summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/build.yaml3
-rw-r--r--.github/workflows/pre-commit.yaml18
-rw-r--r--.github/workflows/stale.yaml4
-rw-r--r--.pre-commit-config.yaml7
-rw-r--r--autobuild.xml10
-rwxr-xr-xdoc/contributions.txt8
-rw-r--r--indra/cmake/00-Common.cmake4
-rw-r--r--indra/llappearance/CMakeLists.txt2
-rw-r--r--indra/llappearance/llavatarappearance.cpp1
-rw-r--r--indra/llappearance/llwearable.h4
-rw-r--r--indra/llappearance/llwearabledata.cpp40
-rw-r--r--indra/llappearance/llwearabledata.h9
-rw-r--r--indra/llaudio/llaudioengine.cpp103
-rwxr-xr-xindra/llaudio/llaudioengine.h13
-rw-r--r--indra/llaudio/llaudioengine_fmodstudio.cpp11
-rw-r--r--indra/llaudio/llaudioengine_fmodstudio.h1
-rw-r--r--indra/llcharacter/llbvhloader.cpp2
-rw-r--r--indra/llcharacter/llkeyframemotion.cpp55
-rw-r--r--indra/llcommon/CMakeLists.txt2
-rw-r--r--indra/llcommon/hbxxh.h18
-rw-r--r--indra/llcommon/indra_constants.h1
-rw-r--r--indra/llcommon/llapp.cpp44
-rw-r--r--indra/llcommon/llapp.h22
-rw-r--r--indra/llcommon/llcallbacklist.cpp2
-rw-r--r--indra/llcommon/lldefs.h48
-rw-r--r--indra/llcommon/llerror.h1
-rw-r--r--indra/llcommon/llerrorthread.cpp133
-rw-r--r--indra/llcommon/llleap.cpp31
-rw-r--r--indra/llcommon/llmd5.cpp32
-rw-r--r--indra/llcommon/llmd5.h23
-rw-r--r--indra/llcommon/llsdserialize.cpp197
-rw-r--r--indra/llcommon/llsdserialize.h2
-rw-r--r--indra/llcommon/llstreamtools.cpp26
-rw-r--r--indra/llcommon/llstreamtools.h27
-rw-r--r--indra/llcommon/lltracerecording.cpp124
-rw-r--r--indra/llcommon/lltracerecording.h172
-rw-r--r--indra/llcommon/lluuid.cpp2
-rw-r--r--indra/llcommon/lluuid.h50
-rw-r--r--indra/llcommon/stdtypes.h2
-rw-r--r--indra/llcommon/tests/llleap_test.cpp27
-rw-r--r--indra/llcommon/tests/llsdserialize_test.cpp610
-rwxr-xr-xindra/llcorehttp/tests/test_llcorehttp_peer.py2
-rw-r--r--indra/llinventory/llinventory.cpp315
-rw-r--r--indra/llinventory/llinventory.h7
-rw-r--r--indra/llinventory/llsettingssky.cpp11
-rw-r--r--indra/llinventory/llsettingssky.h2
-rw-r--r--indra/llinventory/tests/inventorymisc_test.cpp20
-rw-r--r--indra/llmath/llcamera.h2
-rw-r--r--indra/llmath/llvolume.cpp34
-rw-r--r--indra/llmath/llvolumemgr.cpp18
-rw-r--r--indra/llmessage/CMakeLists.txt2
-rw-r--r--indra/llmessage/llcachename.cpp4
-rw-r--r--indra/llmessage/llcircuit.cpp2
-rw-r--r--indra/llmessage/llcoproceduremanager.cpp21
-rw-r--r--indra/llmessage/llcorehttputil.cpp42
-rw-r--r--indra/llmessage/llcorehttputil.h4
-rw-r--r--indra/llmessage/llgenericstreamingmessage.cpp72
-rw-r--r--indra/llmessage/llgenericstreamingmessage.h50
-rw-r--r--indra/llmessage/llregionflags.h5
-rw-r--r--indra/llmessage/message.cpp1
-rw-r--r--indra/llmessage/message_prehash.cpp1
-rw-r--r--indra/llmessage/message_prehash.h1
-rwxr-xr-xindra/llmessage/tests/test_llsdmessage_peer.py4
-rw-r--r--indra/llprimitive/CMakeLists.txt1
-rw-r--r--indra/llprimitive/llgltfmaterial.cpp297
-rw-r--r--indra/llprimitive/llgltfmaterial.h45
-rw-r--r--indra/llprimitive/llgltfmaterial_templates.h142
-rw-r--r--indra/llprimitive/llmaterial.cpp29
-rw-r--r--indra/llprimitive/llmaterial.h4
-rw-r--r--indra/llprimitive/llmaterialid.h26
-rw-r--r--indra/llprimitive/llprimitive.cpp2
-rw-r--r--indra/llrender/CMakeLists.txt2
-rw-r--r--indra/llrender/llfontgl.cpp38
-rw-r--r--indra/llrender/llfontgl.h4
-rw-r--r--indra/llrender/llgl.cpp4
-rw-r--r--indra/llrender/llimagegl.cpp33
-rw-r--r--indra/llrender/llimagegl.h8
-rw-r--r--indra/llrender/llrender.cpp4
-rw-r--r--indra/llrender/llshadermgr.cpp5
-rw-r--r--indra/llrender/llshadermgr.h3
-rw-r--r--indra/llrender/lltexturemanagerbridge.cpp (renamed from indra/llappearance/lltexturemanagerbridge.cpp)0
-rw-r--r--indra/llrender/lltexturemanagerbridge.h (renamed from indra/llappearance/lltexturemanagerbridge.h)1
-rw-r--r--indra/llrender/llvertexbuffer.cpp2
-rw-r--r--indra/llui/llaccordionctrl.cpp330
-rw-r--r--indra/llui/llaccordionctrl.h2
-rw-r--r--indra/llui/llaccordionctrltab.cpp371
-rw-r--r--indra/llui/llaccordionctrltab.h2
-rw-r--r--indra/llui/llbutton.cpp6
-rw-r--r--indra/llui/lldraghandle.cpp1
-rw-r--r--indra/llui/llflatlistview.cpp52
-rw-r--r--indra/llui/llfolderview.cpp101
-rw-r--r--indra/llui/llfolderview.h20
-rw-r--r--indra/llui/llfolderviewitem.cpp154
-rw-r--r--indra/llui/llfolderviewitem.h15
-rw-r--r--indra/llui/llfolderviewmodel.cpp4
-rw-r--r--indra/llui/llfolderviewmodel.h8
-rw-r--r--indra/llui/lliconctrl.cpp26
-rw-r--r--indra/llui/lliconctrl.h7
-rw-r--r--indra/llui/lllayoutstack.cpp38
-rw-r--r--indra/llui/lllayoutstack.h5
-rw-r--r--indra/llui/llmenugl.cpp27
-rw-r--r--indra/llui/llmenugl.h10
-rw-r--r--indra/llui/llpanel.h1
-rw-r--r--indra/llui/llresizehandle.cpp5
-rw-r--r--indra/llui/llresizehandle.h1
-rw-r--r--indra/llui/llscrollbar.cpp11
-rw-r--r--indra/llui/llscrollbar.h4
-rw-r--r--indra/llui/llscrollcontainer.cpp11
-rw-r--r--indra/llui/llscrollcontainer.h6
-rw-r--r--indra/llui/lltabcontainer.cpp16
-rw-r--r--indra/llui/lltabcontainer.h1
-rw-r--r--indra/llui/lltextbase.cpp10
-rw-r--r--indra/llui/lltextbase.h2
-rw-r--r--indra/llui/lltextbox.cpp3
-rw-r--r--indra/llui/lltooltip.cpp36
-rw-r--r--indra/llui/lltooltip.h12
-rw-r--r--indra/llui/lluicolortable.cpp6
-rw-r--r--indra/llui/lluictrl.cpp9
-rw-r--r--indra/llui/lluictrl.h1
-rw-r--r--indra/llui/llview.cpp35
-rw-r--r--indra/llui/llview.h2
-rw-r--r--indra/llwindow/llwindow.h3
-rw-r--r--indra/llwindow/llwindowwin32.cpp28
-rw-r--r--indra/llxml/llcontrol.cpp3
-rw-r--r--indra/newview/CMakeLists.txt22
-rw-r--r--indra/newview/app_settings/cmd_line.xml6
-rw-r--r--indra/newview/app_settings/keywords.ini1
-rw-r--r--indra/newview/app_settings/keywords_lsl_default.xml9
-rw-r--r--indra/newview/app_settings/logcontrol.xml1
-rw-r--r--indra/newview/app_settings/settings.xml313
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl52
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl3
-rw-r--r--indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl15
-rw-r--r--indra/newview/app_settings/shaders/class1/environment/srgbF.glsl28
-rw-r--r--indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl11
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl10
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/pbralphaF.glsl32
-rw-r--r--indra/newview/app_settings/shaders/class2/deferred/reflectionProbeF.glsl8
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl10
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/materialF.glsl12
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/multiPointLightF.glsl8
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl263
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/pointLightF.glsl4
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl31
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl19
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl109
-rw-r--r--indra/newview/app_settings/shaders/class3/environment/waterF.glsl4
-rw-r--r--indra/newview/featuretable.txt20
-rw-r--r--indra/newview/featuretable_mac.txt21
-rw-r--r--indra/newview/installers/windows/installer_template.nsi20
-rwxr-xr-xindra/newview/installers/windows/lang_zh.nsibin10144 -> 10154 bytes
-rw-r--r--indra/newview/llagent.cpp207
-rw-r--r--indra/newview/llagent.h22
-rw-r--r--indra/newview/llagentcamera.cpp30
-rw-r--r--indra/newview/llagentlistener.cpp3
-rw-r--r--indra/newview/llagentui.cpp6
-rw-r--r--indra/newview/llagentwearables.cpp14
-rw-r--r--indra/newview/llagentwearables.h2
-rw-r--r--indra/newview/llaisapi.cpp863
-rw-r--r--indra/newview/llaisapi.h53
-rw-r--r--indra/newview/llappearancemgr.cpp361
-rw-r--r--indra/newview/llappearancemgr.h2
-rw-r--r--indra/newview/llappviewer.cpp197
-rw-r--r--indra/newview/llappviewer.h1
-rw-r--r--indra/newview/llappviewerlinux.cpp2
-rw-r--r--indra/newview/llappviewermacosx.cpp2
-rw-r--r--indra/newview/llappviewerwin32.cpp2
-rw-r--r--indra/newview/llattachmentsmgr.cpp16
-rw-r--r--indra/newview/llavataractions.cpp181
-rw-r--r--indra/newview/llavataractions.h1
-rw-r--r--indra/newview/llavatarpropertiesprocessor.h1
-rw-r--r--indra/newview/llbuycurrencyhtml.cpp2
-rw-r--r--indra/newview/llchathistory.cpp2
-rw-r--r--indra/newview/llchatitemscontainerctrl.cpp2
-rw-r--r--indra/newview/llcommanddispatcherlistener.cpp4
-rw-r--r--indra/newview/llcommandhandler.cpp7
-rw-r--r--indra/newview/llcommandhandler.h4
-rw-r--r--indra/newview/llcontrolavatar.cpp7
-rw-r--r--indra/newview/llcontrolavatar.h6
-rw-r--r--indra/newview/llconversationmodel.h3
-rw-r--r--indra/newview/lldrawable.cpp22
-rw-r--r--indra/newview/lldrawpool.cpp82
-rw-r--r--indra/newview/lldrawpool.h21
-rw-r--r--indra/newview/lldrawpoolalpha.cpp9
-rw-r--r--indra/newview/lldrawpoolavatar.cpp12
-rw-r--r--indra/newview/llenvironment.cpp17
-rw-r--r--indra/newview/lleventnotifier.cpp6
-rw-r--r--indra/newview/llface.cpp46
-rw-r--r--indra/newview/llface.h10
-rw-r--r--indra/newview/llfilepicker.cpp11
-rw-r--r--indra/newview/llfilepicker_mac.mm3
-rw-r--r--indra/newview/llfloater360capture.cpp77
-rw-r--r--indra/newview/llfloater360capture.h4
-rw-r--r--indra/newview/llfloaterbulkpermission.cpp5
-rw-r--r--indra/newview/llfloaterbulkpermission.h2
-rw-r--r--indra/newview/llfloatercamerapresets.cpp18
-rw-r--r--indra/newview/llfloatercamerapresets.h3
-rw-r--r--indra/newview/llfloaterchangeitemthumbnail.cpp955
-rw-r--r--indra/newview/llfloaterchangeitemthumbnail.h139
-rw-r--r--indra/newview/llfloatereditenvironmentbase.cpp2
-rw-r--r--indra/newview/llfloatereditextdaycycle.cpp24
-rw-r--r--indra/newview/llfloatereditextdaycycle.h2
-rw-r--r--indra/newview/llfloaterenvironmentadjust.cpp2
-rw-r--r--indra/newview/llfloaterexperienceprofile.cpp6
-rw-r--r--indra/newview/llfloaterforgetuser.cpp14
-rw-r--r--indra/newview/llfloatergesture.cpp2
-rw-r--r--indra/newview/llfloaterhandler.cpp2
-rw-r--r--indra/newview/llfloaterhandler.h2
-rw-r--r--indra/newview/llfloaterimcontainer.cpp3
-rw-r--r--indra/newview/llfloaterimnearbychat.cpp8
-rw-r--r--indra/newview/llfloaterimsessiontab.cpp8
-rw-r--r--indra/newview/llfloaterimsessiontab.h1
-rw-r--r--indra/newview/llfloaterinventorysettings.cpp44
-rw-r--r--indra/newview/llfloaterinventorysettings.h45
-rw-r--r--indra/newview/llfloaterlinkreplace.cpp4
-rw-r--r--indra/newview/llfloatermarketplacelistings.cpp144
-rw-r--r--indra/newview/llfloatermarketplacelistings.h8
-rw-r--r--indra/newview/llfloaternewfeaturenotification.cpp83
-rw-r--r--indra/newview/llfloaternewfeaturenotification.h49
-rw-r--r--indra/newview/llfloateropenobject.cpp45
-rw-r--r--indra/newview/llfloateroutfitphotopreview.cpp288
-rw-r--r--indra/newview/llfloateroutfitphotopreview.h77
-rw-r--r--indra/newview/llfloaterperms.cpp2
-rw-r--r--indra/newview/llfloaterperms.h1
-rw-r--r--indra/newview/llfloaterproperties.cpp891
-rw-r--r--indra/newview/llfloaterproperties.h98
-rw-r--r--indra/newview/llfloaterregioninfo.cpp28
-rw-r--r--indra/newview/llfloaterregioninfo.h1
-rw-r--r--indra/newview/llfloatersearch.cpp2
-rw-r--r--indra/newview/llfloatersidepanelcontainer.cpp23
-rw-r--r--indra/newview/llfloatersidepanelcontainer.h2
-rw-r--r--indra/newview/llfloatersimpleoutfitsnapshot.cpp333
-rw-r--r--indra/newview/llfloatersimplesnapshot.cpp499
-rw-r--r--indra/newview/llfloatersimplesnapshot.h (renamed from indra/newview/llfloatersimpleoutfitsnapshot.h)61
-rw-r--r--indra/newview/llfloatertools.cpp3
-rw-r--r--indra/newview/llfloatertopobjects.cpp49
-rw-r--r--indra/newview/llfloatertopobjects.h4
-rw-r--r--indra/newview/llfloatertranslationsettings.cpp248
-rw-r--r--indra/newview/llfloatertranslationsettings.h32
-rwxr-xr-xindra/newview/llfloaterworldmap.cpp11
-rw-r--r--indra/newview/llfolderviewmodelinventory.h2
-rw-r--r--indra/newview/llfriendcard.cpp41
-rw-r--r--indra/newview/llglsandbox.cpp6
-rw-r--r--indra/newview/llgltfmateriallist.cpp105
-rw-r--r--indra/newview/llgltfmateriallist.h3
-rw-r--r--indra/newview/llgroupactions.cpp6
-rw-r--r--indra/newview/llimprocessing.cpp11
-rw-r--r--indra/newview/llinspectobject.cpp4
-rw-r--r--indra/newview/llinspecttexture.cpp249
-rw-r--r--indra/newview/llinspecttexture.h (renamed from indra/llcommon/llerrorthread.h)43
-rw-r--r--indra/newview/llinspecttoast.cpp7
-rw-r--r--indra/newview/llinventorybridge.cpp837
-rw-r--r--indra/newview/llinventorybridge.h37
-rw-r--r--indra/newview/llinventoryfilter.cpp89
-rw-r--r--indra/newview/llinventoryfilter.h24
-rw-r--r--indra/newview/llinventoryfunctions.cpp897
-rw-r--r--indra/newview/llinventoryfunctions.h95
-rw-r--r--indra/newview/llinventorygallery.cpp3824
-rw-r--r--indra/newview/llinventorygallery.h419
-rw-r--r--indra/newview/llinventorygallerymenu.cpp714
-rw-r--r--indra/newview/llinventorygallerymenu.h62
-rw-r--r--indra/newview/llinventorymodel.cpp773
-rw-r--r--indra/newview/llinventorymodel.h42
-rw-r--r--indra/newview/llinventorymodelbackgroundfetch.cpp845
-rw-r--r--indra/newview/llinventorymodelbackgroundfetch.h75
-rw-r--r--indra/newview/llinventoryobserver.cpp167
-rw-r--r--indra/newview/llinventoryobserver.h14
-rw-r--r--indra/newview/llinventorypanel.cpp641
-rw-r--r--indra/newview/llinventorypanel.h90
-rw-r--r--indra/newview/lllogchat.cpp2
-rw-r--r--indra/newview/llloginhandler.cpp1
-rw-r--r--indra/newview/llloginhandler.h2
-rw-r--r--indra/newview/lllogininstance.cpp28
-rw-r--r--indra/newview/lllogininstance.h3
-rw-r--r--indra/newview/llmarketplacefunctions.cpp10
-rw-r--r--indra/newview/llmaterialeditor.cpp409
-rw-r--r--indra/newview/llmaterialeditor.h13
-rw-r--r--indra/newview/llmaterialmgr.h33
-rw-r--r--indra/newview/llmeshrepository.cpp30
-rw-r--r--indra/newview/llmodelpreview.cpp5
-rw-r--r--indra/newview/llmutelist.h1
-rw-r--r--indra/newview/lloutfitgallery.cpp879
-rw-r--r--indra/newview/lloutfitgallery.h68
-rw-r--r--indra/newview/lloutfitobserver.cpp3
-rw-r--r--indra/newview/lloutfitobserver.h3
-rw-r--r--indra/newview/lloutfitslist.cpp37
-rw-r--r--indra/newview/lloutfitslist.h5
-rw-r--r--indra/newview/llpaneleditsky.cpp8
-rw-r--r--indra/newview/llpaneleditsky.h2
-rw-r--r--indra/newview/llpaneleditwearable.cpp2
-rw-r--r--indra/newview/llpanelface.cpp485
-rw-r--r--indra/newview/llpanelface.h37
-rw-r--r--indra/newview/llpanellandmarkinfo.cpp4
-rw-r--r--indra/newview/llpanellandmarkinfo.h2
-rw-r--r--indra/newview/llpanellogin.cpp7
-rw-r--r--indra/newview/llpanelmaininventory.cpp1266
-rw-r--r--indra/newview/llpanelmaininventory.h83
-rw-r--r--indra/newview/llpanelmarketplaceinbox.cpp3
-rw-r--r--indra/newview/llpanelmarketplaceinboxinventory.cpp34
-rw-r--r--indra/newview/llpanelmarketplaceinboxinventory.h11
-rw-r--r--indra/newview/llpanelnearbymedia.cpp6
-rw-r--r--indra/newview/llpanelobjectinventory.cpp20
-rw-r--r--indra/newview/llpaneloutfitedit.cpp16
-rw-r--r--indra/newview/llpaneloutfitsinventory.cpp8
-rw-r--r--indra/newview/llpanelpermissions.cpp37
-rw-r--r--indra/newview/llpanelplaces.cpp6
-rw-r--r--indra/newview/llpanelprofile.cpp131
-rw-r--r--indra/newview/llpanelprofile.h5
-rw-r--r--indra/newview/llpanelprofileclassifieds.cpp2
-rw-r--r--indra/newview/llpanelprofilepicks.cpp7
-rw-r--r--indra/newview/llpanelvolume.cpp22
-rw-r--r--indra/newview/llpanelwearing.cpp15
-rw-r--r--indra/newview/llpanelwearing.h1
-rw-r--r--indra/newview/llpreview.cpp20
-rw-r--r--indra/newview/llpreview.h2
-rw-r--r--indra/newview/llpreviewnotecard.cpp2
-rw-r--r--indra/newview/llpreviewscript.cpp1
-rw-r--r--indra/newview/llreflectionmap.cpp14
-rw-r--r--indra/newview/llreflectionmapmanager.cpp17
-rw-r--r--indra/newview/llreflectionmapmanager.h9
-rw-r--r--indra/newview/llsceneview.cpp5
-rw-r--r--indra/newview/llscripteditor.cpp2
-rw-r--r--indra/newview/llselectmgr.cpp138
-rw-r--r--indra/newview/llselectmgr.h16
-rw-r--r--indra/newview/llsettingsvo.cpp42
-rw-r--r--indra/newview/llsettingsvo.h1
-rw-r--r--indra/newview/llshareavatarhandler.cpp2
-rw-r--r--indra/newview/llsidepanelinventory.cpp302
-rw-r--r--indra/newview/llsidepanelinventory.h24
-rw-r--r--indra/newview/llsidepaneliteminfo.cpp357
-rw-r--r--indra/newview/llsidepaneliteminfo.h37
-rw-r--r--indra/newview/llsidepaneltaskinfo.cpp176
-rw-r--r--indra/newview/llsidepaneltaskinfo.h34
-rw-r--r--indra/newview/llsnapshotlivepreview.cpp6
-rw-r--r--indra/newview/llsnapshotlivepreview.h1
-rw-r--r--indra/newview/llspatialpartition.cpp80
-rw-r--r--indra/newview/llspatialpartition.h5
-rw-r--r--indra/newview/llsprite.cpp5
-rw-r--r--indra/newview/llstartup.cpp122
-rw-r--r--indra/newview/llstartup.h1
-rw-r--r--indra/newview/llstatusbar.cpp2
-rw-r--r--indra/newview/lltexturectrl.cpp566
-rw-r--r--indra/newview/lltexturectrl.h60
-rw-r--r--indra/newview/lltexturefetch.cpp108
-rw-r--r--indra/newview/lltextureview.cpp4
-rw-r--r--indra/newview/llthumbnailctrl.cpp239
-rw-r--r--indra/newview/llthumbnailctrl.h88
-rw-r--r--indra/newview/lltoastalertpanel.cpp8
-rw-r--r--indra/newview/lltoolbarview.cpp2
-rw-r--r--indra/newview/lltoolcomp.cpp3
-rw-r--r--indra/newview/lltooldraganddrop.cpp83
-rw-r--r--indra/newview/lltoolpie.cpp8
-rw-r--r--indra/newview/lltoolselect.cpp4
-rw-r--r--indra/newview/lltranslate.cpp870
-rw-r--r--indra/newview/lltranslate.h17
-rw-r--r--indra/newview/llurldispatcher.cpp69
-rw-r--r--indra/newview/llvieweraudio.cpp38
-rw-r--r--indra/newview/llviewercontrol.cpp10
-rw-r--r--indra/newview/llviewerfloaterreg.cpp18
-rw-r--r--indra/newview/llviewergenericmessage.cpp18
-rw-r--r--indra/newview/llviewergenericmessage.h1
-rw-r--r--indra/newview/llviewerhelp.cpp2
-rw-r--r--indra/newview/llviewerinput.cpp7
-rw-r--r--indra/newview/llviewerinventory.cpp535
-rw-r--r--indra/newview/llviewerinventory.h46
-rw-r--r--indra/newview/llviewermediafocus.cpp1
-rw-r--r--indra/newview/llviewermenu.cpp191
-rw-r--r--indra/newview/llviewermenufile.cpp9
-rw-r--r--indra/newview/llviewermessage.cpp152
-rw-r--r--indra/newview/llviewerobject.cpp18
-rw-r--r--indra/newview/llviewerobject.h1
-rw-r--r--indra/newview/llviewerobjectlist.cpp52
-rw-r--r--indra/newview/llvieweroctree.cpp6
-rw-r--r--indra/newview/llviewerparcelmgr.cpp24
-rw-r--r--indra/newview/llviewerparcelmgr.h7
-rwxr-xr-xindra/newview/llviewerregion.cpp157
-rw-r--r--indra/newview/llviewerregion.h36
-rw-r--r--indra/newview/llviewershadermgr.cpp210
-rw-r--r--indra/newview/llviewerstats.cpp4
-rw-r--r--indra/newview/llviewerstatsrecorder.cpp292
-rw-r--r--indra/newview/llviewerstatsrecorder.h137
-rw-r--r--indra/newview/llviewertexteditor.cpp22
-rw-r--r--indra/newview/llviewertexture.cpp8
-rw-r--r--indra/newview/llviewertexturelist.cpp71
-rw-r--r--indra/newview/llviewertexturelist.h13
-rw-r--r--indra/newview/llviewerthrottle.cpp2
-rw-r--r--indra/newview/llviewerwearable.h1
-rw-r--r--indra/newview/llviewerwindow.cpp74
-rw-r--r--indra/newview/llviewerwindow.h10
-rw-r--r--indra/newview/llvoavatar.cpp14
-rw-r--r--indra/newview/llvocache.cpp39
-rw-r--r--indra/newview/llvocache.h2
-rw-r--r--indra/newview/llvoicecallhandler.cpp2
-rw-r--r--indra/newview/llvoiceclient.cpp2
-rw-r--r--indra/newview/llvoicevivox.cpp48
-rw-r--r--indra/newview/llvoicevivox.h7
-rw-r--r--indra/newview/llvopartgroup.cpp2
-rw-r--r--indra/newview/llvosurfacepatch.cpp7
-rw-r--r--indra/newview/llvovolume.cpp203
-rw-r--r--indra/newview/llwearableitemslist.cpp9
-rwxr-xr-xindra/newview/llworldmapview.cpp3
-rw-r--r--indra/newview/pipeline.cpp210
-rw-r--r--indra/newview/pipeline.h14
-rw-r--r--indra/newview/skins/default/colors.xml2
-rw-r--r--indra/newview/skins/default/html/ja/help-offline/index.html42
-rw-r--r--indra/newview/skins/default/html/ja/loading-error/index.html124
-rw-r--r--indra/newview/skins/default/html/ja/loading/loading.html32
-rw-r--r--indra/newview/skins/default/textures/icons/copy_clipboard.pngbin0 -> 3443 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/delete_icon.pngbin0 -> 3570 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/file_upload.pngbin0 -> 3191 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/multi_folder_mode.pngbin0 -> 2786 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/paste_clipboard.pngbin0 -> 3412 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/profile_badge_beta.pngbin0 -> 3223 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/profile_badge_beta_lifetime.pngbin0 -> 3221 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/profile_badge_lifetime.pngbin0 -> 3302 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/profile_badge_linden.pngbin0 -> 3521 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/profile_badge_pplus_lifetime.pngbin0 -> 3311 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/profile_badge_premium_lifetime.pngbin0 -> 3301 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/single_folder_back.pngbin0 -> 3276 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/single_folder_forward.pngbin0 -> 3260 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/single_folder_mode.pngbin0 -> 2780 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/single_folder_up.pngbin0 -> 3118 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/snapshot_icon.pngbin0 -> 3341 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/texture_icon.pngbin0 -> 2812 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/thumbnail_fallback_icon.pngbin0 -> 6162 bytes
-rw-r--r--indra/newview/skins/default/textures/textures.xml27
-rw-r--r--indra/newview/skins/default/xui/da/floater_animation_preview.xml187
-rw-r--r--indra/newview/skins/default/xui/da/floater_inventory.xml16
-rw-r--r--indra/newview/skins/default/xui/da/floater_inventory_item_properties.xml67
-rw-r--r--indra/newview/skins/default/xui/da/floater_nearby_chat.xml4
-rw-r--r--indra/newview/skins/default/xui/da/floater_perm_prefs.xml16
-rw-r--r--indra/newview/skins/default/xui/da/floater_postcard.xml36
-rw-r--r--indra/newview/skins/default/xui/da/floater_voice_controls.xml30
-rw-r--r--indra/newview/skins/default/xui/da/menu_bottomtray.xml17
-rw-r--r--indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml21
-rw-r--r--indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml31
-rw-r--r--indra/newview/skins/default/xui/da/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/da/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/da/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/da/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/da/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/default/xui/da/panel_bottomtray.xml47
-rw-r--r--indra/newview/skins/default/xui/da/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/default/xui/da/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/default/xui/da/panel_region_texture.xml57
-rw-r--r--indra/newview/skins/default/xui/de/floater_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml36
-rw-r--r--indra/newview/skins/default/xui/de/floater_perm_prefs.xml16
-rw-r--r--indra/newview/skins/default/xui/de/floater_voice_controls.xml30
-rw-r--r--indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml21
-rw-r--r--indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml31
-rw-r--r--indra/newview/skins/default/xui/de/menu_name_field.xml6
-rw-r--r--indra/newview/skins/default/xui/de/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/de/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml9
-rw-r--r--indra/newview/skins/default/xui/de/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/de/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/default/xui/de/panel_facebook_account.xml15
-rw-r--r--indra/newview/skins/default/xui/de/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/default/xui/de/panel_im_control_panel.xml30
-rw-r--r--indra/newview/skins/default/xui/de/panel_main_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/de/panel_profile_interests.xml35
-rw-r--r--indra/newview/skins/default/xui/en/floater_adjust_environment.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_bulk_perms.xml14
-rw-r--r--indra/newview/skins/default/xui/en/floater_change_item_thumbnail.xml164
-rw-r--r--indra/newview/skins/default/xui/en/floater_inventory_settings.xml179
-rw-r--r--indra/newview/skins/default/xui/en/floater_item_properties.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_my_inventory.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_new_feature_notification.xml69
-rw-r--r--indra/newview/skins/default/xui/en/floater_outfit_photo_preview.xml65
-rw-r--r--indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml11
-rw-r--r--indra/newview/skins/default/xui/en/floater_scene_load_stats.xml12
-rw-r--r--indra/newview/skins/default/xui/en/floater_simple_snapshot.xml (renamed from indra/newview/skins/default/xui/en/floater_simple_outfit_snapshot.xml)10
-rw-r--r--indra/newview/skins/default/xui/en/floater_snapshot.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_task_properties.xml24
-rw-r--r--indra/newview/skins/default/xui/en/floater_texture_ctrl.xml16
-rw-r--r--indra/newview/skins/default/xui/en/floater_tools.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_top_objects.xml13
-rw-r--r--indra/newview/skins/default/xui/en/floater_translation_settings.xml216
-rw-r--r--indra/newview/skins/default/xui/en/menu_attachment_self.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_gallery_inventory.xml515
-rwxr-xr-xindra/newview/skins/default/xui/en/menu_gallery_outfit_tab.xml32
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory.xml372
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory_add.xml11
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml104
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory_search_visibility.xml11
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory_view_default.xml114
-rw-r--r--indra/newview/skins/default/xui/en/menu_outfit_gear.xml27
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_nearby.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml109
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml179
-rw-r--r--indra/newview/skins/default/xui/en/panel_gltf_material.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_inventory_gallery.xml33
-rw-r--r--indra/newview/skins/default/xui/en/panel_inventory_gallery_item.xml75
-rw-r--r--indra/newview/skins/default/xui/en/panel_main_inventory.xml509
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfit_gallery.xml42
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfits_wearing.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile_firstlife.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile_secondlife.xml58
-rw-r--r--indra/newview/skins/default/xui/en/panel_script_experience.xml17
-rw-r--r--indra/newview/skins/default/xui/en/panel_settings_sky_atmos.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_tools_texture.xml16
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_inventory.xml194
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_item_info.xml749
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_task_info.xml22
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml13
-rw-r--r--indra/newview/skins/default/xui/es/floater_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml36
-rw-r--r--indra/newview/skins/default/xui/es/floater_perm_prefs.xml16
-rw-r--r--indra/newview/skins/default/xui/es/floater_voice_controls.xml30
-rw-r--r--indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml21
-rw-r--r--indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml31
-rw-r--r--indra/newview/skins/default/xui/es/menu_name_field.xml6
-rw-r--r--indra/newview/skins/default/xui/es/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/es/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_people_nearby_view_sort.xml9
-rw-r--r--indra/newview/skins/default/xui/es/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/es/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/default/xui/es/panel_facebook_account.xml15
-rw-r--r--indra/newview/skins/default/xui/es/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/default/xui/es/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/default/xui/es/panel_main_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/es/panel_profile_interests.xml35
-rw-r--r--indra/newview/skins/default/xui/fr/floater_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml36
-rw-r--r--indra/newview/skins/default/xui/fr/floater_perm_prefs.xml16
-rw-r--r--indra/newview/skins/default/xui/fr/floater_voice_controls.xml30
-rw-r--r--indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml21
-rw-r--r--indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml31
-rw-r--r--indra/newview/skins/default/xui/fr/menu_name_field.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/menu_people_nearby_view_sort.xml9
-rw-r--r--indra/newview/skins/default/xui/fr/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/default/xui/fr/panel_facebook_account.xml15
-rw-r--r--indra/newview/skins/default/xui/fr/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/default/xui/fr/panel_im_control_panel.xml30
-rw-r--r--indra/newview/skins/default/xui/fr/panel_main_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/panel_profile_interests.xml35
-rw-r--r--indra/newview/skins/default/xui/it/floater_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml36
-rw-r--r--indra/newview/skins/default/xui/it/floater_perm_prefs.xml16
-rw-r--r--indra/newview/skins/default/xui/it/floater_voice_controls.xml30
-rw-r--r--indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml21
-rw-r--r--indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml31
-rw-r--r--indra/newview/skins/default/xui/it/menu_name_field.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/it/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml9
-rw-r--r--indra/newview/skins/default/xui/it/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/it/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/default/xui/it/panel_facebook_account.xml15
-rw-r--r--indra/newview/skins/default/xui/it/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/default/xui/it/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/default/xui/it/panel_main_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/it/panel_profile_interests.xml35
-rw-r--r--indra/newview/skins/default/xui/ja/control_table_contents_camera.xml72
-rw-r--r--indra/newview/skins/default/xui/ja/control_table_contents_columns_basic.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/control_table_contents_editing.xml24
-rw-r--r--indra/newview/skins/default/xui/ja/control_table_contents_media.xml27
-rw-r--r--indra/newview/skins/default/xui/ja/control_table_contents_movement.xml60
-rw-r--r--indra/newview/skins/default/xui/ja/floater_360capture.xml23
-rw-r--r--indra/newview/skins/default/xui/ja/floater_aaa.xml57
-rw-r--r--indra/newview/skins/default/xui/ja/floater_about.xml28
-rw-r--r--indra/newview/skins/default/xui/ja/floater_about_land.xml199
-rw-r--r--indra/newview/skins/default/xui/ja/floater_activeim.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_add_payment_method.xml25
-rw-r--r--indra/newview/skins/default/xui/ja/floater_adjust_environment.xml102
-rw-r--r--indra/newview/skins/default/xui/ja/floater_animation_anim_preview.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_animation_bvh_preview.xml54
-rw-r--r--indra/newview/skins/default/xui/ja/floater_associate_listing.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/floater_autoreplace.xml23
-rw-r--r--indra/newview/skins/default/xui/ja/floater_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_avatar_picker.xml33
-rw-r--r--indra/newview/skins/default/xui/ja/floater_avatar_render_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_avatar_textures.xml71
-rw-r--r--indra/newview/skins/default/xui/ja/floater_ban_duration.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_beacons.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/floater_big_preview.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_build_options.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_bulk_perms.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/floater_bumps.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_contents.xml20
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_currency.xml145
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_currency_html.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_land.xml98
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_object.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/floater_camera.xml76
-rw-r--r--indra/newview/skins/default/xui/ja/floater_camera_presets.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/floater_choose_group.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_classified.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_color_picker.xml60
-rw-r--r--indra/newview/skins/default/xui/ja/floater_conversation_log.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_conversation_preview.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_create_landmark.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/floater_critical.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/floater_delete_pref_preset.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/floater_destinations.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_display_name.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/floater_edit_ext_day_cycle.xml72
-rw-r--r--indra/newview/skins/default/xui/ja/floater_event.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_experience_search.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_experienceprofile.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/floater_experiences.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_fast_timers.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_fbc_web.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_fixedenvironment.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/floater_font_test.xml87
-rw-r--r--indra/newview/skins/default/xui/ja/floater_forget_user.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/floater_gesture.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/floater_god_tools.xml36
-rw-r--r--indra/newview/skins/default/xui/ja/floater_goto_line.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_help_browser.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_how_to.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_hud.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_im_container.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_im_session.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/floater_image_preview.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/floater_import_collada.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/floater_incoming_call.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/floater_inspect.xml19
-rw-r--r--indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml36
-rw-r--r--indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_item_properties.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_joystick.xml176
-rw-r--r--indra/newview/skins/default/xui/ja/floater_lagmeter.xml36
-rw-r--r--indra/newview/skins/default/xui/ja/floater_land_holdings.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/floater_linkreplace.xml36
-rw-r--r--indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_load_pref_preset.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/floater_lsl_guide.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_map.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_marketplace_listings.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/floater_marketplace_validation.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_media_browser.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_media_settings.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_mem_leaking.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_mfa.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/floater_model_preview.xml62
-rw-r--r--indra/newview/skins/default/xui/ja/floater_moveview.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_mute_object.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_my_environments.xml27
-rw-r--r--indra/newview/skins/default/xui/ja/floater_my_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_my_scripts.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_notification.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_object_weights.xml22
-rw-r--r--indra/newview/skins/default/xui/ja/floater_openobject.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/floater_outfit_photo_preview.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/floater_outfit_save_as.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/floater_outgoing_call.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/floater_pathfinding_characters.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml56
-rw-r--r--indra/newview/skins/default/xui/ja/floater_pathfinding_linksets.xml74
-rw-r--r--indra/newview/skins/default/xui/ja/floater_pay.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/floater_pay_object.xml42
-rw-r--r--indra/newview/skins/default/xui/ja/floater_people.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/floater_performance.xml73
-rw-r--r--indra/newview/skins/default/xui/ja/floater_perm_prefs.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/floater_perms_default.xml22
-rw-r--r--indra/newview/skins/default/xui/ja/floater_pick_track.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_post_process.xml33
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preferences.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preferences_graphics_advanced.xml81
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preferences_proxy.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preferences_view_advanced.xml22
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_animation.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_gesture.xml22
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_notecard.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_sound.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_texture.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_trash.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/floater_price_for_listing.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/floater_profile.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_profile_permissions.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/floater_profile_texture.xml17
-rw-r--r--indra/newview/skins/default/xui/ja/floater_publish_classified.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_region_debug_console.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_region_info.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_region_restarting.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/floater_report_abuse.xml32
-rw-r--r--indra/newview/skins/default/xui/ja/floater_save_camera_preset.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/floater_save_pref_preset.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/floater_scene_load_stats.xml109
-rw-r--r--indra/newview/skins/default/xui/ja/floater_script_debug.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_script_debug_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_script_ed_prefs.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/floater_script_limits.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_script_preview.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_script_queue.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_search.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_select_key.xml23
-rw-r--r--indra/newview/skins/default/xui/ja/floater_sell_land.xml30
-rw-r--r--indra/newview/skins/default/xui/ja/floater_settings_debug.xml28
-rw-r--r--indra/newview/skins/default/xui/ja/floater_settings_picker.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_simple_outfit_snapshot.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/floater_snapshot.xml81
-rw-r--r--indra/newview/skins/default/xui/ja/floater_sound_preview.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_spellcheck.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_spellcheck_import.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_stats.xml71
-rw-r--r--indra/newview/skins/default/xui/ja/floater_telehub.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/floater_test_button.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/floater_test_checkbox.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/floater_test_combobox.xml40
-rw-r--r--indra/newview/skins/default/xui/ja/floater_test_inspectors.xml23
-rw-r--r--indra/newview/skins/default/xui/ja/floater_test_layout_stacks.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_test_line_editor.xml28
-rw-r--r--indra/newview/skins/default/xui/ja/floater_test_radiogroup.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/floater_test_slider.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/floater_test_spinner.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/floater_test_text_editor.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/floater_test_text_vertical_aligment.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/floater_texture_fetch_debugger.xml42
-rw-r--r--indra/newview/skins/default/xui/ja/floater_tools.xml186
-rw-r--r--indra/newview/skins/default/xui/ja/floater_top_objects.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/floater_tos.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/floater_translation_settings.xml72
-rw-r--r--indra/newview/skins/default/xui/ja/floater_ui_preview.xml62
-rw-r--r--indra/newview/skins/default/xui/ja/floater_url_entry.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/floater_voice_controls.xml30
-rw-r--r--indra/newview/skins/default/xui/ja/floater_voice_volume.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_whitelist_entry.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_window_size.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_world_map.xml198
-rw-r--r--indra/newview/skins/default/xui/ja/fonts.xml239
-rw-r--r--indra/newview/skins/default/xui/ja/inspect_avatar.xml19
-rw-r--r--indra/newview/skins/default/xui/ja/inspect_group.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/inspect_object.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/inspect_remote_object.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/language_settings.xml140
-rw-r--r--indra/newview/skins/default/xui/ja/menu_add_wearable_gear.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_attachment_other.xml24
-rw-r--r--indra/newview/skins/default/xui/ja/menu_attachment_self.xml20
-rw-r--r--indra/newview/skins/default/xui/ja/menu_avatar_icon.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/menu_avatar_other.xml23
-rw-r--r--indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings_add.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_avatar_self.xml26
-rw-r--r--indra/newview/skins/default/xui/ja/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_cof_clothing.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_cof_gear.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_conversation.xml31
-rw-r--r--indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_copy_paste_color.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_copy_paste_features.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_copy_paste_light.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_copy_paste_object.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_copy_paste_pos.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/menu_copy_paste_rot.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/menu_copy_paste_size.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/menu_copy_paste_texture.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_edit.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_favorites.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/menu_gallery_outfit_tab.xml50
-rw-r--r--indra/newview/skins/default/xui/ja/menu_gesture_gear.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/menu_group_plus.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_hide_navbar.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/menu_im_conversation.xml13
-rw-r--r--indra/newview/skins/default/xui/ja/menu_im_session_showmodes.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_imchiclet_group.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_imchiclet_p2p.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml21
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inspect_object_gear.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml31
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inventory.xml94
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inventory_add.xml24
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inventory_search_visibility.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/menu_land.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_login.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/menu_marketplace_view.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_media_ctrl.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_mini_map.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_model_import_gear_default.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_mute_particle.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/menu_name_field.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/menu_navbar.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_nearby_chat.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_object.xml29
-rw-r--r--indra/newview/skins/default/xui/ja/menu_object_icon.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/menu_outfit_gear.xml53
-rw-r--r--indra/newview/skins/default/xui/ja/menu_outfit_tab.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/menu_participant_list.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/menu_participant_view.xml13
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_blocked_plus.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_blocked_view.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_friends_view.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_nearby.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_nearby_view_sort.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_recent_view.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/menu_picks.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/menu_place.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_place_add_button.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml15
-rw-r--r--indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml25
-rw-r--r--indra/newview/skins/default/xui/ja/menu_places_gear_sorting.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/menu_profile_other.xml23
-rw-r--r--indra/newview/skins/default/xui/ja/menu_profile_overflow.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_profile_self.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/menu_save_outfit.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_save_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/menu_settings_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/menu_slurl.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/menu_teleport_history_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_teleport_history_item.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_text_editor.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_toolbars.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_topinfobar.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_agent.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_experience.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_group.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_http.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_inventory.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_map.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_objectim.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_slapp.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_slurl.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/menu_viewer.xml514
-rw-r--r--indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/menu_wearing_gear.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_wearing_tab.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/mime_types.xml83
-rw-r--r--indra/newview/skins/default/xui/ja/mime_types_linux.xml46
-rw-r--r--indra/newview/skins/default/xui/ja/mime_types_mac.xml51
-rw-r--r--indra/newview/skins/default/xui/ja/notifications.xml8417
-rw-r--r--indra/newview/skins/default/xui/ja/outfit_accordion_tab.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_active_object_row.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml31
-rw-r--r--indra/newview/skins/default/xui/ja/panel_avatar_tag.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_block_list_sidetray.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_body_parts_list_item.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_bodyparts_list_button_bar.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_bottomtray_lite.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/panel_camera_preset_item.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_chat_header.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_classified_info.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_clothing_list_button_bar.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_clothing_list_item.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/panel_cof_wearables.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_conversation_list_item.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/panel_conversation_log_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_deletable_wearable_list_item.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_dummy_clothing_list_item.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_alpha.xml15
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_eyes.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_gloves.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_hair.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_jacket.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_pants.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_physics.xml28
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_shape.xml36
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_shirt.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_shoes.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_skin.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_skirt.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_socks.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_tattoo.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_underpants.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_universal.xml22
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_wearable.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/panel_experience_info.xml22
-rw-r--r--indra/newview/skins/default/xui/ja/panel_experience_list_editor.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_experience_list_item.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_experience_log.xml33
-rw-r--r--indra/newview/skins/default/xui/ja/panel_experience_search.xml41
-rw-r--r--indra/newview/skins/default/xui/ja/panel_experiences.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/panel_facebook_account.xml15
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_bulk_ban.xml32
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_creation_sidetray.xml80
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_general.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_invite.xml15
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_land_money.xml48
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_list_item.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_list_item_short.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_notices.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_notify.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_roles.xml152
-rw-r--r--indra/newview/skins/default/xui/ja/panel_hide_beacon.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_im_control_panel.xml30
-rw-r--r--indra/newview/skins/default/xui/ja/panel_instant_message.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_inventory_item.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/panel_landmark_info.xml39
-rw-r--r--indra/newview/skins/default/xui/ja/panel_landmarks.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_login.xml42
-rw-r--r--indra/newview/skins/default/xui/ja/panel_login_first.xml47
-rw-r--r--indra/newview/skins/default/xui/ja/panel_main_inventory.xml17
-rw-r--r--indra/newview/skins/default/xui/ja/panel_marketplace_listings.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/panel_marketplace_listings_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_marketplace_listings_listed.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_marketplace_listings_unassociated.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_marketplace_listings_unlisted.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_media_settings_general.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/panel_media_settings_permissions.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/panel_media_settings_security.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_nearby_media.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/panel_notification.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/panel_notification_list_item.xml142
-rw-r--r--indra/newview/skins/default/xui/ja/panel_online_status_toast.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_outfit_edit.xml66
-rw-r--r--indra/newview/skins/default/xui/ja/panel_outfit_gallery.xml30
-rw-r--r--indra/newview/skins/default/xui/ja/panel_outfit_gallery_item.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/panel_outfit_snapshot_inventory.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml17
-rw-r--r--indra/newview/skins/default/xui/ja/panel_outfits_inventory_gear_default.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/panel_outfits_list.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/panel_outfits_wearing.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/panel_people.xml71
-rw-r--r--indra/newview/skins/default/xui/ja/panel_performance_autoadjustments.xml67
-rw-r--r--indra/newview/skins/default/xui/ja/panel_performance_complexity.xml24
-rw-r--r--indra/newview/skins/default/xui/ja/panel_performance_huds.xml21
-rw-r--r--indra/newview/skins/default/xui/ja/panel_performance_nearby.xml39
-rw-r--r--indra/newview/skins/default/xui/ja/panel_performance_preferences.xml120
-rw-r--r--indra/newview/skins/default/xui/ja/panel_place_profile.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/panel_places.xml94
-rw-r--r--indra/newview/skins/default/xui/ja/panel_postcard_message.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_postcard_settings.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml26
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_chat.xml45
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_colors.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_controls.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_general.xml50
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml53
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_grids.xml21
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_move.xml22
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_setup.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_sound.xml72
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_uploads.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/panel_presets_camera_pulldown.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/panel_presets_pulldown.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/panel_profile_classified.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_profile_classifieds.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_profile_firstlife.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_profile_interests.xml35
-rw-r--r--indra/newview/skins/default/xui/ja/panel_profile_notes.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_profile_pick.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_profile_picks.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_profile_secondlife.xml136
-rw-r--r--indra/newview/skins/default/xui/ja/panel_profile_web.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_progress.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_access.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_covenant.xml30
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_debug.xml22
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_environment.xml115
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_estate.xml26
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_experiences.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_general.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_terrain.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/panel_script_ed.xml38
-rw-r--r--indra/newview/skins/default/xui/ja/panel_script_experience.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_script_question_toast.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_scrolling_param.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/panel_settings_sky_atmos.xml63
-rw-r--r--indra/newview/skins/default/xui/ja/panel_settings_sky_clouds.xml44
-rw-r--r--indra/newview/skins/default/xui/ja/panel_settings_sky_density.xml34
-rw-r--r--indra/newview/skins/default/xui/ja/panel_settings_sky_sunmoon.xml74
-rw-r--r--indra/newview/skins/default/xui/ja/panel_settings_water.xml72
-rw-r--r--indra/newview/skins/default/xui/ja/panel_sidetray_home_tab.xml15
-rw-r--r--indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml22
-rw-r--r--indra/newview/skins/default/xui/ja/panel_snapshot_local.xml26
-rw-r--r--indra/newview/skins/default/xui/ja/panel_snapshot_options.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_snapshot_profile.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/panel_sound_devices.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_stand_stop_flying.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/panel_status_bar.xml22
-rw-r--r--indra/newview/skins/default/xui/ja/panel_sys_well_item.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/panel_teleport_history.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/panel_teleport_history_item.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_tools_texture.xml22
-rw-r--r--indra/newview/skins/default/xui/ja/panel_voice_effect.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_volume_pulldown.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_world_map.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/role_actions.xml80
-rw-r--r--indra/newview/skins/default/xui/ja/sidepanel_appearance.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/sidepanel_inventory.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/sidepanel_item_info.xml20
-rw-r--r--indra/newview/skins/default/xui/ja/sidepanel_task_info.xml66
-rw-r--r--indra/newview/skins/default/xui/ja/strings.xml9476
-rw-r--r--indra/newview/skins/default/xui/ja/teleport_strings.xml126
-rw-r--r--indra/newview/skins/default/xui/ja/widgets/bodyparts_list_item.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/widgets/clothing_list_item.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/widgets/deletable_wearable_list_item.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/widgets/density_ctrl.xml30
-rw-r--r--indra/newview/skins/default/xui/ja/widgets/dummy_clothing_list_item.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/widgets/flat_list_view.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/widgets/inbox_folder_view_folder.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/widgets/inbox_folder_view_item.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/widgets/menu_item_separator.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/widgets/menu_item_tear_off.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/widgets/name_editor.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/widgets/panel_camera_item.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/widgets/person_view.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/widgets/sun_moon_trackball.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/widgets/wearable_outfit_list_item.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/widgets/xy_vector.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/xui_version.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/floater_about.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/floater_about_land.xml120
-rw-r--r--indra/newview/skins/default/xui/pl/floater_animation_anim_preview.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_animation_bvh_preview.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_associate_listing.xml5
-rw-r--r--indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml59
-rw-r--r--indra/newview/skins/default/xui/pl/notifications.xml1134
-rw-r--r--indra/newview/skins/default/xui/pl/panel_main_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/pl/strings.xml938
-rw-r--r--indra/newview/skins/default/xui/pt/floater_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml36
-rw-r--r--indra/newview/skins/default/xui/pt/floater_perm_prefs.xml16
-rw-r--r--indra/newview/skins/default/xui/pt/floater_voice_controls.xml30
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml21
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml31
-rw-r--r--indra/newview/skins/default/xui/pt/menu_name_field.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_people_nearby_view_sort.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_hair.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_facebook_account.xml15
-rw-r--r--indra/newview/skins/default/xui/pt/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/default/xui/pt/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/default/xui/pt/panel_main_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/panel_profile_interests.xml35
-rw-r--r--indra/newview/skins/default/xui/ru/floater_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/floater_inventory_item_properties.xml36
-rw-r--r--indra/newview/skins/default/xui/ru/floater_perm_prefs.xml15
-rw-r--r--indra/newview/skins/default/xui/ru/floater_voice_controls.xml30
-rw-r--r--indra/newview/skins/default/xui/ru/menu_inspect_avatar_gear.xml21
-rw-r--r--indra/newview/skins/default/xui/ru/menu_inspect_self_gear.xml31
-rw-r--r--indra/newview/skins/default/xui/ru/menu_name_field.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/ru/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/ru/menu_people_nearby_view_sort.xml9
-rw-r--r--indra/newview/skins/default/xui/ru/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/ru/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/default/xui/ru/panel_facebook_account.xml15
-rw-r--r--indra/newview/skins/default/xui/ru/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/default/xui/ru/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/default/xui/ru/panel_main_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/ru/panel_profile_interests.xml35
-rw-r--r--indra/newview/skins/default/xui/tr/floater_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/floater_inventory_item_properties.xml36
-rw-r--r--indra/newview/skins/default/xui/tr/floater_perm_prefs.xml15
-rw-r--r--indra/newview/skins/default/xui/tr/floater_voice_controls.xml30
-rw-r--r--indra/newview/skins/default/xui/tr/menu_inspect_avatar_gear.xml21
-rw-r--r--indra/newview/skins/default/xui/tr/menu_inspect_self_gear.xml31
-rw-r--r--indra/newview/skins/default/xui/tr/menu_name_field.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/tr/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/tr/menu_people_nearby_view_sort.xml9
-rw-r--r--indra/newview/skins/default/xui/tr/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/tr/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/default/xui/tr/panel_facebook_account.xml15
-rw-r--r--indra/newview/skins/default/xui/tr/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/default/xui/tr/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/default/xui/tr/panel_main_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/tr/panel_profile_interests.xml35
-rw-r--r--indra/newview/skins/default/xui/zh/floater_chat_bar.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/floater_inventory_item_properties.xml36
-rw-r--r--indra/newview/skins/default/xui/zh/floater_perm_prefs.xml15
-rw-r--r--indra/newview/skins/default/xui/zh/floater_voice_controls.xml30
-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_self_gear.xml31
-rw-r--r--indra/newview/skins/default/xui/zh/menu_name_field.xml6
-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_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_nearby_view_sort.xml9
-rw-r--r--indra/newview/skins/default/xui/zh/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/zh/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/default/xui/zh/panel_facebook_account.xml15
-rw-r--r--indra/newview/skins/default/xui/zh/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/default/xui/zh/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/default/xui/zh/panel_main_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/zh/panel_navmesh_rebake.xml6
-rw-r--r--indra/newview/skins/default/xui/zh/panel_profile_interests.xml35
-rwxr-xr-xindra/newview/viewer_manifest.py2
-rwxr-xr-xscripts/messages/message_template.msg19
-rwxr-xr-xscripts/messages/message_template.msg.sha12
-rw-r--r--scripts/metrics/slp_conv.py2
-rw-r--r--scripts/metrics/viewer_asset_logs.py2
-rwxr-xr-xscripts/metrics/viewerstats.py2
1104 files changed, 47448 insertions, 22253 deletions
diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index 0835f9751e..77127856c3 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -15,9 +15,6 @@ jobs:
configuration: [ReleaseOS]
addrsize: [64]
include:
- - runner: windows-large
- configuration: ReleaseOS
- addrsize: 32
- runner: macos-12-xl
developer_dir: "/Applications/Xcode_14.0.1.app/Contents/Developer"
runs-on: ${{ matrix.runner }}
diff --git a/.github/workflows/pre-commit.yaml b/.github/workflows/pre-commit.yaml
new file mode 100644
index 0000000000..17c0ace02f
--- /dev/null
+++ b/.github/workflows/pre-commit.yaml
@@ -0,0 +1,18 @@
+name: pre-commit
+
+on:
+ pull_request:
+ push:
+ branches: [main, contribute]
+ tags: [v*]
+
+
+jobs:
+ pre-commit:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v4
+ with:
+ python-version: 3.x
+ - uses: pre-commit/action@v3.0.0
diff --git a/.github/workflows/stale.yaml b/.github/workflows/stale.yaml
index 82a9a968b9..35ac41420c 100644
--- a/.github/workflows/stale.yaml
+++ b/.github/workflows/stale.yaml
@@ -15,8 +15,8 @@ jobs:
- uses: actions/stale@v6
id: stale
with:
- stale-pr-message: This pull request is stale because it has been open 60 days with no activity. Remove stale label or comment or it will be closed in 7 days
- days-before-stale: 60
+ stale-pr-message: This pull request is stale because it has been open 30 days with no activity. Remove stale label or comment or it will be closed in 7 days
+ days-before-stale: 30
days-before-close: 7
exempt-pr-labels: blocked,must,should,keep
stale-pr-label: stale
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 6d296d7a24..fe7dfbac7a 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,9 +1,8 @@
repos:
- - repo: https://bitbucket.org/lindenlab/git-hooks.git
- rev: v1.0.0-beta2
+ - repo: https://github.com/secondlife/git-hooks.git
+ rev: v1.0.0
hooks:
- id: opensource-license
- - id: jira-issue
- id: llsd
- id: no-trigraphs
- id: copyright
@@ -11,7 +10,7 @@ repos:
files: \.(cpp|c|h|py|glsl|cmake|txt)$
exclude: language.txt
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v2.5.0
+ rev: v4.4.0
hooks:
- id: check-xml
- id: mixed-line-ending
diff --git a/autobuild.xml b/autobuild.xml
index 29fee08e41..4dcca3a013 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -2759,9 +2759,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<key>archive</key>
<map>
<key>hash</key>
- <string>9e1b5515ab59b4e9cfeef6626d65d03d</string>
+ <string>8b091b1f13348eedadf66d7d81cb6bc1</string>
<key>url</key>
- <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/108609/945996/viewer_manager-3.0.577252-darwin64-577252.tar.bz2</string>
+ <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/116621/1003286/viewer_manager-3.0.580913-darwin64-580913.tar.bz2</string>
</map>
<key>name</key>
<string>darwin64</string>
@@ -2771,9 +2771,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<key>archive</key>
<map>
<key>hash</key>
- <string>a3c599595ecc8fb987a5499fca42520a</string>
+ <string>647e86470e02509b1cf89829d08dfd46</string>
<key>url</key>
- <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/108610/946003/viewer_manager-3.0.577252-windows-577252.tar.bz2</string>
+ <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/116623/1003293/viewer_manager-3.0.580913-windows-580913.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@@ -2784,7 +2784,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<key>source_type</key>
<string>hg</string>
<key>version</key>
- <string>3.0.577252</string>
+ <string>3.0.580913</string>
</map>
<key>vlc-bin</key>
<map>
diff --git a/doc/contributions.txt b/doc/contributions.txt
index c335628391..af8b259c74 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -238,6 +238,7 @@ Ansariel Hiller
SL-15227
SL-15398
SL-18432
+ SL-19140
SL-4126
Aralara Rajal
Arare Chantilly
@@ -594,6 +595,7 @@ Henri Beauchamp
VWR-4157
SL-15175
SL-19110
+ SL-19159
herina Bode
Hikkoshi Sakai
VWR-429
@@ -894,6 +896,7 @@ Kitty Barnett
STORM-2149
MAINT-7581
MAINT-7081
+ SL-18988
Kolor Fall
Komiko Okamoto
Korvel Noh
@@ -932,6 +935,8 @@ Lexi Frua
Lillie Cordeaux
Lilly Zenovka
Lizzy Macarthur
+Logue Takacs
+ INTL-490
Luban Yiyuan
Luc Starsider
Luminous Luminos
@@ -1188,6 +1193,8 @@ PanteraPolnocy
SL-18891
SL-18904
SL-18937
+ SL-19207
+ SL-19681
Parvati Silverweb
Patric Mills
VWR-2645
@@ -1413,6 +1420,7 @@ Sovereign Engineer
SL-18525
SL-18534
SL-19690
+ SL-19336
SpacedOut Frye
VWR-34
VWR-45
diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index 58a64a8755..a93c5d06e8 100644
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -171,6 +171,10 @@ if (DARWIN)
## Really?? On developer machines too?
##set(ENABLE_SIGNING TRUE)
##set(SIGNING_IDENTITY "Developer ID Application: Linden Research, Inc.")
+
+ # required for clang-15/xcode-15 since our boost package still uses deprecated std::unary_function/binary_function
+ # see https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#C++-Standard-Library
+ add_compile_definitions(_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION)
endif (DARWIN)
if (LINUX OR DARWIN)
diff --git a/indra/llappearance/CMakeLists.txt b/indra/llappearance/CMakeLists.txt
index 75c0e276eb..c3be8bc78e 100644
--- a/indra/llappearance/CMakeLists.txt
+++ b/indra/llappearance/CMakeLists.txt
@@ -21,7 +21,6 @@ set(llappearance_SOURCE_FILES
lltexglobalcolor.cpp
lltexlayer.cpp
lltexlayerparams.cpp
- lltexturemanagerbridge.cpp
llwearable.cpp
llwearabledata.cpp
llwearabletype.cpp
@@ -44,7 +43,6 @@ set(llappearance_HEADER_FILES
lltexglobalcolor.h
lltexlayer.h
lltexlayerparams.h
- lltexturemanagerbridge.h
llwearable.h
llwearabledata.h
llwearabletype.h
diff --git a/indra/llappearance/llavatarappearance.cpp b/indra/llappearance/llavatarappearance.cpp
index 7946a3e705..18b03c1f89 100644
--- a/indra/llappearance/llavatarappearance.cpp
+++ b/indra/llappearance/llavatarappearance.cpp
@@ -1050,7 +1050,6 @@ BOOL LLAvatarAppearance::loadSkeletonNode ()
mRoot->addChild(mMeshLOD[MESH_ID_UPPER_BODY]);
mRoot->addChild(mMeshLOD[MESH_ID_LOWER_BODY]);
mRoot->addChild(mMeshLOD[MESH_ID_SKIRT]);
- mRoot->addChild(mMeshLOD[MESH_ID_HEAD]);
LLAvatarJoint *skull = (LLAvatarJoint*)mRoot->findJoint("mSkull");
if (skull)
diff --git a/indra/llappearance/llwearable.h b/indra/llappearance/llwearable.h
index 875c2932f1..d86db236a3 100644
--- a/indra/llappearance/llwearable.h
+++ b/indra/llappearance/llwearable.h
@@ -32,7 +32,6 @@
#include "llsaleinfo.h"
#include "llwearabletype.h"
-class LLMD5;
class LLVisualParam;
class LLTexGlobalColorInfo;
class LLTexGlobalColor;
@@ -110,9 +109,6 @@ public:
// Something happened that requires the wearable to be updated (e.g. worn/unworn).
virtual void setUpdated() const = 0;
- // Update the baked texture hash.
- virtual void addToBakedTextureHash(LLMD5& hash) const = 0;
-
typedef std::map<S32, LLVisualParam *> visual_param_index_map_t;
visual_param_index_map_t mVisualParamIndexMap;
diff --git a/indra/llappearance/llwearabledata.cpp b/indra/llappearance/llwearabledata.cpp
index 0eaeedb6ee..9fbbc57c87 100644
--- a/indra/llappearance/llwearabledata.cpp
+++ b/indra/llappearance/llwearabledata.cpp
@@ -31,7 +31,6 @@
#include "llavatarappearance.h"
#include "llavatarappearancedefines.h"
#include "lldriverparam.h"
-#include "llmd5.h"
LLWearableData::LLWearableData() :
mAvatarAppearance(NULL)
@@ -343,42 +342,3 @@ U32 LLWearableData::getWearableCount(const U32 tex_index) const
const LLWearableType::EType wearable_type = LLAvatarAppearance::getDictionary()->getTEWearableType((LLAvatarAppearanceDefines::ETextureIndex)tex_index);
return getWearableCount(wearable_type);
}
-
-LLUUID LLWearableData::computeBakedTextureHash(LLAvatarAppearanceDefines::EBakedTextureIndex baked_index,
- BOOL generate_valid_hash) // Set to false if you want to upload the baked texture w/o putting it in the cache
-{
- LLUUID hash_id;
- bool hash_computed = false;
- LLMD5 hash;
- const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = LLAvatarAppearance::getDictionary()->getBakedTexture(baked_index);
-
- for (U8 i=0; i < baked_dict->mWearables.size(); i++)
- {
- const LLWearableType::EType baked_type = baked_dict->mWearables[i];
- const U32 num_wearables = getWearableCount(baked_type);
- for (U32 index = 0; index < num_wearables; ++index)
- {
- const LLWearable* wearable = getWearable(baked_type,index);
- if (wearable)
- {
- wearable->addToBakedTextureHash(hash);
- hash_computed = true;
- }
- }
- }
- if (hash_computed)
- {
- hash.update((const unsigned char*)baked_dict->mWearablesHashID.mData, UUID_BYTES);
-
- if (!generate_valid_hash)
- {
- invalidateBakedTextureHash(hash);
- }
- hash.finalize();
- hash.raw_digest(hash_id.mData);
- }
-
- return hash_id;
-}
-
-
diff --git a/indra/llappearance/llwearabledata.h b/indra/llappearance/llwearabledata.h
index a0c446ea9e..b8e0bf8bd1 100644
--- a/indra/llappearance/llwearabledata.h
+++ b/indra/llappearance/llwearabledata.h
@@ -86,15 +86,6 @@ private:
void pullCrossWearableValues(const LLWearableType::EType type);
//--------------------------------------------------------------------
- // Server Communication
- //--------------------------------------------------------------------
-public:
- LLUUID computeBakedTextureHash(LLAvatarAppearanceDefines::EBakedTextureIndex baked_index,
- BOOL generate_valid_hash = TRUE);
-protected:
- virtual void invalidateBakedTextureHash(LLMD5& hash) const {}
-
- //--------------------------------------------------------------------
// Member variables
//--------------------------------------------------------------------
protected:
diff --git a/indra/llaudio/llaudioengine.cpp b/indra/llaudio/llaudioengine.cpp
index ddc508455f..a387bb23cd 100644
--- a/indra/llaudio/llaudioengine.cpp
+++ b/indra/llaudio/llaudioengine.cpp
@@ -204,7 +204,8 @@ std::string LLAudioEngine::getInternetStreamURL()
{
if (mStreamingAudioImpl)
return mStreamingAudioImpl->getURL();
- else return std::string();
+
+ return std::string();
}
@@ -345,42 +346,43 @@ void LLAudioEngine::idle()
}
continue;
}
- else
+
+ // Check to see if the current sound is done playing.
+ if (!channelp->isPlaying())
{
- // Check to see if the current sound is done playing, or looped.
- if (!channelp->isPlaying())
+ sourcep->mCurrentDatap = sourcep->mQueuedDatap;
+ sourcep->mQueuedDatap = NULL;
+
+ // Reset the timer so the source doesn't die.
+ sourcep->mAgeTimer.reset();
+
+ // Make sure we have the buffer set up if we just decoded the data
+ if (sourcep->mCurrentDatap)
{
- sourcep->mCurrentDatap = sourcep->mQueuedDatap;
- sourcep->mQueuedDatap = NULL;
+ updateBufferForData(sourcep->mCurrentDatap);
+ }
- // Reset the timer so the source doesn't die.
- sourcep->mAgeTimer.reset();
+ // Actually play the associated data.
+ sourcep->setupChannel();
+ channelp->updateBuffer();
+ sourcep->getChannel()->play();
+ continue;
+ }
- // Make sure we have the buffer set up if we just decoded the data
- if (sourcep->mCurrentDatap)
- {
- updateBufferForData(sourcep->mCurrentDatap);
- }
+ // Check to see if the current sound is looped.
+ if (sourcep->isLoop())
+ {
+ // It's a loop, we need to check and see if we're done with it.
+ if (channelp->mLoopedThisFrame)
+ {
+ sourcep->mCurrentDatap = sourcep->mQueuedDatap;
+ sourcep->mQueuedDatap = NULL;
- // Actually play the associated data.
+ // Actually, should do a time sync so if we're a loop master/slave
+ // we don't drift away.
sourcep->setupChannel();
- channelp->updateBuffer();
sourcep->getChannel()->play();
}
- else if (sourcep->isLoop())
- {
- // It's a loop, we need to check and see if we're done with it.
- if (channelp->mLoopedThisFrame)
- {
- sourcep->mCurrentDatap = sourcep->mQueuedDatap;
- sourcep->mQueuedDatap = NULL;
-
- // Actually, should do a time sync so if we're a loop master/slave
- // we don't drift away.
- sourcep->setupChannel();
- sourcep->getChannel()->play();
- }
- }
}
}
@@ -396,18 +398,11 @@ void LLAudioEngine::idle()
for (source_map::value_type& src_pair : mAllSources)
{
LLAudioSource *sourcep = src_pair.second;
- if (sourcep->isMuted())
- {
- continue;
- }
- if (sourcep->isSyncMaster())
+ if (sourcep->isMuted() && sourcep->isSyncMaster() && sourcep->getPriority() > max_sm_priority)
{
- if (sourcep->getPriority() > max_sm_priority)
- {
- sync_masterp = sourcep;
- master_channelp = sync_masterp->getChannel();
- max_sm_priority = sourcep->getPriority();
- }
+ sync_masterp = sourcep;
+ master_channelp = sync_masterp->getChannel();
+ max_sm_priority = sourcep->getPriority();
}
}
@@ -737,7 +732,7 @@ F64 LLAudioEngine::mapWindVecToGain(LLVector3 wind_vec)
}
return (gain);
-}
+}
F64 LLAudioEngine::mapWindVecToPitch(LLVector3 wind_vec)
@@ -964,12 +959,11 @@ void LLAudioEngine::cleanupAudioSource(LLAudioSource *asp)
else
{
LL_DEBUGS("AudioEngine") << "Cleaning up audio sources for "<< asp->getID() <<LL_ENDL;
- delete asp;
- mAllSources.erase(iter);
-}
+ delete asp;
+ mAllSources.erase(iter);
+ }
}
-
bool LLAudioEngine::hasDecodedFile(const LLUUID &uuid)
{
std::string uuid_str;
@@ -1687,20 +1681,19 @@ void LLAudioChannel::setSource(LLAudioSource *sourcep)
{
LL_DEBUGS("AudioEngine") << "( id: " << sourcep->getID() << ")" << LL_ENDL;
- if (sourcep == mCurrentSourcep)
- {
- // Don't reallocate the channel, this will make FMOD goofy.
- //LL_INFOS() << "Calling setSource with same source!" << LL_ENDL;
- }
+ if (sourcep == mCurrentSourcep)
+ {
+ // Don't reallocate the channel, this will make FMOD goofy.
+ //LL_INFOS() << "Calling setSource with same source!" << LL_ENDL;
+ }
- mCurrentSourcep = sourcep;
+ mCurrentSourcep = sourcep;
- updateBuffer();
- update3DPosition();
-}
+ updateBuffer();
+ update3DPosition();
+ }
}
-
bool LLAudioChannel::updateBuffer()
{
if (!gAudiop)
diff --git a/indra/llaudio/llaudioengine.h b/indra/llaudio/llaudioengine.h
index 0fe8b3d756..a133898969 100755
--- a/indra/llaudio/llaudioengine.h
+++ b/indra/llaudio/llaudioengine.h
@@ -90,6 +90,7 @@ public:
// initialization/startup/shutdown
virtual bool init(void *userdata, const std::string &app_title);
virtual std::string getDriverName(bool verbose) = 0;
+ virtual LLStreamingAudioInterface *createDefaultStreamingAudioImpl() const = 0;
virtual void shutdown();
// Used by the mechanics of the engine
@@ -468,13 +469,13 @@ struct SoundData
const LLUUID& owner_id,
const F32 gain,
const S32 type = LLAudioEngine::AUDIO_TYPE_NONE,
- const LLVector3d &pos_global = LLVector3d::zero)
+ const LLVector3d &pos_global = LLVector3d::zero) :
+ audio_uuid(audio_uuid),
+ owner_id(owner_id),
+ gain(gain),
+ type(type),
+ pos_global(pos_global)
{
- this->audio_uuid = audio_uuid;
- this->owner_id = owner_id;
- this->gain = gain;
- this->type = type;
- this->pos_global = pos_global;
}
};
diff --git a/indra/llaudio/llaudioengine_fmodstudio.cpp b/indra/llaudio/llaudioengine_fmodstudio.cpp
index ba743020b5..c6313ea289 100644
--- a/indra/llaudio/llaudioengine_fmodstudio.cpp
+++ b/indra/llaudio/llaudioengine_fmodstudio.cpp
@@ -208,10 +208,6 @@ bool LLAudioEngine_FMODSTUDIO::init(void* userdata, const std::string &app_title
}
#endif
- // set up our favourite FMOD-native streaming audio implementation if none has already been added
- if (!getStreamingAudioImpl()) // no existing implementation added
- setStreamingAudioImpl(new LLStreamingAudio_FMODSTUDIO(mSystem));
-
LL_INFOS("AppInit") << "LLAudioEngine_FMODSTUDIO::init() FMOD Studio initialized correctly" << LL_ENDL;
int r_numbuffers, r_samplerate, r_channels;
@@ -253,6 +249,13 @@ std::string LLAudioEngine_FMODSTUDIO::getDriverName(bool verbose)
}
+// create our favourite FMOD-native streaming audio implementation
+LLStreamingAudioInterface *LLAudioEngine_FMODSTUDIO::createDefaultStreamingAudioImpl() const
+{
+ return new LLStreamingAudio_FMODSTUDIO(mSystem);
+}
+
+
void LLAudioEngine_FMODSTUDIO::allocateListener(void)
{
mListenerp = (LLListener *) new LLListener_FMODSTUDIO(mSystem);
diff --git a/indra/llaudio/llaudioengine_fmodstudio.h b/indra/llaudio/llaudioengine_fmodstudio.h
index d3d6d69685..29e7bc6bf0 100644
--- a/indra/llaudio/llaudioengine_fmodstudio.h
+++ b/indra/llaudio/llaudioengine_fmodstudio.h
@@ -53,6 +53,7 @@ public:
// initialization/startup/shutdown
virtual bool init(void *user_data, const std::string &app_title);
virtual std::string getDriverName(bool verbose);
+ virtual LLStreamingAudioInterface* createDefaultStreamingAudioImpl() const;
virtual void allocateListener();
virtual void shutdown();
diff --git a/indra/llcharacter/llbvhloader.cpp b/indra/llcharacter/llbvhloader.cpp
index 117d408b21..5b1b28bf4f 100644
--- a/indra/llcharacter/llbvhloader.cpp
+++ b/indra/llcharacter/llbvhloader.cpp
@@ -1352,7 +1352,6 @@ BOOL LLBVHLoader::serialize(LLDataPacker& dp)
dp.packS32(joint->mNumRotKeys, "num_rot_keys");
LLQuaternion::Order order = bvhStringToOrder( joint->mOrder );
- S32 outcount = 0;
S32 frame = 0;
for (Key& key : joint->mKeys)
{
@@ -1418,7 +1417,6 @@ BOOL LLBVHLoader::serialize(LLDataPacker& dp)
dp.packU16(x, "rot_angle_x");
dp.packU16(y, "rot_angle_y");
dp.packU16(z, "rot_angle_z");
- outcount++;
frame++;
}
diff --git a/indra/llcharacter/llkeyframemotion.cpp b/indra/llcharacter/llkeyframemotion.cpp
index 6720f902bd..d95ec159f2 100644
--- a/indra/llcharacter/llkeyframemotion.cpp
+++ b/indra/llcharacter/llkeyframemotion.cpp
@@ -497,13 +497,20 @@ LLMotion::LLMotionInitStatus LLKeyframeMotion::onInitialize(LLCharacter *charact
// request asset
mAssetStatus = ASSET_FETCHED;
- LL_DEBUGS("Animation") << "Requesting data fetch for: " << mID << LL_ENDL;
- character_id = new LLUUID(mCharacter->getID());
- gAssetStorage->getAssetData(mID,
- LLAssetType::AT_ANIMATION,
- onLoadComplete,
- (void *)character_id,
- FALSE);
+ if (mID.notNull())
+ {
+ LL_DEBUGS("Animation") << "Requesting data fetch for: " << mID << LL_ENDL;
+ character_id = new LLUUID(mCharacter->getID());
+ gAssetStorage->getAssetData(mID,
+ LLAssetType::AT_ANIMATION,
+ onLoadComplete,
+ (void*)character_id,
+ FALSE);
+ }
+ else
+ {
+ LL_INFOS("Animation") << "Attempted to fetch animation " << mName << " with null id for character " << mCharacter->getID() << LL_ENDL;
+ }
return STATUS_HOLD;
case ASSET_FETCHED:
@@ -1391,6 +1398,8 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp, const LLUUID& asset_id, boo
// get number of joint motions
//-------------------------------------------------------------------------
U32 num_motions = 0;
+ S32 rotation_dupplicates = 0;
+ S32 position_dupplicates = 0;
if (!dp.unpackU32(num_motions, "num_joints"))
{
LL_WARNS() << "can't read number of joints"
@@ -1621,6 +1630,12 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp, const LLUUID& asset_id, boo
rCurve->mKeys[time] = rot_key;
}
+ if (joint_motion->mRotationCurve.mNumKeys > joint_motion->mRotationCurve.mKeys.size())
+ {
+ rotation_dupplicates++;
+ LL_INFOS() << "Motion: " << asset_id << " had dupplicate rotation keys that were removed" << LL_ENDL;
+ }
+
//---------------------------------------------------------------------
// scan position curve header
//---------------------------------------------------------------------
@@ -1723,9 +1738,24 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp, const LLUUID& asset_id, boo
}
}
+ if (joint_motion->mPositionCurve.mNumKeys > joint_motion->mPositionCurve.mKeys.size())
+ {
+ position_dupplicates++;
+ }
+
joint_motion->mUsage = joint_state->getUsage();
}
+ if (rotation_dupplicates > 0)
+ {
+ LL_INFOS() << "Motion: " << asset_id << " had " << rotation_dupplicates << " dupplicate rotation keys that were removed" << LL_ENDL;
+ }
+
+ if (position_dupplicates > 0)
+ {
+ LL_INFOS() << "Motion: " << asset_id << " had " << position_dupplicates << " dupplicate position keys that were removed" << LL_ENDL;
+ }
+
//-------------------------------------------------------------------------
// get number of constraints
//-------------------------------------------------------------------------
@@ -2005,10 +2035,13 @@ BOOL LLKeyframeMotion::serialize(LLDataPacker& dp) const
JointMotion* joint_motionp = mJointMotionList->getJointMotion(i);
success &= dp.packString(joint_motionp->mJointName, "joint_name");
success &= dp.packS32(joint_motionp->mPriority, "joint_priority");
- success &= dp.packS32(joint_motionp->mRotationCurve.mNumKeys, "num_rot_keys");
+ success &= dp.packS32(joint_motionp->mRotationCurve.mKeys.size(), "num_rot_keys");
- LL_DEBUGS("BVH") << "Joint " << joint_motionp->mJointName << LL_ENDL;
- for (RotationCurve::key_map_t::value_type& rot_pair : joint_motionp->mRotationCurve.mKeys)
+ LL_DEBUGS("BVH") << "Joint " << i
+ << " name: " << joint_motionp->mJointName
+ << " Rotation keys: " << joint_motionp->mRotationCurve.mKeys.size()
+ << " Position keys: " << joint_motionp->mPositionCurve.mKeys.size() << LL_ENDL;
+ for (RotationCurve::key_map_t::value_type& rot_pair : joint_motionp->mRotationCurve.mKeys)
{
RotationKey& rot_key = rot_pair.second;
U16 time_short = F32_to_U16(rot_key.mTime, 0.f, mJointMotionList->mDuration);
@@ -2028,7 +2061,7 @@ BOOL LLKeyframeMotion::serialize(LLDataPacker& dp) const
LL_DEBUGS("BVH") << " rot: t " << rot_key.mTime << " angles " << rot_angles.mV[VX] <<","<< rot_angles.mV[VY] <<","<< rot_angles.mV[VZ] << LL_ENDL;
}
- success &= dp.packS32(joint_motionp->mPositionCurve.mNumKeys, "num_pos_keys");
+ success &= dp.packS32(joint_motionp->mPositionCurve.mKeys.size(), "num_pos_keys");
for (PositionCurve::key_map_t::value_type& pos_pair : joint_motionp->mPositionCurve.mKeys)
{
PositionKey& pos_key = pos_pair.second;
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index 516813aae1..fa9c6eaa79 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -40,7 +40,6 @@ set(llcommon_SOURCE_FILES
lldependencies.cpp
lldictionary.cpp
llerror.cpp
- llerrorthread.cpp
llevent.cpp
lleventapi.cpp
lleventcoro.cpp
@@ -153,7 +152,6 @@ set(llcommon_HEADER_FILES
llendianswizzle.h
llerror.h
llerrorcontrol.h
- llerrorthread.h
llevent.h
lleventapi.h
lleventcoro.h
diff --git a/indra/llcommon/hbxxh.h b/indra/llcommon/hbxxh.h
index 236716722a..9c0e9cf172 100644
--- a/indra/llcommon/hbxxh.h
+++ b/indra/llcommon/hbxxh.h
@@ -96,6 +96,15 @@ public:
}
}
+ // Make this class no-copy (it would be possible, with custom copy
+ // operators, but it is not trivially copyable, because of the mState
+ // pointer): it does not really make sense to allow copying it anyway,
+ // since all we care about is the resulting digest (so you should only
+ // need and care about storing/copying the digest and not a class
+ // instance).
+ HBXXH64(const HBXXH64&) noexcept = delete;
+ HBXXH64& operator=(const HBXXH64&) noexcept = delete;
+
~HBXXH64();
void update(const void* buffer, size_t len);
@@ -199,6 +208,15 @@ public:
}
}
+ // Make this class no-copy (it would be possible, with custom copy
+ // operators, but it is not trivially copyable, because of the mState
+ // pointer): it does not really make sense to allow copying it anyway,
+ // since all we care about is the resulting digest (so you should only
+ // need and care about storing/copying the digest and not a class
+ // instance).
+ HBXXH128(const HBXXH128&) noexcept = delete;
+ HBXXH128& operator=(const HBXXH128&) noexcept = delete;
+
~HBXXH128();
void update(const void* buffer, size_t len);
diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h
index 10b98f49aa..679f79039b 100644
--- a/indra/llcommon/indra_constants.h
+++ b/indra/llcommon/indra_constants.h
@@ -345,6 +345,7 @@ const U8 CLICK_ACTION_PLAY = 5;
const U8 CLICK_ACTION_OPEN_MEDIA = 6;
const U8 CLICK_ACTION_ZOOM = 7;
const U8 CLICK_ACTION_DISABLED = 8;
+const U8 CLICK_ACTION_IGNORE = 9;
// DO NOT CHANGE THE SEQUENCE OF THIS LIST!!
diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp
index d839b19c99..b99166991f 100644
--- a/indra/llcommon/llapp.cpp
+++ b/indra/llcommon/llapp.cpp
@@ -39,7 +39,6 @@
#include "llcommon.h"
#include "llapr.h"
#include "llerrorcontrol.h"
-#include "llerrorthread.h"
#include "llframetimer.h"
#include "lllivefile.h"
#include "llmemory.h"
@@ -108,12 +107,7 @@ LLAppErrorHandler LLApp::sErrorHandler = NULL;
BOOL LLApp::sErrorThreadRunning = FALSE;
-LLApp::LLApp() : mThreadErrorp(NULL)
-{
- commonCtor();
-}
-
-void LLApp::commonCtor()
+LLApp::LLApp()
{
// Set our status to running
setStatus(APP_STATUS_RUNNING);
@@ -143,12 +137,6 @@ void LLApp::commonCtor()
mCrashReportPipeStr = L"\\\\.\\pipe\\LLCrashReporterPipe";
}
-LLApp::LLApp(LLErrorThread *error_thread) :
- mThreadErrorp(error_thread)
-{
- commonCtor();
-}
-
LLApp::~LLApp()
{
@@ -158,13 +146,6 @@ LLApp::~LLApp()
mLiveFiles.clear();
setStopped();
- // HACK: wait for the error thread to clean itself
- ms_sleep(20);
- if (mThreadErrorp)
- {
- delete mThreadErrorp;
- mThreadErrorp = NULL;
- }
SUBSYSTEM_CLEANUP_DBG(LLCommon);
}
@@ -393,27 +374,6 @@ void LLApp::setupErrorHandling(bool second_instance)
#endif // ! LL_BUGSPLAT
#endif // ! LL_WINDOWS
-
-#ifdef LL_BUGSPLAT
- // do not start our own error thread
-#else // ! LL_BUGSPLAT
- startErrorThread();
-#endif
-}
-
-void LLApp::startErrorThread()
-{
- //
- // Start the error handling thread, which is responsible for taking action
- // when the app goes into the APP_STATUS_ERROR state
- //
- if(!mThreadErrorp)
- {
- LL_INFOS() << "Starting error thread" << LL_ENDL;
- mThreadErrorp = new LLErrorThread();
- mThreadErrorp->setUserData((void *) this);
- mThreadErrorp->start();
- }
}
void LLApp::setErrorHandler(LLAppErrorHandler handler)
@@ -476,7 +436,7 @@ void LLApp::setStatus(EAppStatus status)
// static
void LLApp::setError()
{
- // set app status to ERROR so that the LLErrorThread notices
+ // set app status to ERROR
setStatus(APP_STATUS_ERROR);
}
diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h
index c65fe21c9c..c832c8b142 100644
--- a/indra/llcommon/llapp.h
+++ b/indra/llcommon/llapp.h
@@ -34,7 +34,6 @@
#include <atomic>
#include <chrono>
// Forward declarations
-class LLErrorThread;
class LLLiveFile;
#if LL_LINUX
#include <signal.h>
@@ -53,7 +52,6 @@ void clear_signals();
class LL_COMMON_API LLApp
{
- friend class LLErrorThread;
public:
typedef enum e_app_status
{
@@ -67,11 +65,6 @@ public:
LLApp();
virtual ~LLApp();
-protected:
- LLApp(LLErrorThread* error_thread);
- void commonCtor();
-public:
-
/**
* @brief Return the static app instance if one was created.
*/
@@ -257,14 +250,14 @@ public:
void setupErrorHandling(bool mSecondInstance=false);
void setErrorHandler(LLAppErrorHandler handler);
- static void runErrorHandler(); // run shortly after we detect an error, ran in the relatively robust context of the LLErrorThread - preferred.
+ static void runErrorHandler(); // run shortly after we detect an error
//@}
-
+
// the maximum length of the minidump filename returned by getMiniDumpFilename()
static const U32 MAX_MINDUMP_PATH_LENGTH = 256;
// change the directory where Breakpad minidump files are written to
- void setDebugFileNames(const std::string &path);
+ void setDebugFileNames(const std::string &path);
// Return the Google Breakpad minidump filename after a crash.
char *getMiniDumpFilename() { return mMinidumpPath; }
@@ -310,13 +303,11 @@ protected:
void stepFrame();
private:
- void startErrorThread();
-
// Contains the filename of the minidump file after a crash.
char mMinidumpPath[MAX_MINDUMP_PATH_LENGTH];
- std::string mStaticDebugFileName;
- std::string mDynamicDebugFileName;
+ std::string mStaticDebugFileName;
+ std::string mDynamicDebugFileName;
// *NOTE: On Windows, we need a routine to reset the structured
// exception handler when some evil driver has taken it over for
@@ -324,9 +315,6 @@ private:
typedef int(*signal_handler_func)(int signum);
static LLAppErrorHandler sErrorHandler;
- // Default application threads
- LLErrorThread* mThreadErrorp; // Waits for app to go to status ERROR, then runs the error callback
-
// This is the application level runnable scheduler.
LLRunner mRunner;
diff --git a/indra/llcommon/llcallbacklist.cpp b/indra/llcommon/llcallbacklist.cpp
index 93d0a035da..9f23ce5317 100644
--- a/indra/llcommon/llcallbacklist.cpp
+++ b/indra/llcommon/llcallbacklist.cpp
@@ -55,7 +55,7 @@ void LLCallbackList::addFunction( callback_t func, void *data)
// only add one callback per func/data pair
//
- if (containsFunction(func))
+ if (containsFunction(func, data))
{
return;
}
diff --git a/indra/llcommon/lldefs.h b/indra/llcommon/lldefs.h
index 5c46f6a796..4e25001fff 100644
--- a/indra/llcommon/lldefs.h
+++ b/indra/llcommon/lldefs.h
@@ -167,48 +167,34 @@ const U32 MAXADDRSTR = 17; // 123.567.901.345 = 15 chars + \0 + 1 for good luc
//
// defined for U16, U32, U64, S16, S32, S64, :
// llclampb(a) // clamps a to [0 .. 255]
-//
-
-template <typename T1, typename T2>
-inline auto llmax(T1 d1, T2 d2)
-{
- return (d1 > d2) ? d1 : d2;
-}
-
-template <typename T1, typename T2, typename T3>
-inline auto llmax(T1 d1, T2 d2, T3 d3)
-{
- auto r = llmax(d1,d2);
- return llmax(r, d3);
-}
+//
-template <typename T1, typename T2, typename T3, typename T4>
-inline auto llmax(T1 d1, T2 d2, T3 d3, T4 d4)
+// recursion tail
+template <typename T>
+inline auto llmax(T data)
{
- auto r1 = llmax(d1,d2);
- auto r2 = llmax(d3,d4);
- return llmax(r1, r2);
+ return data;
}
-template <typename T1, typename T2>
-inline auto llmin(T1 d1, T2 d2)
+template <typename T0, typename T1, typename... Ts>
+inline auto llmax(T0 d0, T1 d1, Ts... rest)
{
- return (d1 < d2) ? d1 : d2;
+ auto maxrest = llmax(d1, rest...);
+ return (d0 > maxrest)? d0 : maxrest;
}
-template <typename T1, typename T2, typename T3>
-inline auto llmin(T1 d1, T2 d2, T3 d3)
+// recursion tail
+template <typename T>
+inline auto llmin(T data)
{
- auto r = llmin(d1,d2);
- return (r < d3 ? r : d3);
+ return data;
}
-template <typename T1, typename T2, typename T3, typename T4>
-inline auto llmin(T1 d1, T2 d2, T3 d3, T4 d4)
+template <typename T0, typename T1, typename... Ts>
+inline auto llmin(T0 d0, T1 d1, Ts... rest)
{
- auto r1 = llmin(d1,d2);
- auto r2 = llmin(d3,d4);
- return llmin(r1, r2);
+ auto minrest = llmin(d1, rest...);
+ return (d0 < minrest) ? d0 : minrest;
}
template <typename A, typename MIN, typename MAX>
diff --git a/indra/llcommon/llerror.h b/indra/llcommon/llerror.h
index 08eb323c4a..f229b4964a 100644
--- a/indra/llcommon/llerror.h
+++ b/indra/llcommon/llerror.h
@@ -276,7 +276,6 @@ namespace LLError
// used to indicate no class info known for logging
//LLCallStacks keeps track of call stacks and output the call stacks to log file
- //when LLAppViewer::handleViewerCrash() is triggered.
//
//Note: to be simple, efficient and necessary to keep track of correct call stacks,
//LLCallStacks is designed not to be thread-safe.
diff --git a/indra/llcommon/llerrorthread.cpp b/indra/llcommon/llerrorthread.cpp
deleted file mode 100644
index f6bc68b5c1..0000000000
--- a/indra/llcommon/llerrorthread.cpp
+++ /dev/null
@@ -1,133 +0,0 @@
-/**
- * @file llerrorthread.cpp
- *
- * $LicenseInfo:firstyear=2004&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 "linden_common.h"
-#include "llerrorthread.h"
-
-#include "llapp.h"
-#include "lltimer.h" // ms_sleep()
-
-LLErrorThread::LLErrorThread()
- : LLThread("Error"),
- mUserDatap(NULL)
-{
-}
-
-LLErrorThread::~LLErrorThread()
-{
-}
-
-void LLErrorThread::setUserData(void* user_data)
-{
- mUserDatap = user_data;
-}
-
-
-void* LLErrorThread::getUserData() const
-{
- return mUserDatap;
-}
-
-#if !LL_WINDOWS
-//
-// Various signal/error handling functions that can't be put into the class
-//
-void get_child_status(const int waitpid_status, int &process_status, bool &exited, bool do_logging)
-{
- exited = false;
- process_status = -1;
- // The child process exited. Call its callback, and then clean it up
- if (WIFEXITED(waitpid_status))
- {
- process_status = WEXITSTATUS(waitpid_status);
- exited = true;
- if (do_logging)
- {
- LL_INFOS() << "get_child_status - Child exited cleanly with return of " << process_status << LL_ENDL;
- }
- return;
- }
- else if (WIFSIGNALED(waitpid_status))
- {
- process_status = WTERMSIG(waitpid_status);
- exited = true;
- if (do_logging)
- {
- LL_INFOS() << "get_child_status - Child died because of uncaught signal " << process_status << LL_ENDL;
-#ifdef WCOREDUMP
- if (WCOREDUMP(waitpid_status))
- {
- LL_INFOS() << "get_child_status - Child dumped core" << LL_ENDL;
- }
- else
- {
- LL_INFOS() << "get_child_status - Child didn't dump core" << LL_ENDL;
- }
-#endif
- }
- return;
- }
- else if (do_logging)
- {
- // This is weird. I just dump the waitpid status into the status code,
- // not that there's any way of telling what it is...
- LL_INFOS() << "get_child_status - Got SIGCHILD but child didn't exit" << LL_ENDL;
- process_status = waitpid_status;
- }
-
-}
-#endif
-
-void LLErrorThread::run()
-{
- LLApp::sErrorThreadRunning = TRUE;
- // This thread sits and waits for the sole purpose
- // of waiting for the signal/exception handlers to flag the
- // application state as APP_STATUS_ERROR.
- LL_INFOS() << "thread_error - Waiting for an error" << LL_ENDL;
-
- S32 counter = 0;
- while (! (LLApp::isError() || LLApp::isStopped()))
- {
- ms_sleep(10);
- counter++;
- }
- if (LLApp::isError())
- {
- // The app is in an error state, run the application's error handler.
- //LL_INFOS() << "thread_error - An error has occurred, running error callback!" << LL_ENDL;
- // Run the error handling callback
- LLApp::runErrorHandler();
- }
- else
- {
- // Everything is okay, a clean exit.
- //LL_INFOS() << "thread_error - Application exited cleanly" << LL_ENDL;
- }
-
- //LL_INFOS() << "thread_error - Exiting" << LL_ENDL;
- LLApp::sErrorThreadRunning = FALSE;
-}
-
diff --git a/indra/llcommon/llleap.cpp b/indra/llcommon/llleap.cpp
index c87c0758fe..259f5bc505 100644
--- a/indra/llcommon/llleap.cpp
+++ b/indra/llcommon/llleap.cpp
@@ -204,30 +204,35 @@ public:
LLSD packet(LLSDMap("pump", pump)("data", data));
std::ostringstream buffer;
- buffer << LLSDNotationStreamer(packet);
+ // SL-18330: for large data blocks, it's much faster to parse binary
+ // LLSD than notation LLSD. Use serialize(LLSD_BINARY) rather than
+ // directly calling LLSDBinaryFormatter because, unlike the latter,
+ // serialize() prepends the relevant header, needed by a general-
+ // purpose LLSD parser to distinguish binary from notation.
+ LLSDSerialize::serialize(packet, buffer, LLSDSerialize::LLSD_BINARY,
+ LLSDFormatter::OPTIONS_NONE);
/*==========================================================================*|
// DEBUGGING ONLY: don't copy str() if we can avoid it.
std::string strdata(buffer.str());
if (std::size_t(buffer.tellp()) != strdata.length())
{
- LL_ERRS("LLLeap") << "tellp() -> " << buffer.tellp() << " != "
+ LL_ERRS("LLLeap") << "tellp() -> " << static_cast<U64>(buffer.tellp()) << " != "
<< "str().length() -> " << strdata.length() << LL_ENDL;
}
// DEBUGGING ONLY: reading back is terribly inefficient.
std::istringstream readback(strdata);
LLSD echo;
- LLPointer<LLSDParser> parser(new LLSDNotationParser());
- S32 parse_status(parser->parse(readback, echo, strdata.length()));
- if (parse_status == LLSDParser::PARSE_FAILURE)
+ bool parse_status(LLSDSerialize::deserialize(echo, readback, strdata.length()));
+ if (! parse_status)
{
- LL_ERRS("LLLeap") << "LLSDNotationParser() cannot parse output of "
- << "LLSDNotationStreamer()" << LL_ENDL;
+ LL_ERRS("LLLeap") << "LLSDSerialize::deserialize() cannot parse output of "
+ << "LLSDSerialize::serialize(LLSD_BINARY)" << LL_ENDL;
}
if (! llsd_equals(echo, packet))
{
- LL_ERRS("LLLeap") << "LLSDNotationParser() produced different LLSD "
- << "than passed to LLSDNotationStreamer()" << LL_ENDL;
+ LL_ERRS("LLLeap") << "LLSDSerialize::deserialize() returned different LLSD "
+ << "than passed to LLSDSerialize::serialize()" << LL_ENDL;
}
|*==========================================================================*/
@@ -314,9 +319,17 @@ public:
LL_DEBUGS("LLLeap") << "needed " << mExpect << " bytes, got "
<< childout.size() << ", parsing LLSD" << LL_ENDL;
LLSD data;
+#if 1
+ // specifically require notation LLSD from child
LLPointer<LLSDParser> parser(new LLSDNotationParser());
S32 parse_status(parser->parse(childout.get_istream(), data, mExpect));
if (parse_status == LLSDParser::PARSE_FAILURE)
+#else
+ // SL-18330: accept any valid LLSD serialization format from child
+ // Unfortunately this runs into trouble we have not yet debugged.
+ bool parse_status(LLSDSerialize::deserialize(data, childout.get_istream(), mExpect));
+ if (! parse_status)
+#endif
{
bad_protocol("unparseable LLSD data");
}
diff --git a/indra/llcommon/llmd5.cpp b/indra/llcommon/llmd5.cpp
index 9b2a2bab60..0abe817f1d 100644
--- a/indra/llcommon/llmd5.cpp
+++ b/indra/llcommon/llmd5.cpp
@@ -96,7 +96,7 @@ LLMD5::LLMD5()
// operation, processing another message block, and updating the
// context.
-void LLMD5::update (const uint1 *input, const size_t input_length) {
+void LLMD5::update (const uint8_t *input, const size_t input_length) {
size_t input_index, buffer_index;
size_t buffer_space; // how much space is left in buffer
@@ -189,7 +189,7 @@ void LLMD5::finalize (){
unsigned char bits[8]; /* Flawfinder: ignore */
size_t index, padLen;
- static uint1 PADDING[64]={
+ static uint8_t PADDING[64]={
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
@@ -201,8 +201,8 @@ void LLMD5::finalize (){
}
// Save number of bits.
- // Treat count, a uint64_t, as uint4[2].
- encode (bits, reinterpret_cast<uint4*>(&count), 8);
+ // Treat count, a uint64_t, as uint32_t[2].
+ encode (bits, reinterpret_cast<uint32_t*>(&count), 8);
// Pad out to 56 mod 64.
index = size_t((count >> 3) & 0x3f);
@@ -412,7 +412,7 @@ Rotation is separate from addition to prevent recomputation.
// LLMD5 basic transformation. Transforms state based on block.
void LLMD5::transform (const U8 block[64]){
- uint4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
+ uint32_t a = state[0], b = state[1], c = state[2], d = state[3], x[16];
decode (x, block, 64);
@@ -496,38 +496,38 @@ void LLMD5::transform (const U8 block[64]){
state[3] += d;
// Zeroize sensitive information.
- memset ( (uint1 *) x, 0, sizeof(x));
+ memset ( (uint8_t *) x, 0, sizeof(x));
}
-// Encodes input (UINT4) into output (unsigned char). Assumes len is
+// Encodes input (uint32_t) into output (unsigned char). Assumes len is
// a multiple of 4.
-void LLMD5::encode (uint1 *output, const uint4 *input, const size_t len) {
+void LLMD5::encode (uint8_t *output, const uint32_t *input, const size_t len) {
size_t i, j;
for (i = 0, j = 0; j < len; i++, j += 4) {
- output[j] = (uint1) (input[i] & 0xff);
- output[j+1] = (uint1) ((input[i] >> 8) & 0xff);
- output[j+2] = (uint1) ((input[i] >> 16) & 0xff);
- output[j+3] = (uint1) ((input[i] >> 24) & 0xff);
+ output[j] = (uint8_t) (input[i] & 0xff);
+ output[j+1] = (uint8_t) ((input[i] >> 8) & 0xff);
+ output[j+2] = (uint8_t) ((input[i] >> 16) & 0xff);
+ output[j+3] = (uint8_t) ((input[i] >> 24) & 0xff);
}
}
-// Decodes input (unsigned char) into output (UINT4). Assumes len is
+// Decodes input (unsigned char) into output (uint32_t). Assumes len is
// a multiple of 4.
-void LLMD5::decode (uint4 *output, const uint1 *input, const size_t len){
+void LLMD5::decode (uint32_t *output, const uint8_t *input, const size_t len){
size_t i, j;
for (i = 0, j = 0; j < len; i++, j += 4)
- output[i] = ((uint4)input[j]) | (((uint4)input[j+1]) << 8) |
- (((uint4)input[j+2]) << 16) | (((uint4)input[j+3]) << 24);
+ output[i] = ((uint32_t)input[j]) | (((uint32_t)input[j+1]) << 8) |
+ (((uint32_t)input[j+2]) << 16) | (((uint32_t)input[j+3]) << 24);
}
diff --git a/indra/llcommon/llmd5.h b/indra/llcommon/llmd5.h
index 8530dc0389..7d6373c20c 100644
--- a/indra/llcommon/llmd5.h
+++ b/indra/llcommon/llmd5.h
@@ -67,6 +67,8 @@ documentation and/or software.
*/
+#include <cstdint> // uint32_t et al.
+
// use for the raw digest output
const int MD5RAW_BYTES = 16;
@@ -75,18 +77,13 @@ const int MD5HEX_STR_SIZE = 33; // char hex[MD5HEX_STR_SIZE]; with null
const int MD5HEX_STR_BYTES = 32; // message system fixed size
class LL_COMMON_API LLMD5 {
-// first, some types:
- typedef unsigned int uint4; // assumes integer is 4 words long
- typedef unsigned short int uint2; // assumes short integer is 2 words long
- typedef unsigned char uint1; // assumes char is 1 word long
-
// how many bytes to grab at a time when checking files
static const int BLOCK_LEN;
public:
// methods for controlled operation:
LLMD5 (); // simple initializer
- void update (const uint1 *input, const size_t input_length);
+ void update (const uint8_t *input, const size_t input_length);
void update (std::istream& stream);
void update (FILE *file);
void update (const std::string& str);
@@ -109,19 +106,19 @@ private:
// next, the private data:
- uint4 state[4];
+ uint32_t state[4];
uint64_t count; // number of *bits*, mod 2^64
- uint1 buffer[64]; // input buffer
- uint1 digest[16];
- uint1 finalized;
+ uint8_t buffer[64]; // input buffer
+ uint8_t digest[16];
+ uint8_t finalized;
// last, the private methods, mostly static:
void init (); // called by all constructors
- void transform (const uint1 *buffer); // does the real update work. Note
+ void transform (const uint8_t *buffer); // does the real update work. Note
// that length is implied to be 64.
- static void encode (uint1 *dest, const uint4 *src, const size_t length);
- static void decode (uint4 *dest, const uint1 *src, const size_t length);
+ static void encode (uint8_t *dest, const uint32_t *src, const size_t length);
+ static void decode (uint32_t *dest, const uint8_t *src, const size_t length);
};
diff --git a/indra/llcommon/llsdserialize.cpp b/indra/llcommon/llsdserialize.cpp
index b7e316da10..3db456ddb3 100644
--- a/indra/llcommon/llsdserialize.cpp
+++ b/indra/llcommon/llsdserialize.cpp
@@ -48,6 +48,7 @@
#endif
#include "lldate.h"
+#include "llmemorystream.h"
#include "llsd.h"
#include "llstring.h"
#include "lluri.h"
@@ -64,6 +65,23 @@ const std::string LLSD_NOTATION_HEADER("llsd/notation");
#define windowBits 15
#define ENABLE_ZLIB_GZIP 32
+// If we published this in llsdserialize.h, we could use it in the
+// implementation of LLSDOStreamer's operator<<().
+template <class Formatter>
+void format_using(const LLSD& data, std::ostream& ostr,
+ LLSDFormatter::EFormatterOptions options=LLSDFormatter::OPTIONS_PRETTY_BINARY)
+{
+ LLPointer<Formatter> f{ new Formatter };
+ f->format(data, ostr, options);
+}
+
+template <class Parser>
+S32 parse_using(std::istream& istr, LLSD& data, size_t max_bytes, S32 max_depth=-1)
+{
+ LLPointer<Parser> p{ new Parser };
+ return p->parse(istr, data, max_bytes, max_depth);
+}
+
/**
* LLSDSerialize
*/
@@ -86,10 +104,10 @@ void LLSDSerialize::serialize(const LLSD& sd, std::ostream& str, ELLSD_Serialize
f = new LLSDXMLFormatter;
break;
- case LLSD_NOTATION:
- str << "<? " << LLSD_NOTATION_HEADER << " ?>\n";
- f = new LLSDNotationFormatter;
- break;
+ case LLSD_NOTATION:
+ str << "<? " << LLSD_NOTATION_HEADER << " ?>\n";
+ f = new LLSDNotationFormatter;
+ break;
default:
LL_WARNS() << "serialize request for unknown ELLSD_Serialize" << LL_ENDL;
@@ -104,18 +122,37 @@ void LLSDSerialize::serialize(const LLSD& sd, std::ostream& str, ELLSD_Serialize
// static
bool LLSDSerialize::deserialize(LLSD& sd, std::istream& str, llssize max_bytes)
{
- LLPointer<LLSDParser> p = NULL;
char hdr_buf[MAX_HDR_LEN + 1] = ""; /* Flawfinder: ignore */
- int i;
- int inbuf = 0;
- bool legacy_no_header = false;
bool fail_if_not_legacy = false;
- std::string header;
- /*
- * Get the first line before anything.
- */
- str.get(hdr_buf, MAX_HDR_LEN, '\n');
+ /*
+ * Get the first line before anything. Don't read more than max_bytes:
+ * this get() overload reads no more than (count-1) bytes into the
+ * specified buffer. In the usual case when max_bytes exceeds
+ * sizeof(hdr_buf), get() will read no more than sizeof(hdr_buf)-2.
+ */
+ llssize max_hdr_read = MAX_HDR_LEN;
+ if (max_bytes != LLSDSerialize::SIZE_UNLIMITED)
+ {
+ max_hdr_read = llmin(max_bytes + 1, max_hdr_read);
+ }
+ str.get(hdr_buf, max_hdr_read, '\n');
+ auto inbuf = str.gcount();
+
+ // https://en.cppreference.com/w/cpp/io/basic_istream/get
+ // When the get() above sees the specified delimiter '\n', it stops there
+ // without pulling it from the stream. If it turns out that the stream
+ // does NOT contain a header, and the content includes meaningful '\n',
+ // it's important to pull that into hdr_buf too.
+ if (inbuf < max_bytes && str.get(hdr_buf[inbuf]))
+ {
+ // got the delimiting '\n'
+ ++inbuf;
+ // None of the following requires that hdr_buf contain a final '\0'
+ // byte. We could store one if needed, since even the incremented
+ // inbuf won't exceed sizeof(hdr_buf)-1, but there's no need.
+ }
+ std::string header{ hdr_buf, static_cast<std::string::size_type>(inbuf) };
if (str.fail())
{
str.clear();
@@ -123,79 +160,97 @@ bool LLSDSerialize::deserialize(LLSD& sd, std::istream& str, llssize max_bytes)
}
if (!strncasecmp(LEGACY_NON_HEADER, hdr_buf, strlen(LEGACY_NON_HEADER))) /* Flawfinder: ignore */
+ { // Create a LLSD XML parser, and parse the first chunk read above.
+ LLSDXMLParser x;
+ x.parsePart(hdr_buf, inbuf); // Parse the first part that was already read
+ auto parsed = x.parse(str, sd, max_bytes - inbuf); // Parse the rest of it
+ // Formally we should probably check (parsed != PARSE_FAILURE &&
+ // parsed > 0), but since PARSE_FAILURE is -1, this suffices.
+ return (parsed > 0);
+ }
+
+ if (fail_if_not_legacy)
{
- legacy_no_header = true;
- inbuf = (int)str.gcount();
+ LL_WARNS() << "deserialize LLSD parse failure" << LL_ENDL;
+ return false;
}
- else
+
+ /*
+ * Remove the newline chars
+ */
+ std::string::size_type lastchar = header.find_last_not_of("\r\n");
+ if (lastchar != std::string::npos)
{
- if (fail_if_not_legacy)
- goto fail;
- /*
- * Remove the newline chars
- */
- for (i = 0; i < MAX_HDR_LEN; i++)
- {
- if (hdr_buf[i] == 0 || hdr_buf[i] == '\r' ||
- hdr_buf[i] == '\n')
- {
- hdr_buf[i] = 0;
- break;
- }
- }
- header = hdr_buf;
+ // It's important that find_last_not_of() returns size_type, which is
+ // why lastchar explicitly declares the type above. erase(size_type)
+ // erases from that offset to the end of the string, whereas
+ // erase(iterator) erases only a single character.
+ header.erase(lastchar+1);
+ }
- std::string::size_type start = std::string::npos;
- std::string::size_type end = std::string::npos;
- start = header.find_first_not_of("<? ");
- if (start != std::string::npos)
+ // trim off the <? ... ?> header syntax
+ auto start = header.find_first_not_of("<? ");
+ if (start != std::string::npos)
+ {
+ auto end = header.find_first_of(" ?", start);
+ if (end != std::string::npos)
{
- end = header.find_first_of(" ?", start);
+ header = header.substr(start, end - start);
+ ws(str);
}
- if ((start == std::string::npos) || (end == std::string::npos))
- goto fail;
-
- header = header.substr(start, end - start);
- ws(str);
}
/*
* Create the parser as appropriate
*/
- if (legacy_no_header)
- { // Create a LLSD XML parser, and parse the first chunk read above
- LLSDXMLParser* x = new LLSDXMLParser();
- x->parsePart(hdr_buf, inbuf); // Parse the first part that was already read
- x->parseLines(str, sd); // Parse the rest of it
- delete x;
- return true;
- }
-
- if (header == LLSD_BINARY_HEADER)
+ if (0 == LLStringUtil::compareInsensitive(header, LLSD_BINARY_HEADER))
{
- p = new LLSDBinaryParser;
+ return (parse_using<LLSDBinaryParser>(str, sd, max_bytes-inbuf) > 0);
}
- else if (header == LLSD_XML_HEADER)
+ else if (0 == LLStringUtil::compareInsensitive(header, LLSD_XML_HEADER))
{
- p = new LLSDXMLParser;
+ return (parse_using<LLSDXMLParser>(str, sd, max_bytes-inbuf) > 0);
}
- else if (header == LLSD_NOTATION_HEADER)
+ else if (0 == LLStringUtil::compareInsensitive(header, LLSD_NOTATION_HEADER))
{
- p = new LLSDNotationParser;
+ return (parse_using<LLSDNotationParser>(str, sd, max_bytes-inbuf) > 0);
}
- else
+ else // no header we recognize
{
- LL_WARNS() << "deserialize request for unknown ELLSD_Serialize" << LL_ENDL;
- }
-
- if (p.notNull())
- {
- p->parse(str, sd, max_bytes);
- return true;
+ LLPointer<LLSDParser> p;
+ if (inbuf && hdr_buf[0] == '<')
+ {
+ // looks like XML
+ LL_DEBUGS() << "deserialize request with no header, assuming XML" << LL_ENDL;
+ p = new LLSDXMLParser;
+ }
+ else
+ {
+ // assume notation
+ LL_DEBUGS() << "deserialize request with no header, assuming notation" << LL_ENDL;
+ p = new LLSDNotationParser;
+ }
+ // Since we've already read 'inbuf' bytes into 'hdr_buf', prepend that
+ // data to whatever remains in 'str'.
+ LLMemoryStreamBuf already(reinterpret_cast<const U8*>(hdr_buf), inbuf);
+ cat_streambuf prebuff(&already, str.rdbuf());
+ std::istream prepend(&prebuff);
+#if 1
+ return (p->parse(prepend, sd, max_bytes) > 0);
+#else
+ // debugging the reconstituted 'prepend' stream
+ // allocate a buffer that we hope is big enough for the whole thing
+ std::vector<char> wholemsg((max_bytes == size_t(SIZE_UNLIMITED))? 1024 : max_bytes);
+ prepend.read(wholemsg.data(), std::min(max_bytes, wholemsg.size()));
+ LLMemoryStream replay(reinterpret_cast<const U8*>(wholemsg.data()), prepend.gcount());
+ auto success{ p->parse(replay, sd, prepend.gcount()) > 0 };
+ {
+ LL_DEBUGS() << (success? "parsed: $$" : "failed: '")
+ << std::string(wholemsg.data(), llmin(prepend.gcount(), 100)) << "$$"
+ << LL_ENDL;
+ }
+ return success;
+#endif
}
-
-fail:
- LL_WARNS() << "deserialize LLSD parse failure" << LL_ENDL;
- return false;
}
/**
@@ -2193,9 +2248,9 @@ LLUZipHelper::EZipRresult LLUZipHelper::unzip_llsd(LLSD& data, std::istream& is,
LLUZipHelper::EZipRresult LLUZipHelper::unzip_llsd(LLSD& data, const U8* in, S32 size)
{
U8* result = NULL;
- U32 cur_size = 0;
+ llssize cur_size = 0;
z_stream strm;
-
+
constexpr U32 CHUNK = 1024 * 512;
static thread_local std::unique_ptr<U8[]> out;
@@ -2388,7 +2443,7 @@ U8* unzip_llsdNavMesh( bool& valid, size_t& outsize, std::istream& is, S32 size
return result;
}
-char* strip_deprecated_header(char* in, U32& cur_size, U32* header_size)
+char* strip_deprecated_header(char* in, llssize& cur_size, llssize* header_size)
{
const char* deprecated_header = "<? LLSD/Binary ?>";
constexpr size_t deprecated_header_size = 17;
diff --git a/indra/llcommon/llsdserialize.h b/indra/llcommon/llsdserialize.h
index 2f12c6d1ff..676b7bfd6a 100644
--- a/indra/llcommon/llsdserialize.h
+++ b/indra/llcommon/llsdserialize.h
@@ -873,5 +873,5 @@ LL_COMMON_API std::string zip_llsd(LLSD& data);
LL_COMMON_API U8* unzip_llsdNavMesh( bool& valid, size_t& outsize,std::istream& is, S32 size);
// returns a pointer to the array or past the array if the deprecated header exists
-LL_COMMON_API char* strip_deprecated_header(char* in, U32& cur_size, U32* header_size = nullptr);
+LL_COMMON_API char* strip_deprecated_header(char* in, llssize& cur_size, llssize* header_size = nullptr);
#endif // LL_LLSDSERIALIZE_H
diff --git a/indra/llcommon/llstreamtools.cpp b/indra/llcommon/llstreamtools.cpp
index 1ff15fcf89..bc32b6fd9e 100644
--- a/indra/llcommon/llstreamtools.cpp
+++ b/indra/llcommon/llstreamtools.cpp
@@ -513,3 +513,29 @@ std::istream& operator>>(std::istream& str, const char *tocheck)
}
return str;
}
+
+int cat_streambuf::underflow()
+{
+ if (gptr() == egptr())
+ {
+ // here because our buffer is empty
+ std::streamsize size = 0;
+ // Until we've run out of mInputs, try reading the first of them
+ // into mBuffer. If that fetches some characters, break the loop.
+ while (! mInputs.empty()
+ && ! (size = mInputs.front()->sgetn(mBuffer.data(), mBuffer.size())))
+ {
+ // We tried to read mInputs.front() but got zero characters.
+ // Discard the first streambuf and try the next one.
+ mInputs.pop_front();
+ }
+ // Either we ran out of mInputs or we succeeded in reading some
+ // characters, that is, size != 0. Tell base class what we have.
+ setg(mBuffer.data(), mBuffer.data(), mBuffer.data() + size);
+ }
+ // If we fell out of the above loop with mBuffer still empty, return
+ // eof(), otherwise return the next character.
+ return (gptr() == egptr())
+ ? std::char_traits<char>::eof()
+ : std::char_traits<char>::to_int_type(*gptr());
+}
diff --git a/indra/llcommon/llstreamtools.h b/indra/llcommon/llstreamtools.h
index 1b04bf91d7..bb7bc20327 100644
--- a/indra/llcommon/llstreamtools.h
+++ b/indra/llcommon/llstreamtools.h
@@ -27,8 +27,10 @@
#ifndef LL_STREAM_TOOLS_H
#define LL_STREAM_TOOLS_H
+#include <deque>
#include <iostream>
#include <string>
+#include <vector>
// unless specifed otherwise these all return input_stream.good()
@@ -113,6 +115,27 @@ LL_COMMON_API std::streamsize fullread(
LL_COMMON_API std::istream& operator>>(std::istream& str, const char *tocheck);
-#endif
-
+/**
+ * cat_streambuf is a std::streambuf subclass that accepts a variadic number
+ * of std::streambuf* (e.g. some_istream.rdbuf()) and virtually concatenates
+ * their contents.
+ */
+// derived from https://stackoverflow.com/a/49441066/5533635
+class cat_streambuf: public std::streambuf
+{
+private:
+ std::deque<std::streambuf*> mInputs;
+ std::vector<char> mBuffer;
+
+public:
+ // only valid for std::streambuf* arguments
+ template <typename... Inputs>
+ cat_streambuf(Inputs... inputs):
+ mInputs{inputs...},
+ mBuffer(1024)
+ {}
+
+ int underflow() override;
+};
+#endif
diff --git a/indra/llcommon/lltracerecording.cpp b/indra/llcommon/lltracerecording.cpp
index a8dcc5226a..bb3d667a42 100644
--- a/indra/llcommon/lltracerecording.cpp
+++ b/indra/llcommon/lltracerecording.cpp
@@ -577,10 +577,12 @@ S32 Recording::getSampleCount( const StatType<EventAccumulator>& stat )
// PeriodicRecording
///////////////////////////////////////////////////////////////////////
-PeriodicRecording::PeriodicRecording( S32 num_periods, EPlayState state)
+PeriodicRecording::PeriodicRecording( size_t num_periods, EPlayState state)
: mAutoResize(num_periods == 0),
mCurPeriod(0),
mNumRecordedPeriods(0),
+ // This guarantee that mRecordingPeriods cannot be empty is essential for
+ // code in several methods.
mRecordingPeriods(num_periods ? num_periods : 1)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
@@ -596,18 +598,19 @@ PeriodicRecording::~PeriodicRecording()
void PeriodicRecording::nextPeriod()
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
if (mAutoResize)
{
mRecordingPeriods.push_back(Recording());
}
Recording& old_recording = getCurRecording();
- mCurPeriod = (mCurPeriod + 1) % mRecordingPeriods.size();
+ inci(mCurPeriod);
old_recording.splitTo(getCurRecording());
- mNumRecordedPeriods = mRecordingPeriods.empty()? 0 :
- llmin(mRecordingPeriods.size() - 1, mNumRecordedPeriods + 1);
+ // Since mRecordingPeriods always has at least one entry, we can always
+ // safely subtract 1 from its size().
+ mNumRecordedPeriods = llmin(mRecordingPeriods.size() - 1, mNumRecordedPeriods + 1);
}
void PeriodicRecording::appendRecording(Recording& recording)
@@ -620,31 +623,29 @@ void PeriodicRecording::appendRecording(Recording& recording)
void PeriodicRecording::appendPeriodicRecording( PeriodicRecording& other )
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
if (other.mRecordingPeriods.empty()) return;
getCurRecording().update();
other.getCurRecording().update();
-
- const auto other_recording_slots = other.mRecordingPeriods.size();
+
const auto other_num_recordings = other.getNumRecordedPeriods();
const auto other_current_recording_index = other.mCurPeriod;
- const auto other_oldest_recording_index = (other_current_recording_index + other_recording_slots - other_num_recordings) % other_recording_slots;
+ const auto other_oldest_recording_index = other.previ(other_current_recording_index, other_num_recordings);
// append first recording into our current slot
getCurRecording().appendRecording(other.mRecordingPeriods[other_oldest_recording_index]);
// from now on, add new recordings for everything after the first
- auto other_index = (other_oldest_recording_index + 1) % other_recording_slots;
+ auto other_index = other.nexti(other_oldest_recording_index);
if (mAutoResize)
{
// push back recordings for everything in the middle
- auto other_index = (other_oldest_recording_index + 1) % other_recording_slots;
while (other_index != other_current_recording_index)
{
mRecordingPeriods.push_back(other.mRecordingPeriods[other_index]);
- other_index = (other_index + 1) % other_recording_slots;
+ other.inci(other_index);
}
// add final recording, if it wasn't already added as the first
@@ -653,36 +654,25 @@ void PeriodicRecording::appendPeriodicRecording( PeriodicRecording& other )
mRecordingPeriods.push_back(other.mRecordingPeriods[other_current_recording_index]);
}
- mCurPeriod = mRecordingPeriods.empty()? 0 : mRecordingPeriods.size() - 1;
+ // mRecordingPeriods is never empty()
+ mCurPeriod = mRecordingPeriods.size() - 1;
mNumRecordedPeriods = mCurPeriod;
}
else
{
- S32 num_to_copy = llmin((S32)mRecordingPeriods.size(), (S32)other_num_recordings);
-
- std::vector<Recording>::iterator src_it = other.mRecordingPeriods.begin() + other_index ;
- std::vector<Recording>::iterator dest_it = mRecordingPeriods.begin() + mCurPeriod;
-
+ auto num_to_copy = llmin(mRecordingPeriods.size(), other_num_recordings);
// already consumed the first recording from other, so start counting at 1
- for(S32 i = 1; i < num_to_copy; i++)
+ for (size_t n = 1, srci = other_index, dsti = mCurPeriod;
+ n < num_to_copy;
+ ++n, other.inci(srci), inci(dsti))
{
- *dest_it = *src_it;
-
- if (++src_it == other.mRecordingPeriods.end())
- {
- src_it = other.mRecordingPeriods.begin();
- }
-
- if (++dest_it == mRecordingPeriods.end())
- {
- dest_it = mRecordingPeriods.begin();
- }
+ mRecordingPeriods[dsti] = other.mRecordingPeriods[srci];
}
-
+
// want argument to % to be positive, otherwise result could be negative and thus out of bounds
llassert(num_to_copy >= 1);
// advance to last recording period copied, and make that our current period
- mCurPeriod = (mCurPeriod + num_to_copy - 1) % mRecordingPeriods.size();
+ inci(mCurPeriod, num_to_copy - 1);
mNumRecordedPeriods = llmin(mRecordingPeriods.size() - 1, mNumRecordedPeriods + num_to_copy - 1);
}
@@ -694,13 +684,11 @@ void PeriodicRecording::appendPeriodicRecording( PeriodicRecording& other )
F64Seconds PeriodicRecording::getDuration() const
{
- LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
F64Seconds duration;
- auto num_periods = mRecordingPeriods.size();
- for (size_t i = 1; i <= num_periods; i++)
+ for (size_t n = 0; n < mRecordingPeriods.size(); ++n)
{
- auto index = (mCurPeriod + num_periods - i) % num_periods;
- duration += mRecordingPeriods[index].getDuration();
+ duration += mRecordingPeriods[nexti(mCurPeriod, n)].getDuration();
}
return duration;
}
@@ -737,16 +725,14 @@ const Recording& PeriodicRecording::getCurRecording() const
Recording& PeriodicRecording::getPrevRecording( size_t offset )
{
- auto num_periods = mRecordingPeriods.size();
- offset = llclamp(offset, 0, num_periods - 1);
- return mRecordingPeriods[(mCurPeriod + num_periods - offset) % num_periods];
+ // reuse const implementation, but return non-const reference
+ return const_cast<Recording&>(
+ const_cast<const PeriodicRecording*>(this)->getPrevRecording(offset));
}
const Recording& PeriodicRecording::getPrevRecording( size_t offset ) const
{
- auto num_periods = mRecordingPeriods.size();
- offset = llclamp(offset, 0, num_periods - 1);
- return mRecordingPeriods[(mCurPeriod + num_periods - offset) % num_periods];
+ return mRecordingPeriods[previ(mCurPeriod, offset)];
}
void PeriodicRecording::handleStart()
@@ -789,14 +775,14 @@ void PeriodicRecording::handleSplitTo(PeriodicRecording& other)
getCurRecording().splitTo(other.getCurRecording());
}
-F64 PeriodicRecording::getPeriodMin( const StatType<EventAccumulator>& stat, size_t num_periods /*= S32_MAX*/ )
+F64 PeriodicRecording::getPeriodMin( const StatType<EventAccumulator>& stat, size_t num_periods /*= std::numeric_limits<size_t>::max()*/ )
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
num_periods = llmin(num_periods, getNumRecordedPeriods());
bool has_value = false;
F64 min_val = std::numeric_limits<F64>::max();
- for (S32 i = 1; i <= num_periods; i++)
+ for (size_t i = 1; i <= num_periods; i++)
{
Recording& recording = getPrevRecording(i);
if (recording.hasValue(stat))
@@ -811,14 +797,14 @@ F64 PeriodicRecording::getPeriodMin( const StatType<EventAccumulator>& stat, siz
: NaN;
}
-F64 PeriodicRecording::getPeriodMax( const StatType<EventAccumulator>& stat, size_t num_periods /*= S32_MAX*/ )
+F64 PeriodicRecording::getPeriodMax( const StatType<EventAccumulator>& stat, size_t num_periods /*= std::numeric_limits<size_t>::max()*/ )
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
num_periods = llmin(num_periods, getNumRecordedPeriods());
bool has_value = false;
F64 max_val = std::numeric_limits<F64>::min();
- for (S32 i = 1; i <= num_periods; i++)
+ for (size_t i = 1; i <= num_periods; i++)
{
Recording& recording = getPrevRecording(i);
if (recording.hasValue(stat))
@@ -834,7 +820,7 @@ F64 PeriodicRecording::getPeriodMax( const StatType<EventAccumulator>& stat, siz
}
// calculates means using aggregates per period
-F64 PeriodicRecording::getPeriodMean( const StatType<EventAccumulator>& stat, size_t num_periods /*= S32_MAX*/ )
+F64 PeriodicRecording::getPeriodMean( const StatType<EventAccumulator>& stat, size_t num_periods /*= std::numeric_limits<size_t>::max()*/ )
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
num_periods = llmin(num_periods, getNumRecordedPeriods());
@@ -842,7 +828,7 @@ F64 PeriodicRecording::getPeriodMean( const StatType<EventAccumulator>& stat, si
F64 mean = 0;
S32 valid_period_count = 0;
- for (S32 i = 1; i <= num_periods; i++)
+ for (size_t i = 1; i <= num_periods; i++)
{
Recording& recording = getPrevRecording(i);
if (recording.hasValue(stat))
@@ -857,7 +843,7 @@ F64 PeriodicRecording::getPeriodMean( const StatType<EventAccumulator>& stat, si
: NaN;
}
-F64 PeriodicRecording::getPeriodStandardDeviation( const StatType<EventAccumulator>& stat, size_t num_periods /*= S32_MAX*/ )
+F64 PeriodicRecording::getPeriodStandardDeviation( const StatType<EventAccumulator>& stat, size_t num_periods /*= std::numeric_limits<size_t>::max()*/ )
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
num_periods = llmin(num_periods, getNumRecordedPeriods());
@@ -866,7 +852,7 @@ F64 PeriodicRecording::getPeriodStandardDeviation( const StatType<EventAccumulat
F64 sum_of_squares = 0;
S32 valid_period_count = 0;
- for (S32 i = 1; i <= num_periods; i++)
+ for (size_t i = 1; i <= num_periods; i++)
{
Recording& recording = getPrevRecording(i);
if (recording.hasValue(stat))
@@ -882,14 +868,14 @@ F64 PeriodicRecording::getPeriodStandardDeviation( const StatType<EventAccumulat
: NaN;
}
-F64 PeriodicRecording::getPeriodMin( const StatType<SampleAccumulator>& stat, size_t num_periods /*= S32_MAX*/ )
+F64 PeriodicRecording::getPeriodMin( const StatType<SampleAccumulator>& stat, size_t num_periods /*= std::numeric_limits<size_t>::max()*/ )
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
num_periods = llmin(num_periods, getNumRecordedPeriods());
bool has_value = false;
F64 min_val = std::numeric_limits<F64>::max();
- for (S32 i = 1; i <= num_periods; i++)
+ for (size_t i = 1; i <= num_periods; i++)
{
Recording& recording = getPrevRecording(i);
if (recording.hasValue(stat))
@@ -904,14 +890,14 @@ F64 PeriodicRecording::getPeriodMin( const StatType<SampleAccumulator>& stat, si
: NaN;
}
-F64 PeriodicRecording::getPeriodMax(const StatType<SampleAccumulator>& stat, size_t num_periods /*= S32_MAX*/)
+F64 PeriodicRecording::getPeriodMax(const StatType<SampleAccumulator>& stat, size_t num_periods /*= std::numeric_limits<size_t>::max()*/)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
num_periods = llmin(num_periods, getNumRecordedPeriods());
bool has_value = false;
F64 max_val = std::numeric_limits<F64>::min();
- for (S32 i = 1; i <= num_periods; i++)
+ for (size_t i = 1; i <= num_periods; i++)
{
Recording& recording = getPrevRecording(i);
if (recording.hasValue(stat))
@@ -927,7 +913,7 @@ F64 PeriodicRecording::getPeriodMax(const StatType<SampleAccumulator>& stat, siz
}
-F64 PeriodicRecording::getPeriodMean( const StatType<SampleAccumulator>& stat, size_t num_periods /*= S32_MAX*/ )
+F64 PeriodicRecording::getPeriodMean( const StatType<SampleAccumulator>& stat, size_t num_periods /*= std::numeric_limits<size_t>::max()*/ )
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
num_periods = llmin(num_periods, getNumRecordedPeriods());
@@ -935,7 +921,7 @@ F64 PeriodicRecording::getPeriodMean( const StatType<SampleAccumulator>& stat, s
S32 valid_period_count = 0;
F64 mean = 0;
- for (S32 i = 1; i <= num_periods; i++)
+ for (size_t i = 1; i <= num_periods; i++)
{
Recording& recording = getPrevRecording(i);
if (recording.hasValue(stat))
@@ -950,13 +936,13 @@ F64 PeriodicRecording::getPeriodMean( const StatType<SampleAccumulator>& stat, s
: NaN;
}
-F64 PeriodicRecording::getPeriodMedian( const StatType<SampleAccumulator>& stat, size_t num_periods /*= S32_MAX*/ )
+F64 PeriodicRecording::getPeriodMedian( const StatType<SampleAccumulator>& stat, size_t num_periods /*= std::numeric_limits<size_t>::max()*/ )
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
num_periods = llmin(num_periods, getNumRecordedPeriods());
std::vector<F64> buf;
- for (S32 i = 1; i <= num_periods; i++)
+ for (size_t i = 1; i <= num_periods; i++)
{
Recording& recording = getPrevRecording(i);
if (recording.getDuration() > (F32Seconds)0.f)
@@ -976,7 +962,7 @@ F64 PeriodicRecording::getPeriodMedian( const StatType<SampleAccumulator>& stat,
return F64((buf.size() % 2 == 0) ? (buf[buf.size() / 2 - 1] + buf[buf.size() / 2]) / 2 : buf[buf.size() / 2]);
}
-F64 PeriodicRecording::getPeriodStandardDeviation( const StatType<SampleAccumulator>& stat, size_t num_periods /*= S32_MAX*/ )
+F64 PeriodicRecording::getPeriodStandardDeviation( const StatType<SampleAccumulator>& stat, size_t num_periods /*= std::numeric_limits<size_t>::max()*/ )
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
num_periods = llmin(num_periods, getNumRecordedPeriods());
@@ -985,7 +971,7 @@ F64 PeriodicRecording::getPeriodStandardDeviation( const StatType<SampleAccumula
S32 valid_period_count = 0;
F64 sum_of_squares = 0;
- for (S32 i = 1; i <= num_periods; i++)
+ for (size_t i = 1; i <= num_periods; i++)
{
Recording& recording = getPrevRecording(i);
if (recording.hasValue(stat))
@@ -1002,13 +988,13 @@ F64 PeriodicRecording::getPeriodStandardDeviation( const StatType<SampleAccumula
}
-F64Kilobytes PeriodicRecording::getPeriodMin( const StatType<MemAccumulator>& stat, size_t num_periods /*= S32_MAX*/ )
+F64Kilobytes PeriodicRecording::getPeriodMin( const StatType<MemAccumulator>& stat, size_t num_periods /*= std::numeric_limits<size_t>::max()*/ )
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
num_periods = llmin(num_periods, getNumRecordedPeriods());
F64Kilobytes min_val(std::numeric_limits<F64>::max());
- for (S32 i = 1; i <= num_periods; i++)
+ for (size_t i = 1; i <= num_periods; i++)
{
Recording& recording = getPrevRecording(i);
min_val = llmin(min_val, recording.getMin(stat));
@@ -1022,13 +1008,13 @@ F64Kilobytes PeriodicRecording::getPeriodMin(const MemStatHandle& stat, size_t n
return getPeriodMin(static_cast<const StatType<MemAccumulator>&>(stat), num_periods);
}
-F64Kilobytes PeriodicRecording::getPeriodMax(const StatType<MemAccumulator>& stat, size_t num_periods /*= S32_MAX*/)
+F64Kilobytes PeriodicRecording::getPeriodMax(const StatType<MemAccumulator>& stat, size_t num_periods /*= std::numeric_limits<size_t>::max()*/)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
num_periods = llmin(num_periods, getNumRecordedPeriods());
F64Kilobytes max_val(0.0);
- for (S32 i = 1; i <= num_periods; i++)
+ for (size_t i = 1; i <= num_periods; i++)
{
Recording& recording = getPrevRecording(i);
max_val = llmax(max_val, recording.getMax(stat));
@@ -1042,14 +1028,14 @@ F64Kilobytes PeriodicRecording::getPeriodMax(const MemStatHandle& stat, size_t n
return getPeriodMax(static_cast<const StatType<MemAccumulator>&>(stat), num_periods);
}
-F64Kilobytes PeriodicRecording::getPeriodMean( const StatType<MemAccumulator>& stat, size_t num_periods /*= S32_MAX*/ )
+F64Kilobytes PeriodicRecording::getPeriodMean( const StatType<MemAccumulator>& stat, size_t num_periods /*= std::numeric_limits<size_t>::max()*/ )
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
num_periods = llmin(num_periods, getNumRecordedPeriods());
F64Kilobytes mean(0);
- for (S32 i = 1; i <= num_periods; i++)
+ for (size_t i = 1; i <= num_periods; i++)
{
Recording& recording = getPrevRecording(i);
mean += recording.getMean(stat);
@@ -1063,7 +1049,7 @@ F64Kilobytes PeriodicRecording::getPeriodMean(const MemStatHandle& stat, size_t
return getPeriodMean(static_cast<const StatType<MemAccumulator>&>(stat), num_periods);
}
-F64Kilobytes PeriodicRecording::getPeriodStandardDeviation( const StatType<MemAccumulator>& stat, size_t num_periods /*= S32_MAX*/ )
+F64Kilobytes PeriodicRecording::getPeriodStandardDeviation( const StatType<MemAccumulator>& stat, size_t num_periods /*= std::numeric_limits<size_t>::max()*/ )
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
num_periods = llmin(num_periods, getNumRecordedPeriods());
@@ -1072,7 +1058,7 @@ F64Kilobytes PeriodicRecording::getPeriodStandardDeviation( const StatType<MemAc
S32 valid_period_count = 0;
F64 sum_of_squares = 0;
- for (S32 i = 1; i <= num_periods; i++)
+ for (size_t i = 1; i <= num_periods; i++)
{
Recording& recording = getPrevRecording(i);
if (recording.hasValue(stat))
diff --git a/indra/llcommon/lltracerecording.h b/indra/llcommon/lltracerecording.h
index 8b56721f42..a6b1a67d02 100644
--- a/indra/llcommon/lltracerecording.h
+++ b/indra/llcommon/lltracerecording.h
@@ -33,6 +33,7 @@
#include "lltimer.h"
#include "lltraceaccumulators.h"
#include "llpointer.h"
+#include <limits>
class LLStopWatchControlsMixinCommon
{
@@ -330,7 +331,7 @@ namespace LLTrace
: public LLStopWatchControlsMixin<PeriodicRecording>
{
public:
- PeriodicRecording(S32 num_periods, EPlayState state = STOPPED);
+ PeriodicRecording(size_t num_periods, EPlayState state = STOPPED);
~PeriodicRecording();
void nextPeriod();
@@ -353,7 +354,7 @@ namespace LLTrace
Recording snapshotCurRecording() const;
template <typename T>
- auto getSampleCount(const StatType<T>& stat, size_t num_periods = S32_MAX)
+ auto getSampleCount(const StatType<T>& stat, size_t num_periods = std::numeric_limits<size_t>::max())
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
num_periods = llmin(num_periods, getNumRecordedPeriods());
@@ -373,14 +374,14 @@ namespace LLTrace
// catch all for stats that have a defined sum
template <typename T>
- typename T::value_t getPeriodMin(const StatType<T>& stat, size_t num_periods = S32_MAX)
+ typename T::value_t getPeriodMin(const StatType<T>& stat, size_t num_periods = std::numeric_limits<size_t>::max())
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
num_periods = llmin(num_periods, getNumRecordedPeriods());
bool has_value = false;
typename T::value_t min_val(std::numeric_limits<typename T::value_t>::max());
- for (S32 i = 1; i <= num_periods; i++)
+ for (size_t i = 1; i <= num_periods; i++)
{
Recording& recording = getPrevRecording(i);
if (recording.hasValue(stat))
@@ -396,39 +397,39 @@ namespace LLTrace
}
template<typename T>
- T getPeriodMin(const CountStatHandle<T>& stat, size_t num_periods = S32_MAX)
+ T getPeriodMin(const CountStatHandle<T>& stat, size_t num_periods = std::numeric_limits<size_t>::max())
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
return T(getPeriodMin(static_cast<const StatType<CountAccumulator>&>(stat), num_periods));
}
- F64 getPeriodMin(const StatType<SampleAccumulator>& stat, size_t num_periods = S32_MAX);
+ F64 getPeriodMin(const StatType<SampleAccumulator>& stat, size_t num_periods = std::numeric_limits<size_t>::max());
template<typename T>
- T getPeriodMin(const SampleStatHandle<T>& stat, size_t num_periods = S32_MAX)
+ T getPeriodMin(const SampleStatHandle<T>& stat, size_t num_periods = std::numeric_limits<size_t>::max())
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
return T(getPeriodMin(static_cast<const StatType<SampleAccumulator>&>(stat), num_periods));
}
- F64 getPeriodMin(const StatType<EventAccumulator>& stat, size_t num_periods = S32_MAX);
+ F64 getPeriodMin(const StatType<EventAccumulator>& stat, size_t num_periods = std::numeric_limits<size_t>::max());
template<typename T>
- T getPeriodMin(const EventStatHandle<T>& stat, size_t num_periods = S32_MAX)
+ T getPeriodMin(const EventStatHandle<T>& stat, size_t num_periods = std::numeric_limits<size_t>::max())
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
return T(getPeriodMin(static_cast<const StatType<EventAccumulator>&>(stat), num_periods));
}
- F64Kilobytes getPeriodMin(const StatType<MemAccumulator>& stat, size_t num_periods = S32_MAX);
- F64Kilobytes getPeriodMin(const MemStatHandle& stat, size_t num_periods = S32_MAX);
+ F64Kilobytes getPeriodMin(const StatType<MemAccumulator>& stat, size_t num_periods = std::numeric_limits<size_t>::max());
+ F64Kilobytes getPeriodMin(const MemStatHandle& stat, size_t num_periods = std::numeric_limits<size_t>::max());
template <typename T>
- typename RelatedTypes<typename T::value_t>::fractional_t getPeriodMinPerSec(const StatType<T>& stat, size_t num_periods = S32_MAX)
+ typename RelatedTypes<typename T::value_t>::fractional_t getPeriodMinPerSec(const StatType<T>& stat, size_t num_periods = std::numeric_limits<size_t>::max())
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
num_periods = llmin(num_periods, getNumRecordedPeriods());
typename RelatedTypes<typename T::value_t>::fractional_t min_val(std::numeric_limits<F64>::max());
- for (S32 i = 1; i <= num_periods; i++)
+ for (size_t i = 1; i <= num_periods; i++)
{
Recording& recording = getPrevRecording(i);
min_val = llmin(min_val, recording.getPerSec(stat));
@@ -437,7 +438,7 @@ namespace LLTrace
}
template<typename T>
- typename RelatedTypes<T>::fractional_t getPeriodMinPerSec(const CountStatHandle<T>& stat, size_t num_periods = S32_MAX)
+ typename RelatedTypes<T>::fractional_t getPeriodMinPerSec(const CountStatHandle<T>& stat, size_t num_periods = std::numeric_limits<size_t>::max())
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
return typename RelatedTypes<T>::fractional_t(getPeriodMinPerSec(static_cast<const StatType<CountAccumulator>&>(stat), num_periods));
@@ -449,14 +450,14 @@ namespace LLTrace
// catch all for stats that have a defined sum
template <typename T>
- typename T::value_t getPeriodMax(const StatType<T>& stat, size_t num_periods = S32_MAX)
+ typename T::value_t getPeriodMax(const StatType<T>& stat, size_t num_periods = std::numeric_limits<size_t>::max())
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
num_periods = llmin(num_periods, getNumRecordedPeriods());
bool has_value = false;
typename T::value_t max_val(std::numeric_limits<typename T::value_t>::min());
- for (S32 i = 1; i <= num_periods; i++)
+ for (size_t i = 1; i <= num_periods; i++)
{
Recording& recording = getPrevRecording(i);
if (recording.hasValue(stat))
@@ -472,39 +473,39 @@ namespace LLTrace
}
template<typename T>
- T getPeriodMax(const CountStatHandle<T>& stat, size_t num_periods = S32_MAX)
+ T getPeriodMax(const CountStatHandle<T>& stat, size_t num_periods = std::numeric_limits<size_t>::max())
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
return T(getPeriodMax(static_cast<const StatType<CountAccumulator>&>(stat), num_periods));
}
- F64 getPeriodMax(const StatType<SampleAccumulator>& stat, size_t num_periods = S32_MAX);
+ F64 getPeriodMax(const StatType<SampleAccumulator>& stat, size_t num_periods = std::numeric_limits<size_t>::max());
template<typename T>
- T getPeriodMax(const SampleStatHandle<T>& stat, size_t num_periods = S32_MAX)
+ T getPeriodMax(const SampleStatHandle<T>& stat, size_t num_periods = std::numeric_limits<size_t>::max())
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
return T(getPeriodMax(static_cast<const StatType<SampleAccumulator>&>(stat), num_periods));
}
- F64 getPeriodMax(const StatType<EventAccumulator>& stat, size_t num_periods = S32_MAX);
+ F64 getPeriodMax(const StatType<EventAccumulator>& stat, size_t num_periods = std::numeric_limits<size_t>::max());
template<typename T>
- T getPeriodMax(const EventStatHandle<T>& stat, size_t num_periods = S32_MAX)
+ T getPeriodMax(const EventStatHandle<T>& stat, size_t num_periods = std::numeric_limits<size_t>::max())
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
return T(getPeriodMax(static_cast<const StatType<EventAccumulator>&>(stat), num_periods));
}
- F64Kilobytes getPeriodMax(const StatType<MemAccumulator>& stat, size_t num_periods = S32_MAX);
- F64Kilobytes getPeriodMax(const MemStatHandle& stat, size_t num_periods = S32_MAX);
+ F64Kilobytes getPeriodMax(const StatType<MemAccumulator>& stat, size_t num_periods = std::numeric_limits<size_t>::max());
+ F64Kilobytes getPeriodMax(const MemStatHandle& stat, size_t num_periods = std::numeric_limits<size_t>::max());
template <typename T>
- typename RelatedTypes<typename T::value_t>::fractional_t getPeriodMaxPerSec(const StatType<T>& stat, size_t num_periods = S32_MAX)
+ typename RelatedTypes<typename T::value_t>::fractional_t getPeriodMaxPerSec(const StatType<T>& stat, size_t num_periods = std::numeric_limits<size_t>::max())
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
num_periods = llmin(num_periods, getNumRecordedPeriods());
F64 max_val = std::numeric_limits<F64>::min();
- for (S32 i = 1; i <= num_periods; i++)
+ for (size_t i = 1; i <= num_periods; i++)
{
Recording& recording = getPrevRecording(i);
max_val = llmax(max_val, recording.getPerSec(stat));
@@ -513,7 +514,7 @@ namespace LLTrace
}
template<typename T>
- typename RelatedTypes<T>::fractional_t getPeriodMaxPerSec(const CountStatHandle<T>& stat, size_t num_periods = S32_MAX)
+ typename RelatedTypes<T>::fractional_t getPeriodMaxPerSec(const CountStatHandle<T>& stat, size_t num_periods = std::numeric_limits<size_t>::max())
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
return typename RelatedTypes<T>::fractional_t(getPeriodMaxPerSec(static_cast<const StatType<CountAccumulator>&>(stat), num_periods));
@@ -525,14 +526,14 @@ namespace LLTrace
// catch all for stats that have a defined sum
template <typename T>
- typename RelatedTypes<typename T::value_t>::fractional_t getPeriodMean(const StatType<T >& stat, size_t num_periods = S32_MAX)
+ typename RelatedTypes<typename T::value_t>::fractional_t getPeriodMean(const StatType<T >& stat, size_t num_periods = std::numeric_limits<size_t>::max())
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
num_periods = llmin(num_periods, getNumRecordedPeriods());
typename RelatedTypes<typename T::value_t>::fractional_t mean(0);
- for (S32 i = 1; i <= num_periods; i++)
+ for (size_t i = 1; i <= num_periods; i++)
{
Recording& recording = getPrevRecording(i);
if (recording.getDuration() > (F32Seconds)0.f)
@@ -546,39 +547,39 @@ namespace LLTrace
}
template<typename T>
- typename RelatedTypes<T>::fractional_t getPeriodMean(const CountStatHandle<T>& stat, size_t num_periods = S32_MAX)
+ typename RelatedTypes<T>::fractional_t getPeriodMean(const CountStatHandle<T>& stat, size_t num_periods = std::numeric_limits<size_t>::max())
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
return typename RelatedTypes<T>::fractional_t(getPeriodMean(static_cast<const StatType<CountAccumulator>&>(stat), num_periods));
}
- F64 getPeriodMean(const StatType<SampleAccumulator>& stat, size_t num_periods = S32_MAX);
+ F64 getPeriodMean(const StatType<SampleAccumulator>& stat, size_t num_periods = std::numeric_limits<size_t>::max());
template<typename T>
- typename RelatedTypes<T>::fractional_t getPeriodMean(const SampleStatHandle<T>& stat, size_t num_periods = S32_MAX)
+ typename RelatedTypes<T>::fractional_t getPeriodMean(const SampleStatHandle<T>& stat, size_t num_periods = std::numeric_limits<size_t>::max())
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
return typename RelatedTypes<T>::fractional_t(getPeriodMean(static_cast<const StatType<SampleAccumulator>&>(stat), num_periods));
}
- F64 getPeriodMean(const StatType<EventAccumulator>& stat, size_t num_periods = S32_MAX);
+ F64 getPeriodMean(const StatType<EventAccumulator>& stat, size_t num_periods = std::numeric_limits<size_t>::max());
template<typename T>
- typename RelatedTypes<T>::fractional_t getPeriodMean(const EventStatHandle<T>& stat, size_t num_periods = S32_MAX)
+ typename RelatedTypes<T>::fractional_t getPeriodMean(const EventStatHandle<T>& stat, size_t num_periods = std::numeric_limits<size_t>::max())
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
return typename RelatedTypes<T>::fractional_t(getPeriodMean(static_cast<const StatType<EventAccumulator>&>(stat), num_periods));
}
- F64Kilobytes getPeriodMean(const StatType<MemAccumulator>& stat, size_t num_periods = S32_MAX);
- F64Kilobytes getPeriodMean(const MemStatHandle& stat, size_t num_periods = S32_MAX);
+ F64Kilobytes getPeriodMean(const StatType<MemAccumulator>& stat, size_t num_periods = std::numeric_limits<size_t>::max());
+ F64Kilobytes getPeriodMean(const MemStatHandle& stat, size_t num_periods = std::numeric_limits<size_t>::max());
template <typename T>
- typename RelatedTypes<typename T::value_t>::fractional_t getPeriodMeanPerSec(const StatType<T>& stat, size_t num_periods = S32_MAX)
+ typename RelatedTypes<typename T::value_t>::fractional_t getPeriodMeanPerSec(const StatType<T>& stat, size_t num_periods = std::numeric_limits<size_t>::max())
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
num_periods = llmin(num_periods, getNumRecordedPeriods());
typename RelatedTypes<typename T::value_t>::fractional_t mean = 0;
- for (S32 i = 1; i <= num_periods; i++)
+ for (size_t i = 1; i <= num_periods; i++)
{
Recording& recording = getPrevRecording(i);
if (recording.getDuration() > (F32Seconds)0.f)
@@ -593,64 +594,64 @@ namespace LLTrace
}
template<typename T>
- typename RelatedTypes<T>::fractional_t getPeriodMeanPerSec(const CountStatHandle<T>& stat, size_t num_periods = S32_MAX)
+ typename RelatedTypes<T>::fractional_t getPeriodMeanPerSec(const CountStatHandle<T>& stat, size_t num_periods = std::numeric_limits<size_t>::max())
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
return typename RelatedTypes<T>::fractional_t(getPeriodMeanPerSec(static_cast<const StatType<CountAccumulator>&>(stat), num_periods));
}
- F64 getPeriodMedian( const StatType<SampleAccumulator>& stat, size_t num_periods = S32_MAX);
+ F64 getPeriodMedian( const StatType<SampleAccumulator>& stat, size_t num_periods = std::numeric_limits<size_t>::max());
- template <typename T>
- typename RelatedTypes<typename T::value_t>::fractional_t getPeriodMedianPerSec(const StatType<T>& stat, size_t num_periods = S32_MAX)
- {
- LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
- num_periods = llmin(num_periods, getNumRecordedPeriods());
-
- std::vector <typename RelatedTypes<typename T::value_t>::fractional_t> buf;
- for (S32 i = 1; i <= num_periods; i++)
- {
- Recording& recording = getPrevRecording(i);
- if (recording.getDuration() > (F32Seconds)0.f)
- {
- buf.push_back(recording.getPerSec(stat));
- }
- }
- std::sort(buf.begin(), buf.end());
-
- return typename RelatedTypes<T>::fractional_t((buf.size() % 2 == 0) ? (buf[buf.size() / 2 - 1] + buf[buf.size() / 2]) / 2 : buf[buf.size() / 2]);
- }
-
- template<typename T>
- typename RelatedTypes<T>::fractional_t getPeriodMedianPerSec(const CountStatHandle<T>& stat, size_t num_periods = S32_MAX)
- {
- LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
- return typename RelatedTypes<T>::fractional_t(getPeriodMedianPerSec(static_cast<const StatType<CountAccumulator>&>(stat), num_periods));
- }
+ template <typename T>
+ typename RelatedTypes<typename T::value_t>::fractional_t getPeriodMedianPerSec(const StatType<T>& stat, size_t num_periods = std::numeric_limits<size_t>::max())
+ {
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
+ num_periods = llmin(num_periods, getNumRecordedPeriods());
+
+ std::vector <typename RelatedTypes<typename T::value_t>::fractional_t> buf;
+ for (size_t i = 1; i <= num_periods; i++)
+ {
+ Recording& recording = getPrevRecording(i);
+ if (recording.getDuration() > (F32Seconds)0.f)
+ {
+ buf.push_back(recording.getPerSec(stat));
+ }
+ }
+ std::sort(buf.begin(), buf.end());
+
+ return typename RelatedTypes<T>::fractional_t((buf.size() % 2 == 0) ? (buf[buf.size() / 2 - 1] + buf[buf.size() / 2]) / 2 : buf[buf.size() / 2]);
+ }
+
+ template<typename T>
+ typename RelatedTypes<T>::fractional_t getPeriodMedianPerSec(const CountStatHandle<T>& stat, size_t num_periods = std::numeric_limits<size_t>::max())
+ {
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
+ return typename RelatedTypes<T>::fractional_t(getPeriodMedianPerSec(static_cast<const StatType<CountAccumulator>&>(stat), num_periods));
+ }
//
// PERIODIC STANDARD DEVIATION
//
- F64 getPeriodStandardDeviation(const StatType<SampleAccumulator>& stat, size_t num_periods = S32_MAX);
+ F64 getPeriodStandardDeviation(const StatType<SampleAccumulator>& stat, size_t num_periods = std::numeric_limits<size_t>::max());
template<typename T>
- typename RelatedTypes<T>::fractional_t getPeriodStandardDeviation(const SampleStatHandle<T>& stat, size_t num_periods = S32_MAX)
+ typename RelatedTypes<T>::fractional_t getPeriodStandardDeviation(const SampleStatHandle<T>& stat, size_t num_periods = std::numeric_limits<size_t>::max())
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
return typename RelatedTypes<T>::fractional_t(getPeriodStandardDeviation(static_cast<const StatType<SampleAccumulator>&>(stat), num_periods));
}
- F64 getPeriodStandardDeviation(const StatType<EventAccumulator>& stat, size_t num_periods = S32_MAX);
+ F64 getPeriodStandardDeviation(const StatType<EventAccumulator>& stat, size_t num_periods = std::numeric_limits<size_t>::max());
template<typename T>
- typename RelatedTypes<T>::fractional_t getPeriodStandardDeviation(const EventStatHandle<T>& stat, size_t num_periods = S32_MAX)
+ typename RelatedTypes<T>::fractional_t getPeriodStandardDeviation(const EventStatHandle<T>& stat, size_t num_periods = std::numeric_limits<size_t>::max())
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_STATS;
return typename RelatedTypes<T>::fractional_t(getPeriodStandardDeviation(static_cast<const StatType<EventAccumulator>&>(stat), num_periods));
}
- F64Kilobytes getPeriodStandardDeviation(const StatType<MemAccumulator>& stat, size_t num_periods = S32_MAX);
- F64Kilobytes getPeriodStandardDeviation(const MemStatHandle& stat, size_t num_periods = S32_MAX);
+ F64Kilobytes getPeriodStandardDeviation(const StatType<MemAccumulator>& stat, size_t num_periods = std::numeric_limits<size_t>::max());
+ F64Kilobytes getPeriodStandardDeviation(const MemStatHandle& stat, size_t num_periods = std::numeric_limits<size_t>::max());
private:
// implementation for LLStopWatchControlsMixin
@@ -659,6 +660,35 @@ namespace LLTrace
/*virtual*/ void handleReset();
/*virtual*/ void handleSplitTo(PeriodicRecording& other);
+ // helper methods for wraparound ring-buffer arithmetic
+ inline
+ size_t wrapi(size_t i) const
+ {
+ return i % mRecordingPeriods.size();
+ }
+
+ inline
+ size_t nexti(size_t i, size_t offset=1) const
+ {
+ return wrapi(i + offset);
+ }
+
+ inline
+ size_t previ(size_t i, size_t offset=1) const
+ {
+ auto num_periods = mRecordingPeriods.size();
+ // constrain offset
+ offset = llclamp(offset, 0, num_periods - 1);
+ // add size() so expression can't go (unsigned) "negative"
+ return wrapi(i + num_periods - offset);
+ }
+
+ inline
+ void inci(size_t& i, size_t offset=1) const
+ {
+ i = nexti(i, offset);
+ }
+
private:
std::vector<Recording> mRecordingPeriods;
const bool mAutoResize;
diff --git a/indra/llcommon/lluuid.cpp b/indra/llcommon/lluuid.cpp
index 7105c4502d..200add404f 100644
--- a/indra/llcommon/lluuid.cpp
+++ b/indra/llcommon/lluuid.cpp
@@ -885,7 +885,7 @@ U32 LLUUID::getRandomSeed()
seed[7] = (unsigned char)(pid);
getSystemTime((uuid_time_t*)(&seed[8]));
- U64 seed64 = HBXXH64((const void*)seed, 16).digest();
+ U64 seed64 = HBXXH64::digest((const void*)seed, 16);
return U32(seed64) ^ U32(seed64 >> 32);
}
diff --git a/indra/llcommon/lluuid.h b/indra/llcommon/lluuid.h
index c139c4eb4e..80597fa186 100644
--- a/indra/llcommon/lluuid.h
+++ b/indra/llcommon/lluuid.h
@@ -116,6 +116,14 @@ public:
U16 getCRC16() const;
U32 getCRC32() const;
+ // Returns a 64 bits digest of the UUID, by XORing its two 64 bits long
+ // words. HB
+ inline U64 getDigest64() const
+ {
+ U64* tmp = (U64*)mData;
+ return tmp[0] ^ tmp[1];
+ }
+
static BOOL validate(const std::string& in_string); // Validate that the UUID string is legal.
static const LLUUID null;
@@ -165,36 +173,22 @@ public:
LLAssetID makeAssetID(const LLUUID& session) const;
};
-// Generate a hash of an LLUUID object using the boost hash templates.
-template <>
-struct boost::hash<LLUUID>
-{
- typedef LLUUID argument_type;
- typedef std::size_t result_type;
- result_type operator()(argument_type const& s) const
- {
- result_type seed(0);
-
- for (S32 i = 0; i < UUID_BYTES; ++i)
- {
- boost::hash_combine(seed, s.mData[i]);
- }
-
- return seed;
- }
-};
-
-// Adapt boost hash to std hash
+// std::hash implementation for LLUUID
namespace std
{
- template<> struct hash<LLUUID>
- {
- std::size_t operator()(LLUUID const& s) const noexcept
- {
- return boost::hash<LLUUID>()(s);
- }
- };
+ template<> struct hash<LLUUID>
+ {
+ inline size_t operator()(const LLUUID& id) const noexcept
+ {
+ return (size_t)id.getDigest64();
+ }
+ };
}
-#endif
+// For use with boost containers.
+inline size_t hash_value(const LLUUID& id) noexcept
+{
+ return (size_t)id.getDigest64();
+}
+#endif // LL_LLUUID_H
diff --git a/indra/llcommon/stdtypes.h b/indra/llcommon/stdtypes.h
index da8512169c..0b43d7ad4b 100644
--- a/indra/llcommon/stdtypes.h
+++ b/indra/llcommon/stdtypes.h
@@ -41,7 +41,7 @@ typedef unsigned int U32;
// to express an index that might go negative
// (ssize_t is provided by SOME compilers, don't collide)
-typedef typename std::make_signed<size_t>::type llssize;
+typedef typename std::make_signed<std::size_t>::type llssize;
#if LL_WINDOWS
// https://docs.microsoft.com/en-us/cpp/build/reference/zc-wchar-t-wchar-t-is-native-type
diff --git a/indra/llcommon/tests/llleap_test.cpp b/indra/llcommon/tests/llleap_test.cpp
index 7ee36a9ea6..3ae48a2532 100644
--- a/indra/llcommon/tests/llleap_test.cpp
+++ b/indra/llcommon/tests/llleap_test.cpp
@@ -109,7 +109,12 @@ namespace tut
"import os\n"
"import sys\n"
"\n"
- "from llbase import llsd\n"
+ "try:\n"
+ // new freestanding llsd package
+ " import llsd\n"
+ "except ImportError:\n"
+ // older llbase.llsd module
+ " from llbase import llsd\n"
"\n"
"class ProtocolError(Exception):\n"
" def __init__(self, msg, data):\n"
@@ -120,26 +125,26 @@ namespace tut
" pass\n"
"\n"
"def get():\n"
- " hdr = ''\n"
- " while ':' not in hdr and len(hdr) < 20:\n"
- " hdr += sys.stdin.read(1)\n"
+ " hdr = []\n"
+ " while b':' not in hdr and len(hdr) < 20:\n"
+ " hdr.append(sys.stdin.buffer.read(1))\n"
" if not hdr:\n"
" sys.exit(0)\n"
- " if not hdr.endswith(':'):\n"
+ " if not hdr[-1] == b':':\n"
" raise ProtocolError('Expected len:data, got %r' % hdr, hdr)\n"
" try:\n"
- " length = int(hdr[:-1])\n"
+ " length = int(b''.join(hdr[:-1]))\n"
" except ValueError:\n"
" raise ProtocolError('Non-numeric len %r' % hdr[:-1], hdr[:-1])\n"
" parts = []\n"
" received = 0\n"
" while received < length:\n"
- " parts.append(sys.stdin.read(length - received))\n"
+ " parts.append(sys.stdin.buffer.read(length - received))\n"
" received += len(parts[-1])\n"
- " data = ''.join(parts)\n"
+ " data = b''.join(parts)\n"
" assert len(data) == length\n"
" try:\n"
- " return llsd.parse(data.encode())\n"
+ " return llsd.parse(data)\n"
// Seems the old indra.base.llsd module didn't properly
// convert IndexError (from running off end of string) to
// LLSDParseError.
@@ -179,11 +184,11 @@ namespace tut
" return _reply\n"
"\n"
"def put(req):\n"
- " sys.stdout.write(':'.join((str(len(req)), req)))\n"
+ " sys.stdout.buffer.write(b'%d:%b' % (len(req), req))\n"
" sys.stdout.flush()\n"
"\n"
"def send(pump, data):\n"
- " put(llsd.format_notation(dict(pump=pump, data=data)).decode())\n"
+ " put(llsd.format_notation(dict(pump=pump, data=data)))\n"
"\n"
"def request(pump, data):\n"
" # we expect 'data' is a dict\n"
diff --git a/indra/llcommon/tests/llsdserialize_test.cpp b/indra/llcommon/tests/llsdserialize_test.cpp
index 5dbcf4c9b8..acb2953b5b 100644
--- a/indra/llcommon/tests/llsdserialize_test.cpp
+++ b/indra/llcommon/tests/llsdserialize_test.cpp
@@ -46,20 +46,24 @@ typedef U32 uint32_t;
#include "boost/range.hpp"
#include "boost/foreach.hpp"
-#include "boost/function.hpp"
#include "boost/bind.hpp"
#include "boost/phoenix/bind/bind_function.hpp"
#include "boost/phoenix/core/argument.hpp"
using namespace boost::phoenix;
-#include "../llsd.h"
-#include "../llsdserialize.h"
+#include "llsd.h"
+#include "llsdserialize.h"
#include "llsdutil.h"
-#include "../llformat.h"
+#include "llformat.h"
+#include "llmemorystream.h"
#include "../test/lltut.h"
#include "../test/namedtempfile.h"
#include "stringize.h"
+#include <functional>
+
+typedef std::function<void(const LLSD& data, std::ostream& str)> FormatterFunction;
+typedef std::function<bool(std::istream& istr, LLSD& data, llssize max_bytes)> ParserFunction;
std::vector<U8> string_to_vector(const std::string& str)
{
@@ -112,7 +116,7 @@ namespace tut
mSD = LLUUID::null;
expected = "<llsd><uuid /></llsd>\n";
xml_test("null uuid", expected);
-
+
mSD = LLUUID("c96f9b1e-f589-4100-9774-d98643ce0bed");
expected = "<llsd><uuid>c96f9b1e-f589-4100-9774-d98643ce0bed</uuid></llsd>\n";
xml_test("uuid", expected);
@@ -136,7 +140,7 @@ namespace tut
expected = "<llsd><binary encoding=\"base64\">aGVsbG8=</binary></llsd>\n";
xml_test("binary", expected);
}
-
+
template<> template<>
void sd_xml_object::test<2>()
{
@@ -225,7 +229,7 @@ namespace tut
expected = "<llsd><map><key>baz</key><undef /><key>foo</key><string>bar</string></map></llsd>\n";
xml_test("2 element map", expected);
}
-
+
template<> template<>
void sd_xml_object::test<6>()
{
@@ -241,7 +245,7 @@ namespace tut
expected = "<llsd><binary encoding=\"base64\">Nnw2fGFzZGZoYXBweWJveHw2MGU0NGVjNS0zMDVjLTQzYzItOWExOS1iNGI4OWIxYWUyYTZ8NjBlNDRlYzUtMzA1Yy00M2MyLTlhMTktYjRiODliMWFlMmE2fDYwZTQ0ZWM1LTMwNWMtNDNjMi05YTE5LWI0Yjg5YjFhZTJhNnwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDB8N2ZmZmZmZmZ8N2ZmZmZmZmZ8MHwwfDgyMDAwfDQ1MGZlMzk0LTI5MDQtYzlhZC0yMTRjLWEwN2ViN2ZlZWMyOXwoTm8gRGVzY3JpcHRpb24pfDB8MTB8MA==</binary></llsd>\n";
xml_test("binary", expected);
}
-
+
class TestLLSDSerializeData
{
public:
@@ -250,9 +254,34 @@ namespace tut
void doRoundTripTests(const std::string&);
void checkRoundTrip(const std::string&, const LLSD& v);
-
- LLPointer<LLSDFormatter> mFormatter;
- LLPointer<LLSDParser> mParser;
+
+ void setFormatterParser(LLPointer<LLSDFormatter> formatter, LLPointer<LLSDParser> parser)
+ {
+ mFormatter = [formatter](const LLSD& data, std::ostream& str)
+ {
+ formatter->format(data, str);
+ };
+ // this lambda must be mutable since otherwise the bound 'parser'
+ // is assumed to point to a const LLSDParser
+ mParser = [parser](std::istream& istr, LLSD& data, llssize max_bytes) mutable
+ {
+ // reset() call is needed since test code re-uses parser object
+ parser->reset();
+ return (parser->parse(istr, data, max_bytes) > 0);
+ };
+ }
+
+ void setParser(bool (*parser)(LLSD&, std::istream&, llssize))
+ {
+ // why does LLSDSerialize::deserialize() reverse the parse() params??
+ mParser = [parser](std::istream& istr, LLSD& data, llssize max_bytes)
+ {
+ return parser(data, istr, max_bytes);
+ };
+ }
+
+ FormatterFunction mFormatter;
+ ParserFunction mParser;
};
TestLLSDSerializeData::TestLLSDSerializeData()
@@ -265,12 +294,11 @@ namespace tut
void TestLLSDSerializeData::checkRoundTrip(const std::string& msg, const LLSD& v)
{
- std::stringstream stream;
- mFormatter->format(v, stream);
+ std::stringstream stream;
+ mFormatter(v, stream);
//LL_INFOS() << "checkRoundTrip: length " << stream.str().length() << LL_ENDL;
LLSD w;
- mParser->reset(); // reset() call is needed since test code re-uses mParser
- mParser->parse(stream, w, stream.str().size());
+ mParser(stream, w, stream.str().size());
try
{
@@ -299,52 +327,52 @@ namespace tut
fillmap(root[key], width, depth - 1);
}
}
-
+
void TestLLSDSerializeData::doRoundTripTests(const std::string& msg)
{
LLSD v;
checkRoundTrip(msg + " undefined", v);
-
+
v = true;
checkRoundTrip(msg + " true bool", v);
-
+
v = false;
checkRoundTrip(msg + " false bool", v);
-
+
v = 1;
checkRoundTrip(msg + " positive int", v);
-
+
v = 0;
checkRoundTrip(msg + " zero int", v);
-
+
v = -1;
checkRoundTrip(msg + " negative int", v);
-
+
v = 1234.5f;
checkRoundTrip(msg + " positive float", v);
-
+
v = 0.0f;
checkRoundTrip(msg + " zero float", v);
-
+
v = -1234.5f;
checkRoundTrip(msg + " negative float", v);
-
+
// FIXME: need a NaN test
-
+
v = LLUUID::null;
checkRoundTrip(msg + " null uuid", v);
-
+
LLUUID newUUID;
newUUID.generate();
v = newUUID;
checkRoundTrip(msg + " new uuid", v);
-
+
v = "";
checkRoundTrip(msg + " empty string", v);
-
+
v = "some string";
checkRoundTrip(msg + " non-empty string", v);
-
+
v =
"Second Life is a 3-D virtual world entirely built and owned by its residents. "
"Since opening to the public in 2003, it has grown explosively and today is "
@@ -372,7 +400,7 @@ namespace tut
for (U32 block = 0x000000; block <= 0x10ffff; block += block_size)
{
std::ostringstream out;
-
+
for (U32 c = block; c < block + block_size; ++c)
{
if (c <= 0x000001f
@@ -386,7 +414,7 @@ namespace tut
if (0x00fdd0 <= c && c <= 0x00fdef) { continue; }
if ((c & 0x00fffe) == 0x00fffe) { continue; }
// see Unicode standard, section 15.8
-
+
if (c <= 0x00007f)
{
out << (char)(c & 0x7f);
@@ -410,55 +438,55 @@ namespace tut
out << (char)(0x80 | ((c >> 0) & 0x3f));
}
}
-
+
v = out.str();
std::ostringstream blockmsg;
blockmsg << msg << " unicode string block 0x" << std::hex << block;
checkRoundTrip(blockmsg.str(), v);
}
-
+
LLDate epoch;
v = epoch;
checkRoundTrip(msg + " epoch date", v);
-
+
LLDate aDay("2002-12-07T05:07:15.00Z");
v = aDay;
checkRoundTrip(msg + " date", v);
-
+
LLURI path("http://slurl.com/secondlife/Ambleside/57/104/26/");
v = path;
checkRoundTrip(msg + " url", v);
-
+
const char source[] = "it must be a blue moon again";
std::vector<U8> data;
// note, includes terminating '\0'
copy(&source[0], &source[sizeof(source)], back_inserter(data));
-
+
v = data;
checkRoundTrip(msg + " binary", v);
-
+
v = LLSD::emptyMap();
checkRoundTrip(msg + " empty map", v);
-
+
v = LLSD::emptyMap();
v["name"] = "luke"; //v.insert("name", "luke");
v["age"] = 3; //v.insert("age", 3);
checkRoundTrip(msg + " map", v);
-
+
v.clear();
v["a"]["1"] = true;
v["b"]["0"] = false;
checkRoundTrip(msg + " nested maps", v);
-
+
v = LLSD::emptyArray();
checkRoundTrip(msg + " empty array", v);
-
+
v = LLSD::emptyArray();
v.append("ali");
v.append(28);
checkRoundTrip(msg + " array", v);
-
+
v.clear();
v[0][0] = true;
v[1][0] = false;
@@ -468,7 +496,7 @@ namespace tut
fillmap(v, 10, 3); // 10^6 maps
checkRoundTrip(msg + " many nested maps", v);
}
-
+
typedef tut::test_group<TestLLSDSerializeData> TestLLSDSerializeGroup;
typedef TestLLSDSerializeGroup::object TestLLSDSerializeObject;
TestLLSDSerializeGroup gTestLLSDSerializeGroup("llsd serialization");
@@ -476,35 +504,106 @@ namespace tut
template<> template<>
void TestLLSDSerializeObject::test<1>()
{
- mFormatter = new LLSDNotationFormatter(false, "", LLSDFormatter::OPTIONS_PRETTY_BINARY);
- mParser = new LLSDNotationParser();
+ setFormatterParser(new LLSDNotationFormatter(false, "", LLSDFormatter::OPTIONS_PRETTY_BINARY),
+ new LLSDNotationParser());
doRoundTripTests("pretty binary notation serialization");
}
template<> template<>
void TestLLSDSerializeObject::test<2>()
{
- mFormatter = new LLSDNotationFormatter(false, "", LLSDFormatter::OPTIONS_NONE);
- mParser = new LLSDNotationParser();
+ setFormatterParser(new LLSDNotationFormatter(false, "", LLSDFormatter::OPTIONS_NONE),
+ new LLSDNotationParser());
doRoundTripTests("raw binary notation serialization");
}
template<> template<>
void TestLLSDSerializeObject::test<3>()
{
- mFormatter = new LLSDXMLFormatter();
- mParser = new LLSDXMLParser();
+ setFormatterParser(new LLSDXMLFormatter(), new LLSDXMLParser());
doRoundTripTests("xml serialization");
}
template<> template<>
void TestLLSDSerializeObject::test<4>()
{
- mFormatter = new LLSDBinaryFormatter();
- mParser = new LLSDBinaryParser();
+ setFormatterParser(new LLSDBinaryFormatter(), new LLSDBinaryParser());
doRoundTripTests("binary serialization");
}
+ template<> template<>
+ void TestLLSDSerializeObject::test<5>()
+ {
+ mFormatter = [](const LLSD& sd, std::ostream& str)
+ {
+ LLSDSerialize::serialize(sd, str, LLSDSerialize::LLSD_BINARY);
+ };
+ setParser(LLSDSerialize::deserialize);
+ doRoundTripTests("serialize(LLSD_BINARY)");
+ };
+
+ template<> template<>
+ void TestLLSDSerializeObject::test<6>()
+ {
+ mFormatter = [](const LLSD& sd, std::ostream& str)
+ {
+ LLSDSerialize::serialize(sd, str, LLSDSerialize::LLSD_XML);
+ };
+ setParser(LLSDSerialize::deserialize);
+ doRoundTripTests("serialize(LLSD_XML)");
+ };
+
+ template<> template<>
+ void TestLLSDSerializeObject::test<7>()
+ {
+ mFormatter = [](const LLSD& sd, std::ostream& str)
+ {
+ LLSDSerialize::serialize(sd, str, LLSDSerialize::LLSD_NOTATION);
+ };
+ setParser(LLSDSerialize::deserialize);
+ // In this test, serialize(LLSD_NOTATION) emits a header recognized by
+ // deserialize().
+ doRoundTripTests("serialize(LLSD_NOTATION)");
+ };
+
+ template<> template<>
+ void TestLLSDSerializeObject::test<8>()
+ {
+ setFormatterParser(new LLSDNotationFormatter(false, "", LLSDFormatter::OPTIONS_NONE),
+ new LLSDNotationParser());
+ setParser(LLSDSerialize::deserialize);
+ // This is an interesting test because LLSDNotationFormatter does not
+ // emit an llsd/notation header.
+ doRoundTripTests("LLSDNotationFormatter -> deserialize");
+ };
+
+ template<> template<>
+ void TestLLSDSerializeObject::test<9>()
+ {
+ setFormatterParser(new LLSDXMLFormatter(false, "", LLSDFormatter::OPTIONS_NONE),
+ new LLSDXMLParser());
+ setParser(LLSDSerialize::deserialize);
+ // This is an interesting test because LLSDXMLFormatter does not
+ // emit an LLSD/XML header.
+ doRoundTripTests("LLSDXMLFormatter -> deserialize");
+ };
+
+/*==========================================================================*|
+ // We do not expect this test to succeed. Without a header, neither
+ // notation LLSD nor binary LLSD reliably start with a distinct character,
+ // the way XML LLSD starts with '<'. By convention, we default to notation
+ // rather than binary.
+ template<> template<>
+ void TestLLSDSerializeObject::test<10>()
+ {
+ setFormatterParser(new LLSDBinaryFormatter(false, "", LLSDFormatter::OPTIONS_NONE),
+ new LLSDBinaryParser());
+ setParser(LLSDSerialize::deserialize);
+ // This is an interesting test because LLSDBinaryFormatter does not
+ // emit an LLSD/Binary header.
+ doRoundTripTests("LLSDBinaryFormatter -> deserialize");
+ };
+|*==========================================================================*/
/**
* @class TestLLSDParsing
@@ -555,7 +654,7 @@ namespace tut
public:
TestLLSDXMLParsing() {}
};
-
+
typedef tut::test_group<TestLLSDXMLParsing> TestLLSDXMLParsingGroup;
typedef TestLLSDXMLParsingGroup::object TestLLSDXMLParsingObject;
TestLLSDXMLParsingGroup gTestLLSDXMLParsingGroup("llsd XML parsing");
@@ -586,8 +685,8 @@ namespace tut
LLSD(),
LLSDParser::PARSE_FAILURE);
}
-
-
+
+
template<> template<>
void TestLLSDXMLParsingObject::test<2>()
{
@@ -596,7 +695,7 @@ namespace tut
v["amy"] = 23;
v["bob"] = LLSD();
v["cam"] = 1.23;
-
+
ensureParse(
"unknown data type",
"<llsd><map>"
@@ -607,16 +706,16 @@ namespace tut
v,
v.size() + 1);
}
-
+
template<> template<>
void TestLLSDXMLParsingObject::test<3>()
{
// test handling of nested bad data
-
+
LLSD v;
v["amy"] = 23;
v["cam"] = 1.23;
-
+
ensureParse(
"map with html",
"<llsd><map>"
@@ -626,7 +725,7 @@ namespace tut
"</map></llsd>",
v,
v.size() + 1);
-
+
v.clear();
v["amy"] = 23;
v["cam"] = 1.23;
@@ -639,7 +738,7 @@ namespace tut
"</map></llsd>",
v,
v.size() + 1);
-
+
v.clear();
v["amy"] = 23;
v["bob"] = LLSD::emptyMap();
@@ -661,7 +760,7 @@ namespace tut
v[0] = 23;
v[1] = LLSD();
v[2] = 1.23;
-
+
ensureParse(
"array value of html",
"<llsd><array>"
@@ -671,7 +770,7 @@ namespace tut
"</array></llsd>",
v,
v.size() + 1);
-
+
v.clear();
v[0] = 23;
v[1] = LLSD::emptyMap();
@@ -1225,7 +1324,7 @@ namespace tut
vec[0] = 'a'; vec[1] = 'b'; vec[2] = 'c';
vec[3] = '3'; vec[4] = '2'; vec[5] = '1';
LLSD value = vec;
-
+
vec.resize(11);
vec[0] = 'b'; // for binary
vec[5] = 'a'; vec[6] = 'b'; vec[7] = 'c';
@@ -1694,85 +1793,83 @@ namespace tut
ensureBinaryAndXML("map", test);
}
- struct TestPythonCompatible
+ // helper for TestPythonCompatible
+ static std::string import_llsd("import os.path\n"
+ "import sys\n"
+ "try:\n"
+ // new freestanding llsd package
+ " import llsd\n"
+ "except ImportError:\n"
+ // older llbase.llsd module
+ " from llbase import llsd\n");
+
+ // helper for TestPythonCompatible
+ template <typename CONTENT>
+ void python(const std::string& desc, const CONTENT& script, int expect=0)
{
- TestPythonCompatible():
- // Note the peculiar insertion of __FILE__ into this string. Since
- // this script is being written into a platform-dependent temp
- // directory, we can't locate indra/lib/python relative to
- // Python's __file__. Use __FILE__ instead, navigating relative
- // to this C++ source file. Use Python raw-string syntax so
- // Windows pathname backslashes won't mislead Python's string
- // scanner.
- import_llsd("import os.path\n"
- "import sys\n"
- "from llbase import llsd\n")
- {}
- ~TestPythonCompatible() {}
+ auto PYTHON(LLStringUtil::getenv("PYTHON"));
+ ensure("Set $PYTHON to the Python interpreter", !PYTHON.empty());
- std::string import_llsd;
+ NamedTempFile scriptfile("py", script);
- template <typename CONTENT>
- void python(const std::string& desc, const CONTENT& script, int expect=0)
+#if LL_WINDOWS
+ std::string q("\"");
+ std::string qPYTHON(q + PYTHON + q);
+ std::string qscript(q + scriptfile.getName() + q);
+ int rc = _spawnl(_P_WAIT, PYTHON.c_str(), qPYTHON.c_str(), qscript.c_str(), NULL);
+ if (rc == -1)
{
- auto PYTHON(LLStringUtil::getenv("PYTHON"));
- ensure("Set $PYTHON to the Python interpreter", !PYTHON.empty());
-
- NamedTempFile scriptfile("py", script);
+ char buffer[256];
+ strerror_s(buffer, errno); // C++ can infer the buffer size! :-O
+ ensure(STRINGIZE("Couldn't run Python " << desc << "script: " << buffer), false);
+ }
+ else
+ {
+ ensure_equals(STRINGIZE(desc << " script terminated with rc " << rc), rc, expect);
+ }
-#if LL_WINDOWS
- std::string q("\"");
- std::string qPYTHON(q + PYTHON + q);
- std::string qscript(q + scriptfile.getName() + q);
- int rc = _spawnl(_P_WAIT, PYTHON.c_str(), qPYTHON.c_str(), qscript.c_str(), NULL);
- if (rc == -1)
- {
- char buffer[256];
- strerror_s(buffer, errno); // C++ can infer the buffer size! :-O
- ensure(STRINGIZE("Couldn't run Python " << desc << "script: " << buffer), false);
- }
- else
+#else // LL_DARWIN, LL_LINUX
+ LLProcess::Params params;
+ params.executable = PYTHON;
+ params.args.add(scriptfile.getName());
+ LLProcessPtr py(LLProcess::create(params));
+ ensure(STRINGIZE("Couldn't launch " << desc << " script"), bool(py));
+ // Implementing timeout would mean messing with alarm() and
+ // catching SIGALRM... later maybe...
+ int status(0);
+ if (waitpid(py->getProcessID(), &status, 0) == -1)
+ {
+ int waitpid_errno(errno);
+ ensure_equals(STRINGIZE("Couldn't retrieve rc from " << desc << " script: "
+ "waitpid() errno " << waitpid_errno),
+ waitpid_errno, ECHILD);
+ }
+ else
+ {
+ if (WIFEXITED(status))
{
- ensure_equals(STRINGIZE(desc << " script terminated with rc " << rc), rc, expect);
+ int rc(WEXITSTATUS(status));
+ ensure_equals(STRINGIZE(desc << " script terminated with rc " << rc),
+ rc, expect);
}
-
-#else // LL_DARWIN, LL_LINUX
- LLProcess::Params params;
- params.executable = PYTHON;
- params.args.add(scriptfile.getName());
- LLProcessPtr py(LLProcess::create(params));
- ensure(STRINGIZE("Couldn't launch " << desc << " script"), bool(py));
- // Implementing timeout would mean messing with alarm() and
- // catching SIGALRM... later maybe...
- int status(0);
- if (waitpid(py->getProcessID(), &status, 0) == -1)
+ else if (WIFSIGNALED(status))
{
- int waitpid_errno(errno);
- ensure_equals(STRINGIZE("Couldn't retrieve rc from " << desc << " script: "
- "waitpid() errno " << waitpid_errno),
- waitpid_errno, ECHILD);
+ ensure(STRINGIZE(desc << " script terminated by signal " << WTERMSIG(status)),
+ false);
}
else
{
- if (WIFEXITED(status))
- {
- int rc(WEXITSTATUS(status));
- ensure_equals(STRINGIZE(desc << " script terminated with rc " << rc),
- rc, expect);
- }
- else if (WIFSIGNALED(status))
- {
- ensure(STRINGIZE(desc << " script terminated by signal " << WTERMSIG(status)),
- false);
- }
- else
- {
- ensure(STRINGIZE(desc << " script produced impossible status " << status),
- false);
- }
+ ensure(STRINGIZE(desc << " script produced impossible status " << status),
+ false);
}
-#endif
}
+#endif
+ }
+
+ struct TestPythonCompatible
+ {
+ TestPythonCompatible() {}
+ ~TestPythonCompatible() {}
};
typedef tut::test_group<TestPythonCompatible> TestPythonCompatibleGroup;
@@ -1798,25 +1895,33 @@ namespace tut
"print('Running on', sys.platform)\n");
}
- // helper for test<3>
- static void writeLLSDArray(std::ostream& out, const LLSD& array)
+ // helper for test<3> - test<7>
+ static void writeLLSDArray(const FormatterFunction& serialize,
+ std::ostream& out, const LLSD& array)
{
- BOOST_FOREACH(LLSD item, llsd::inArray(array))
+ for (const LLSD& item : llsd::inArray(array))
{
- LLSDSerialize::toNotation(item, out);
- // It's important to separate with newlines because Python's llsd
- // module doesn't support parsing from a file stream, only from a
- // string, so we have to know how much of the file to read into a
- // string.
- out << '\n';
+ // It's important to delimit the entries in this file somehow
+ // because, although Python's llsd.parse() can accept a file
+ // stream, the XML parser expects EOF after a single outer element
+ // -- it doesn't just stop. So we must extract a sequence of bytes
+ // strings from the file. But since one of the serialization
+ // formats we want to test is binary, we can't pick any single
+ // byte value as a delimiter! Use a binary integer length prefix
+ // instead.
+ std::ostringstream buffer;
+ serialize(item, buffer);
+ auto buffstr{ buffer.str() };
+ int bufflen{ static_cast<int>(buffstr.length()) };
+ out.write(reinterpret_cast<const char*>(&bufflen), sizeof(bufflen));
+ out.write(buffstr.c_str(), buffstr.length());
}
}
- template<> template<>
- void TestPythonCompatibleObject::test<3>()
+ // helper for test<3> - test<7>
+ static void toPythonUsing(const std::string& desc,
+ const FormatterFunction& serialize)
{
- set_test_name("verify sequence to Python");
-
LLSD cdata(llsd::array(17, 3.14,
"This string\n"
"has several\n"
@@ -1836,7 +1941,7 @@ namespace tut
" except StopIteration:\n"
" pass\n"
" else:\n"
- " assert False, 'Too many data items'\n";
+ " raise AssertionError('Too many data items')\n";
// Create an llsdXXXXXX file containing 'data' serialized to
// notation.
@@ -1845,32 +1950,128 @@ namespace tut
// takes a callable. To this callable it passes the
// std::ostream with which it's writing the
// NamedTempFile.
- boost::bind(writeLLSDArray, _1, cdata));
+ [serialize, cdata]
+ (std::ostream& out)
+ { writeLLSDArray(serialize, out, cdata); });
- python("read C++ notation",
+ python("read C++ " + desc,
placeholders::arg1 <<
import_llsd <<
- "def parse_each(iterable):\n"
- " for item in iterable:\n"
- " yield llsd.parse(item)\n" <<
- pydata <<
+ "from functools import partial\n"
+ "import io\n"
+ "import struct\n"
+ "lenformat = struct.Struct('i')\n"
+ "def parse_each(inf):\n"
+ " for rawlen in iter(partial(inf.read, lenformat.size), b''):\n"
+ " len = lenformat.unpack(rawlen)[0]\n"
+ // Since llsd.parse() has no max_bytes argument, instead of
+ // passing the input stream directly to parse(), read the item
+ // into a distinct bytes object and parse that.
+ " data = inf.read(len)\n"
+ " try:\n"
+ " frombytes = llsd.parse(data)\n"
+ " except llsd.LLSDParseError as err:\n"
+ " print(f'*** {err}')\n"
+ " print(f'Bad content:\\n{data!r}')\n"
+ " raise\n"
+ // Also try parsing from a distinct stream.
+ " stream = io.BytesIO(data)\n"
+ " fromstream = llsd.parse(stream)\n"
+ " assert frombytes == fromstream\n"
+ " yield frombytes\n"
+ << pydata <<
// Don't forget raw-string syntax for Windows pathnames.
"verify(parse_each(open(r'" << file.getName() << "', 'rb')))\n");
}
template<> template<>
+ void TestPythonCompatibleObject::test<3>()
+ {
+ set_test_name("to Python using LLSDSerialize::serialize(LLSD_XML)");
+ toPythonUsing("LLSD_XML",
+ [](const LLSD& sd, std::ostream& out)
+ { LLSDSerialize::serialize(sd, out, LLSDSerialize::LLSD_XML); });
+ }
+
+ template<> template<>
void TestPythonCompatibleObject::test<4>()
{
- set_test_name("verify sequence from Python");
+ set_test_name("to Python using LLSDSerialize::serialize(LLSD_NOTATION)");
+ toPythonUsing("LLSD_NOTATION",
+ [](const LLSD& sd, std::ostream& out)
+ { LLSDSerialize::serialize(sd, out, LLSDSerialize::LLSD_NOTATION); });
+ }
+
+ template<> template<>
+ void TestPythonCompatibleObject::test<5>()
+ {
+ set_test_name("to Python using LLSDSerialize::serialize(LLSD_BINARY)");
+ toPythonUsing("LLSD_BINARY",
+ [](const LLSD& sd, std::ostream& out)
+ { LLSDSerialize::serialize(sd, out, LLSDSerialize::LLSD_BINARY); });
+ }
+
+ template<> template<>
+ void TestPythonCompatibleObject::test<6>()
+ {
+ set_test_name("to Python using LLSDSerialize::toXML()");
+ toPythonUsing("toXML()", LLSDSerialize::toXML);
+ }
+
+ template<> template<>
+ void TestPythonCompatibleObject::test<7>()
+ {
+ set_test_name("to Python using LLSDSerialize::toNotation()");
+ toPythonUsing("toNotation()", LLSDSerialize::toNotation);
+ }
+/*==========================================================================*|
+ template<> template<>
+ void TestPythonCompatibleObject::test<8>()
+ {
+ set_test_name("to Python using LLSDSerialize::toBinary()");
+ // We don't expect this to work because, without a header,
+ // llsd.parse() will assume notation rather than binary.
+ toPythonUsing("toBinary()", LLSDSerialize::toBinary);
+ }
+|*==========================================================================*/
+
+ // helper for test<8> - test<12>
+ bool itemFromStream(std::istream& istr, LLSD& item, const ParserFunction& parse)
+ {
+ // reset the output value for debugging clarity
+ item.clear();
+ // We use an int length prefix as a foolproof delimiter even for
+ // binary serialized streams.
+ int length{ 0 };
+ istr.read(reinterpret_cast<char*>(&length), sizeof(length));
+// return parse(istr, item, length);
+ // Sadly, as of 2022-12-01 it seems we can't really trust our LLSD
+ // parsers to honor max_bytes: this test works better when we read
+ // each item into its own distinct LLMemoryStream, instead of passing
+ // the original istr with a max_bytes constraint.
+ std::vector<U8> buffer(length);
+ istr.read(reinterpret_cast<char*>(buffer.data()), length);
+ LLMemoryStream stream(buffer.data(), length);
+ return parse(stream, item, length);
+ }
+
+ // helper for test<8> - test<12>
+ void fromPythonUsing(const std::string& pyformatter,
+ const ParserFunction& parse=
+ [](std::istream& istr, LLSD& data, llssize max_bytes)
+ { return LLSDSerialize::deserialize(data, istr, max_bytes); })
+ {
// Create an empty data file. This is just a placeholder for our
// script to write into. Create it to establish a unique name that
// we know.
NamedTempFile file("llsd", "");
- python("write Python notation",
+ python("Python " + pyformatter,
placeholders::arg1 <<
import_llsd <<
+ "import struct\n"
+ "lenformat = struct.Struct('i')\n"
"DATA = [\n"
" 17,\n"
" 3.14,\n"
@@ -1881,34 +2082,87 @@ namespace tut
"]\n"
// Don't forget raw-string syntax for Windows pathnames.
// N.B. Using 'print' implicitly adds newlines.
- "with open(r'" << file.getName() << "', 'w') as f:\n"
+ "with open(r'" << file.getName() << "', 'wb') as f:\n"
" for item in DATA:\n"
- " print(llsd.format_notation(item).decode(), file=f)\n");
+ " serialized = llsd." << pyformatter << "(item)\n"
+ " f.write(lenformat.pack(len(serialized)))\n"
+ " f.write(serialized)\n");
std::ifstream inf(file.getName().c_str());
LLSD item;
- // Notice that we're not doing anything special to parse out the
- // newlines: LLSDSerialize::fromNotation ignores them. While it would
- // seem they're not strictly necessary, going in this direction, we
- // want to ensure that notation-separated-by-newlines works in both
- // directions -- since in practice, a given file might be read by
- // either language.
- ensure_equals("Failed to read LLSD::Integer from Python",
- LLSDSerialize::fromNotation(item, inf, LLSDSerialize::SIZE_UNLIMITED),
- 1);
- ensure_equals(item.asInteger(), 17);
- ensure_equals("Failed to read LLSD::Real from Python",
- LLSDSerialize::fromNotation(item, inf, LLSDSerialize::SIZE_UNLIMITED),
- 1);
- ensure_approximately_equals("Bad LLSD::Real value from Python",
- item.asReal(), 3.14, 7); // 7 bits ~= 0.01
- ensure_equals("Failed to read LLSD::String from Python",
- LLSDSerialize::fromNotation(item, inf, LLSDSerialize::SIZE_UNLIMITED),
- 1);
- ensure_equals(item.asString(),
- "This string\n"
- "has several\n"
- "lines.");
-
+ try
+ {
+ ensure("Failed to read LLSD::Integer from Python",
+ itemFromStream(inf, item, parse));
+ ensure_equals(item.asInteger(), 17);
+ ensure("Failed to read LLSD::Real from Python",
+ itemFromStream(inf, item, parse));
+ ensure_approximately_equals("Bad LLSD::Real value from Python",
+ item.asReal(), 3.14, 7); // 7 bits ~= 0.01
+ ensure("Failed to read LLSD::String from Python",
+ itemFromStream(inf, item, parse));
+ ensure_equals(item.asString(),
+ "This string\n"
+ "has several\n"
+ "lines.");
+ }
+ catch (const tut::failure& err)
+ {
+ std::cout << "for " << err.what() << ", item = " << item << std::endl;
+ throw;
+ }
+ }
+
+ template<> template<>
+ void TestPythonCompatibleObject::test<8>()
+ {
+ set_test_name("from Python XML using LLSDSerialize::deserialize()");
+ fromPythonUsing("format_xml");
+ }
+
+ template<> template<>
+ void TestPythonCompatibleObject::test<9>()
+ {
+ set_test_name("from Python notation using LLSDSerialize::deserialize()");
+ fromPythonUsing("format_notation");
+ }
+
+ template<> template<>
+ void TestPythonCompatibleObject::test<10>()
+ {
+ set_test_name("from Python binary using LLSDSerialize::deserialize()");
+ fromPythonUsing("format_binary");
+ }
+
+ template<> template<>
+ void TestPythonCompatibleObject::test<11>()
+ {
+ set_test_name("from Python XML using fromXML()");
+ // fromXML()'s optional 3rd param isn't max_bytes, it's emit_errors
+ fromPythonUsing("format_xml",
+ [](std::istream& istr, LLSD& data, llssize)
+ { return LLSDSerialize::fromXML(data, istr) > 0; });
+ }
+
+ template<> template<>
+ void TestPythonCompatibleObject::test<12>()
+ {
+ set_test_name("from Python notation using fromNotation()");
+ fromPythonUsing("format_notation",
+ [](std::istream& istr, LLSD& data, llssize max_bytes)
+ { return LLSDSerialize::fromNotation(data, istr, max_bytes) > 0; });
+ }
+
+/*==========================================================================*|
+ template<> template<>
+ void TestPythonCompatibleObject::test<13>()
+ {
+ set_test_name("from Python binary using fromBinary()");
+ // We don't expect this to work because format_binary() emits a
+ // header, but fromBinary() won't recognize a header.
+ fromPythonUsing("format_binary",
+ [](std::istream& istr, LLSD& data, llssize max_bytes)
+ { return LLSDSerialize::fromBinary(data, istr, max_bytes) > 0; });
}
+|*==========================================================================*/
}
diff --git a/indra/llcorehttp/tests/test_llcorehttp_peer.py b/indra/llcorehttp/tests/test_llcorehttp_peer.py
index 185e8e25c6..b9992538ba 100755
--- a/indra/llcorehttp/tests/test_llcorehttp_peer.py
+++ b/indra/llcorehttp/tests/test_llcorehttp_peer.py
@@ -38,7 +38,7 @@ from io import StringIO
from http.server import HTTPServer, BaseHTTPRequestHandler
-from llbase import llsd
+import llsd
# we're in llcorehttp/tests ; testrunner.py is found in llmessage/tests
sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir,
diff --git a/indra/llinventory/llinventory.cpp b/indra/llinventory/llinventory.cpp
index 81261f0767..5adf1fa0e6 100644
--- a/indra/llinventory/llinventory.cpp
+++ b/indra/llinventory/llinventory.cpp
@@ -40,9 +40,12 @@
///----------------------------------------------------------------------------
/// Exported functions
///----------------------------------------------------------------------------
+// FIXME D567 - what's the point of these, especially if we don't even use them consistently?
static const std::string INV_ITEM_ID_LABEL("item_id");
static const std::string INV_FOLDER_ID_LABEL("cat_id");
static const std::string INV_PARENT_ID_LABEL("parent_id");
+static const std::string INV_THUMBNAIL_LABEL("thumbnail");
+static const std::string INV_THUMBNAIL_ID_LABEL("thumbnail_id");
static const std::string INV_ASSET_TYPE_LABEL("type");
static const std::string INV_PREFERRED_TYPE_LABEL("preferred_type");
static const std::string INV_INVENTORY_TYPE_LABEL("inv_type");
@@ -99,6 +102,7 @@ void LLInventoryObject::copyObject(const LLInventoryObject* other)
mParentUUID = other->mParentUUID;
mType = other->mType;
mName = other->mName;
+ mThumbnailUUID = other->mThumbnailUUID;
}
const LLUUID& LLInventoryObject::getUUID() const
@@ -111,6 +115,11 @@ const LLUUID& LLInventoryObject::getParentUUID() const
return mParentUUID;
}
+const LLUUID& LLInventoryObject::getThumbnailUUID() const
+{
+ return mThumbnailUUID;
+}
+
const std::string& LLInventoryObject::getName() const
{
return mName;
@@ -160,6 +169,11 @@ void LLInventoryObject::setParent(const LLUUID& new_parent)
mParentUUID = new_parent;
}
+void LLInventoryObject::setThumbnailUUID(const LLUUID& thumbnail_uuid)
+{
+ mThumbnailUUID = thumbnail_uuid;
+}
+
void LLInventoryObject::setType(LLAssetType::EType type)
{
mType = type;
@@ -201,6 +215,26 @@ BOOL LLInventoryObject::importLegacyStream(std::istream& input_stream)
{
mType = LLAssetType::lookup(valuestr);
}
+ else if (0 == strcmp("metadata", keyword))
+ {
+ LLSD metadata(valuestr);
+ if (metadata.has("thumbnail"))
+ {
+ const LLSD& thumbnail = metadata["thumbnail"];
+ if (thumbnail.has("asset_id"))
+ {
+ setThumbnailUUID(thumbnail["asset_id"].asUUID());
+ }
+ else
+ {
+ setThumbnailUUID(LLUUID::null);
+ }
+ }
+ else
+ {
+ setThumbnailUUID(LLUUID::null);
+ }
+ }
else if(0 == strcmp("name", keyword))
{
//strcpy(valuestr, buffer + strlen(keyword) + 3);
@@ -336,6 +370,7 @@ void LLInventoryItem::copyItem(const LLInventoryItem* other)
copyObject(other);
mPermissions = other->mPermissions;
mAssetUUID = other->mAssetUUID;
+ mThumbnailUUID = other->mThumbnailUUID;
mDescription = other->mDescription;
mSaleInfo = other->mSaleInfo;
mInventoryType = other->mInventoryType;
@@ -400,6 +435,7 @@ U32 LLInventoryItem::getCRC32() const
//LL_DEBUGS() << "8 crc: " << std::hex << crc << std::dec << LL_ENDL;
crc += (U32)mCreationDate;
//LL_DEBUGS() << "9 crc: " << std::hex << crc << std::dec << LL_ENDL;
+ crc += mThumbnailUUID.getCRC32();
return crc;
}
@@ -655,6 +691,26 @@ BOOL LLInventoryItem::importLegacyStream(std::istream& input_stream)
{
mType = LLAssetType::lookup(valuestr);
}
+ else if (0 == strcmp("metadata", keyword))
+ {
+ LLSD metadata(valuestr);
+ if (metadata.has("thumbnail"))
+ {
+ const LLSD& thumbnail = metadata["thumbnail"];
+ if (thumbnail.has("asset_id"))
+ {
+ setThumbnailUUID(thumbnail["asset_id"].asUUID());
+ }
+ else
+ {
+ setThumbnailUUID(LLUUID::null);
+ }
+ }
+ else
+ {
+ setThumbnailUUID(LLUUID::null);
+ }
+ }
else if(0 == strcmp("inv_type", keyword))
{
mInventoryType = LLInventoryType::lookup(std::string(valuestr));
@@ -744,6 +800,13 @@ BOOL LLInventoryItem::exportLegacyStream(std::ostream& output_stream, BOOL inclu
output_stream << "\t\tparent_id\t" << uuid_str << "\n";
mPermissions.exportLegacyStream(output_stream);
+ if (mThumbnailUUID.notNull())
+ {
+ LLSD metadata;
+ metadata["thumbnail"] = LLSD().with("asset_id", mThumbnailUUID);
+ output_stream << "\t\tmetadata\t" << metadata << "|\n";
+ }
+
// Check for permissions to see the asset id, and if so write it
// out as an asset id. Otherwise, apply our cheesy encryption.
if(include_asset_key)
@@ -797,6 +860,11 @@ void LLInventoryItem::asLLSD( LLSD& sd ) const
sd[INV_PARENT_ID_LABEL] = mParentUUID;
sd[INV_PERMISSIONS_LABEL] = ll_create_sd_from_permissions(mPermissions);
+ if (mThumbnailUUID.notNull())
+ {
+ sd[INV_THUMBNAIL_LABEL] = LLSD().with(INV_ASSET_ID_LABEL, mThumbnailUUID);
+ }
+
U32 mask = mPermissions.getMaskBase();
if(((mask & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED)
|| (mAssetUUID.isNull()))
@@ -848,6 +916,35 @@ bool LLInventoryItem::fromLLSD(const LLSD& sd, bool is_new)
{
mParentUUID = sd[w];
}
+ mThumbnailUUID.setNull();
+ w = INV_THUMBNAIL_LABEL;
+ if (sd.has(w))
+ {
+ const LLSD &thumbnail_map = sd[w];
+ w = INV_ASSET_ID_LABEL;
+ if (thumbnail_map.has(w))
+ {
+ mThumbnailUUID = thumbnail_map[w];
+ }
+ /* Example:
+ <key> asset_id </key>
+ <uuid> acc0ec86 - 17f2 - 4b92 - ab41 - 6718b1f755f7 </uuid>
+ <key> perms </key>
+ <integer> 8 </integer>
+ <key>service</key>
+ <integer> 3 </integer>
+ <key>version</key>
+ <integer> 1 </key>
+ */
+ }
+ else
+ {
+ w = INV_THUMBNAIL_ID_LABEL;
+ if (sd.has(w))
+ {
+ mThumbnailUUID = sd[w].asUUID();
+ }
+ }
w = INV_PERMISSIONS_LABEL;
if (sd.has(w))
{
@@ -972,135 +1069,6 @@ fail:
}
-// Deleted LLInventoryItem::exportFileXML() and LLInventoryItem::importXML()
-// because I can't find any non-test code references to it. 2009-05-04 JC
-
-S32 LLInventoryItem::packBinaryBucket(U8* bin_bucket, LLPermissions* perm_override) const
-{
- // Figure out which permissions to use.
- LLPermissions perm;
- if (perm_override)
- {
- // Use the permissions override.
- perm = *perm_override;
- }
- else
- {
- // Use the current permissions.
- perm = getPermissions();
- }
-
- // describe the inventory item
- char* buffer = (char*) bin_bucket;
- std::string creator_id_str;
-
- perm.getCreator().toString(creator_id_str);
- std::string owner_id_str;
- perm.getOwner().toString(owner_id_str);
- std::string last_owner_id_str;
- perm.getLastOwner().toString(last_owner_id_str);
- std::string group_id_str;
- perm.getGroup().toString(group_id_str);
- std::string asset_id_str;
- getAssetUUID().toString(asset_id_str);
- S32 size = sprintf(buffer, /* Flawfinder: ignore */
- "%d|%d|%s|%s|%s|%s|%s|%x|%x|%x|%x|%x|%s|%s|%d|%d|%x",
- getType(),
- getInventoryType(),
- getName().c_str(),
- creator_id_str.c_str(),
- owner_id_str.c_str(),
- last_owner_id_str.c_str(),
- group_id_str.c_str(),
- perm.getMaskBase(),
- perm.getMaskOwner(),
- perm.getMaskGroup(),
- perm.getMaskEveryone(),
- perm.getMaskNextOwner(),
- asset_id_str.c_str(),
- getDescription().c_str(),
- getSaleInfo().getSaleType(),
- getSaleInfo().getSalePrice(),
- getFlags()) + 1;
-
- return size;
-}
-
-void LLInventoryItem::unpackBinaryBucket(U8* bin_bucket, S32 bin_bucket_size)
-{
- // Early exit on an empty binary bucket.
- if (bin_bucket_size <= 1) return;
-
- if (NULL == bin_bucket)
- {
- LL_ERRS() << "unpackBinaryBucket failed. bin_bucket is NULL." << LL_ENDL;
- return;
- }
-
- // Convert the bin_bucket into a string.
- std::vector<char> item_buffer(bin_bucket_size+1);
- memcpy(&item_buffer[0], bin_bucket, bin_bucket_size); /* Flawfinder: ignore */
- item_buffer[bin_bucket_size] = '\0';
- std::string str(&item_buffer[0]);
-
- LL_DEBUGS() << "item buffer: " << str << LL_ENDL;
-
- // Tokenize the string.
- typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
- boost::char_separator<char> sep("|", "", boost::keep_empty_tokens);
- tokenizer tokens(str, sep);
- tokenizer::iterator iter = tokens.begin();
-
- // Extract all values.
- LLUUID item_id;
- item_id.generate();
- setUUID(item_id);
-
- LLAssetType::EType type;
- type = (LLAssetType::EType)(atoi((*(iter++)).c_str()));
- setType( type );
-
- LLInventoryType::EType inv_type;
- inv_type = (LLInventoryType::EType)(atoi((*(iter++)).c_str()));
- setInventoryType( inv_type );
-
- std::string name((*(iter++)).c_str());
- rename( name );
-
- LLUUID creator_id((*(iter++)).c_str());
- LLUUID owner_id((*(iter++)).c_str());
- LLUUID last_owner_id((*(iter++)).c_str());
- LLUUID group_id((*(iter++)).c_str());
- PermissionMask mask_base = strtoul((*(iter++)).c_str(), NULL, 16);
- PermissionMask mask_owner = strtoul((*(iter++)).c_str(), NULL, 16);
- PermissionMask mask_group = strtoul((*(iter++)).c_str(), NULL, 16);
- PermissionMask mask_every = strtoul((*(iter++)).c_str(), NULL, 16);
- PermissionMask mask_next = strtoul((*(iter++)).c_str(), NULL, 16);
- LLPermissions perm;
- perm.init(creator_id, owner_id, last_owner_id, group_id);
- perm.initMasks(mask_base, mask_owner, mask_group, mask_every, mask_next);
- setPermissions(perm);
- //LL_DEBUGS() << "perm: " << perm << LL_ENDL;
-
- LLUUID asset_id((*(iter++)).c_str());
- setAssetUUID(asset_id);
-
- std::string desc((*(iter++)).c_str());
- setDescription(desc);
-
- LLSaleInfo::EForSale sale_type;
- sale_type = (LLSaleInfo::EForSale)(atoi((*(iter++)).c_str()));
- S32 price = atoi((*(iter++)).c_str());
- LLSaleInfo sale_info(sale_type, price);
- setSaleInfo(sale_info);
-
- U32 flags = strtoul((*(iter++)).c_str(), NULL, 16);
- setFlags(flags);
-
- time_t now = time(NULL);
- setCreationDate(now);
-}
-
///----------------------------------------------------------------------------
/// Class LLInventoryCategory
///----------------------------------------------------------------------------
@@ -1150,11 +1118,32 @@ void LLInventoryCategory::setPreferredType(LLFolderType::EType type)
LLSD LLInventoryCategory::asLLSD() const
{
LLSD sd = LLSD();
- sd["item_id"] = mUUID;
- sd["parent_id"] = mParentUUID;
+ sd[INV_ITEM_ID_LABEL] = mUUID;
+ sd[INV_PARENT_ID_LABEL] = mParentUUID;
S8 type = static_cast<S8>(mPreferredType);
- sd["type"] = type;
- sd["name"] = mName;
+ sd[INV_ASSET_TYPE_LABEL] = type;
+ sd[INV_NAME_LABEL] = mName;
+
+ if (mThumbnailUUID.notNull())
+ {
+ sd[INV_THUMBNAIL_LABEL] = LLSD().with(INV_ASSET_ID_LABEL, mThumbnailUUID);
+ }
+
+ return sd;
+}
+
+LLSD LLInventoryCategory::asAISCreateCatLLSD() const
+{
+ LLSD sd = LLSD();
+ sd[INV_FOLDER_ID_LABEL_WS] = mUUID;
+ sd[INV_PARENT_ID_LABEL] = mParentUUID;
+ S8 type = static_cast<S8>(mPreferredType);
+ sd[INV_ASSET_TYPE_LABEL_WS] = type;
+ sd[INV_NAME_LABEL] = mName;
+ if (mThumbnailUUID.notNull())
+ {
+ sd[INV_THUMBNAIL_LABEL] = LLSD().with(INV_ASSET_ID_LABEL, mThumbnailUUID);
+ }
return sd;
}
@@ -1184,6 +1173,25 @@ bool LLInventoryCategory::fromLLSD(const LLSD& sd)
{
mParentUUID = sd[w];
}
+ mThumbnailUUID.setNull();
+ w = INV_THUMBNAIL_LABEL;
+ if (sd.has(w))
+ {
+ const LLSD &thumbnail_map = sd[w];
+ w = INV_ASSET_ID_LABEL;
+ if (thumbnail_map.has(w))
+ {
+ mThumbnailUUID = thumbnail_map[w];
+ }
+ }
+ else
+ {
+ w = INV_THUMBNAIL_ID_LABEL;
+ if (sd.has(w))
+ {
+ mThumbnailUUID = sd[w];
+ }
+ }
w = INV_ASSET_TYPE_LABEL;
if (sd.has(w))
{
@@ -1275,6 +1283,26 @@ BOOL LLInventoryCategory::importLegacyStream(std::istream& input_stream)
LLStringUtil::replaceNonstandardASCII(mName, ' ');
LLStringUtil::replaceChar(mName, '|', ' ');
}
+ else if (0 == strcmp("metadata", keyword))
+ {
+ LLSD metadata(valuestr);
+ if (metadata.has("thumbnail"))
+ {
+ const LLSD& thumbnail = metadata["thumbnail"];
+ if (thumbnail.has("asset_id"))
+ {
+ setThumbnailUUID(thumbnail["asset_id"].asUUID());
+ }
+ else
+ {
+ setThumbnailUUID(LLUUID::null);
+ }
+ }
+ else
+ {
+ setThumbnailUUID(LLUUID::null);
+ }
+ }
else
{
LL_WARNS() << "unknown keyword '" << keyword
@@ -1295,6 +1323,12 @@ BOOL LLInventoryCategory::exportLegacyStream(std::ostream& output_stream, BOOL)
output_stream << "\t\ttype\t" << LLAssetType::lookup(mType) << "\n";
output_stream << "\t\tpref_type\t" << LLFolderType::lookup(mPreferredType) << "\n";
output_stream << "\t\tname\t" << mName.c_str() << "|\n";
+ if (mThumbnailUUID.notNull())
+ {
+ LLSD metadata;
+ metadata["thumbnail"] = LLSD().with("asset_id", mThumbnailUUID);
+ output_stream << "\t\tmetadata\t" << metadata << "|\n";
+ }
output_stream << "\t}\n";
return TRUE;
}
@@ -1308,6 +1342,11 @@ LLSD LLInventoryCategory::exportLLSD() const
cat_data[INV_PREFERRED_TYPE_LABEL] = LLFolderType::lookup(mPreferredType);
cat_data[INV_NAME_LABEL] = mName;
+ if (mThumbnailUUID.notNull())
+ {
+ cat_data[INV_THUMBNAIL_LABEL] = LLSD().with(INV_ASSET_ID_LABEL, mThumbnailUUID);
+ }
+
return cat_data;
}
@@ -1329,6 +1368,16 @@ bool LLInventoryCategory::importLLSD(const LLSD& cat_data)
{
setPreferredType(LLFolderType::lookup(cat_data[INV_PREFERRED_TYPE_LABEL].asString()));
}
+ if (cat_data.has(INV_THUMBNAIL_LABEL))
+ {
+ LLUUID thumbnail_uuid;
+ const LLSD &thumbnail_data = cat_data[INV_THUMBNAIL_LABEL];
+ if (thumbnail_data.has(INV_ASSET_ID_LABEL))
+ {
+ thumbnail_uuid = thumbnail_data[INV_ASSET_ID_LABEL].asUUID();
+ }
+ setThumbnailUUID(thumbnail_uuid);
+ }
if (cat_data.has(INV_NAME_LABEL))
{
mName = cat_data[INV_NAME_LABEL].asString();
diff --git a/indra/llinventory/llinventory.h b/indra/llinventory/llinventory.h
index 7d9f9704f1..6d4535af27 100644
--- a/indra/llinventory/llinventory.h
+++ b/indra/llinventory/llinventory.h
@@ -70,6 +70,7 @@ public:
virtual const LLUUID& getUUID() const; // inventoryID that this item points to
virtual const LLUUID& getLinkedUUID() const; // inventoryID that this item points to, else this item's inventoryID
const LLUUID& getParentUUID() const;
+ virtual const LLUUID& getThumbnailUUID() const;
virtual const std::string& getName() const;
virtual LLAssetType::EType getType() const;
LLAssetType::EType getActualType() const; // bypasses indirection for linked items
@@ -84,6 +85,7 @@ public:
void setUUID(const LLUUID& new_uuid);
virtual void rename(const std::string& new_name);
void setParent(const LLUUID& new_parent);
+ virtual void setThumbnailUUID(const LLUUID& thumbnail_uuid);
void setType(LLAssetType::EType type);
virtual void setCreationDate(time_t creation_date_utc); // only stored for items
@@ -108,6 +110,7 @@ public:
protected:
LLUUID mUUID;
LLUUID mParentUUID; // Parent category. Root categories have LLUUID::NULL.
+ LLUUID mThumbnailUUID;
LLAssetType::EType mType;
std::string mName;
time_t mCreationDate; // seconds from 1/1/1970, UTC
@@ -203,9 +206,6 @@ public:
// Helper Functions
//--------------------------------------------------------------------
public:
- // Pack all information needed to reconstruct this item into the given binary bucket.
- S32 packBinaryBucket(U8* bin_bucket, LLPermissions* perm_override = NULL) const;
- void unpackBinaryBucket(U8* bin_bucket, S32 bin_bucket_size);
LLSD asLLSD() const;
void asLLSD( LLSD& sd ) const;
bool fromLLSD(const LLSD& sd, bool is_new = true);
@@ -253,6 +253,7 @@ public:
LLFolderType::EType getPreferredType() const;
void setPreferredType(LLFolderType::EType type);
LLSD asLLSD() const;
+ LLSD asAISCreateCatLLSD() const;
bool fromLLSD(const LLSD& sd);
//--------------------------------------------------------------------
diff --git a/indra/llinventory/llsettingssky.cpp b/indra/llinventory/llsettingssky.cpp
index 8338245897..fedbed2990 100644
--- a/indra/llinventory/llsettingssky.cpp
+++ b/indra/llinventory/llsettingssky.cpp
@@ -32,6 +32,7 @@
#include "llfasttimer.h"
#include "v3colorutil.h"
+
//=========================================================================
namespace
{
@@ -133,7 +134,9 @@ const std::string LLSettingsSky::SETTING_SKY_ICE_LEVEL("ice_level");
const std::string LLSettingsSky::SETTING_REFLECTION_PROBE_AMBIANCE("reflection_probe_ambiance");
-const LLUUID LLSettingsSky::DEFAULT_ASSET_ID("3ae23978-ac82-bcf3-a9cb-ba6e52dcb9ad");
+const LLUUID LLSettingsSky::DEFAULT_ASSET_ID("651510b8-5f4d-8991-1592-e7eeab2a5a06");
+
+F32 LLSettingsSky::sAutoAdjustProbeAmbiance = 1.f;
static const LLUUID DEFAULT_SUN_ID("32bfbcea-24b1-fb9d-1ef9-48a28a63730f"); // dataserver
static const LLUUID DEFAULT_MOON_ID("d07f6eed-b96a-47cd-b51d-400ad4a1c428"); // dataserver
@@ -1438,7 +1441,7 @@ F32 LLSettingsSky::getReflectionProbeAmbiance(bool auto_adjust) const
{
if (auto_adjust && canAutoAdjust())
{
- return 1.f;
+ return sAutoAdjustProbeAmbiance;
}
return mSettings[SETTING_REFLECTION_PROBE_AMBIANCE].asReal();
@@ -1446,6 +1449,7 @@ F32 LLSettingsSky::getReflectionProbeAmbiance(bool auto_adjust) const
F32 LLSettingsSky::getTotalReflectionProbeAmbiance(F32 cloud_shadow_scale, bool auto_adjust) const
{
+#if 0
// feed cloud shadow back into reflection probe ambiance to mimic pre-reflection-probe behavior
// without brightening dark/interior spaces
F32 probe_ambiance = getReflectionProbeAmbiance(auto_adjust);
@@ -1456,6 +1460,9 @@ F32 LLSettingsSky::getTotalReflectionProbeAmbiance(F32 cloud_shadow_scale, bool
}
return probe_ambiance;
+#else
+ return getReflectionProbeAmbiance(auto_adjust);
+#endif
}
F32 LLSettingsSky::getSkyBottomRadius() const
diff --git a/indra/llinventory/llsettingssky.h b/indra/llinventory/llsettingssky.h
index f55e9f0631..7ba7a9ba06 100644
--- a/indra/llinventory/llsettingssky.h
+++ b/indra/llinventory/llsettingssky.h
@@ -103,6 +103,8 @@ public:
static const LLUUID DEFAULT_ASSET_ID;
+ static F32 sAutoAdjustProbeAmbiance;
+
typedef PTR_NAMESPACE::shared_ptr<LLSettingsSky> ptr_t;
//---------------------------------------------------------------------
diff --git a/indra/llinventory/tests/inventorymisc_test.cpp b/indra/llinventory/tests/inventorymisc_test.cpp
index e8b063bffe..039fa938dd 100644
--- a/indra/llinventory/tests/inventorymisc_test.cpp
+++ b/indra/llinventory/tests/inventorymisc_test.cpp
@@ -400,27 +400,7 @@ namespace tut
// Deleted LLInventoryItem::exportFileXML() and LLInventoryItem::importXML()
// because I can't find any non-test code references to it. 2009-05-04 JC
}
-
- template<> template<>
- void inventory_object::test<10>()
- {
- LLPointer<LLInventoryItem> src1 = create_random_inventory_item();
- U8* bin_bucket = new U8[300];
- S32 bin_bucket_size = src1->packBinaryBucket(bin_bucket, NULL);
-
- LLPointer<LLInventoryItem> src2 = new LLInventoryItem();
- src2->unpackBinaryBucket(bin_bucket, bin_bucket_size);
- ensure_equals("1.sale price::getSalePrice() failed price", src1->getSaleInfo().getSalePrice(), src2->getSaleInfo().getSalePrice());
- ensure_equals("2.sale type::getSaleType() failed type", src1->getSaleInfo().getSaleType(), src2->getSaleInfo().getSaleType());
- ensure_equals("3.type::getType() failed", src1->getType(), src2->getType());
- ensure_equals("4.inventory type::getInventoryType() failed type", src1->getInventoryType(), src2->getInventoryType());
- ensure_equals("5.name::getName() failed", src1->getName(), src2->getName());
- ensure_equals("6.description::getDescription() failed", src1->getDescription(), src2->getDescription());
- ensure_equals("7.flags::getFlags() failed", src1->getFlags(), src2->getFlags());
-
- }
-
template<> template<>
void inventory_object::test<11>()
{
diff --git a/indra/llmath/llcamera.h b/indra/llmath/llcamera.h
index 27eaa614c9..c4d04f5d02 100644
--- a/indra/llmath/llcamera.h
+++ b/indra/llmath/llcamera.h
@@ -39,7 +39,7 @@ const F32 DEFAULT_NEAR_PLANE = 0.25f;
const F32 DEFAULT_FAR_PLANE = 64.f; // far reaches across two horizontal, not diagonal, regions
const F32 MAX_ASPECT_RATIO = 50.0f;
-const F32 MAX_NEAR_PLANE = 10.f;
+const F32 MAX_NEAR_PLANE = 1023.9f; // Clamp the near plane just before the skybox ends
const F32 MAX_FAR_PLANE = 100000.0f; //1000000.0f; // Max allowed. Not good Z precision though.
const F32 MAX_FAR_CLIP = 512.0f;
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index 667108320a..a5f047d207 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -5626,29 +5626,29 @@ bool LLVolumeFace::cacheOptimize(bool gen_tangents)
mWeights[dst_idx].loadua(data.w[src_idx].mV);
}
}
+
+ // put back in normalized coordinate frame
+ LLVector4a inv_scale(1.f/mNormalizedScale.mV[0], 1.f / mNormalizedScale.mV[1], 1.f / mNormalizedScale.mV[2]);
+ LLVector4a scale;
+ scale.load3(mNormalizedScale.mV);
+ scale.getF32ptr()[3] = 1.f;
+
+ for (int i = 0; i < mNumVertices; ++i)
+ {
+ mPositions[i].mul(inv_scale);
+ mNormals[i].mul(scale);
+ mNormals[i].normalize3();
+ F32 w = mTangents[i].getF32ptr()[3];
+ mTangents[i].mul(scale);
+ mTangents[i].normalize3();
+ mTangents[i].getF32ptr()[3] = w;
+ }
}
else
{
// blew past the max vertex size limit, use legacy tangent generation which never adds verts
createTangents();
}
-
- // put back in normalized coordinate frame
- LLVector4a inv_scale(1.f/mNormalizedScale.mV[0], 1.f / mNormalizedScale.mV[1], 1.f / mNormalizedScale.mV[2]);
- LLVector4a scale;
- scale.load3(mNormalizedScale.mV);
- scale.getF32ptr()[3] = 1.f;
-
- for (int i = 0; i < mNumVertices; ++i)
- {
- mPositions[i].mul(inv_scale);
- mNormals[i].mul(scale);
- mNormals[i].normalize3();
- F32 w = mTangents[i].getF32ptr()[3];
- mTangents[i].mul(scale);
- mTangents[i].normalize3();
- mTangents[i].getF32ptr()[3] = w;
- }
}
// cache optimize index buffer
diff --git a/indra/llmath/llvolumemgr.cpp b/indra/llmath/llvolumemgr.cpp
index 89cdb1c6b9..9399504529 100644
--- a/indra/llmath/llvolumemgr.cpp
+++ b/indra/llmath/llvolumemgr.cpp
@@ -89,7 +89,7 @@ BOOL LLVolumeMgr::cleanup()
// Note however that LLVolumeLODGroup that contains the volume
// also holds a LLPointer so the volume will only go away after
// anything holding the volume and the LODGroup are destroyed
-LLVolume* LLVolumeMgr::refVolume(const LLVolumeParams &volume_params, const S32 detail)
+LLVolume* LLVolumeMgr::refVolume(const LLVolumeParams &volume_params, const S32 lod)
{
LLVolumeLODGroup* volgroupp;
if (mDataMutex)
@@ -109,7 +109,7 @@ LLVolume* LLVolumeMgr::refVolume(const LLVolumeParams &volume_params, const S32
{
mDataMutex->unlock();
}
- return volgroupp->refLOD(detail);
+ return volgroupp->refLOD(lod);
}
// virtual
@@ -287,18 +287,18 @@ bool LLVolumeLODGroup::cleanupRefs()
return res;
}
-LLVolume* LLVolumeLODGroup::refLOD(const S32 detail)
+LLVolume* LLVolumeLODGroup::refLOD(const S32 lod)
{
- llassert(detail >=0 && detail < NUM_LODS);
- mAccessCount[detail]++;
+ llassert(lod >=0 && lod < NUM_LODS);
+ mAccessCount[lod]++;
mRefs++;
- if (mVolumeLODs[detail].isNull())
+ if (mVolumeLODs[lod].isNull())
{
- mVolumeLODs[detail] = new LLVolume(mVolumeParams, mDetailScales[detail]);
+ mVolumeLODs[lod] = new LLVolume(mVolumeParams, mDetailScales[lod]);
}
- mLODRefs[detail]++;
- return mVolumeLODs[detail];
+ mLODRefs[lod]++;
+ return mVolumeLODs[lod];
}
BOOL LLVolumeLODGroup::derefLOD(LLVolume *volumep)
diff --git a/indra/llmessage/CMakeLists.txt b/indra/llmessage/CMakeLists.txt
index 4786956e85..e44309476b 100644
--- a/indra/llmessage/CMakeLists.txt
+++ b/indra/llmessage/CMakeLists.txt
@@ -30,6 +30,7 @@ set(llmessage_SOURCE_FILES
lldispatcher.cpp
llexperiencecache.cpp
llfiltersd2xmlrpc.cpp
+ llgenericstreamingmessage.cpp
llhost.cpp
llhttpnode.cpp
llhttpsdhandler.cpp
@@ -114,6 +115,7 @@ set(llmessage_HEADER_FILES
llextendedstatus.h
llfiltersd2xmlrpc.h
llfollowcamparams.h
+ llgenericstreamingmessage.h
llhost.h
llhttpnode.h
llhttpnodeadapter.h
diff --git a/indra/llmessage/llcachename.cpp b/indra/llmessage/llcachename.cpp
index 66bd85f4e6..a2e85cf6c2 100644
--- a/indra/llmessage/llcachename.cpp
+++ b/indra/llmessage/llcachename.cpp
@@ -552,7 +552,9 @@ std::string LLCacheName::buildUsername(const std::string& full_name)
// if the input wasn't a correctly formatted legacy name, just return it
// cleaned up from a potential terminal "Resident"
- return cleanFullName(full_name);
+ std::string clean_name = cleanFullName(full_name);
+ LLStringUtil::toLower(clean_name);
+ return clean_name;
}
//static
diff --git a/indra/llmessage/llcircuit.cpp b/indra/llmessage/llcircuit.cpp
index 8baa2e328b..a9a292958f 100644
--- a/indra/llmessage/llcircuit.cpp
+++ b/indra/llmessage/llcircuit.cpp
@@ -271,7 +271,6 @@ void LLCircuitData::ackReliablePacket(TPACKETID packet_num)
S32 LLCircuitData::resendUnackedPackets(const F64Seconds now)
{
- S32 resent_packets = 0;
LLReliablePacket *packetp;
@@ -375,7 +374,6 @@ S32 LLCircuitData::resendUnackedPackets(const F64Seconds now)
// Don't remove it yet, it still gets to try to resend at least once.
++iter;
}
- resent_packets++;
}
else
{
diff --git a/indra/llmessage/llcoproceduremanager.cpp b/indra/llmessage/llcoproceduremanager.cpp
index d310cefd1e..ebbaea9b12 100644
--- a/indra/llmessage/llcoproceduremanager.cpp
+++ b/indra/llmessage/llcoproceduremanager.cpp
@@ -364,7 +364,26 @@ LLUUID LLCoprocedurePool::enqueueCoprocedure(const std::string &name, LLCoproced
{
LLUUID id(LLUUID::generateNewID());
- LL_INFOS("CoProcMgr") << "Coprocedure(" << name << ") enqueuing with id=" << id.asString() << " in pool \"" << mPoolName << "\" at " << mPending << LL_ENDL;
+ if (mPoolName == "AIS")
+ {
+ // Fetch is going to be spammy.
+ LL_DEBUGS("CoProcMgr", "Inventory") << "Coprocedure(" << name << ") enqueuing with id=" << id.asString() << " in pool \"" << mPoolName
+ << "\" at "
+ << mPending << LL_ENDL;
+
+ if (mPending >= (LLCoprocedureManager::DEFAULT_QUEUE_SIZE - 1))
+ {
+ // If it's all used up (not supposed to happen,
+ // fetched should cap it), we are going to crash
+ LL_WARNS("CoProcMgr", "Inventory") << "About to run out of queue space for Coprocedure(" << name
+ << ") enqueuing with id=" << id.asString() << " Already pending:" << mPending << LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_INFOS("CoProcMgr") << "Coprocedure(" << name << ") enqueuing with id=" << id.asString() << " in pool \"" << mPoolName << "\" at "
+ << mPending << LL_ENDL;
+ }
auto pushed = mPendingCoprocs->try_push(boost::make_shared<QueuedCoproc>(name, id, proc));
if (pushed == boost::fibers::channel_op_status::success)
{
diff --git a/indra/llmessage/llcorehttputil.cpp b/indra/llmessage/llcorehttputil.cpp
index 02f273b204..460740cebc 100644
--- a/indra/llmessage/llcorehttputil.cpp
+++ b/indra/llmessage/llcorehttputil.cpp
@@ -1329,6 +1329,48 @@ void HttpCoroutineAdapter::trivialPostCoro(std::string url, LLCore::HttpRequest:
}
+/*static*/
+void HttpCoroutineAdapter::callbackHttpDel(const std::string &url, LLCore::HttpRequest::policy_t policyId, completionCallback_t success,
+ completionCallback_t failure)
+{
+ LLCoros::instance().launch("HttpCoroutineAdapter::genericDelCoro",
+ boost::bind(&HttpCoroutineAdapter::trivialDelCoro, url, policyId, success, failure));
+}
+
+/*static*/
+void HttpCoroutineAdapter::trivialDelCoro(std::string url, LLCore::HttpRequest::policy_t policyId, completionCallback_t success,
+ completionCallback_t failure)
+{
+ LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("genericDelCoro", policyId));
+ LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
+ LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions);
+
+ httpOpts->setWantHeaders(true);
+
+ LL_INFOS("HttpCoroutineAdapter", "genericDelCoro") << "Generic DEL for " << url << LL_ENDL;
+
+ LLSD result = httpAdapter->deleteAndSuspend(httpRequest, url, httpOpts);
+
+ LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
+ LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
+
+ if (!status)
+ {
+ if (failure)
+ {
+ failure(httpResults);
+ }
+ }
+ else
+ {
+ if (success)
+ {
+ success(result);
+ }
+ }
+}
+
+
} // end namespace LLCoreHttpUtil
diff --git a/indra/llmessage/llcorehttputil.h b/indra/llmessage/llcorehttputil.h
index 430dc417ac..6d0d68cf24 100644
--- a/indra/llmessage/llcorehttputil.h
+++ b/indra/llmessage/llcorehttputil.h
@@ -598,6 +598,9 @@ public:
callbackHttpPost(url, LLCore::HttpRequest::DEFAULT_POLICY_ID, postData, success, failure);
}
+ static void callbackHttpDel(const std::string &url, LLCore::HttpRequest::policy_t policyId, completionCallback_t success = NULL,
+ completionCallback_t failure = NULL);
+
/// Generic Get and post routines for HTTP via coroutines.
/// These static methods do all required setup for the GET or POST operation.
/// When the operation completes successfully they will put the success message in the log at INFO level,
@@ -659,6 +662,7 @@ private:
static void trivialGetCoro(std::string url, LLCore::HttpRequest::policy_t policyId, completionCallback_t success, completionCallback_t failure);
static void trivialPostCoro(std::string url, LLCore::HttpRequest::policy_t policyId, LLSD postData, completionCallback_t success, completionCallback_t failure);
+ static void trivialDelCoro(std::string url, LLCore::HttpRequest::policy_t policyId, completionCallback_t success, completionCallback_t failure);
void checkDefaultHeaders(LLCore::HttpHeaders::ptr_t &headers);
diff --git a/indra/llmessage/llgenericstreamingmessage.cpp b/indra/llmessage/llgenericstreamingmessage.cpp
new file mode 100644
index 0000000000..8627675c54
--- /dev/null
+++ b/indra/llmessage/llgenericstreamingmessage.cpp
@@ -0,0 +1,72 @@
+/**
+ * @file llgenericstreamingmessage.cpp
+ * @brief Generic Streaming Message helpers. Shared between viewer and simulator.
+ *
+ * $LicenseInfo:firstyear=2023&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2023, 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 "linden_common.h"
+
+#include "llgenericstreamingmessage.h"
+
+#include "message.h"
+
+void LLGenericStreamingMessage::send(LLMessageSystem* msg)
+{
+#if 0 // viewer cannot send GenericStreamingMessage
+ msg->newMessageFast(_PREHASH_GenericStreamingMessage);
+
+ if (mData.size() < 1024 * 7)
+ { // disable warning about big messages unless we're sending a REALLY big message
+ msg->tempDisableWarnAboutBigMessage();
+ }
+ else
+ {
+ LL_WARNS("Messaging") << "Attempted to send too large GenericStreamingMessage, dropping." << LL_ENDL;
+ return;
+ }
+
+ msg->nextBlockFast(_PREHASH_MethodData);
+ msg->addU16Fast(_PREHASH_Method, mMethod);
+ msg->nextBlockFast(_PREHASH_DataBlock);
+ msg->addStringFast(_PREHASH_Data, mData.c_str());
+#endif
+}
+
+void LLGenericStreamingMessage::unpack(LLMessageSystem* msg)
+{
+ U16* m = (U16*)&mMethod; // squirrely pass enum as U16 by reference
+ msg->getU16Fast(_PREHASH_MethodData, _PREHASH_Method, *m);
+
+ constexpr int MAX_SIZE = 7 * 1024;
+
+ char buffer[MAX_SIZE];
+
+ // NOTE: don't use getStringFast to avoid 1200 byte truncation
+ U32 size = msg->getSizeFast(_PREHASH_DataBlock, _PREHASH_Data);
+ msg->getBinaryDataFast(_PREHASH_DataBlock, _PREHASH_Data, buffer, size, 0, MAX_SIZE);
+
+ mData.assign(buffer, size);
+}
+
+
+
diff --git a/indra/llmessage/llgenericstreamingmessage.h b/indra/llmessage/llgenericstreamingmessage.h
new file mode 100644
index 0000000000..9ac9719ea1
--- /dev/null
+++ b/indra/llmessage/llgenericstreamingmessage.h
@@ -0,0 +1,50 @@
+/**
+ * @file llgenericstreamingmessage.h
+ * @brief Generic Streaming Message helpers. Shared between viewer and simulator.
+ *
+ * $LicenseInfo:firstyear=2023&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2023, 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$
+ */
+
+#pragma once
+
+#include <string>
+#include "stdtypes.h"
+
+class LLMessageSystem;
+
+class LLGenericStreamingMessage
+{
+public:
+ enum Method : U16
+ {
+ METHOD_GLTF_MATERIAL_OVERRIDE = 0x4175,
+ METHOD_UNKNOWN = 0xFFFF,
+ };
+
+ void send(LLMessageSystem* msg);
+ void unpack(LLMessageSystem* msg);
+
+ Method mMethod = METHOD_UNKNOWN;
+ std::string mData;
+};
+
+
diff --git a/indra/llmessage/llregionflags.h b/indra/llmessage/llregionflags.h
index 8548ed51e7..464bf05250 100644
--- a/indra/llmessage/llregionflags.h
+++ b/indra/llmessage/llregionflags.h
@@ -171,8 +171,9 @@ const U32 ESTATE_ACCESS_MANAGER_REMOVE = 1U << 9;
const U32 ESTATE_ACCESS_NO_REPLY = 1U << 10;
const U32 ESTATE_ACCESS_FAILED_BAN_ESTATE_MANAGER = 1U << 11;
-const S32 ESTATE_MAX_MANAGERS = 15;
-const S32 ESTATE_MAX_ACCESS_IDS = 500; // max for access, banned
+const S32 ESTATE_MAX_MANAGERS = 20;
+const S32 ESTATE_MAX_ACCESS_IDS = 500; // max for access
+const S32 ESTATE_MAX_BANNED_IDS = 750; // max for banned
const S32 ESTATE_MAX_GROUP_IDS = (S32) ESTATE_ACCESS_MAX_ENTRIES_PER_PACKET;
// 'Sim Wide Delete' flags
diff --git a/indra/llmessage/message.cpp b/indra/llmessage/message.cpp
index 19146c64f4..31acc65642 100644
--- a/indra/llmessage/message.cpp
+++ b/indra/llmessage/message.cpp
@@ -3402,6 +3402,7 @@ typedef std::map<const char*, LLMessageBuilder*> BuilderMap;
void LLMessageSystem::newMessageFast(const char *name)
{
+ //LL_DEBUGS("Messaging") << "creating new message: " << name << LL_ENDL;
LLMessageConfig::Flavor message_flavor =
LLMessageConfig::getMessageFlavor(name);
LLMessageConfig::Flavor server_flavor =
diff --git a/indra/llmessage/message_prehash.cpp b/indra/llmessage/message_prehash.cpp
index 57ea954054..4dccacb889 100644
--- a/indra/llmessage/message_prehash.cpp
+++ b/indra/llmessage/message_prehash.cpp
@@ -1367,6 +1367,7 @@ char const* const _PREHASH_MuteType = LLMessageStringTable::getInstance()->getSt
char const* const _PREHASH_IMViaEMail = LLMessageStringTable::getInstance()->getString("IMViaEMail");
char const* const _PREHASH_RentPrice = LLMessageStringTable::getInstance()->getString("RentPrice");
char const* const _PREHASH_GenericMessage = LLMessageStringTable::getInstance()->getString("GenericMessage");
+char const* const _PREHASH_GenericStreamingMessage = LLMessageStringTable::getInstance()->getString("GenericStreamingMessage");
char const* const _PREHASH_ChildAgentAlive = LLMessageStringTable::getInstance()->getString("ChildAgentAlive");
char const* const _PREHASH_AssetType = LLMessageStringTable::getInstance()->getString("AssetType");
char const* const _PREHASH_SpawnPointBlock = LLMessageStringTable::getInstance()->getString("SpawnPointBlock");
diff --git a/indra/llmessage/message_prehash.h b/indra/llmessage/message_prehash.h
index 572dadd408..a393bbabb2 100644
--- a/indra/llmessage/message_prehash.h
+++ b/indra/llmessage/message_prehash.h
@@ -1368,6 +1368,7 @@ extern char const* const _PREHASH_MuteType;
extern char const* const _PREHASH_IMViaEMail;
extern char const* const _PREHASH_RentPrice;
extern char const* const _PREHASH_GenericMessage;
+extern char const* const _PREHASH_GenericStreamingMessage;
extern char const* const _PREHASH_ChildAgentAlive;
extern char const* const _PREHASH_AssetType;
extern char const* const _PREHASH_SpawnPointBlock;
diff --git a/indra/llmessage/tests/test_llsdmessage_peer.py b/indra/llmessage/tests/test_llsdmessage_peer.py
index 5ba0749e31..8e9b6c09e7 100755
--- a/indra/llmessage/tests/test_llsdmessage_peer.py
+++ b/indra/llmessage/tests/test_llsdmessage_peer.py
@@ -33,8 +33,8 @@ import os
import sys
from http.server import HTTPServer, BaseHTTPRequestHandler
-from llbase.fastest_elementtree import parse as xml_parse
-from llbase import llsd
+from llsd.fastest_elementtree import parse as xml_parse
+import llsd
from testrunner import freeport, run, debug, VERBOSE
import time
diff --git a/indra/llprimitive/CMakeLists.txt b/indra/llprimitive/CMakeLists.txt
index 76d261ab3e..2bd1edaacc 100644
--- a/indra/llprimitive/CMakeLists.txt
+++ b/indra/llprimitive/CMakeLists.txt
@@ -34,6 +34,7 @@ set(llprimitive_HEADER_FILES
lldaeloader.h
llgltfloader.h
llgltfmaterial.h
+ llgltfmaterial_templates.h
legacy_object_types.h
llmaterial.h
llmaterialid.h
diff --git a/indra/llprimitive/llgltfmaterial.cpp b/indra/llprimitive/llgltfmaterial.cpp
index c16803d39d..f42c11ee21 100644
--- a/indra/llprimitive/llgltfmaterial.cpp
+++ b/indra/llprimitive/llgltfmaterial.cpp
@@ -24,24 +24,28 @@
* $/LicenseInfo$
*/
+
#include "linden_common.h"
#include "llgltfmaterial.h"
+#include "llsdserialize.h"
+
// NOTE -- this should be the one and only place tiny_gltf.h is included
#include "tinygltf/tiny_gltf.h"
+#include "llgltfmaterial_templates.h"
const char* const LLGLTFMaterial::ASSET_VERSION = "1.1";
const char* const LLGLTFMaterial::ASSET_TYPE = "GLTF 2.0";
const std::array<std::string, 2> LLGLTFMaterial::ACCEPTED_ASSET_VERSIONS = { "1.0", "1.1" };
-const char* const GLTF_FILE_EXTENSION_TRANSFORM = "KHR_texture_transform";
-const char* const GLTF_FILE_EXTENSION_TRANSFORM_SCALE = "scale";
-const char* const GLTF_FILE_EXTENSION_TRANSFORM_OFFSET = "offset";
-const char* const GLTF_FILE_EXTENSION_TRANSFORM_ROTATION = "rotation";
+const char* const LLGLTFMaterial::GLTF_FILE_EXTENSION_TRANSFORM = "KHR_texture_transform";
+const char* const LLGLTFMaterial::GLTF_FILE_EXTENSION_TRANSFORM_SCALE = "scale";
+const char* const LLGLTFMaterial::GLTF_FILE_EXTENSION_TRANSFORM_OFFSET = "offset";
+const char* const LLGLTFMaterial::GLTF_FILE_EXTENSION_TRANSFORM_ROTATION = "rotation";
// special UUID that indicates a null UUID in override data
-static const LLUUID GLTF_OVERRIDE_NULL_UUID = LLUUID("ffffffff-ffff-ffff-ffff-ffffffffffff");
+const LLUUID LLGLTFMaterial::GLTF_OVERRIDE_NULL_UUID = LLUUID("ffffffff-ffff-ffff-ffff-ffffffffffff");
void LLGLTFMaterial::TextureTransform::getPacked(F32 (&packed)[8]) const
{
@@ -67,14 +71,14 @@ LLGLTFMaterial::LLGLTFMaterial(const LLGLTFMaterial& rhs)
LLGLTFMaterial& LLGLTFMaterial::operator=(const LLGLTFMaterial& rhs)
{
- //have to do a manual operator= because of LLRefCount
+ //have to do a manual operator= because of LLRefCount
mTextureId = rhs.mTextureId;
mTextureTransform = rhs.mTextureTransform;
mBaseColor = rhs.mBaseColor;
mEmissiveColor = rhs.mEmissiveColor;
-
+
mMetallicFactor = rhs.mMetallicFactor;
mRoughnessFactor = rhs.mRoughnessFactor;
mAlphaCutoff = rhs.mAlphaCutoff;
@@ -96,7 +100,7 @@ bool LLGLTFMaterial::operator==(const LLGLTFMaterial& rhs) const
mBaseColor == rhs.mBaseColor &&
mEmissiveColor == rhs.mEmissiveColor &&
-
+
mMetallicFactor == rhs.mMetallicFactor &&
mRoughnessFactor == rhs.mRoughnessFactor &&
mAlphaCutoff == rhs.mAlphaCutoff &&
@@ -121,6 +125,7 @@ bool LLGLTFMaterial::fromJSON(const std::string& json, std::string& warn_msg, st
return true;
}
+
return false;
}
@@ -189,7 +194,8 @@ void LLGLTFMaterial::setFromModel(const tinygltf::Model& model, S32 mat_index)
}
}
-LLVector2 vec2_from_json(const tinygltf::Value::Object& object, const char* key, const LLVector2& default_value)
+// static
+LLVector2 LLGLTFMaterial::vec2FromJson(const tinygltf::Value::Object& object, const char* key, const LLVector2& default_value)
{
const auto it = object.find(key);
if (it == object.end())
@@ -214,7 +220,8 @@ LLVector2 vec2_from_json(const tinygltf::Value::Object& object, const char* key,
return value;
}
-F32 float_from_json(const tinygltf::Value::Object& object, const char* key, const F32 default_value)
+// static
+F32 LLGLTFMaterial::floatFromJson(const tinygltf::Value::Object& object, const char* key, const F32 default_value)
{
const auto it = object.find(key);
if (it == object.end())
@@ -229,52 +236,6 @@ F32 float_from_json(const tinygltf::Value::Object& object, const char* key, cons
return (F32)real_json.GetNumberAsDouble();
}
-template<typename T>
-std::string gltf_get_texture_image(const tinygltf::Model& model, const T& texture_info)
-{
- const S32 texture_idx = texture_info.index;
- if (texture_idx < 0 || texture_idx >= model.textures.size())
- {
- return "";
- }
- const tinygltf::Texture& texture = model.textures[texture_idx];
-
- // Ignore texture.sampler for now
-
- const S32 image_idx = texture.source;
- if (image_idx < 0 || image_idx >= model.images.size())
- {
- return "";
- }
- const tinygltf::Image& image = model.images[image_idx];
-
- return image.uri;
-}
-
-// *NOTE: Use template here as workaround for the different similar texture info classes
-template<typename T>
-void LLGLTFMaterial::setFromTexture(const tinygltf::Model& model, const T& texture_info, TextureInfo texture_info_id)
-{
- LL_PROFILE_ZONE_SCOPED;
- const std::string uri = gltf_get_texture_image(model, texture_info);
- mTextureId[texture_info_id].set(uri);
-
- const tinygltf::Value::Object& extensions_object = texture_info.extensions;
- const auto transform_it = extensions_object.find(GLTF_FILE_EXTENSION_TRANSFORM);
- if (transform_it != extensions_object.end())
- {
- const tinygltf::Value& transform_json = std::get<1>(*transform_it);
- if (transform_json.IsObject())
- {
- const tinygltf::Value::Object& transform_object = transform_json.Get<tinygltf::Value::Object>();
- TextureTransform& transform = mTextureTransform[texture_info_id];
- transform.mOffset = vec2_from_json(transform_object, GLTF_FILE_EXTENSION_TRANSFORM_OFFSET, getDefaultTextureOffset());
- transform.mScale = vec2_from_json(transform_object, GLTF_FILE_EXTENSION_TRANSFORM_SCALE, getDefaultTextureScale());
- transform.mRotation = float_from_json(transform_object, GLTF_FILE_EXTENSION_TRANSFORM_ROTATION, getDefaultTextureRotation());
- }
- }
-}
-
void LLGLTFMaterial::writeToModel(tinygltf::Model& model, S32 mat_index) const
{
LL_PROFILE_ZONE_SCOPED;
@@ -301,7 +262,7 @@ void LLGLTFMaterial::writeToModel(tinygltf::Model& model, S32 mat_index) const
material_out.alphaMode = getAlphaMode();
material_out.alphaCutoff = mAlphaCutoff;
-
+
mBaseColor.write(material_out.pbrMetallicRoughness.baseColorFactor);
if (mEmissiveColor != LLGLTFMaterial::getDefaultEmissiveColor())
@@ -319,7 +280,7 @@ void LLGLTFMaterial::writeToModel(tinygltf::Model& model, S32 mat_index) const
tinygltf::Value::Object extras;
bool write_extras = false;
if (mOverrideAlphaMode && mAlphaMode == getDefaultAlphaMode())
- {
+ {
extras["override_alpha_mode"] = tinygltf::Value(mOverrideAlphaMode);
write_extras = true;
}
@@ -338,57 +299,6 @@ void LLGLTFMaterial::writeToModel(tinygltf::Model& model, S32 mat_index) const
model.asset.version = "2.0";
}
-template<typename T>
-void gltf_allocate_texture_image(tinygltf::Model& model, T& texture_info, const std::string& uri)
-{
- const S32 image_idx = model.images.size();
- model.images.emplace_back();
- model.images[image_idx].uri = uri;
-
- // The texture, not to be confused with the texture info
- const S32 texture_idx = model.textures.size();
- model.textures.emplace_back();
- tinygltf::Texture& texture = model.textures[texture_idx];
- texture.source = image_idx;
-
- texture_info.index = texture_idx;
-}
-
-template<typename T>
-void LLGLTFMaterial::writeToTexture(tinygltf::Model& model, T& texture_info, TextureInfo texture_info_id, bool force_write) const
-{
- LL_PROFILE_ZONE_SCOPED;
- const LLUUID& texture_id = mTextureId[texture_info_id];
- const TextureTransform& transform = mTextureTransform[texture_info_id];
- const bool is_blank_transform = transform == sDefault.mTextureTransform[0];
- // Check if this material matches all the fallback values, and if so, then
- // skip including it to reduce material size
- if (!force_write && texture_id.isNull() && is_blank_transform)
- {
- return;
- }
-
- // tinygltf will discard this texture info if there is no valid texture,
- // causing potential loss of information for overrides, so ensure one is
- // defined. -Cosmic,2023-01-30
- gltf_allocate_texture_image(model, texture_info, texture_id.asString());
-
- if (!is_blank_transform)
- {
- tinygltf::Value::Object transform_map;
- transform_map[GLTF_FILE_EXTENSION_TRANSFORM_OFFSET] = tinygltf::Value(tinygltf::Value::Array({
- tinygltf::Value(transform.mOffset.mV[VX]),
- tinygltf::Value(transform.mOffset.mV[VY])
- }));
- transform_map[GLTF_FILE_EXTENSION_TRANSFORM_SCALE] = tinygltf::Value(tinygltf::Value::Array({
- tinygltf::Value(transform.mScale.mV[VX]),
- tinygltf::Value(transform.mScale.mV[VY])
- }));
- transform_map[GLTF_FILE_EXTENSION_TRANSFORM_ROTATION] = tinygltf::Value(transform.mRotation);
- texture_info.extensions[GLTF_FILE_EXTENSION_TRANSFORM] = tinygltf::Value(transform_map);
- }
-}
-
void LLGLTFMaterial::sanitizeAssetMaterial()
{
mTextureTransform = sDefault.mTextureTransform;
@@ -402,19 +312,19 @@ bool LLGLTFMaterial::setBaseMaterial()
return *this != old_override;
}
-bool LLGLTFMaterial::isClearedForBaseMaterial()
-{
- LLGLTFMaterial cleared_override = sDefault;
- cleared_override.setBaseMaterial(*this);
- return *this == cleared_override;
-}
-
// For material overrides only. Copies transforms from the old override.
void LLGLTFMaterial::setBaseMaterial(const LLGLTFMaterial& old_override_mat)
{
mTextureTransform = old_override_mat.mTextureTransform;
}
+bool LLGLTFMaterial::isClearedForBaseMaterial() const
+{
+ LLGLTFMaterial cleared_override = sDefault;
+ cleared_override.setBaseMaterial(*this);
+ return *this == cleared_override;
+}
+
// static
void LLGLTFMaterial::hackOverrideUUID(LLUUID& id)
@@ -515,7 +425,7 @@ void LLGLTFMaterial::setAlphaMode(const std::string& mode, bool for_override)
{
m = ALPHA_MODE_BLEND;
}
-
+
setAlphaMode(m, for_override);
}
@@ -693,6 +603,159 @@ void LLGLTFMaterial::applyOverride(const LLGLTFMaterial& override_mat)
}
}
+void LLGLTFMaterial::getOverrideLLSD(const LLGLTFMaterial& override_mat, LLSD& data)
+{
+ LL_PROFILE_ZONE_SCOPED;
+ llassert(data.isUndefined());
+
+ // make every effort to shave bytes here
+
+ for (int i = 0; i < GLTF_TEXTURE_INFO_COUNT; ++i)
+ {
+ LLUUID& texture_id = mTextureId[i];
+ const LLUUID& override_texture_id = override_mat.mTextureId[i];
+ if (override_texture_id.notNull() && override_texture_id != texture_id)
+ {
+ data["tex"][i] = LLSD::UUID(override_texture_id);
+ }
+ }
+
+ if (override_mat.mBaseColor != getDefaultBaseColor())
+ {
+ data["bc"] = override_mat.mBaseColor.getValue();
+ }
+
+ if (override_mat.mEmissiveColor != getDefaultEmissiveColor())
+ {
+ data["ec"] = override_mat.mEmissiveColor.getValue();
+ }
+
+ if (override_mat.mMetallicFactor != getDefaultMetallicFactor())
+ {
+ data["mf"] = override_mat.mMetallicFactor;
+ }
+
+ if (override_mat.mRoughnessFactor != getDefaultRoughnessFactor())
+ {
+ data["rf"] = override_mat.mRoughnessFactor;
+ }
+
+ if (override_mat.mAlphaMode != getDefaultAlphaMode() || override_mat.mOverrideAlphaMode)
+ {
+ data["am"] = override_mat.mAlphaMode;
+ }
+
+ if (override_mat.mAlphaCutoff != getDefaultAlphaCutoff())
+ {
+ data["ac"] = override_mat.mAlphaCutoff;
+ }
+
+ if (override_mat.mDoubleSided != getDefaultDoubleSided() || override_mat.mOverrideDoubleSided)
+ {
+ data["ds"] = override_mat.mDoubleSided;
+ }
+
+ for (int i = 0; i < GLTF_TEXTURE_INFO_COUNT; ++i)
+ {
+ if (override_mat.mTextureTransform[i].mOffset != getDefaultTextureOffset())
+ {
+ data["ti"][i]["o"] = override_mat.mTextureTransform[i].mOffset.getValue();
+ }
+
+ if (override_mat.mTextureTransform[i].mScale != getDefaultTextureScale())
+ {
+ data["ti"][i]["s"] = override_mat.mTextureTransform[i].mScale.getValue();
+ }
+
+ if (override_mat.mTextureTransform[i].mRotation != getDefaultTextureRotation())
+ {
+ data["ti"][i]["r"] = override_mat.mTextureTransform[i].mRotation;
+ }
+ }
+}
+
+
+void LLGLTFMaterial::applyOverrideLLSD(const LLSD& data)
+{
+ const LLSD& tex = data["tex"];
+
+ if (tex.isArray())
+ {
+ for (int i = 0; i < tex.size(); ++i)
+ {
+ mTextureId[i] = tex[i].asUUID();
+ }
+ }
+
+ const LLSD& bc = data["bc"];
+ if (bc.isDefined())
+ {
+ mBaseColor.setValue(bc);
+ }
+
+ const LLSD& ec = data["ec"];
+ if (ec.isDefined())
+ {
+ mEmissiveColor.setValue(ec);
+ }
+
+ const LLSD& mf = data["mf"];
+ if (mf.isReal())
+ {
+ mMetallicFactor = mf.asReal();
+ }
+
+ const LLSD& rf = data["rf"];
+ if (rf.isReal())
+ {
+ mRoughnessFactor = rf.asReal();
+ }
+
+ const LLSD& am = data["am"];
+ if (am.isInteger())
+ {
+ mAlphaMode = (AlphaMode) am.asInteger();
+ }
+
+ const LLSD& ac = data["ac"];
+ if (ac.isReal())
+ {
+ mAlphaCutoff = ac.asReal();
+ }
+
+ const LLSD& ds = data["ds"];
+ if (ds.isBoolean())
+ {
+ mDoubleSided = ds.asBoolean();
+ mOverrideDoubleSided = true;
+ }
+
+ const LLSD& ti = data["ti"];
+ if (ti.isArray())
+ {
+ for (int i = 0; i < GLTF_TEXTURE_INFO_COUNT; ++i)
+ {
+ const LLSD& o = ti[i]["o"];
+ if (o.isDefined())
+ {
+ mTextureTransform[i].mOffset.setValue(o);
+ }
+
+ const LLSD& s = ti[i]["s"];
+ if (s.isDefined())
+ {
+ mTextureTransform[i].mScale.setValue(s);
+ }
+
+ const LLSD& r = ti[i]["r"];
+ if (r.isReal())
+ {
+ mTextureTransform[i].mRotation = r.asReal();
+ }
+ }
+ }
+}
+
LLUUID LLGLTFMaterial::getHash() const
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
diff --git a/indra/llprimitive/llgltfmaterial.h b/indra/llprimitive/llgltfmaterial.h
index ad7784f6d1..a078a530a4 100644
--- a/indra/llprimitive/llgltfmaterial.h
+++ b/indra/llprimitive/llgltfmaterial.h
@@ -35,10 +35,13 @@
#include "hbxxh.h"
#include <string>
+#include <map>
namespace tinygltf
{
class Model;
+ struct TextureInfo;
+ class Value;
}
class LLTextureEntry;
@@ -52,6 +55,9 @@ public:
static const char* const ASSET_VERSION;
static const char* const ASSET_TYPE;
+ // Max allowed size of a GLTF material asset or override, when serialized
+ // as a minified JSON string
+ static constexpr size_t MAX_ASSET_LENGTH = 2048;
static const std::array<std::string, 2> ACCEPTED_ASSET_VERSIONS;
static bool isAcceptedVersion(const std::string& version) { return std::find(ACCEPTED_ASSET_VERSIONS.cbegin(), ACCEPTED_ASSET_VERSIONS.cend(), version) != ACCEPTED_ASSET_VERSIONS.cend(); }
@@ -64,6 +70,7 @@ public:
void getPacked(F32 (&packed)[8]) const;
bool operator==(const TextureTransform& other) const;
+ bool operator!=(const TextureTransform& other) const { return !(*this == other); }
};
enum AlphaMode
@@ -96,8 +103,13 @@ public:
GLTF_TEXTURE_INFO_COUNT
};
- std::array<LLUUID, GLTF_TEXTURE_INFO_COUNT> mTextureId;
+ static const char* const GLTF_FILE_EXTENSION_TRANSFORM;
+ static const char* const GLTF_FILE_EXTENSION_TRANSFORM_SCALE;
+ static const char* const GLTF_FILE_EXTENSION_TRANSFORM_OFFSET;
+ static const char* const GLTF_FILE_EXTENSION_TRANSFORM_ROTATION;
+ static const LLUUID GLTF_OVERRIDE_NULL_UUID;
+ std::array<LLUUID, GLTF_TEXTURE_INFO_COUNT> mTextureId;
std::array<TextureTransform, GLTF_TEXTURE_INFO_COUNT> mTextureTransform;
// NOTE: initialize values to defaults according to the GLTF spec
@@ -137,7 +149,7 @@ public:
void setAlphaMode(S32 mode, bool for_override = false);
void setDoubleSided(bool double_sided, bool for_override = false);
- //NOTE: texture offsets only exist in overrides, so "for_override" is not needed
+ // *NOTE: texture offsets only exist in overrides, so "for_override" is not needed
void setTextureOffset(TextureInfo texture_info, const LLVector2& offset);
void setTextureScale(TextureInfo texture_info, const LLVector2& scale);
@@ -155,7 +167,6 @@ public:
static LLVector2 getDefaultTextureScale();
static F32 getDefaultTextureRotation();
-
static void hackOverrideUUID(LLUUID& id);
static void applyOverrideUUID(LLUUID& dst_id, const LLUUID& override_id);
@@ -164,7 +175,7 @@ public:
void setAlphaMode(const std::string& mode, bool for_override = false);
const char* getAlphaMode() const;
-
+
// set the contents of this LLGLTFMaterial from the given json
// returns true if successful
// if unsuccessful, the contents of this LLGLTFMaterial should be left unchanged and false is returned
@@ -185,6 +196,14 @@ public:
void writeToModel(tinygltf::Model& model, S32 mat_index) const;
void applyOverride(const LLGLTFMaterial& override_mat);
+
+ // apply the given LLSD override data
+ void applyOverrideLLSD(const LLSD& data);
+
+ // Get the given override on this LLGLTFMaterial as LLSD
+ // override_mat -- the override source data
+ // data -- output LLSD object (should be passed in empty)
+ void getOverrideLLSD(const LLGLTFMaterial& override_mat, LLSD& data);
// For base materials only (i.e. assets). Clears transforms to
// default since they're not supported in assets yet.
@@ -193,21 +212,29 @@ public:
// For material overrides only. Clears most properties to
// default/fallthrough, but preserves the transforms.
bool setBaseMaterial();
+ void setBaseMaterial(const LLGLTFMaterial& old_override_mat);
// True if setBaseMaterial() was just called
- bool isClearedForBaseMaterial();
+ bool isClearedForBaseMaterial() const;
// For local materials, they have to keep track of where
// they are assigned to for full updates
virtual void addTextureEntry(LLTextureEntry* te) {};
virtual void removeTextureEntry(LLTextureEntry* te) {};
-private:
+protected:
+ static LLVector2 vec2FromJson(const std::map<std::string, tinygltf::Value>& object, const char* key, const LLVector2& default_value);
+ static F32 floatFromJson(const std::map<std::string, tinygltf::Value>& object, const char* key, const F32 default_value);
+
+ template<typename T>
+ static void allocateTextureImage(tinygltf::Model& model, T& texture_info, const std::string& uri);
+
template<typename T>
void setFromTexture(const tinygltf::Model& model, const T& texture_info, TextureInfo texture_info_id);
+ template<typename T>
+ static void setFromTexture(const tinygltf::Model& model, const T& texture_info, LLUUID& texture_id, TextureTransform& transform);
template<typename T>
void writeToTexture(tinygltf::Model& model, T& texture_info, TextureInfo texture_info_id, bool force_write = false) const;
-
- void setBaseMaterial(const LLGLTFMaterial& old_override_mat);
+ template<typename T>
+ static void writeToTexture(tinygltf::Model& model, T& texture_info, const LLUUID& texture_id, const TextureTransform& transform, bool force_write = false);
};
-
diff --git a/indra/llprimitive/llgltfmaterial_templates.h b/indra/llprimitive/llgltfmaterial_templates.h
new file mode 100644
index 0000000000..f607dfe967
--- /dev/null
+++ b/indra/llprimitive/llgltfmaterial_templates.h
@@ -0,0 +1,142 @@
+/**
+ * @file llgltfmaterial_templates.h
+ * @brief Material template definition
+ *
+ * $LicenseInfo:firstyear=2023&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2023, 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$
+ */
+
+#pragma once
+
+#include "llgltfmaterial.h"
+
+// Use templates here as workaround for the different similar texture info classes in tinygltf
+// Includer must first include tiny_gltf.h with the desired flags
+
+template<typename T>
+std::string gltf_get_texture_image(const tinygltf::Model& model, const T& texture_info)
+{
+ const S32 texture_idx = texture_info.index;
+ if (texture_idx < 0 || texture_idx >= model.textures.size())
+ {
+ return "";
+ }
+ const tinygltf::Texture& texture = model.textures[texture_idx];
+
+ // Ignore texture.sampler for now
+
+ const S32 image_idx = texture.source;
+ if (image_idx < 0 || image_idx >= model.images.size())
+ {
+ return "";
+ }
+ const tinygltf::Image& image = model.images[image_idx];
+
+ return image.uri;
+}
+
+template<typename T>
+void LLGLTFMaterial::setFromTexture(const tinygltf::Model& model, const T& texture_info, TextureInfo texture_info_id)
+{
+ setFromTexture(model, texture_info, mTextureId[texture_info_id], mTextureTransform[texture_info_id]);
+ const std::string uri = gltf_get_texture_image(model, texture_info);
+}
+
+// static
+template<typename T>
+void LLGLTFMaterial::setFromTexture(const tinygltf::Model& model, const T& texture_info, LLUUID& texture_id, TextureTransform& transform)
+{
+ LL_PROFILE_ZONE_SCOPED;
+ const std::string uri = gltf_get_texture_image(model, texture_info);
+ texture_id.set(uri);
+
+ const tinygltf::Value::Object& extensions_object = texture_info.extensions;
+ const auto transform_it = extensions_object.find(GLTF_FILE_EXTENSION_TRANSFORM);
+ if (transform_it != extensions_object.end())
+ {
+ const tinygltf::Value& transform_json = std::get<1>(*transform_it);
+ if (transform_json.IsObject())
+ {
+ const tinygltf::Value::Object& transform_object = transform_json.Get<tinygltf::Value::Object>();
+ transform.mOffset = vec2FromJson(transform_object, GLTF_FILE_EXTENSION_TRANSFORM_OFFSET, getDefaultTextureOffset());
+ transform.mScale = vec2FromJson(transform_object, GLTF_FILE_EXTENSION_TRANSFORM_SCALE, getDefaultTextureScale());
+ transform.mRotation = floatFromJson(transform_object, GLTF_FILE_EXTENSION_TRANSFORM_ROTATION, getDefaultTextureRotation());
+ }
+ }
+}
+
+// static
+template<typename T>
+void LLGLTFMaterial::allocateTextureImage(tinygltf::Model& model, T& texture_info, const std::string& uri)
+{
+ const S32 image_idx = model.images.size();
+ model.images.emplace_back();
+ model.images[image_idx].uri = uri;
+
+ // The texture, not to be confused with the texture info
+ const S32 texture_idx = model.textures.size();
+ model.textures.emplace_back();
+ tinygltf::Texture& texture = model.textures[texture_idx];
+ texture.source = image_idx;
+
+ texture_info.index = texture_idx;
+}
+
+// static
+template<typename T>
+void LLGLTFMaterial::writeToTexture(tinygltf::Model& model, T& texture_info, TextureInfo texture_info_id, bool force_write) const
+{
+ writeToTexture(model, texture_info, mTextureId[texture_info_id], mTextureTransform[texture_info_id], force_write);
+}
+
+// static
+template<typename T>
+void LLGLTFMaterial::writeToTexture(tinygltf::Model& model, T& texture_info, const LLUUID& texture_id, const TextureTransform& transform, bool force_write)
+{
+ LL_PROFILE_ZONE_SCOPED;
+ const bool is_blank_transform = transform == sDefault.mTextureTransform[0];
+ // Check if this material matches all the fallback values, and if so, then
+ // skip including it to reduce material size
+ if (!force_write && texture_id.isNull() && is_blank_transform)
+ {
+ return;
+ }
+
+ // tinygltf will discard this texture info if there is no valid texture,
+ // causing potential loss of information for overrides, so ensure one is
+ // defined. -Cosmic,2023-01-30
+ allocateTextureImage(model, texture_info, texture_id.asString());
+
+ if (!is_blank_transform)
+ {
+ tinygltf::Value::Object transform_map;
+ transform_map[GLTF_FILE_EXTENSION_TRANSFORM_OFFSET] = tinygltf::Value(tinygltf::Value::Array({
+ tinygltf::Value(transform.mOffset.mV[VX]),
+ tinygltf::Value(transform.mOffset.mV[VY])
+ }));
+ transform_map[GLTF_FILE_EXTENSION_TRANSFORM_SCALE] = tinygltf::Value(tinygltf::Value::Array({
+ tinygltf::Value(transform.mScale.mV[VX]),
+ tinygltf::Value(transform.mScale.mV[VY])
+ }));
+ transform_map[GLTF_FILE_EXTENSION_TRANSFORM_ROTATION] = tinygltf::Value(transform.mRotation);
+ texture_info.extensions[GLTF_FILE_EXTENSION_TRANSFORM] = tinygltf::Value(transform_map);
+ }
+}
diff --git a/indra/llprimitive/llmaterial.cpp b/indra/llprimitive/llmaterial.cpp
index 37525e4a3d..0d146de949 100644
--- a/indra/llprimitive/llmaterial.cpp
+++ b/indra/llprimitive/llmaterial.cpp
@@ -332,17 +332,6 @@ void LLMaterial::setAlphaMaskCutoff(U8 cutoff)
mAlphaMaskCutoff = cutoff;
}
-LLUUID LLMaterial::getMaterialID() const
-{
- // TODO - not null
- return LLUUID::null;
-}
-
-void LLMaterial::setMaterialID(const LLUUID &material_id)
-{
- // TODO - set
-}
-
LLSD LLMaterial::asLLSD() const
{
LLSD material_data;
@@ -438,18 +427,18 @@ bool LLMaterial::operator != (const LLMaterial& rhs) const
}
-U32 LLMaterial::getShaderMask(U32 alpha_mode)
+U32 LLMaterial::getShaderMask(U32 alpha_mode, BOOL is_alpha)
{ //NEVER incorporate this value into the message system -- this function will vary depending on viewer implementation
- U32 ret = 0;
- //two least significant bits are "diffuse alpha mode"
- if (alpha_mode != DIFFUSE_ALPHA_MODE_DEFAULT)
- {
- ret = alpha_mode;
- }
- else
+ //two least significant bits are "diffuse alpha mode"
+ U32 ret = alpha_mode;
+ if (ret == DIFFUSE_ALPHA_MODE_DEFAULT)
{
- ret = getDiffuseAlphaMode();
+ ret = getDiffuseAlphaMode();
+ if (ret == DIFFUSE_ALPHA_MODE_BLEND && !is_alpha)
+ {
+ ret = DIFFUSE_ALPHA_MODE_NONE;
+ }
}
llassert(ret < SHADER_COUNT);
diff --git a/indra/llprimitive/llmaterial.h b/indra/llprimitive/llmaterial.h
index d715671ae1..81f41ddc51 100644
--- a/indra/llprimitive/llmaterial.h
+++ b/indra/llprimitive/llmaterial.h
@@ -115,8 +115,6 @@ public:
void setDiffuseAlphaMode(U8 alpha_mode);
U8 getAlphaMaskCutoff() const;
void setAlphaMaskCutoff(U8 cutoff);
- LLUUID getMaterialID() const;
- void setMaterialID(LLUUID const & material_id);
bool isNull() const;
static const LLMaterial null;
@@ -124,7 +122,7 @@ public:
bool operator == (const LLMaterial& rhs) const;
bool operator != (const LLMaterial& rhs) const;
- U32 getShaderMask(U32 alpha_mode = DIFFUSE_ALPHA_MODE_DEFAULT);
+ U32 getShaderMask(U32 alpha_mode, BOOL is_alpha);
LLUUID getHash() const;
protected:
diff --git a/indra/llprimitive/llmaterialid.h b/indra/llprimitive/llmaterialid.h
index e6165dfc91..5eb463b0fd 100644
--- a/indra/llprimitive/llmaterialid.h
+++ b/indra/llprimitive/llmaterialid.h
@@ -67,6 +67,14 @@ public:
static const LLMaterialID null;
+ // Returns a 64 bits digest of the material Id, by XORing its two 64 bits
+ // long words. HB
+ inline U64 getDigest64() const
+ {
+ U64* tmp = (U64*)mID;
+ return tmp[0] ^ tmp[1];
+ }
+
private:
void parseFromBinary(const LLSD::Binary& pMaterialID);
void copyFromOtherMaterialID(const LLMaterialID& pOtherMaterialID);
@@ -75,5 +83,23 @@ private:
U8 mID[MATERIAL_ID_SIZE];
} ;
+// std::hash implementation for LLMaterialID
+namespace std
+{
+ template<> struct hash<LLMaterialID>
+ {
+ inline size_t operator()(const LLMaterialID& id) const noexcept
+ {
+ return (size_t)id.getDigest64();
+ }
+ };
+}
+
+// For use with boost containers.
+inline size_t hash_value(const LLMaterialID& id) noexcept
+{
+ return (size_t)id.getDigest64();
+}
+
#endif // LL_LLMATERIALID_H
diff --git a/indra/llprimitive/llprimitive.cpp b/indra/llprimitive/llprimitive.cpp
index 5dfce4ae16..350d84ae6c 100644
--- a/indra/llprimitive/llprimitive.cpp
+++ b/indra/llprimitive/llprimitive.cpp
@@ -85,6 +85,8 @@ const F32 LIGHT_MAX_CUTOFF = 180.f;
const F32 REFLECTION_PROBE_MIN_AMBIANCE = 0.f;
const F32 REFLECTION_PROBE_MAX_AMBIANCE = 100.f;
const F32 REFLECTION_PROBE_DEFAULT_AMBIANCE = 0.f;
+// *NOTE: Clip distances are clamped in LLCamera::setNear. The max clip
+// distance is currently limited by the skybox
const F32 REFLECTION_PROBE_MIN_CLIP_DISTANCE = 0.f;
const F32 REFLECTION_PROBE_MAX_CLIP_DISTANCE = 1024.f;
const F32 REFLECTION_PROBE_DEFAULT_CLIP_DISTANCE = 0.f;
diff --git a/indra/llrender/CMakeLists.txt b/indra/llrender/CMakeLists.txt
index 9454943dc5..a95daed6cd 100644
--- a/indra/llrender/CMakeLists.txt
+++ b/indra/llrender/CMakeLists.txt
@@ -29,6 +29,7 @@ set(llrender_SOURCE_FILES
llrendertarget.cpp
llshadermgr.cpp
lltexture.cpp
+ lltexturemanagerbridge.cpp
lluiimage.cpp
llvertexbuffer.cpp
llglcommonfunc.cpp
@@ -58,6 +59,7 @@ set(llrender_HEADER_FILES
llrendersphere.h
llshadermgr.h
lltexture.h
+ lltexturemanagerbridge.h
lluiimage.h
lluiimage.inl
llvertexbuffer.h
diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp
index 1bf061bc8d..15fddbc99f 100644
--- a/indra/llrender/llfontgl.cpp
+++ b/indra/llrender/llfontgl.cpp
@@ -494,7 +494,7 @@ F32 LLFontGL::getWidthF32(const std::string& utf8text, S32 begin_offset, S32 max
return getWidthF32(wtext.c_str(), begin_offset, max_chars);
}
-F32 LLFontGL::getWidthF32(const llwchar* wchars, S32 begin_offset, S32 max_chars) const
+F32 LLFontGL::getWidthF32(const llwchar* wchars, S32 begin_offset, S32 max_chars, bool no_padding) const
{
const S32 LAST_CHARACTER = LLFontFreetype::LAST_CHAR_FULL;
@@ -517,12 +517,15 @@ F32 LLFontGL::getWidthF32(const llwchar* wchars, S32 begin_offset, S32 max_chars
F32 advance = mFontFreetype->getXAdvance(fgi);
- // for the last character we want to measure the greater of its width and xadvance values
- // so keep track of the difference between these values for the each character we measure
- // so we can fix things up at the end
- width_padding = llmax( 0.f, // always use positive padding amount
- width_padding - advance, // previous padding left over after advance of current character
- (F32)(fgi->mWidth + fgi->mXBearing) - advance); // difference between width of this character and advance to next character
+ if (!no_padding)
+ {
+ // for the last character we want to measure the greater of its width and xadvance values
+ // so keep track of the difference between these values for the each character we measure
+ // so we can fix things up at the end
+ width_padding = llmax(0.f, // always use positive padding amount
+ width_padding - advance, // previous padding left over after advance of current character
+ (F32)(fgi->mWidth + fgi->mXBearing) - advance); // difference between width of this character and advance to next character
+ }
cur_x += advance;
llwchar next_char = wchars[i+1];
@@ -539,8 +542,11 @@ F32 LLFontGL::getWidthF32(const llwchar* wchars, S32 begin_offset, S32 max_chars
cur_x = (F32)ll_round(cur_x);
}
- // add in extra pixels for last character's width past its xadvance
- cur_x += width_padding;
+ if (!no_padding)
+ {
+ // add in extra pixels for last character's width past its xadvance
+ cur_x += width_padding;
+ }
return cur_x / sScaleX;
}
@@ -1018,6 +1024,20 @@ LLFontGL* LLFontGL::getFontSansSerifSmall()
}
//static
+LLFontGL* LLFontGL::getFontSansSerifSmallBold()
+{
+ static LLFontGL* fontp = getFont(LLFontDescriptor("SansSerif","Small",BOLD));
+ return fontp;
+}
+
+//static
+LLFontGL* LLFontGL::getFontSansSerifSmallItalic()
+{
+ static LLFontGL* fontp = getFont(LLFontDescriptor("SansSerif","Small",ITALIC));
+ return fontp;
+}
+
+//static
LLFontGL* LLFontGL::getFontSansSerif()
{
static LLFontGL* fontp = getFont(LLFontDescriptor("SansSerif","Medium",0));
diff --git a/indra/llrender/llfontgl.h b/indra/llrender/llfontgl.h
index 3b58a37d33..9bbf9ce0c4 100644
--- a/indra/llrender/llfontgl.h
+++ b/indra/llrender/llfontgl.h
@@ -138,7 +138,7 @@ public:
F32 getWidthF32(const std::string& utf8text) const;
F32 getWidthF32(const llwchar* wchars) const;
F32 getWidthF32(const std::string& text, S32 offset, S32 max_chars ) const;
- F32 getWidthF32(const llwchar* wchars, S32 offset, S32 max_chars) const;
+ F32 getWidthF32(const llwchar* wchars, S32 offset, S32 max_chars, bool no_padding = false) const;
// The following are called often, frequently with large buffers, so do not use a string interface
@@ -189,6 +189,8 @@ public:
static LLFontGL* getFontMonospace();
static LLFontGL* getFontSansSerifSmall();
+ static LLFontGL* getFontSansSerifSmallBold();
+ static LLFontGL* getFontSansSerifSmallItalic();
static LLFontGL* getFontSansSerif();
static LLFontGL* getFontSansSerifBig();
static LLFontGL* getFontSansSerifHuge();
diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp
index ae408dae4f..4c7c8e6f5c 100644
--- a/indra/llrender/llgl.cpp
+++ b/indra/llrender/llgl.cpp
@@ -2890,9 +2890,7 @@ void LLGLSyncFence::wait()
if (mSync)
{
while (glClientWaitSync(mSync, 0, FENCE_WAIT_TIME_NANOSECONDS) == GL_TIMEOUT_EXPIRED)
- { //track the number of times we've waited here
- static S32 waits = 0;
- waits++;
+ {
}
}
}
diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp
index 3e3a3095e3..c6fd824c4e 100644
--- a/indra/llrender/llimagegl.cpp
+++ b/indra/llrender/llimagegl.cpp
@@ -58,7 +58,7 @@ U32 wpo2(U32 i);
// texture memory accounting (for OS X)
static LLMutex sTexMemMutex;
-static std::unordered_map<U32, U32> sTextureAllocs;
+static std::unordered_map<U32, U64> sTextureAllocs;
static U64 sTextureBytes = 0;
// track a texture alloc on the currently bound texture.
@@ -67,7 +67,7 @@ static void alloc_tex_image(U32 width, U32 height, U32 pixformat)
{
U32 texUnit = gGL.getCurrentTexUnitIndex();
U32 texName = gGL.getTexUnit(texUnit)->getCurrTexture();
- S32 size = LLImageGL::dataFormatBytes(pixformat, width, height);
+ U64 size = LLImageGL::dataFormatBytes(pixformat, width, height);
llassert(size >= 0);
@@ -296,7 +296,7 @@ S32 LLImageGL::dataFormatBits(S32 dataformat)
}
//static
-S32 LLImageGL::dataFormatBytes(S32 dataformat, S32 width, S32 height)
+S64 LLImageGL::dataFormatBytes(S32 dataformat, S32 width, S32 height)
{
switch (dataformat)
{
@@ -312,8 +312,8 @@ S32 LLImageGL::dataFormatBytes(S32 dataformat, S32 width, S32 height)
default:
break;
}
- S32 bytes ((width*height*dataFormatBits(dataformat)+7)>>3);
- S32 aligned = (bytes+3)&~3;
+ S64 bytes (((S64)width * (S64)height * (S64)dataFormatBits(dataformat)+7)>>3);
+ S64 aligned = (bytes+3)&~3;
return aligned;
}
@@ -518,7 +518,7 @@ void LLImageGL::init(BOOL usemipmaps)
// so that it is obvious by visual inspection if we forgot to
// init a field.
- mTextureMemory = (S32Bytes)0;
+ mTextureMemory = S64Bytes(0);
mLastBindTime = 0.f;
mPickMask = NULL;
@@ -905,9 +905,16 @@ BOOL LLImageGL::setImage(const U8* data_in, BOOL data_hasmips /* = FALSE */, S32
stop_glerror();
if (prev_mip_data)
- delete[] prev_mip_data;
+ {
+ if (prev_mip_data != cur_mip_data)
+ delete[] prev_mip_data;
+ prev_mip_data = nullptr;
+ }
if (cur_mip_data)
+ {
delete[] cur_mip_data;
+ cur_mip_data = nullptr;
+ }
mGLTextureCreated = false;
return FALSE;
@@ -1737,7 +1744,7 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_
}
- mTextureMemory = (S32Bytes)getMipBytes(mCurrentDiscardLevel);
+ mTextureMemory = (S64Bytes)getMipBytes(mCurrentDiscardLevel);
mTexelsInGLTexture = getWidth() * getHeight();
// mark this as bound at this point, so we don't throw it out immediately
@@ -1931,9 +1938,9 @@ void LLImageGL::destroyGLTexture()
if (mTexName != 0)
{
- if(mTextureMemory != S32Bytes(0))
+ if(mTextureMemory != S64Bytes(0))
{
- mTextureMemory = (S32Bytes)0;
+ mTextureMemory = (S64Bytes)0;
}
LLImageGL::deleteTextures(1, &mTexName);
@@ -2029,7 +2036,7 @@ S32 LLImageGL::getWidth(S32 discard_level) const
return width;
}
-S32 LLImageGL::getBytes(S32 discard_level) const
+S64 LLImageGL::getBytes(S32 discard_level) const
{
if (discard_level < 0)
{
@@ -2042,7 +2049,7 @@ S32 LLImageGL::getBytes(S32 discard_level) const
return dataFormatBytes(mFormatPrimary, w, h);
}
-S32 LLImageGL::getMipBytes(S32 discard_level) const
+S64 LLImageGL::getMipBytes(S32 discard_level) const
{
if (discard_level < 0)
{
@@ -2050,7 +2057,7 @@ S32 LLImageGL::getMipBytes(S32 discard_level) const
}
S32 w = mWidth>>discard_level;
S32 h = mHeight>>discard_level;
- S32 res = dataFormatBytes(mFormatPrimary, w, h);
+ S64 res = dataFormatBytes(mFormatPrimary, w, h);
if (mUseMipMaps)
{
while (w > 1 && h > 1)
diff --git a/indra/llrender/llimagegl.h b/indra/llrender/llimagegl.h
index 243aeaea25..a9a6b93cb3 100644
--- a/indra/llrender/llimagegl.h
+++ b/indra/llrender/llimagegl.h
@@ -65,7 +65,7 @@ public:
// Size calculation
static S32 dataFormatBits(S32 dataformat);
- static S32 dataFormatBytes(S32 dataformat, S32 width, S32 height);
+ static S64 dataFormatBytes(S32 dataformat, S32 width, S32 height);
static S32 dataFormatComponents(S32 dataformat);
BOOL updateBindStats() const ;
@@ -145,8 +145,8 @@ public:
S32 getWidth(S32 discard_level = -1) const;
S32 getHeight(S32 discard_level = -1) const;
U8 getComponents() const { return mComponents; }
- S32 getBytes(S32 discard_level = -1) const;
- S32 getMipBytes(S32 discard_level = -1) const;
+ S64 getBytes(S32 discard_level = -1) const;
+ S64 getMipBytes(S32 discard_level = -1) const;
BOOL getBoundRecently() const;
BOOL isJustBound() const;
BOOL getHasExplicitFormat() const { return mHasExplicitFormat; }
@@ -208,7 +208,7 @@ public:
public:
// Various GL/Rendering options
- S32Bytes mTextureMemory;
+ S64Bytes mTextureMemory;
mutable F32 mLastBindTime; // last time this was bound, by discard level
private:
diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index 8430d13093..ee66122774 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -975,8 +975,8 @@ void LLRender::syncLightState()
shader->uniform3fv(LLShaderMgr::LIGHT_AMBIENT, 1, mAmbientLightColor.mV);
shader->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_primary[0] ? 1 : 0);
//shader->uniform3fv(LLShaderMgr::AMBIENT, 1, mAmbientLightColor.mV);
- shader->uniform3fv(LLShaderMgr::SUNLIGHT_COLOR, 1, diffuse[0].mV);
- shader->uniform3fv(LLShaderMgr::MOONLIGHT_COLOR, 1, diffuse_b[0].mV);
+ //shader->uniform3fv(LLShaderMgr::SUNLIGHT_COLOR, 1, diffuse[0].mV);
+ //shader->uniform3fv(LLShaderMgr::MOONLIGHT_COLOR, 1, diffuse_b[0].mV);
}
}
diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp
index 91412add44..d1ff85c85b 100644
--- a/indra/llrender/llshadermgr.cpp
+++ b/indra/llrender/llshadermgr.cpp
@@ -1275,6 +1275,8 @@ void LLShaderMgr::initAttribsAndUniforms()
mReservedUniforms.push_back("sunlight_color");
mReservedUniforms.push_back("ambient_color");
mReservedUniforms.push_back("sky_hdr_scale");
+ mReservedUniforms.push_back("sky_sunlight_scale");
+ mReservedUniforms.push_back("sky_ambient_scale");
mReservedUniforms.push_back("blue_horizon");
mReservedUniforms.push_back("blue_density");
mReservedUniforms.push_back("haze_horizon");
@@ -1308,8 +1310,9 @@ void LLShaderMgr::initAttribsAndUniforms()
mReservedUniforms.push_back("warmthAmount");
mReservedUniforms.push_back("glowStrength");
mReservedUniforms.push_back("glowDelta");
+ mReservedUniforms.push_back("glowNoiseMap");
- llassert(mReservedUniforms.size() == LLShaderMgr::GLOW_DELTA+1);
+ llassert(mReservedUniforms.size() == LLShaderMgr::GLOW_NOISE_MAP+1);
mReservedUniforms.push_back("minimum_alpha");
diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h
index 151e94093d..5c99a6b42d 100644
--- a/indra/llrender/llshadermgr.h
+++ b/indra/llrender/llshadermgr.h
@@ -103,6 +103,8 @@ public:
SUNLIGHT_COLOR, // "sunlight_color"
AMBIENT, // "ambient_color"
SKY_HDR_SCALE, // "sky_hdr_scale"
+ SKY_SUNLIGHT_SCALE, // "sky_sunlight_scale"
+ SKY_AMBIENT_SCALE, // "sky_ambient_scale"
BLUE_HORIZON, // "blue_horizon"
BLUE_DENSITY, // "blue_density"
HAZE_HORIZON, // "haze_horizon"
@@ -131,6 +133,7 @@ public:
GLOW_WARMTH_AMOUNT, // "warmthAmount"
GLOW_STRENGTH, // "glowStrength"
GLOW_DELTA, // "glowDelta"
+ GLOW_NOISE_MAP, // "glowNoiseMap"
MINIMUM_ALPHA, // "minimum_alpha"
EMISSIVE_BRIGHTNESS, // "emissive_brightness"
diff --git a/indra/llappearance/lltexturemanagerbridge.cpp b/indra/llrender/lltexturemanagerbridge.cpp
index 33f2185e4f..33f2185e4f 100644
--- a/indra/llappearance/lltexturemanagerbridge.cpp
+++ b/indra/llrender/lltexturemanagerbridge.cpp
diff --git a/indra/llappearance/lltexturemanagerbridge.h b/indra/llrender/lltexturemanagerbridge.h
index 101704b162..f61433ea4d 100644
--- a/indra/llappearance/lltexturemanagerbridge.h
+++ b/indra/llrender/lltexturemanagerbridge.h
@@ -27,7 +27,6 @@
#ifndef LL_TEXTUREMANAGERBRIDGE_H
#define LL_TEXTUREMANAGERBRIDGE_H
-#include "llavatarappearancedefines.h"
#include "llpointer.h"
#include "llgltexture.h"
diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp
index b5dda23828..de27636c33 100644
--- a/indra/llrender/llvertexbuffer.cpp
+++ b/indra/llrender/llvertexbuffer.cpp
@@ -703,7 +703,7 @@ bool LLVertexBuffer::validateRange(U32 start, U32 end, U32 count, U32 indices_of
for (U32 i = start; i <= end; ++i)
{
- if (!v->isFinite3())
+ if (!v[i].isFinite3())
{
LL_ERRS() << "Non-finite vertex position data detected." << LL_ENDL;
}
diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp
index 809d72208f..0a82bed896 100644
--- a/indra/llui/llaccordionctrl.cpp
+++ b/indra/llui/llaccordionctrl.cpp
@@ -60,7 +60,7 @@ LLAccordionCtrl::LLAccordionCtrl(const Params& params):LLPanel(params)
initNoTabsWidget(params.no_matched_tabs_text);
mSingleExpansion = params.single_expansion;
- if(mFitParent && !mSingleExpansion)
+ if (mFitParent && !mSingleExpansion)
{
LL_INFOS() << "fit_parent works best when combined with single_expansion" << LL_ENDL;
}
@@ -102,14 +102,13 @@ void LLAccordionCtrl::draw()
LLPanel::draw();
}
-
//---------------------------------------------------------------------------------
BOOL LLAccordionCtrl::postBuild()
{
- static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
+ static LLUICachedControl<S32> scrollbar_size("UIScrollbarSize", 0);
LLRect scroll_rect;
- scroll_rect.setOriginAndSize(
+ scroll_rect.setOriginAndSize(
getRect().getWidth() - scrollbar_size,
1,
scrollbar_size,
@@ -126,39 +125,42 @@ BOOL LLAccordionCtrl::postBuild()
sbparams.follows.flags(FOLLOWS_RIGHT | FOLLOWS_TOP | FOLLOWS_BOTTOM);
sbparams.change_callback(boost::bind(&LLAccordionCtrl::onScrollPosChangeCallback, this, _1, _2));
- mScrollbar = LLUICtrlFactory::create<LLScrollbar> (sbparams);
- LLView::addChild( mScrollbar );
- mScrollbar->setVisible( false );
+ mScrollbar = LLUICtrlFactory::create<LLScrollbar>(sbparams);
+ LLView::addChild(mScrollbar);
+ mScrollbar->setVisible(FALSE);
mScrollbar->setFollowsRight();
mScrollbar->setFollowsTop();
mScrollbar->setFollowsBottom();
//if it was created from xml...
std::vector<LLUICtrl*> accordion_tabs;
- for(child_list_const_iter_t it = getChildList()->begin();
+ for (child_list_const_iter_t it = getChildList()->begin();
getChildList()->end() != it; ++it)
{
LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(*it);
- if(accordion_tab == NULL)
+ if (accordion_tab == NULL)
continue;
- if(std::find(mAccordionTabs.begin(),mAccordionTabs.end(),accordion_tab) == mAccordionTabs.end())
+ if (std::find(mAccordionTabs.begin(), mAccordionTabs.end(), accordion_tab) == mAccordionTabs.end())
{
accordion_tabs.push_back(accordion_tab);
}
}
- for(std::vector<LLUICtrl*>::reverse_iterator it = accordion_tabs.rbegin();it!=accordion_tabs.rend();++it)
+ for (std::vector<LLUICtrl*>::reverse_iterator it = accordion_tabs.rbegin();
+ it < accordion_tabs.rend(); ++it)
+ {
addCollapsibleCtrl(*it);
+ }
- arrange ();
+ arrange();
- if(mSingleExpansion)
+ if (mSingleExpansion)
{
- if(!mAccordionTabs[0]->getDisplayChildren())
+ if (!mAccordionTabs[0]->getDisplayChildren())
mAccordionTabs[0]->setDisplayChildren(true);
- for(size_t i=1;i<mAccordionTabs.size();++i)
+ for (size_t i = 1; i < mAccordionTabs.size(); ++i)
{
- if(mAccordionTabs[i]->getDisplayChildren())
+ if (mAccordionTabs[i]->getDisplayChildren())
mAccordionTabs[i]->setDisplayChildren(false);
}
}
@@ -205,23 +207,22 @@ BOOL LLAccordionCtrl::handleRightMouseDown(S32 x, S32 y, MASK mask)
//---------------------------------------------------------------------------------
void LLAccordionCtrl::shiftAccordionTabs(S16 panel_num, S32 delta)
{
- for(size_t i = panel_num; i < mAccordionTabs.size(); i++ )
+ for (size_t i = panel_num; i < mAccordionTabs.size(); ++i)
{
ctrlShiftVertical(mAccordionTabs[i],delta);
}
}
-
//---------------------------------------------------------------------------------
void LLAccordionCtrl::onCollapseCtrlCloseOpen(S16 panel_num)
{
- if(mSingleExpansion)
+ if (mSingleExpansion)
{
- for(size_t i=0;i<mAccordionTabs.size();++i)
+ for (size_t i = 0; i < mAccordionTabs.size(); ++i)
{
- if(i==panel_num)
+ if (i == panel_num)
continue;
- if(mAccordionTabs[i]->getDisplayChildren())
+ if (mAccordionTabs[i]->getDisplayChildren())
mAccordionTabs[i]->setDisplayChildren(false);
}
@@ -232,64 +233,63 @@ void LLAccordionCtrl::onCollapseCtrlCloseOpen(S16 panel_num)
void LLAccordionCtrl::show_hide_scrollbar(S32 width, S32 height)
{
calcRecuiredHeight();
- if(getRecuiredHeight() > height )
- showScrollbar(width,height);
+ if (getRecuiredHeight() > height)
+ showScrollbar(width, height);
else
- hideScrollbar(width,height);
+ hideScrollbar(width, height);
}
-void LLAccordionCtrl::showScrollbar(S32 width, S32 height)
+void LLAccordionCtrl::showScrollbar(S32 width, S32 height)
{
bool was_visible = mScrollbar->getVisible();
- mScrollbar->setVisible(true);
+ mScrollbar->setVisible(TRUE);
static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
ctrlSetLeftTopAndSize(mScrollbar
- ,width-scrollbar_size - PARENT_BORDER_MARGIN/2
- ,height-PARENT_BORDER_MARGIN
- ,scrollbar_size
- ,height-2*PARENT_BORDER_MARGIN);
+ , width - scrollbar_size - PARENT_BORDER_MARGIN / 2
+ , height - PARENT_BORDER_MARGIN
+ , scrollbar_size
+ , height - PARENT_BORDER_MARGIN * 2);
mScrollbar->setPageSize(height);
- mScrollbar->setDocParams(mInnerRect.getHeight(),mScrollbar->getDocPos());
+ mScrollbar->setDocParams(mInnerRect.getHeight(), mScrollbar->getDocPos());
- if(was_visible)
+ if (was_visible)
{
S32 scroll_pos = llmin(mScrollbar->getDocPos(), getRecuiredHeight() - height - 1);
mScrollbar->setDocPos(scroll_pos);
}
}
-void LLAccordionCtrl::hideScrollbar( S32 width, S32 height )
+void LLAccordionCtrl::hideScrollbar(S32 width, S32 height)
{
- if(mScrollbar->getVisible() == false)
+ if (mScrollbar->getVisible() == FALSE)
return;
- mScrollbar->setVisible(false);
+ mScrollbar->setVisible(FALSE);
static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
S32 panel_width = width - 2*BORDER_MARGIN;
- //reshape all accordeons and shift all draggers
- for(size_t i=0;i<mAccordionTabs.size();++i)
+ // Reshape all accordions and shift all draggers
+ for (size_t i = 0; i < mAccordionTabs.size(); ++i)
{
LLRect panel_rect = mAccordionTabs[i]->getRect();
- ctrlSetLeftTopAndSize(mAccordionTabs[i],panel_rect.mLeft,panel_rect.mTop,panel_width,panel_rect.getHeight());
+ ctrlSetLeftTopAndSize(mAccordionTabs[i], panel_rect.mLeft, panel_rect.mTop, panel_width, panel_rect.getHeight());
}
mScrollbar->setDocPos(0);
- if(mAccordionTabs.size()>0)
+ if (!mAccordionTabs.empty())
{
- S32 panel_top = height - BORDER_MARGIN; // Top coordinate of the first panel
+ S32 panel_top = height - BORDER_MARGIN; // Top coordinate of the first panel
S32 diff = panel_top - mAccordionTabs[0]->getRect().mTop;
- shiftAccordionTabs(0,diff);
+ shiftAccordionTabs(0, diff);
}
}
-
//---------------------------------------------------------------------------------
S32 LLAccordionCtrl::calcRecuiredHeight()
{
@@ -305,7 +305,7 @@ S32 LLAccordionCtrl::calcRecuiredHeight()
}
}
- mInnerRect.setLeftTopAndSize(0,rec_height + BORDER_MARGIN*2,getRect().getWidth(),rec_height + BORDER_MARGIN);
+ mInnerRect.setLeftTopAndSize(0, rec_height + BORDER_MARGIN * 2, getRect().getWidth(), rec_height + BORDER_MARGIN);
return mInnerRect.getHeight();
}
@@ -313,7 +313,7 @@ S32 LLAccordionCtrl::calcRecuiredHeight()
//---------------------------------------------------------------------------------
void LLAccordionCtrl::ctrlSetLeftTopAndSize(LLView* panel, S32 left, S32 top, S32 width, S32 height)
{
- if(!panel)
+ if (!panel)
return;
LLRect panel_rect = panel->getRect();
panel_rect.setLeftTopAndSize( left, top, width, height);
@@ -321,9 +321,9 @@ void LLAccordionCtrl::ctrlSetLeftTopAndSize(LLView* panel, S32 left, S32 top, S3
panel->setRect(panel_rect);
}
-void LLAccordionCtrl::ctrlShiftVertical(LLView* panel,S32 delta)
+void LLAccordionCtrl::ctrlShiftVertical(LLView* panel, S32 delta)
{
- if(!panel)
+ if (!panel)
return;
panel->translate(0,delta);
}
@@ -333,9 +333,9 @@ void LLAccordionCtrl::ctrlShiftVertical(LLView* panel,S32 delta)
void LLAccordionCtrl::addCollapsibleCtrl(LLView* view)
{
LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(view);
- if(!accordion_tab)
+ if (!accordion_tab)
return;
- if(std::find(beginChild(), endChild(), accordion_tab) == endChild())
+ if (std::find(beginChild(), endChild(), accordion_tab) == endChild())
addChild(accordion_tab);
mAccordionTabs.push_back(accordion_tab);
@@ -369,7 +369,7 @@ void LLAccordionCtrl::removeCollapsibleCtrl(LLView* view)
}
}
-void LLAccordionCtrl::initNoTabsWidget(const LLTextBox::Params& tb_params)
+void LLAccordionCtrl::initNoTabsWidget(const LLTextBox::Params& tb_params)
{
LLTextBox::Params tp = tb_params;
tp.rect(getLocalRect());
@@ -377,39 +377,39 @@ void LLAccordionCtrl::initNoTabsWidget(const LLTextBox::Params& tb_params)
mNoVisibleTabsHelpText = LLUICtrlFactory::create<LLTextBox>(tp, this);
}
-void LLAccordionCtrl::updateNoTabsHelpTextVisibility()
+void LLAccordionCtrl::updateNoTabsHelpTextVisibility()
{
bool visible_exists = false;
std::vector<LLAccordionCtrlTab*>::const_iterator it = mAccordionTabs.begin();
const std::vector<LLAccordionCtrlTab*>::const_iterator it_end = mAccordionTabs.end();
- for (; it != it_end; ++it)
+ while (it < it_end)
{
- if ((*it)->getVisible())
+ if ((*(it++))->getVisible())
{
visible_exists = true;
break;
}
}
- mNoVisibleTabsHelpText->setVisible(!visible_exists);
+ mNoVisibleTabsHelpText->setVisible(visible_exists ? FALSE : TRUE);
}
-void LLAccordionCtrl::arrangeSinge()
+void LLAccordionCtrl::arrangeSingle()
{
- S32 panel_left = BORDER_MARGIN; // Margin from left side of Splitter
- S32 panel_top = getRect().getHeight() - BORDER_MARGIN; // Top coordinate of the first panel
- S32 panel_width = getRect().getWidth() - 4; // Top coordinate of the first panel
+ S32 panel_left = BORDER_MARGIN; // Margin from left side of Splitter
+ S32 panel_top = getRect().getHeight() - BORDER_MARGIN; // Top coordinate of the first panel
+ S32 panel_width = getRect().getWidth() - 4;
S32 panel_height;
S32 collapsed_height = 0;
- for(size_t i=0;i<mAccordionTabs.size();++i)
+ for (size_t i = 0; i < mAccordionTabs.size(); ++i)
{
LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
- if(accordion_tab->getVisible() == false) //skip hidden accordion tabs
+ if (accordion_tab->getVisible() == FALSE) // Skip hidden accordion tabs
continue;
- if(!accordion_tab->isExpanded() )
+ if (!accordion_tab->isExpanded() )
{
collapsed_height+=mAccordionTabs[i]->getRect().getHeight();
}
@@ -417,28 +417,28 @@ void LLAccordionCtrl::arrangeSinge()
S32 expanded_height = getRect().getHeight() - BORDER_MARGIN - collapsed_height;
- for(size_t i=0;i<mAccordionTabs.size();++i)
+ for (size_t i = 0; i < mAccordionTabs.size(); ++i)
{
LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
- if(accordion_tab->getVisible() == false) //skip hidden accordion tabs
+ if (accordion_tab->getVisible() == FALSE) // Skip hidden accordion tabs
continue;
- if(!accordion_tab->isExpanded() )
+ if (!accordion_tab->isExpanded() )
{
panel_height = accordion_tab->getRect().getHeight();
}
else
{
- if(mFitParent)
+ if (mFitParent)
{
panel_height = expanded_height;
}
else
{
- if(accordion_tab->getAccordionView())
+ if (accordion_tab->getAccordionView())
{
panel_height = accordion_tab->getAccordionView()->getRect().getHeight() +
- accordion_tab->getHeaderHeight() + 2*BORDER_MARGIN;
+ accordion_tab->getHeaderHeight() + BORDER_MARGIN * 2;
}
else
{
@@ -451,67 +451,67 @@ void LLAccordionCtrl::arrangeSinge()
panel_height = llmax(panel_height, accordion_tab->getHeaderHeight());
ctrlSetLeftTopAndSize(mAccordionTabs[i], panel_left, panel_top, panel_width, panel_height);
- panel_top-=mAccordionTabs[i]->getRect().getHeight();
+ panel_top -= mAccordionTabs[i]->getRect().getHeight();
}
show_hide_scrollbar(getRect().getWidth(), getRect().getHeight());
updateLayout(getRect().getWidth(), getRect().getHeight());
}
-void LLAccordionCtrl::arrangeMultiple()
+void LLAccordionCtrl::arrangeMultiple()
{
- S32 panel_left = BORDER_MARGIN; // Margin from left side of Splitter
- S32 panel_top = getRect().getHeight() - BORDER_MARGIN; // Top coordinate of the first panel
- S32 panel_width = getRect().getWidth() - 4; // Top coordinate of the first panel
+ S32 panel_left = BORDER_MARGIN; // Margin from left side of Splitter
+ S32 panel_top = getRect().getHeight() - BORDER_MARGIN; // Top coordinate of the first panel
+ S32 panel_width = getRect().getWidth() - 4;
//Calculate params
- for(size_t i = 0; i < mAccordionTabs.size(); i++ )
+ for (size_t i = 0; i < mAccordionTabs.size(); i++ )
{
LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
- if(accordion_tab->getVisible() == false) //skip hidden accordion tabs
+ if (accordion_tab->getVisible() == FALSE) // Skip hidden accordion tabs
continue;
- if(!accordion_tab->isExpanded() )
+ if (!accordion_tab->isExpanded() )
{
ctrlSetLeftTopAndSize(mAccordionTabs[i], panel_left, panel_top, panel_width, accordion_tab->getRect().getHeight());
- panel_top-=mAccordionTabs[i]->getRect().getHeight();
+ panel_top -= mAccordionTabs[i]->getRect().getHeight();
}
else
{
S32 panel_height = accordion_tab->getRect().getHeight();
- if(mFitParent)
+ if (mFitParent)
{
- // all expanded tabs will have equal height
+ // All expanded tabs will have equal height
panel_height = calcExpandedTabHeight(i, panel_top);
ctrlSetLeftTopAndSize(accordion_tab, panel_left, panel_top, panel_width, panel_height);
- // try to make accordion tab fit accordion view height.
+ // Try to make accordion tab fit accordion view height.
// Accordion View should implement getRequiredRect() and provide valid height
S32 optimal_height = accordion_tab->getAccordionView()->getRequiredRect().getHeight();
optimal_height += accordion_tab->getHeaderHeight() + 2 * BORDER_MARGIN;
- if(optimal_height < panel_height)
+ if (optimal_height < panel_height)
{
panel_height = optimal_height;
}
// minimum tab height is equal to header height
- if(mAccordionTabs[i]->getHeaderHeight() > panel_height)
+ if (mAccordionTabs[i]->getHeaderHeight() > panel_height)
{
panel_height = mAccordionTabs[i]->getHeaderHeight();
}
}
ctrlSetLeftTopAndSize(mAccordionTabs[i], panel_left, panel_top, panel_width, panel_height);
- panel_top-=panel_height;
+ panel_top -= panel_height;
}
}
- show_hide_scrollbar(getRect().getWidth(),getRect().getHeight());
+ show_hide_scrollbar(getRect().getWidth(), getRect().getHeight());
- updateLayout(getRect().getWidth(),getRect().getHeight());
+ updateLayout(getRect().getWidth(), getRect().getHeight());
}
@@ -519,70 +519,67 @@ void LLAccordionCtrl::arrange()
{
updateNoTabsHelpTextVisibility();
- if( mAccordionTabs.size() == 0)
+ if (mAccordionTabs.empty())
{
- //We do not arrange if we do not have what should be arranged
+ // Nothing to arrange
return;
}
-
- if(mAccordionTabs.size() == 1)
+ if (mAccordionTabs.size() == 1)
{
- S32 panel_top = getRect().getHeight() - BORDER_MARGIN; // Top coordinate of the first panel
- S32 panel_width = getRect().getWidth() - 4; // Top coordinate of the first panel
+ S32 panel_top = getRect().getHeight() - BORDER_MARGIN; // Top coordinate of the first panel
+ S32 panel_width = getRect().getWidth() - 4;
LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[0]);
LLRect panel_rect = accordion_tab->getRect();
- S32 panel_height = getRect().getHeight() - 2*BORDER_MARGIN;
-
+ S32 panel_height = getRect().getHeight() - BORDER_MARGIN * 2;
if (accordion_tab->getFitParent())
panel_height = accordion_tab->getRect().getHeight();
- ctrlSetLeftTopAndSize(accordion_tab,panel_rect.mLeft,panel_top,panel_width,panel_height);
+
+ ctrlSetLeftTopAndSize(accordion_tab, panel_rect.mLeft, panel_top, panel_width, panel_height);
- show_hide_scrollbar(getRect().getWidth(),getRect().getHeight());
+ show_hide_scrollbar(getRect().getWidth(), getRect().getHeight());
return;
-
}
- if(mSingleExpansion)
- arrangeSinge ();
+ if (mSingleExpansion)
+ arrangeSingle();
else
- arrangeMultiple ();
+ arrangeMultiple();
}
//---------------------------------------------------------------------------------
-BOOL LLAccordionCtrl::handleScrollWheel ( S32 x, S32 y, S32 clicks )
+BOOL LLAccordionCtrl::handleScrollWheel(S32 x, S32 y, S32 clicks)
{
- if(LLPanel::handleScrollWheel(x,y,clicks))
+ if (LLPanel::handleScrollWheel(x, y, clicks))
return TRUE;
- if( mScrollbar->getVisible() && mScrollbar->handleScrollWheel( 0, 0, clicks ) )
+ if (mScrollbar->getVisible() && mScrollbar->handleScrollWheel(0, 0, clicks))
return TRUE;
- return false;
-
+ return FALSE;
}
-BOOL LLAccordionCtrl::handleKeyHere (KEY key, MASK mask)
+BOOL LLAccordionCtrl::handleKeyHere(KEY key, MASK mask)
{
- if( mScrollbar->getVisible() && mScrollbar->handleKeyHere( key,mask ) )
+ if (mScrollbar->getVisible() && mScrollbar->handleKeyHere(key, mask))
return TRUE;
- return LLPanel::handleKeyHere(key,mask);
+ return LLPanel::handleKeyHere(key, mask);
}
-BOOL LLAccordionCtrl::handleDragAndDrop (S32 x, S32 y, MASK mask,
- BOOL drop,
- EDragAndDropType cargo_type,
- void* cargo_data,
- EAcceptance* accept,
- std::string& tooltip_msg)
+BOOL LLAccordionCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask,
+ BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg)
{
// Scroll folder view if needed. Never accepts a drag or drop.
*accept = ACCEPT_NO;
BOOL handled = autoScroll(x, y);
- if( !handled )
+ if (!handled)
{
handled = childrenHandleDragAndDrop(x, y, mask, drop, cargo_type,
cargo_data, accept, tooltip_msg) != NULL;
@@ -590,14 +587,14 @@ BOOL LLAccordionCtrl::handleDragAndDrop (S32 x, S32 y, MASK mask,
return TRUE;
}
-BOOL LLAccordionCtrl::autoScroll (S32 x, S32 y)
+BOOL LLAccordionCtrl::autoScroll(S32 x, S32 y)
{
static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
bool scrolling = false;
- if( mScrollbar->getVisible() )
+ if (mScrollbar->getVisible())
{
- LLRect rect_local( 0, getRect().getHeight(), getRect().getWidth() - scrollbar_size, 0 );
+ LLRect rect_local(0, getRect().getHeight(), getRect().getWidth() - scrollbar_size, 0);
LLRect screen_local_extents;
// clip rect against root view
@@ -610,51 +607,52 @@ BOOL LLAccordionCtrl::autoScroll (S32 x, S32 y)
LLRect bottom_scroll_rect = screen_local_extents;
bottom_scroll_rect.mTop = rect_local.mBottom + auto_scroll_region_height;
- if( bottom_scroll_rect.pointInRect( x, y ) && (mScrollbar->getDocPos() < mScrollbar->getDocPosMax()) )
+ if (bottom_scroll_rect.pointInRect( x, y ) && (mScrollbar->getDocPos() < mScrollbar->getDocPosMax()))
{
- mScrollbar->setDocPos( mScrollbar->getDocPos() + auto_scroll_speed );
+ mScrollbar->setDocPos(mScrollbar->getDocPos() + auto_scroll_speed);
mAutoScrolling = true;
scrolling = true;
}
LLRect top_scroll_rect = screen_local_extents;
top_scroll_rect.mBottom = rect_local.mTop - auto_scroll_region_height;
- if( top_scroll_rect.pointInRect( x, y ) && (mScrollbar->getDocPos() > 0) )
+ if (top_scroll_rect.pointInRect(x, y) && (mScrollbar->getDocPos() > 0))
{
- mScrollbar->setDocPos( mScrollbar->getDocPos() - auto_scroll_speed );
+ mScrollbar->setDocPos(mScrollbar->getDocPos() - auto_scroll_speed);
mAutoScrolling = true;
scrolling = true;
}
}
- return scrolling;
+
+ return scrolling ? TRUE : FALSE;
}
-void LLAccordionCtrl::updateLayout (S32 width, S32 height)
+void LLAccordionCtrl::updateLayout(S32 width, S32 height)
{
S32 panel_top = height - BORDER_MARGIN ;
- if(mScrollbar->getVisible())
- panel_top+=mScrollbar->getDocPos();
+ if (mScrollbar->getVisible())
+ panel_top += mScrollbar->getDocPos();
- S32 panel_width = width - 2*BORDER_MARGIN;
+ S32 panel_width = width - BORDER_MARGIN * 2;
static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
- if(mScrollbar->getVisible())
- panel_width-=scrollbar_size;
+ if (mScrollbar->getVisible())
+ panel_width -= scrollbar_size;
- //set sizes for first panels and dragbars
- for(size_t i=0;i<mAccordionTabs.size();++i)
+ // set sizes for first panels and dragbars
+ for (size_t i = 0; i < mAccordionTabs.size(); ++i)
{
- if(!mAccordionTabs[i]->getVisible())
+ if (!mAccordionTabs[i]->getVisible())
continue;
LLRect panel_rect = mAccordionTabs[i]->getRect();
- ctrlSetLeftTopAndSize(mAccordionTabs[i],panel_rect.mLeft,panel_top,panel_width,panel_rect.getHeight());
- panel_top-=panel_rect.getHeight();
+ ctrlSetLeftTopAndSize(mAccordionTabs[i], panel_rect.mLeft, panel_top, panel_width, panel_rect.getHeight());
+ panel_top -= panel_rect.getHeight();
}
}
-void LLAccordionCtrl::onScrollPosChangeCallback(S32, LLScrollbar*)
+void LLAccordionCtrl::onScrollPosChangeCallback(S32, LLScrollbar*)
{
- updateLayout(getRect().getWidth(),getRect().getHeight());
+ updateLayout(getRect().getWidth(), getRect().getHeight());
}
// virtual
@@ -687,42 +685,43 @@ void LLAccordionCtrl::onUpdateScrollToChild(const LLUICtrl *cntrl)
LLUICtrl::onUpdateScrollToChild(cntrl);
}
-void LLAccordionCtrl::onOpen (const LLSD& key)
+void LLAccordionCtrl::onOpen(const LLSD& key)
{
- for(size_t i=0;i<mAccordionTabs.size();++i)
+ for (size_t i = 0; i < mAccordionTabs.size(); ++i)
{
LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
LLPanel* panel = dynamic_cast<LLPanel*>(accordion_tab->getAccordionView());
- if(panel!=NULL)
+ if (panel != NULL)
{
panel->onOpen(key);
}
}
}
+
S32 LLAccordionCtrl::notifyParent(const LLSD& info)
{
- if(info.has("action"))
+ if (info.has("action"))
{
std::string str_action = info["action"];
- if(str_action == "size_changes")
+ if (str_action == "size_changes")
{
//
arrange();
return 1;
}
- else if(str_action == "select_next")
+ if (str_action == "select_next")
{
- for(size_t i=0;i<mAccordionTabs.size();++i)
+ for (size_t i = 0; i < mAccordionTabs.size(); ++i)
{
LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
- if(accordion_tab->hasFocus())
+ if (accordion_tab->hasFocus())
{
- while(++i<mAccordionTabs.size())
+ while (++i < mAccordionTabs.size())
{
- if(mAccordionTabs[i]->getVisible())
+ if (mAccordionTabs[i]->getVisible())
break;
}
- if(i<mAccordionTabs.size())
+ if (i < mAccordionTabs.size())
{
accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
accordion_tab->notify(LLSD().with("action","select_first"));
@@ -733,17 +732,17 @@ S32 LLAccordionCtrl::notifyParent(const LLSD& info)
}
return 0;
}
- else if(str_action == "select_prev")
+ if (str_action == "select_prev")
{
- for(size_t i=0;i<mAccordionTabs.size();++i)
+ for (size_t i = 0; i < mAccordionTabs.size(); ++i)
{
LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
- if(accordion_tab->hasFocus() && i>0)
+ if (accordion_tab->hasFocus() && i > 0)
{
bool prev_visible_tab_found = false;
- while(i>0)
+ while (i > 0)
{
- if(mAccordionTabs[--i]->getVisible())
+ if (mAccordionTabs[--i]->getVisible())
{
prev_visible_tab_found = true;
break;
@@ -761,12 +760,12 @@ S32 LLAccordionCtrl::notifyParent(const LLSD& info)
}
return 0;
}
- else if(str_action == "select_current")
+ if (str_action == "select_current")
{
- for(size_t i=0;i<mAccordionTabs.size();++i)
+ for (size_t i = 0; i < mAccordionTabs.size(); ++i)
{
// Set selection to the currently focused tab.
- if(mAccordionTabs[i]->hasFocus())
+ if (mAccordionTabs[i]->hasFocus())
{
if (mAccordionTabs[i] != mSelectedTab)
{
@@ -783,7 +782,7 @@ S32 LLAccordionCtrl::notifyParent(const LLSD& info)
}
return 0;
}
- else if(str_action == "deselect_current")
+ if (str_action == "deselect_current")
{
// Reset selection to the currently selected tab.
if (mSelectedTab)
@@ -802,9 +801,9 @@ S32 LLAccordionCtrl::notifyParent(const LLSD& info)
screenRectToLocal(screen_rc, &local_rc);
// Translate to parent coordinatess to check if we are in visible rectangle
- local_rc.translate( getRect().mLeft, getRect().mBottom );
+ local_rc.translate(getRect().mLeft, getRect().mBottom);
- if ( !getRect().contains (local_rc) )
+ if (!getRect().contains (local_rc))
{
// Back to local coords and calculate position for scroller
S32 bottom = mScrollbar->getDocPos() - local_rc.mBottom + getRect().mBottom;
@@ -814,7 +813,7 @@ S32 LLAccordionCtrl::notifyParent(const LLSD& info)
bottom, // min vertical scroll
top); // max vertical scroll
- mScrollbar->setDocPos( scroll_pos );
+ mScrollbar->setDocPos(scroll_pos);
}
return 1;
}
@@ -834,15 +833,16 @@ S32 LLAccordionCtrl::notifyParent(const LLSD& info)
}
return LLPanel::notifyParent(info);
}
-void LLAccordionCtrl::reset ()
+
+void LLAccordionCtrl::reset()
{
- if(mScrollbar)
+ if (mScrollbar)
mScrollbar->setDocPos(0);
}
void LLAccordionCtrl::expandDefaultTab()
{
- if (mAccordionTabs.size() > 0)
+ if (!mAccordionTabs.empty())
{
LLAccordionCtrlTab* tab = mAccordionTabs.front();
@@ -877,7 +877,7 @@ void LLAccordionCtrl::sort()
arrange();
}
-void LLAccordionCtrl::setFilterSubString(const std::string& filter_string)
+void LLAccordionCtrl::setFilterSubString(const std::string& filter_string)
{
LLStringUtil::format_map_t args;
args["[SEARCH_TERM]"] = LLURI::escape(filter_string);
@@ -907,7 +907,7 @@ const LLAccordionCtrlTab* LLAccordionCtrl::getExpandedTab() const
S32 LLAccordionCtrl::calcExpandedTabHeight(S32 tab_index /* = 0 */, S32 available_height /* = 0 */)
{
- if(tab_index < 0)
+ if (tab_index < 0)
{
return available_height;
}
@@ -915,9 +915,9 @@ S32 LLAccordionCtrl::calcExpandedTabHeight(S32 tab_index /* = 0 */, S32 availabl
S32 collapsed_tabs_height = 0;
S32 num_expanded = 0;
- for(size_t n = tab_index; n < mAccordionTabs.size(); ++n)
+ for (size_t n = tab_index; n < mAccordionTabs.size(); ++n)
{
- if(!mAccordionTabs[n]->isExpanded())
+ if (!mAccordionTabs[n]->isExpanded())
{
collapsed_tabs_height += mAccordionTabs[n]->getHeaderHeight();
}
@@ -927,7 +927,7 @@ S32 LLAccordionCtrl::calcExpandedTabHeight(S32 tab_index /* = 0 */, S32 availabl
}
}
- if(0 == num_expanded)
+ if (0 == num_expanded)
{
return available_height;
}
diff --git a/indra/llui/llaccordionctrl.h b/indra/llui/llaccordionctrl.h
index 2828254472..6a1989afba 100644
--- a/indra/llui/llaccordionctrl.h
+++ b/indra/llui/llaccordionctrl.h
@@ -144,7 +144,7 @@ private:
void initNoTabsWidget(const LLTextBox::Params& tb_params);
void updateNoTabsHelpTextVisibility();
- void arrangeSinge();
+ void arrangeSingle();
void arrangeMultiple();
// Calc Splitter's height that is necessary to display all child content
diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp
index 04485c6262..20da568746 100644
--- a/indra/llui/llaccordionctrltab.cpp
+++ b/indra/llui/llaccordionctrltab.cpp
@@ -69,13 +69,13 @@ public:
virtual BOOL postBuild();
std::string getTitle();
- void setTitle(const std::string& title, const std::string& hl);
+ void setTitle(const std::string& title, const std::string& hl);
- void setTitleFontStyle(std::string style);
+ void setTitleFontStyle(std::string style);
- void setTitleColor(LLUIColor);
+ void setTitleColor(LLUIColor);
- void setSelected(bool is_selected) { mIsSelected = is_selected; }
+ void setSelected(bool is_selected) { mIsSelected = is_selected; }
virtual void onMouseEnter(S32 x, S32 y, MASK mask);
virtual void onMouseLeave(S32 x, S32 y, MASK mask);
@@ -85,8 +85,8 @@ public:
void* cargo_data,
EAcceptance* accept,
std::string& tooltip_msg);
-private:
+private:
LLTextBox* mHeaderTextbox;
// Overlay images (arrows)
@@ -102,7 +102,7 @@ private:
LLPointer<LLUIImage> mImageHeaderFocused;
// style saved when applying it in setTitleFontStyle
- LLStyle::Params mStyleParams;
+ LLStyle::Params mStyleParams;
LLUIColor mHeaderBGColor;
@@ -157,19 +157,17 @@ BOOL LLAccordionCtrlTab::LLAccordionCtrlTabHeader::postBuild()
std::string LLAccordionCtrlTab::LLAccordionCtrlTabHeader::getTitle()
{
- if(mHeaderTextbox)
+ if (mHeaderTextbox)
{
return mHeaderTextbox->getText();
}
- else
- {
- return LLStringUtil::null;
- }
+
+ return LLStringUtil::null;
}
void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::setTitle(const std::string& title, const std::string& hl)
{
- if(mHeaderTextbox)
+ if (mHeaderTextbox)
{
LLTextUtil::textboxSetHighlightedVal(
mHeaderTextbox,
@@ -192,7 +190,7 @@ void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::setTitleFontStyle(std::string
void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::setTitleColor(LLUIColor color)
{
- if(mHeaderTextbox)
+ if (mHeaderTextbox)
{
mHeaderTextbox->setColor(color);
}
@@ -204,11 +202,11 @@ void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::draw()
S32 height = getRect().getHeight();
F32 alpha = getCurrentTransparency();
- gl_rect_2d(0,0,width - 1 ,height - 1,mHeaderBGColor.get() % alpha,true);
+ gl_rect_2d(0, 0, width - 1, height - 1, mHeaderBGColor.get() % alpha, TRUE);
LLAccordionCtrlTab* parent = dynamic_cast<LLAccordionCtrlTab*>(getParent());
- bool collapsible = (parent && parent->getCollapsible());
- bool expanded = (parent && parent->getDisplayChildren());
+ bool collapsible = parent && parent->getCollapsible();
+ bool expanded = parent && parent->getDisplayChildren();
// Handle overlay images, if needed
// Only show green "focus" background image if the accordion is open,
@@ -218,23 +216,22 @@ void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::draw()
/*&& !(collapsible && !expanded)*/ // WHY??
)
{
- mImageHeaderFocused->draw(0,0,width,height);
+ mImageHeaderFocused->draw(0, 0, width, height);
}
else
{
- mImageHeader->draw(0,0,width,height);
+ mImageHeader->draw(0, 0, width, height);
}
- if(mNeedsHighlight)
+ if (mNeedsHighlight)
{
- mImageHeaderOver->draw(0,0,width,height);
+ mImageHeaderOver->draw(0, 0, width, height);
}
-
- if(collapsible)
+ if (collapsible)
{
LLPointer<LLUIImage> overlay_image;
- if(expanded)
+ if (expanded)
{
overlay_image = mImageExpanded;
}
@@ -242,8 +239,7 @@ void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::draw()
{
overlay_image = mImageCollapsed;
}
- overlay_image->draw(HEADER_IMAGE_LEFT_OFFSET,
- (height - overlay_image->getHeight()) / 2);
+ overlay_image->draw(HEADER_IMAGE_LEFT_OFFSET, (height - overlay_image->getHeight()) / 2);
}
LLUICtrl::draw();
@@ -253,7 +249,7 @@ void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::reshape(S32 width, S32 height
{
S32 header_height = mHeaderTextbox->getTextPixelHeight();
- LLRect textboxRect(HEADER_TEXT_LEFT_OFFSET,(height+header_height)/2 ,width,(height-header_height)/2);
+ LLRect textboxRect(HEADER_TEXT_LEFT_OFFSET, (height + header_height) / 2, width, (height - header_height) / 2);
mHeaderTextbox->reshape(textboxRect.getWidth(), textboxRect.getHeight());
mHeaderTextbox->setRect(textboxRect);
@@ -272,20 +268,24 @@ void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::onMouseEnter(S32 x, S32 y, MA
LLUICtrl::onMouseEnter(x, y, mask);
mNeedsHighlight = true;
}
+
void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::onMouseLeave(S32 x, S32 y, MASK mask)
{
LLUICtrl::onMouseLeave(x, y, mask);
mNeedsHighlight = false;
mAutoOpenTimer.stop();
}
+
BOOL LLAccordionCtrlTab::LLAccordionCtrlTabHeader::handleKey(KEY key, MASK mask, BOOL called_from_parent)
{
- if ( ( key == KEY_LEFT || key == KEY_RIGHT) && mask == MASK_NONE)
+ if ((key == KEY_LEFT || key == KEY_RIGHT) && mask == MASK_NONE)
{
return getParent()->handleKey(key, mask, called_from_parent);
}
+
return LLUICtrl::handleKey(key, mask, called_from_parent);
}
+
BOOL LLAccordionCtrlTab::LLAccordionCtrlTabHeader::handleDragAndDrop(S32 x, S32 y, MASK mask,
BOOL drop,
EDragAndDropType cargo_type,
@@ -295,7 +295,7 @@ BOOL LLAccordionCtrlTab::LLAccordionCtrlTabHeader::handleDragAndDrop(S32 x, S32
{
LLAccordionCtrlTab* parent = dynamic_cast<LLAccordionCtrlTab*>(getParent());
- if ( parent && !parent->getDisplayChildren() && parent->getCollapsible() && parent->canOpenClose() )
+ if (parent && !parent->getDisplayChildren() && parent->getCollapsible() && parent->canOpenClose())
{
if (mAutoOpenTimer.getStarted())
{
@@ -307,12 +307,15 @@ BOOL LLAccordionCtrlTab::LLAccordionCtrlTabHeader::handleDragAndDrop(S32 x, S32
}
}
else
+ {
mAutoOpenTimer.start();
+ }
}
return LLUICtrl::handleDragAndDrop(x, y, mask, drop, cargo_type,
cargo_data, accept, tooltip_msg);
}
+
LLAccordionCtrlTab::Params::Params()
: title("title")
,display_children("expanded", true)
@@ -384,41 +387,39 @@ LLAccordionCtrlTab::~LLAccordionCtrlTab()
{
}
-
void LLAccordionCtrlTab::setDisplayChildren(bool display)
{
mDisplayChildren = display;
LLRect rect = getRect();
- rect.mBottom = rect.mTop - (getDisplayChildren() ?
- mExpandedHeight : HEADER_HEIGHT);
+ rect.mBottom = rect.mTop - (getDisplayChildren() ? mExpandedHeight : HEADER_HEIGHT);
setRect(rect);
- if(mContainerPanel)
+ if (mContainerPanel)
+ {
mContainerPanel->setVisible(getDisplayChildren());
+ }
- if(mDisplayChildren)
+ if (mDisplayChildren)
{
adjustContainerPanel();
}
else
{
- if(mScrollbar)
- mScrollbar->setVisible(false);
+ if (mScrollbar)
+ mScrollbar->setVisible(FALSE);
}
-
}
void LLAccordionCtrlTab::reshape(S32 width, S32 height, BOOL called_from_parent /* = TRUE */)
{
LLRect headerRect;
- headerRect.setLeftTopAndSize(
- 0,height,width,HEADER_HEIGHT);
+ headerRect.setLeftTopAndSize(0, height, width, HEADER_HEIGHT);
mHeader->setRect(headerRect);
mHeader->reshape(headerRect.getWidth(), headerRect.getHeight());
- if(!mDisplayChildren)
+ if (!mDisplayChildren)
return;
LLRect childRect;
@@ -426,7 +427,7 @@ void LLAccordionCtrlTab::reshape(S32 width, S32 height, BOOL called_from_parent
childRect.setLeftTopAndSize(
getPaddingLeft(),
height - getHeaderHeight() - getPaddingTop(),
- width - getPaddingLeft() - getPaddingRight(),
+ width - getPaddingLeft() - getPaddingRight(),
height - getHeaderHeight() - getPaddingTop() - getPaddingBottom() );
adjustContainerPanel(childRect);
@@ -434,7 +435,7 @@ void LLAccordionCtrlTab::reshape(S32 width, S32 height, BOOL called_from_parent
void LLAccordionCtrlTab::changeOpenClose(bool is_open)
{
- if(is_open)
+ if (is_open)
mExpandedHeight = getRect().getHeight();
setDisplayChildren(!is_open);
@@ -483,14 +484,14 @@ void LLAccordionCtrlTab::onUpdateScrollToChild(const LLUICtrl *cntrl)
BOOL LLAccordionCtrlTab::handleMouseDown(S32 x, S32 y, MASK mask)
{
- if(mCollapsible && mHeaderVisible && mCanOpenClose)
+ if (mCollapsible && mHeaderVisible && mCanOpenClose)
{
- if(y >= (getRect().getHeight() - HEADER_HEIGHT) )
+ if (y >= (getRect().getHeight() - HEADER_HEIGHT))
{
mHeader->setFocus(true);
changeOpenClose(getDisplayChildren());
- //reset stored state
+ // Reset stored state
mWasStateStored = false;
return TRUE;
}
@@ -510,7 +511,7 @@ boost::signals2::connection LLAccordionCtrlTab::setDropDownStateChangedCallback(
bool LLAccordionCtrlTab::addChild(LLView* child, S32 tab_group)
{
- if(DD_HEADER_NAME != child->getName())
+ if (DD_HEADER_NAME != child->getName())
{
reshape(child->getRect().getWidth() , child->getRect().getHeight() + HEADER_HEIGHT );
mExpandedHeight = getRect().getHeight();
@@ -518,12 +519,12 @@ bool LLAccordionCtrlTab::addChild(LLView* child, S32 tab_group)
bool res = LLUICtrl::addChild(child, tab_group);
- if(DD_HEADER_NAME != child->getName())
+ if (DD_HEADER_NAME != child->getName())
{
- if(!mCollapsible)
+ if (!mCollapsible)
setDisplayChildren(true);
else
- setDisplayChildren(getDisplayChildren());
+ setDisplayChildren(getDisplayChildren());
}
if (!mContainerPanel)
@@ -534,7 +535,7 @@ bool LLAccordionCtrlTab::addChild(LLView* child, S32 tab_group)
void LLAccordionCtrlTab::setAccordionView(LLView* panel)
{
- addChild(panel,0);
+ addChild(panel, 0);
}
std::string LLAccordionCtrlTab::getTitle() const
@@ -543,10 +544,8 @@ std::string LLAccordionCtrlTab::getTitle() const
{
return mHeader->getTitle();
}
- else
- {
- return LLStringUtil::null;
- }
+
+ return LLStringUtil::null;
}
void LLAccordionCtrlTab::setTitle(const std::string& title, const std::string& hl)
@@ -579,6 +578,7 @@ boost::signals2::connection LLAccordionCtrlTab::setFocusReceivedCallback(const f
{
return mHeader->setFocusReceivedCallback(cb);
}
+
return boost::signals2::connection();
}
@@ -588,6 +588,7 @@ boost::signals2::connection LLAccordionCtrlTab::setFocusLostCallback(const focus
{
return mHeader->setFocusLostCallback(cb);
}
+
return boost::signals2::connection();
}
@@ -601,59 +602,65 @@ void LLAccordionCtrlTab::setSelected(bool is_selected)
LLView* LLAccordionCtrlTab::findContainerView()
{
- for(child_list_const_iter_t it = getChildList()->begin();
- getChildList()->end() != it; ++it)
+ child_list_const_iter_t it = getChildList()->begin(), it_end = getChildList()->end();
+ while (it != it_end)
{
- LLView* child = *it;
- if(DD_HEADER_NAME == child->getName())
- continue;
- if(!child->getVisible())
- continue;
- return child;
+ LLView* child = *(it++);
+ if (DD_HEADER_NAME != child->getName() && child->getVisible())
+ return child;
}
+
return NULL;
}
void LLAccordionCtrlTab::selectOnFocusReceived()
{
if (getParent()) // A parent may not be set if tabs are added dynamically.
+ {
getParent()->notifyParent(LLSD().with("action", "select_current"));
+ }
}
void LLAccordionCtrlTab::deselectOnFocusLost()
{
- if(getParent()) // A parent may not be set if tabs are added dynamically.
+ if (getParent()) // A parent may not be set if tabs are added dynamically.
{
getParent()->notifyParent(LLSD().with("action", "deselect_current"));
}
-
}
S32 LLAccordionCtrlTab::getHeaderHeight()
{
- return mHeaderVisible?HEADER_HEIGHT:0;
+ return mHeaderVisible ? HEADER_HEIGHT : 0;
}
-void LLAccordionCtrlTab::setHeaderVisible(bool value)
+void LLAccordionCtrlTab::setHeaderVisible(bool value)
{
- if(mHeaderVisible == value)
+ if (mHeaderVisible == value)
return;
+
mHeaderVisible = value;
- if(mHeader)
- mHeader->setVisible(value);
+
+ if (mHeader)
+ {
+ mHeader->setVisible(value ? TRUE : FALSE);
+ }
+
reshape(getRect().getWidth(), getRect().getHeight(), FALSE);
};
//virtual
BOOL LLAccordionCtrlTab::postBuild()
{
- if(mHeader)
+ if (mHeader)
+ {
mHeader->setVisible(mHeaderVisible);
-
- static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
+ }
+
+ static LLUICachedControl<S32> scrollbar_size("UIScrollbarSize", 0);
LLRect scroll_rect;
- scroll_rect.setOriginAndSize(
+ scroll_rect.setOriginAndSize(
getRect().getWidth() - scrollbar_size,
1,
scrollbar_size,
@@ -661,7 +668,7 @@ BOOL LLAccordionCtrlTab::postBuild()
mContainerPanel = findContainerView();
- if(!mFitPanel)
+ if (!mFitPanel)
{
LLScrollbar::Params sbparams;
sbparams.name("scrollable vertical");
@@ -674,9 +681,8 @@ BOOL LLAccordionCtrlTab::postBuild()
sbparams.follows.flags(FOLLOWS_RIGHT | FOLLOWS_TOP | FOLLOWS_BOTTOM);
sbparams.change_callback(boost::bind(&LLAccordionCtrlTab::onScrollPosChangeCallback, this, _1, _2));
-
- mScrollbar = LLUICtrlFactory::create<LLScrollbar> (sbparams);
- LLView::addChild( mScrollbar );
+ mScrollbar = LLUICtrlFactory::create<LLScrollbar>(sbparams);
+ LLView::addChild(mScrollbar);
mScrollbar->setFollowsRight();
mScrollbar->setFollowsTop();
mScrollbar->setFollowsBottom();
@@ -684,44 +690,48 @@ BOOL LLAccordionCtrlTab::postBuild()
mScrollbar->setVisible(false);
}
- if(mContainerPanel)
+ if (mContainerPanel)
+ {
mContainerPanel->setVisible(mDisplayChildren);
+ }
return LLUICtrl::postBuild();
}
-bool LLAccordionCtrlTab::notifyChildren (const LLSD& info)
+
+bool LLAccordionCtrlTab::notifyChildren (const LLSD& info)
{
- if(info.has("action"))
+ if (info.has("action"))
{
std::string str_action = info["action"];
- if(str_action == "store_state")
+ if (str_action == "store_state")
{
storeOpenCloseState();
return true;
}
- if(str_action == "restore_state")
+
+ if (str_action == "restore_state")
{
restoreOpenCloseState();
return true;
}
}
+
return LLUICtrl::notifyChildren(info);
}
S32 LLAccordionCtrlTab::notifyParent(const LLSD& info)
{
- if(info.has("action"))
+ if (info.has("action"))
{
std::string str_action = info["action"];
- if(str_action == "size_changes")
+ if (str_action == "size_changes")
{
- //
S32 height = info["height"];
- height = llmax(height,10) + HEADER_HEIGHT + getPaddingTop() + getPaddingBottom();
+ height = llmax(height, 10) + HEADER_HEIGHT + getPaddingTop() + getPaddingBottom();
mExpandedHeight = height;
- if(isExpanded() && !mSkipChangesOnNotifyParent)
+ if (isExpanded() && !mSkipChangesOnNotifyParent)
{
LLRect panel_rect = getRect();
panel_rect.setLeftTopAndSize( panel_rect.mLeft, panel_rect.mTop, panel_rect.getWidth(), height);
@@ -729,12 +739,13 @@ S32 LLAccordionCtrlTab::notifyParent(const LLSD& info)
setRect(panel_rect);
}
- //LLAccordionCtrl should rearrange accordion tab if one of accordion change its size
+ // LLAccordionCtrl should rearrange accordion tab if one of accordions changed its size
if (getParent()) // A parent may not be set if tabs are added dynamically.
getParent()->notifyParent(info);
return 1;
}
- else if(str_action == "select_prev")
+
+ if (str_action == "select_prev")
{
showAndFocusHeader();
return 1;
@@ -772,78 +783,85 @@ S32 LLAccordionCtrlTab::notifyParent(const LLSD& info)
S32 LLAccordionCtrlTab::notify(const LLSD& info)
{
- if(info.has("action"))
+ if (info.has("action"))
{
std::string str_action = info["action"];
- if(str_action == "select_first")
+ if (str_action == "select_first")
{
showAndFocusHeader();
return 1;
}
- else if( str_action == "select_last" )
+
+ if (str_action == "select_last")
{
- if(getDisplayChildren() == false)
+ if (!getDisplayChildren())
{
showAndFocusHeader();
}
else
{
LLView* view = getAccordionView();
- if(view)
- view->notify(LLSD().with("action","select_last"));
+ if (view)
+ {
+ view->notify(LLSD().with("action", "select_last"));
+ }
}
}
}
+
return 0;
}
BOOL LLAccordionCtrlTab::handleKey(KEY key, MASK mask, BOOL called_from_parent)
{
- if( !mHeader->hasFocus() )
+ if (!mHeader->hasFocus())
return LLUICtrl::handleKey(key, mask, called_from_parent);
- if ( (key == KEY_RETURN )&& mask == MASK_NONE)
+ if ((key == KEY_RETURN) && mask == MASK_NONE)
{
changeOpenClose(getDisplayChildren());
return TRUE;
}
- if ( (key == KEY_ADD || key == KEY_RIGHT)&& mask == MASK_NONE)
+ if ((key == KEY_ADD || key == KEY_RIGHT) && mask == MASK_NONE)
{
- if(getDisplayChildren() == false)
+ if (!getDisplayChildren())
{
changeOpenClose(getDisplayChildren());
return TRUE;
}
}
- if ( (key == KEY_SUBTRACT || key == KEY_LEFT)&& mask == MASK_NONE)
+
+ if ((key == KEY_SUBTRACT || key == KEY_LEFT) && mask == MASK_NONE)
{
- if(getDisplayChildren() == true)
+ if (getDisplayChildren())
{
changeOpenClose(getDisplayChildren());
return TRUE;
}
}
- if ( key == KEY_DOWN && mask == MASK_NONE)
+ if (key == KEY_DOWN && mask == MASK_NONE)
{
- //if collapsed go to the next accordion
- if(getDisplayChildren() == false)
- //we processing notifyParent so let call parent directly
- getParent()->notifyParent(LLSD().with("action","select_next"));
+ // if collapsed go to the next accordion
+ if (!getDisplayChildren())
+ {
+ // we're processing notifyParent so let call parent directly
+ getParent()->notifyParent(LLSD().with("action", "select_next"));
+ }
else
{
- getAccordionView()->notify(LLSD().with("action","select_first"));
+ getAccordionView()->notify(LLSD().with("action", "select_first"));
}
return TRUE;
}
- if ( key == KEY_UP && mask == MASK_NONE)
+ if (key == KEY_UP && mask == MASK_NONE)
{
- //go to the previous accordion
+ // go to the previous accordion
- //we processing notifyParent so let call parent directly
- getParent()->notifyParent(LLSD().with("action","select_prev"));
+ // we're processing notifyParent so let call parent directly
+ getParent()->notifyParent(LLSD().with("action", "select_prev"));
return TRUE;
}
@@ -869,28 +887,29 @@ void LLAccordionCtrlTab::showAndFocusHeader()
// accordion tab (assuming that the parent is an LLAccordionCtrl) the calls chain
// is shortened and messages from inside the collapsed tabs are avoided.
// See STORM-536.
- getParent()->notifyParent(LLSD().with("scrollToShowRect",screen_rc.getValue()));
+ getParent()->notifyParent(LLSD().with("scrollToShowRect", screen_rc.getValue()));
}
-void LLAccordionCtrlTab::storeOpenCloseState()
+
+void LLAccordionCtrlTab::storeOpenCloseState()
{
- if(mWasStateStored)
+ if (mWasStateStored)
return;
mStoredOpenCloseState = getDisplayChildren();
mWasStateStored = true;
}
-void LLAccordionCtrlTab::restoreOpenCloseState()
+void LLAccordionCtrlTab::restoreOpenCloseState()
{
- if(!mWasStateStored)
+ if (!mWasStateStored)
return;
- if(getDisplayChildren() != mStoredOpenCloseState)
+ if (getDisplayChildren() != mStoredOpenCloseState)
{
changeOpenClose(getDisplayChildren());
}
mWasStateStored = false;
}
-void LLAccordionCtrlTab::adjustContainerPanel ()
+void LLAccordionCtrlTab::adjustContainerPanel()
{
S32 width = getRect().getWidth();
S32 height = getRect().getHeight();
@@ -907,83 +926,83 @@ void LLAccordionCtrlTab::adjustContainerPanel ()
void LLAccordionCtrlTab::adjustContainerPanel(const LLRect& child_rect)
{
- if(!mContainerPanel)
+ if (!mContainerPanel)
return;
- if(!mFitPanel)
+ if (!mFitPanel)
{
show_hide_scrollbar(child_rect);
updateLayout(child_rect);
}
else
{
- mContainerPanel->reshape(child_rect.getWidth(),child_rect.getHeight());
+ mContainerPanel->reshape(child_rect.getWidth(), child_rect.getHeight());
mContainerPanel->setRect(child_rect);
}
}
S32 LLAccordionCtrlTab::getChildViewHeight()
{
- if(!mContainerPanel)
+ if (!mContainerPanel)
return 0;
return mContainerPanel->getRect().getHeight();
}
void LLAccordionCtrlTab::show_hide_scrollbar(const LLRect& child_rect)
{
- if(getChildViewHeight() > child_rect.getHeight() )
+ if (getChildViewHeight() > child_rect.getHeight())
showScrollbar(child_rect);
else
hideScrollbar(child_rect);
}
+
void LLAccordionCtrlTab::showScrollbar(const LLRect& child_rect)
{
- if(!mContainerPanel || !mScrollbar)
+ if (!mContainerPanel || !mScrollbar)
return;
bool was_visible = mScrollbar->getVisible();
mScrollbar->setVisible(true);
static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
- {
- ctrlSetLeftTopAndSize(mScrollbar,child_rect.getWidth()-scrollbar_size,
- child_rect.getHeight()-PARENT_BORDER_MARGIN,
- scrollbar_size,
- child_rect.getHeight()-2*PARENT_BORDER_MARGIN);
- }
+ ctrlSetLeftTopAndSize(mScrollbar,
+ child_rect.getWidth() - scrollbar_size,
+ child_rect.getHeight() - PARENT_BORDER_MARGIN,
+ scrollbar_size,
+ child_rect.getHeight() - PARENT_BORDER_MARGIN * 2);
LLRect orig_rect = mContainerPanel->getRect();
mScrollbar->setPageSize(child_rect.getHeight());
- mScrollbar->setDocParams(orig_rect.getHeight(),mScrollbar->getDocPos());
+ mScrollbar->setDocParams(orig_rect.getHeight(), mScrollbar->getDocPos());
- if(was_visible)
+ if (was_visible)
{
S32 scroll_pos = llmin(mScrollbar->getDocPos(), orig_rect.getHeight() - child_rect.getHeight() - 1);
mScrollbar->setDocPos(scroll_pos);
}
- else//shrink child panel
+ else // Shrink child panel
{
updateLayout(child_rect);
}
-
}
-void LLAccordionCtrlTab::hideScrollbar( const LLRect& child_rect )
+void LLAccordionCtrlTab::hideScrollbar(const LLRect& child_rect)
{
- if(!mContainerPanel || !mScrollbar)
+ if (!mContainerPanel || !mScrollbar)
return;
- if(mScrollbar->getVisible() == false)
+ if (mScrollbar->getVisible() == FALSE)
return;
- mScrollbar->setVisible(false);
+
+ mScrollbar->setVisible(FALSE);
mScrollbar->setDocPos(0);
//shrink child panel
updateLayout(child_rect);
}
-void LLAccordionCtrlTab::onScrollPosChangeCallback(S32, LLScrollbar*)
+void LLAccordionCtrlTab::onScrollPosChangeCallback(S32, LLScrollbar*)
{
LLRect child_rect;
@@ -999,21 +1018,20 @@ void LLAccordionCtrlTab::onScrollPosChangeCallback(S32, LLScrollbar*)
updateLayout(child_rect);
}
-void LLAccordionCtrlTab::drawChild(const LLRect& root_rect,LLView* child)
+void LLAccordionCtrlTab::drawChild(const LLRect& root_rect, LLView* child)
{
if (child && child->getVisible() && child->getRect().isValid())
{
LLRect screen_rect;
- localRectToScreen(child->getRect(),&screen_rect);
-
- if ( root_rect.overlaps(screen_rect) && sDirtyRect.overlaps(screen_rect))
+ localRectToScreen(child->getRect(), &screen_rect);
+
+ if (root_rect.overlaps(screen_rect) && sDirtyRect.overlaps(screen_rect))
{
gGL.matrixMode(LLRender::MM_MODELVIEW);
LLUI::pushMatrix();
{
LLUI::translate((F32)child->getRect().mLeft, (F32)child->getRect().mBottom);
child->draw();
-
}
LLUI::popMatrix();
}
@@ -1022,64 +1040,67 @@ void LLAccordionCtrlTab::drawChild(const LLRect& root_rect,LLView* child)
void LLAccordionCtrlTab::draw()
{
- if(mFitPanel)
+ if (mFitPanel)
+ {
LLUICtrl::draw();
+ }
else
{
- LLRect root_rect = getRootView()->getRect();
- drawChild(root_rect,mHeader);
- drawChild(root_rect,mScrollbar );
- {
- LLRect child_rect;
+ LLRect root_rect(getRootView()->getRect());
+ drawChild(root_rect, mHeader);
+ drawChild(root_rect, mScrollbar);
- S32 width = getRect().getWidth();
- S32 height = getRect().getHeight();
+ LLRect child_rect;
- child_rect.setLeftTopAndSize(
- getPaddingLeft(),
- height - getHeaderHeight() - getPaddingTop(),
- width - getPaddingLeft() - getPaddingRight(),
- height - getHeaderHeight() - getPaddingTop() - getPaddingBottom() );
+ S32 width = getRect().getWidth();
+ S32 height = getRect().getHeight();
- LLLocalClipRect clip(child_rect);
- drawChild(root_rect,mContainerPanel);
- }
+ child_rect.setLeftTopAndSize(
+ getPaddingLeft(),
+ height - getHeaderHeight() - getPaddingTop(),
+ width - getPaddingLeft() - getPaddingRight(),
+ height - getHeaderHeight() - getPaddingTop() - getPaddingBottom());
+
+ LLLocalClipRect clip(child_rect);
+ drawChild(root_rect,mContainerPanel);
}
}
-void LLAccordionCtrlTab::updateLayout ( const LLRect& child_rect )
+void LLAccordionCtrlTab::updateLayout(const LLRect& child_rect)
{
LLView* child = getAccordionView();
- if(!mContainerPanel)
+ if (!mContainerPanel)
return;
S32 panel_top = child_rect.getHeight();
S32 panel_width = child_rect.getWidth();
- static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
- if(mScrollbar && mScrollbar->getVisible() != false)
+ static LLUICachedControl<S32> scrollbar_size("UIScrollbarSize", 0);
+ if (mScrollbar && mScrollbar->getVisible())
{
- panel_top+=mScrollbar->getDocPos();
- panel_width-=scrollbar_size;
+ panel_top += mScrollbar->getDocPos();
+ panel_width -= scrollbar_size;
}
- //set sizes for first panels and dragbars
+ // Set sizes for first panels and dragbars
LLRect panel_rect = child->getRect();
- ctrlSetLeftTopAndSize(mContainerPanel,child_rect.mLeft,panel_top,panel_width,panel_rect.getHeight());
+ ctrlSetLeftTopAndSize(mContainerPanel, child_rect.mLeft, panel_top, panel_width, panel_rect.getHeight());
}
+
void LLAccordionCtrlTab::ctrlSetLeftTopAndSize(LLView* panel, S32 left, S32 top, S32 width, S32 height)
{
- if(!panel)
+ if (!panel)
return;
LLRect panel_rect = panel->getRect();
- panel_rect.setLeftTopAndSize( left, top, width, height);
+ panel_rect.setLeftTopAndSize(left, top, width, height);
panel->reshape( width, height, 1);
panel->setRect(panel_rect);
}
+
BOOL LLAccordionCtrlTab::handleToolTip(S32 x, S32 y, MASK mask)
{
//header may be not the first child but we need to process it first
- if(y >= (getRect().getHeight() - HEADER_HEIGHT - HEADER_HEIGHT/2) )
+ if (y >= (getRect().getHeight() - HEADER_HEIGHT - HEADER_HEIGHT / 2))
{
//inside tab header
//fix for EXT-6619
@@ -1088,16 +1109,18 @@ BOOL LLAccordionCtrlTab::handleToolTip(S32 x, S32 y, MASK mask)
}
return LLUICtrl::handleToolTip(x, y, mask);
}
-BOOL LLAccordionCtrlTab::handleScrollWheel ( S32 x, S32 y, S32 clicks )
+
+BOOL LLAccordionCtrlTab::handleScrollWheel(S32 x, S32 y, S32 clicks)
{
- if( LLUICtrl::handleScrollWheel(x,y,clicks))
+ if (LLUICtrl::handleScrollWheel(x, y, clicks))
{
return TRUE;
}
- if( mScrollbar && mScrollbar->getVisible() && mScrollbar->handleScrollWheel( 0, 0, clicks ) )
+
+ if (mScrollbar && mScrollbar->getVisible() && mScrollbar->handleScrollWheel(0, 0, clicks))
{
return TRUE;
}
+
return FALSE;
}
-
diff --git a/indra/llui/llaccordionctrltab.h b/indra/llui/llaccordionctrltab.h
index 2c72e8c036..896a34cac4 100644
--- a/indra/llui/llaccordionctrltab.h
+++ b/indra/llui/llaccordionctrltab.h
@@ -104,7 +104,7 @@ public:
virtual void setDisplayChildren(bool display);
// Returns expand/collapse state
- virtual bool getDisplayChildren() const {return mDisplayChildren;};
+ virtual bool getDisplayChildren() const { return mDisplayChildren; };
//set LLAccordionCtrlTab panel
void setAccordionView(LLView* panel);
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index 8028f397f3..49d275997a 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -203,7 +203,8 @@ LLButton::LLButton(const LLButton::Params& p)
}
// Hack to make sure there is space for at least one character
- if (getRect().getWidth() - (mRightHPad + mLeftHPad) < mGLFont->getWidth(std::string(" ")))
+ if (getRect().mRight >= 0 && getRect().getWidth() > 0 &&
+ getRect().getWidth() - (mRightHPad + mLeftHPad) < mGLFont->getWidth(std::string(" ")))
{
// Use old defaults
mLeftHPad = llbutton_orig_h_pad;
@@ -942,11 +943,8 @@ void LLButton::draw()
break;
}
- S32 y_offset = 2 + (getRect().getHeight() - 20)/2;
-
if (pressed && mDisplayPressedState)
{
- y_offset--;
x++;
}
diff --git a/indra/llui/lldraghandle.cpp b/indra/llui/lldraghandle.cpp
index 48bf5bb80f..220f5ee825 100644
--- a/indra/llui/lldraghandle.cpp
+++ b/indra/llui/lldraghandle.cpp
@@ -68,6 +68,7 @@ LLDragHandle::LLDragHandle(const LLDragHandle::Params& p)
LLDragHandle::~LLDragHandle()
{
+ gFocusMgr.removeKeyboardFocusWithoutCallback(this);
removeChild(mTitleBox);
delete mTitleBox;
}
diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp
index b13e7389cc..460bd0945b 100644
--- a/indra/llui/llflatlistview.cpp
+++ b/indra/llui/llflatlistview.cpp
@@ -1198,7 +1198,7 @@ void LLFlatListView::onFocusReceived()
{
if (size())
{
- mSelectedItemsBorder->setVisible(TRUE);
+ mSelectedItemsBorder->setVisible(TRUE);
}
gEditMenuHandler = this;
}
@@ -1207,7 +1207,7 @@ void LLFlatListView::onFocusLost()
{
mSelectedItemsBorder->setVisible(FALSE);
// Route menu back to the default
- if( gEditMenuHandler == this )
+ if (gEditMenuHandler == this)
{
gEditMenuHandler = NULL;
}
@@ -1216,16 +1216,16 @@ void LLFlatListView::onFocusLost()
//virtual
S32 LLFlatListView::notify(const LLSD& info)
{
- if(info.has("action"))
+ if (info.has("action"))
{
std::string str_action = info["action"];
- if(str_action == "select_first")
+ if (str_action == "select_first")
{
setFocus(true);
selectFirstItem();
return 1;
}
- else if(str_action == "select_last")
+ else if (str_action == "select_last")
{
setFocus(true);
selectLastItem();
@@ -1238,6 +1238,7 @@ S32 LLFlatListView::notify(const LLSD& info)
notifyParentItemsRectChanged();
return 1;
}
+
return 0;
}
@@ -1249,10 +1250,8 @@ void LLFlatListView::detachItems(std::vector<LLPanel*>& detached_items)
detached_items.clear();
// Go through items and detach valid items, remove them from items panel
// and add to detached_items.
- for (pairs_iterator_t
- iter = mItemPairs.begin(),
- iter_end = mItemPairs.end();
- iter != iter_end; ++iter)
+ pairs_iterator_t iter = mItemPairs.begin(), iter_end = mItemPairs.end();
+ while (iter != iter_end)
{
LLPanel* pItem = (*iter)->first;
if (1 == pItem->notify(action))
@@ -1261,6 +1260,7 @@ void LLFlatListView::detachItems(std::vector<LLPanel*>& detached_items)
mItemsPanel->removeChild(pItem);
detached_items.push_back(pItem);
}
+ iter++;
}
if (!detached_items.empty())
{
@@ -1268,13 +1268,12 @@ void LLFlatListView::detachItems(std::vector<LLPanel*>& detached_items)
if (detached_items.size() == mItemPairs.size())
{
// This way will be faster if all items were disconnected
- for (pairs_iterator_t
- iter = mItemPairs.begin(),
- iter_end = mItemPairs.end();
- iter != iter_end; ++iter)
+ pairs_iterator_t iter = mItemPairs.begin(), iter_end = mItemPairs.end();
+ while (iter != iter_end)
{
(*iter)->first = NULL;
delete *iter;
+ iter++;
}
mItemPairs.clear();
// Also set items panel height to zero.
@@ -1287,16 +1286,14 @@ void LLFlatListView::detachItems(std::vector<LLPanel*>& detached_items)
}
else
{
- for (std::vector<LLPanel*>::const_iterator
- detached_iter = detached_items.begin(),
- detached_iter_end = detached_items.end();
- detached_iter != detached_iter_end; ++detached_iter)
+ std::vector<LLPanel*>::const_iterator
+ detached_iter = detached_items.begin(),
+ detached_iter_end = detached_items.end();
+ while (detached_iter < detached_iter_end)
{
LLPanel* pDetachedItem = *detached_iter;
- for (pairs_iterator_t
- iter = mItemPairs.begin(),
- iter_end = mItemPairs.end();
- iter != iter_end; ++iter)
+ pairs_iterator_t iter = mItemPairs.begin(), iter_end = mItemPairs.end();
+ while (iter != iter_end)
{
item_pair_t* item_pair = *iter;
if (item_pair->first == pDetachedItem)
@@ -1306,7 +1303,9 @@ void LLFlatListView::detachItems(std::vector<LLPanel*>& detached_items)
delete item_pair;
break;
}
+ iter++;
}
+ detached_iter++;
}
rearrangeItems();
}
@@ -1322,7 +1321,6 @@ LLFlatListViewEx::Params::Params()
: no_items_msg("no_items_msg")
, no_filtered_items_msg("no_filtered_items_msg")
{
-
}
LLFlatListViewEx::LLFlatListViewEx(const Params& p)
@@ -1332,7 +1330,6 @@ LLFlatListViewEx::LLFlatListViewEx(const Params& p)
, mForceShowingUnmatchedItems(false)
, mHasMatchedItems(false)
{
-
}
void LLFlatListViewEx::updateNoItemsMessage(const std::string& filter_string)
@@ -1352,7 +1349,6 @@ void LLFlatListViewEx::updateNoItemsMessage(const std::string& filter_string)
// list does not contain any items at all
setNoItemsCommentText(mNoItemsMsg);
}
-
}
bool LLFlatListViewEx::getForceShowingUnmatchedItems()
@@ -1411,12 +1407,10 @@ void LLFlatListViewEx::filterItems()
getItems(items);
mHasMatchedItems = false;
- for (item_panel_list_t::iterator
- iter = items.begin(),
- iter_end = items.end();
- iter != iter_end; ++iter)
+ item_panel_list_t::iterator iter = items.begin(), iter_end = items.end();
+ while (iter < iter_end)
{
- LLPanel* pItem = (*iter);
+ LLPanel* pItem = *(iter++);
updateItemVisibility(pItem, action);
}
diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp
index 62c311f522..650ae9ae75 100644
--- a/indra/llui/llfolderview.cpp
+++ b/indra/llui/llfolderview.cpp
@@ -189,7 +189,9 @@ LLFolderView::LLFolderView(const Params& p)
mStatusTextBox(NULL),
mShowItemLinkOverlays(p.show_item_link_overlays),
mViewModel(p.view_model),
- mGroupedItemModel(p.grouped_item_model)
+ mGroupedItemModel(p.grouped_item_model),
+ mForceArrange(false),
+ mSingleFolderMode(false)
{
LLPanel* panel = p.parent_panel;
mParentPanel = panel->getHandle();
@@ -609,6 +611,7 @@ void LLFolderView::clearSelection()
}
mSelectedItems.clear();
+ mNeedsScroll = false;
}
std::set<LLFolderViewItem*> LLFolderView::getSelectionList() const
@@ -665,7 +668,7 @@ void LLFolderView::draw()
}
else if (mShowEmptyMessage)
{
- mStatusTextBox->setValue(getFolderViewModel()->getStatusText());
+ mStatusTextBox->setValue(getFolderViewModel()->getStatusText(mItems.empty() && mFolders.empty()));
mStatusTextBox->setVisible( TRUE );
// firstly reshape message textbox with current size. This is necessary to
@@ -693,12 +696,16 @@ void LLFolderView::draw()
}
}
- if (mRenameItem && mRenamer && mRenamer->getVisible() && !getVisibleRect().overlaps(mRenamer->getRect()))
- {
- // renamer is not connected to the item we are renaming in any form so manage it manually
- // TODO: consider stopping on any scroll action instead of when out of visible area
- finishRenamingItem();
- }
+ if (mRenameItem
+ && mRenamer
+ && mRenamer->getVisible()
+ && !getVisibleRect().overlaps(mRenamer->getRect()))
+ {
+ // renamer is not connected to the item we are renaming in any form so manage it manually
+ // TODO: consider stopping on any scroll action instead of when out of visible area
+ LL_DEBUGS("Inventory") << "Renamer out of bounds, hiding" << LL_ENDL;
+ finishRenamingItem();
+ }
// skip over LLFolderViewFolder::draw since we don't want the folder icon, label,
// and arrow for the root folder
@@ -832,9 +839,12 @@ void LLFolderView::autoOpenItem( LLFolderViewFolder* item )
mAutoOpenItems.push(item);
item->setOpen(TRUE);
+ if(!item->isSingleFolderMode())
+ {
LLRect content_rect = (mScrollContainer ? mScrollContainer->getContentWindowRect() : LLRect());
LLRect constraint_rect(0,content_rect.getHeight(), content_rect.getWidth(), 0);
scrollToShowItem(item, constraint_rect);
+ }
}
void LLFolderView::closeAutoOpenedFolders()
@@ -1038,6 +1048,8 @@ void LLFolderView::paste()
// public rename functionality - can only start the process
void LLFolderView::startRenamingSelectedItem( void )
{
+ LL_DEBUGS("Inventory") << "Starting inventory renamer" << LL_ENDL;
+
// make sure selection is visible
scrollToShowSelection();
@@ -1273,6 +1285,11 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )
if(mSelectedItems.size())
{
LLFolderViewItem* last_selected = getCurSelectedItem();
+ if(last_selected && last_selected->isSingleFolderMode())
+ {
+ handled = FALSE;
+ break;
+ }
LLFolderViewItem* parent_folder = last_selected->getParentFolder();
if (!last_selected->isOpen() && parent_folder && parent_folder->getParentFolder())
{
@@ -1458,9 +1475,19 @@ BOOL LLFolderView::handleRightMouseDown( S32 x, S32 y, MASK mask )
mCallbackRegistrar->popScope();
}
}
+
+ BOOL item_clicked = FALSE;
+ for (selected_items_t::iterator item_it = mSelectedItems.begin(); item_it != mSelectedItems.end(); ++item_it)
+ {
+ item_clicked |= (*item_it)->getRect().pointInRect(x, y);
+ }
+ if(!item_clicked && mSingleFolderMode)
+ {
+ clearSelection();
+ }
bool hide_folder_menu = mSuppressFolderMenu && isFolderSelected();
- if (menu && (handled
- && ( count > 0 && (hasVisibleChildren()) )) && // show menu only if selected items are visible
+ if (menu && (mSingleFolderMode || (handled
+ && ( count > 0 && (hasVisibleChildren()) ))) && // show menu only if selected items are visible
!hide_folder_menu)
{
if (mCallbackRegistrar)
@@ -1532,6 +1559,22 @@ BOOL LLFolderView::handleHover( S32 x, S32 y, MASK mask )
return LLView::handleHover( x, y, mask );
}
+LLFolderViewItem* LLFolderView::getHoveredItem() const
+{
+ return dynamic_cast<LLFolderViewItem*>(mHoveredItem.get());
+}
+
+void LLFolderView::setHoveredItem(LLFolderViewItem* itemp)
+{
+ if (mHoveredItem.get() != itemp)
+ {
+ if (itemp)
+ mHoveredItem = itemp->getHandle();
+ else
+ mHoveredItem.markDead();
+ }
+}
+
BOOL LLFolderView::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,
@@ -1716,7 +1759,7 @@ void LLFolderView::update()
mNeedsAutoSelect = FALSE;
}
- BOOL is_visible = isInVisibleChain();
+ BOOL is_visible = isInVisibleChain() || mForceArrange;
//Puts folders/items in proper positions
// arrange() takes the model filter flag into account and call sort() if necessary (CHUI-849)
@@ -1817,13 +1860,28 @@ void LLFolderView::update()
}
}
- if (mSignalSelectCallback)
- {
- //RN: we use keyboard focus as a proxy for user-explicit actions
- BOOL take_keyboard_focus = (mSignalSelectCallback == SIGNAL_KEYBOARD_FOCUS);
- mSelectSignal(mSelectedItems, take_keyboard_focus);
- }
- mSignalSelectCallback = FALSE;
+ if (mSelectedItems.size())
+ {
+ LLFolderViewItem* item = mSelectedItems.back();
+ // If the goal is to show renamer, don't callback untill
+ // item is visible or is no longer being scrolled to.
+ // Otherwise renamer will be instantly closed
+ // Todo: consider moving renamer out of selection callback
+ if (!mNeedsAutoRename || !mNeedsScroll || item->getVisible())
+ {
+ if (mSignalSelectCallback)
+ {
+ //RN: we use keyboard focus as a proxy for user-explicit actions
+ BOOL take_keyboard_focus = (mSignalSelectCallback == SIGNAL_KEYBOARD_FOCUS);
+ mSelectSignal(mSelectedItems, take_keyboard_focus);
+ }
+ mSignalSelectCallback = FALSE;
+ }
+ }
+ else
+ {
+ mSignalSelectCallback = FALSE;
+ }
}
void LLFolderView::dumpSelectionInformation()
@@ -1886,6 +1944,11 @@ void LLFolderView::updateMenuOptions(LLMenuGL* menu)
flags = multi_select_flag;
}
+ if(mSingleFolderMode && (mSelectedItems.size() == 0))
+ {
+ buildContextMenu(*menu, flags);
+ }
+
// This adds a check for restrictions based on the entire
// selection set - for example, any one wearable may not push you
// over the limit, but all wearables together still might.
@@ -2042,7 +2105,7 @@ LLFolderViewItem* LLFolderView::getNextUnselectedItem()
return new_selection;
}
-S32 LLFolderView::getItemHeight()
+S32 LLFolderView::getItemHeight() const
{
if(!hasVisibleChildren())
{
diff --git a/indra/llui/llfolderview.h b/indra/llui/llfolderview.h
index 7dfa04828a..5f8a173889 100644
--- a/indra/llui/llfolderview.h
+++ b/indra/llui/llfolderview.h
@@ -127,6 +127,9 @@ public:
bool getAllowMultiSelect() { return mAllowMultiSelect; }
bool getAllowDrag() { return mAllowDrag; }
+ void setSingleFolderMode(bool is_single_mode) { mSingleFolderMode = is_single_mode; }
+ bool isSingleFolderMode() { return mSingleFolderMode; }
+
// Close all folders in the view
void closeAllFolders();
void openTopLevelFolders();
@@ -136,7 +139,7 @@ public:
// Find width and height of this object and its children. Also
// makes sure that this view and its children are the right size.
virtual S32 arrange( S32* width, S32* height );
- virtual S32 getItemHeight();
+ virtual S32 getItemHeight() const;
void arrangeAll() { mArrangeGeneration++; }
S32 getArrangeGeneration() { return mArrangeGeneration; }
@@ -144,6 +147,10 @@ public:
// applies filters to control visibility of items
virtual void filter( LLFolderViewFilter& filter);
+ void clearHoveredItem() { setHoveredItem(nullptr); }
+ LLFolderViewItem* getHoveredItem() const;
+ void setHoveredItem(LLFolderViewItem* itemp);
+
// Get the last selected item
virtual LLFolderViewItem* getCurSelectedItem( void );
selected_items_t& getSelectedItems( void );
@@ -210,6 +217,7 @@ public:
virtual void draw();
virtual void deleteAllChildren();
+ void stopAutoScollining() {mNeedsScroll = false;}
void scrollToShowSelection();
void scrollToShowItem(LLFolderViewItem* item, const LLRect& constraint_rect);
void setScrollContainer( LLScrollContainer* parent ) { mScrollContainer = parent; }
@@ -237,11 +245,15 @@ public:
void setCallbackRegistrar(LLUICtrl::CommitCallbackRegistry::ScopedRegistrar* registrar) { mCallbackRegistrar = registrar; }
void setEnableRegistrar(LLUICtrl::EnableCallbackRegistry::ScopedRegistrar* registrar) { mEnableRegistrar = registrar; }
+ void setForceArrange(bool force) { mForceArrange = force; }
+
LLPanel* getParentPanel() { return mParentPanel.get(); }
// DEBUG only
void dumpSelectionInformation();
virtual S32 notify(const LLSD& info) ;
+
+ void setShowEmptyMessage(bool show_msg) { mShowEmptyMessage = show_msg; }
bool useLabelSuffix() { return mUseLabelSuffix; }
virtual void updateMenu();
@@ -275,6 +287,7 @@ protected:
LLHandle<LLView> mPopupMenuHandle;
std::string mMenuFileName;
+ LLHandle<LLView> mHoveredItem;
selected_items_t mSelectedItems;
bool mKeyboardSelection,
mAllowMultiSelect,
@@ -291,7 +304,8 @@ protected:
mShowItemLinkOverlays,
mShowSelectionContext,
mShowSingleSelection,
- mSuppressFolderMenu;
+ mSuppressFolderMenu,
+ mSingleFolderMode;
// Renaming variables and methods
LLFolderViewItem* mRenameItem; // The item currently being renamed
@@ -330,6 +344,8 @@ protected:
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar* mCallbackRegistrar;
LLUICtrl::EnableCallbackRegistry::ScopedRegistrar* mEnableRegistrar;
+
+ bool mForceArrange;
public:
static F32 sAutoOpenTime;
diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp
index eba93beed9..0dc66bf37a 100644
--- a/indra/llui/llfolderviewitem.cpp
+++ b/indra/llui/llfolderviewitem.cpp
@@ -32,6 +32,7 @@
#include "llfolderview.h"
#include "llfolderviewmodel.h"
#include "llpanel.h"
+#include "llcallbacklist.h"
#include "llcriticaldamp.h"
#include "llclipboard.h"
#include "llfocusmgr.h" // gFocusMgr
@@ -113,6 +114,8 @@ LLFolderViewItem::Params::Params()
icon_width("icon_width", 0),
text_pad("text_pad", 0),
text_pad_right("text_pad_right", 0),
+ single_folder_mode("single_folder_mode", false),
+ double_click_override("double_click_override", false),
arrow_size("arrow_size", 0),
max_folder_item_overlap("max_folder_item_overlap", 0)
{ }
@@ -151,7 +154,9 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
mTextPad(p.text_pad),
mTextPadRight(p.text_pad_right),
mArrowSize(p.arrow_size),
- mMaxFolderItemOverlap(p.max_folder_item_overlap)
+ mSingleFolderMode(p.single_folder_mode),
+ mMaxFolderItemOverlap(p.max_folder_item_overlap),
+ mDoubleClickOverride(p.double_click_override)
{
if (!sColorSetInitialized)
{
@@ -162,7 +167,7 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
sMouseOverColor = LLUIColorTable::instance().getColor("InventoryMouseOverColor", DEFAULT_WHITE);
sFilterBGColor = LLUIColorTable::instance().getColor("FilterBackgroundColor", DEFAULT_WHITE);
sFilterTextColor = LLUIColorTable::instance().getColor("FilterTextColor", DEFAULT_WHITE);
- sSuffixColor = LLUIColorTable::instance().getColor("InventoryItemColor", DEFAULT_WHITE);
+ sSuffixColor = LLUIColorTable::instance().getColor("InventoryItemLinkColor", DEFAULT_WHITE);
sSearchStatusColor = LLUIColorTable::instance().getColor("InventorySearchStatusColor", DEFAULT_WHITE);
sColorSetInitialized = true;
}
@@ -177,6 +182,7 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
LLFolderViewItem::~LLFolderViewItem()
{
mViewModelItem = NULL;
+ gFocusMgr.removeKeyboardFocusWithoutCallback(this);
}
BOOL LLFolderViewItem::postBuild()
@@ -395,7 +401,7 @@ S32 LLFolderViewItem::arrange( S32* width, S32* height )
// it is purely visual, so it is fine to do at our laisure
refreshSuffix();
}
- mLabelWidth = getLabelXPos() + getLabelFontForStyle(mLabelStyle)->getWidth(mLabel) + getLabelFontForStyle(mLabelStyle)->getWidth(mLabelSuffix) + mLabelPaddingRight;
+ mLabelWidth = getLabelXPos() + getLabelFontForStyle(mLabelStyle)->getWidth(mLabel) + getLabelFontForStyle(LLFontGL::NORMAL)->getWidth(mLabelSuffix) + mLabelPaddingRight;
mLabelWidthDirty = false;
}
@@ -412,7 +418,7 @@ S32 LLFolderViewItem::arrange( S32* width, S32* height )
return *height;
}
-S32 LLFolderViewItem::getItemHeight()
+S32 LLFolderViewItem::getItemHeight() const
{
return mItemHeight;
}
@@ -624,11 +630,14 @@ BOOL LLFolderViewItem::handleHover( S32 x, S32 y, MASK mask )
getWindow()->setCursor(UI_CURSOR_NOLOCKED);
}
+ root->clearHoveredItem();
return TRUE;
}
else
{
- getRoot()->setShowSelectionContext(FALSE);
+ LLFolderView* pRoot = getRoot();
+ pRoot->setHoveredItem(this);
+ pRoot->setShowSelectionContext(FALSE);
getWindow()->setCursor(UI_CURSOR_ARROW);
// let parent handle this then...
return FALSE;
@@ -683,6 +692,13 @@ BOOL LLFolderViewItem::handleMouseUp( S32 x, S32 y, MASK mask )
void LLFolderViewItem::onMouseLeave(S32 x, S32 y, MASK mask)
{
mIsMouseOverTitle = false;
+
+ // NOTE: LLViewerWindow::updateUI() calls "enter" before "leave"; if the mouse moved to another item, we can't just outright clear it
+ LLFolderView* pRoot = getRoot();
+ if (this == pRoot->getHoveredItem())
+ {
+ pRoot->clearHoveredItem();
+ }
}
BOOL LLFolderViewItem::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
@@ -889,7 +905,10 @@ void LLFolderViewItem::draw()
getViewModelItem()->update();
- drawOpenFolderArrow(default_params, sFgColor);
+ if(!mSingleFolderMode)
+ {
+ drawOpenFolderArrow(default_params, sFgColor);
+ }
drawHighlight(show_context, filled, sHighlightBgColor, sFlashBgColor, sFocusOutlineColor, sMouseOverColor);
@@ -925,16 +944,43 @@ void LLFolderViewItem::draw()
F32 text_left = (F32)getLabelXPos();
std::string combined_string = mLabel + mLabelSuffix;
+ const LLFontGL* suffix_font = getLabelFontForStyle(LLFontGL::NORMAL);
+ S32 filter_offset = mViewModelItem->getFilterStringOffset();
if (filter_string_length > 0)
{
- S32 left = ll_round(text_left) + font->getWidth(combined_string, 0, mViewModelItem->getFilterStringOffset()) - 2;
+ S32 bottom = llfloor(getRect().getHeight() - font->getLineHeight() - 3 - TOP_PAD);
+ S32 top = getRect().getHeight() - TOP_PAD;
+ if(mLabelSuffix.empty() || (font == suffix_font))
+ {
+ S32 left = ll_round(text_left) + font->getWidth(combined_string, 0, mViewModelItem->getFilterStringOffset()) - 2;
S32 right = left + font->getWidth(combined_string, mViewModelItem->getFilterStringOffset(), filter_string_length) + 2;
- S32 bottom = llfloor(getRect().getHeight() - font->getLineHeight() - 3 - TOP_PAD);
- S32 top = getRect().getHeight() - TOP_PAD;
LLUIImage* box_image = default_params.selection_image;
LLRect box_rect(left, top, right, bottom);
box_image->draw(box_rect, sFilterBGColor);
+ }
+ else
+ {
+ S32 label_filter_length = llmin((S32)mLabel.size() - filter_offset, (S32)filter_string_length);
+ if(label_filter_length > 0)
+ {
+ S32 left = ll_round(text_left) + font->getWidthF32(mLabel, 0, llmin(filter_offset, (S32)mLabel.size())) - 2;
+ S32 right = left + font->getWidthF32(mLabel, filter_offset, label_filter_length) + 2;
+ LLUIImage* box_image = default_params.selection_image;
+ LLRect box_rect(left, top, right, bottom);
+ box_image->draw(box_rect, sFilterBGColor);
+ }
+ S32 suffix_filter_length = label_filter_length > 0 ? filter_string_length - label_filter_length : filter_string_length;
+ if(suffix_filter_length > 0)
+ {
+ S32 suffix_offset = llmax(0, filter_offset - (S32)mLabel.size());
+ S32 left = ll_round(text_left) + font->getWidthF32(mLabel, 0, mLabel.size()) + suffix_font->getWidthF32(mLabelSuffix, 0, suffix_offset) - 2;
+ S32 right = left + suffix_font->getWidthF32(mLabelSuffix, suffix_offset, suffix_filter_length) + 2;
+ LLUIImage* box_image = default_params.selection_image;
+ LLRect box_rect(left, top, right, bottom);
+ box_image->draw(box_rect, sFilterBGColor);
+ }
+ }
}
LLColor4 color = (mIsSelected && filled) ? mFontHighlightColor : mFontColor;
@@ -951,7 +997,7 @@ void LLFolderViewItem::draw()
//
if (!mLabelSuffix.empty())
{
- font->renderUTF8( mLabelSuffix, 0, right_x, y, isFadeItem() ? color : (LLColor4)sSuffixColor,
+ suffix_font->renderUTF8( mLabelSuffix, 0, right_x, y, isFadeItem() ? color : (LLColor4)sSuffixColor,
LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
S32_MAX, S32_MAX, &right_x, FALSE );
}
@@ -961,12 +1007,35 @@ void LLFolderViewItem::draw()
//
if (filter_string_length > 0)
{
- S32 filter_offset = mViewModelItem->getFilterStringOffset();
- F32 match_string_left = text_left + font->getWidthF32(combined_string, 0, filter_offset + filter_string_length) - font->getWidthF32(combined_string, filter_offset, filter_string_length);
- F32 yy = (F32)getRect().getHeight() - font->getLineHeight() - (F32)mTextPad - (F32)TOP_PAD;
- font->renderUTF8( combined_string, filter_offset, match_string_left, yy,
+ if(mLabelSuffix.empty() || (font == suffix_font))
+ {
+ F32 match_string_left = text_left + font->getWidthF32(combined_string, 0, filter_offset + filter_string_length) - font->getWidthF32(combined_string, filter_offset, filter_string_length);
+ F32 yy = (F32)getRect().getHeight() - font->getLineHeight() - (F32)mTextPad - (F32)TOP_PAD;
+ font->renderUTF8( combined_string, filter_offset, match_string_left, yy,
sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
filter_string_length, S32_MAX, &right_x, FALSE );
+ }
+ else
+ {
+ S32 label_filter_length = llmin((S32)mLabel.size() - filter_offset, (S32)filter_string_length);
+ if(label_filter_length > 0)
+ {
+ F32 match_string_left = text_left + font->getWidthF32(mLabel, 0, filter_offset + label_filter_length) - font->getWidthF32(mLabel, filter_offset, label_filter_length);
+ F32 yy = (F32)getRect().getHeight() - font->getLineHeight() - (F32)mTextPad - (F32)TOP_PAD;
+ font->renderUTF8( mLabel, filter_offset, match_string_left, yy,
+ sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, label_filter_length, S32_MAX, &right_x, FALSE );
+ }
+
+ S32 suffix_filter_length = label_filter_length > 0 ? filter_string_length - label_filter_length : filter_string_length;
+ if(suffix_filter_length > 0)
+ {
+ S32 suffix_offset = llmax(0, filter_offset - (S32)mLabel.size());
+ F32 match_string_left = text_left + font->getWidthF32(mLabel, 0, mLabel.size()) + suffix_font->getWidthF32(mLabelSuffix, 0, suffix_offset + suffix_filter_length) - suffix_font->getWidthF32(mLabelSuffix, suffix_offset, suffix_filter_length);
+ F32 yy = (F32)getRect().getHeight() - suffix_font->getLineHeight() - (F32)mTextPad - (F32)TOP_PAD;
+ suffix_font->renderUTF8( mLabelSuffix, suffix_offset, match_string_left, yy, sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, suffix_filter_length, S32_MAX, &right_x, FALSE );
+ }
+ }
+
}
//Gilbert Linden 9-20-2012: Although this should be legal, removing it because it causes the mLabelSuffix rendering to
@@ -1277,7 +1346,7 @@ BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL openitem
child_selected = TRUE;
}
}
- if(openitem && child_selected)
+ if(openitem && child_selected && !mSingleFolderMode)
{
setOpenArrangeRecursively(TRUE);
}
@@ -1702,6 +1771,11 @@ BOOL LLFolderViewFolder::isRemovable()
return TRUE;
}
+void LLFolderViewFolder::destroyRoot()
+{
+ delete this;
+}
+
// this is an internal method used for adding items to folders.
void LLFolderViewFolder::addItem(LLFolderViewItem* item)
{
@@ -1770,7 +1844,19 @@ void LLFolderViewFolder::toggleOpen()
// Force a folder open or closed
void LLFolderViewFolder::setOpen(BOOL openitem)
{
- setOpenArrangeRecursively(openitem);
+ if(mSingleFolderMode)
+ {
+ // navigateToFolder can destroy this view
+ // delay it in case setOpen was called from click or key processing
+ doOnIdleOneTime([this]()
+ {
+ getViewModelItem()->navigateToFolder();
+ });
+ }
+ else
+ {
+ setOpenArrangeRecursively(openitem);
+ }
}
void LLFolderViewFolder::setOpenArrangeRecursively(BOOL openitem, ERecurseType recurse)
@@ -1973,7 +2059,8 @@ BOOL LLFolderViewFolder::handleMouseDown( S32 x, S32 y, MASK mask )
}
if( !handled )
{
- if(mIndentation < x && x < mIndentation + (isCollapsed() ? 0 : mArrowSize) + mTextPad)
+ if((mIndentation < x && x < mIndentation + (isCollapsed() ? 0 : mArrowSize) + mTextPad)
+ && !mSingleFolderMode)
{
toggleOpen();
handled = TRUE;
@@ -1991,12 +2078,45 @@ BOOL LLFolderViewFolder::handleMouseDown( S32 x, S32 y, MASK mask )
BOOL LLFolderViewFolder::handleDoubleClick( S32 x, S32 y, MASK mask )
{
BOOL handled = FALSE;
+ if(mSingleFolderMode)
+ {
+ static LLUICachedControl<bool> double_click_new_window("SingleModeDoubleClickOpenWindow", false);
+ if (double_click_new_window)
+ {
+ getViewModelItem()->navigateToFolder(true);
+ }
+ else
+ {
+ // navigating is going to destroy views and change children
+ // delay it untill handleDoubleClick processing is complete
+ doOnIdleOneTime([this]()
+ {
+ getViewModelItem()->navigateToFolder(false);
+ });
+ }
+ return TRUE;
+ }
+
if( isOpen() )
{
handled = childrenHandleDoubleClick( x, y, mask ) != NULL;
}
if( !handled )
{
+ if(mDoubleClickOverride)
+ {
+ static LLUICachedControl<U32> double_click_action("MultiModeDoubleClickFolder", false);
+ if (double_click_action == 1)
+ {
+ getViewModelItem()->navigateToFolder(true);
+ return TRUE;
+ }
+ if (double_click_action == 2)
+ {
+ getViewModelItem()->navigateToFolder(false, true);
+ return TRUE;
+ }
+ }
if(mIndentation < x && x < mIndentation + (isCollapsed() ? 0 : mArrowSize) + mTextPad)
{
// don't select when user double-clicks plus sign
diff --git a/indra/llui/llfolderviewitem.h b/indra/llui/llfolderviewitem.h
index a5157266c5..5c2a1ecff0 100644
--- a/indra/llui/llfolderviewitem.h
+++ b/indra/llui/llfolderviewitem.h
@@ -72,6 +72,8 @@ public:
text_pad_right,
arrow_size,
max_folder_item_overlap;
+ Optional<bool> single_folder_mode,
+ double_click_override;
Params();
};
@@ -121,6 +123,8 @@ protected:
mIsMouseOverTitle,
mAllowWear,
mAllowDrop,
+ mSingleFolderMode,
+ mDoubleClickOverride,
mSelectPending,
mIsItemCut;
@@ -174,7 +178,7 @@ public:
// Finds width and height of this object and it's children. Also
// makes sure that this view and it's children are the right size.
virtual S32 arrange( S32* width, S32* height );
- virtual S32 getItemHeight();
+ virtual S32 getItemHeight() const;
virtual S32 getLabelXPos();
S32 getIconPad();
S32 getTextPad();
@@ -213,9 +217,9 @@ public:
void setIsCurSelection(BOOL select) { mIsCurSelection = select; }
- BOOL getIsCurSelection() { return mIsCurSelection; }
+ BOOL getIsCurSelection() const { return mIsCurSelection; }
- BOOL hasVisibleChildren() { return mHasVisibleChildren; }
+ BOOL hasVisibleChildren() const { return mHasVisibleChildren; }
// true if object can't have children
virtual bool isFolderComplete() { return true; }
@@ -264,7 +268,7 @@ public:
virtual LLFolderView* getRoot();
virtual const LLFolderView* getRoot() const;
BOOL isDescendantOf( const LLFolderViewFolder* potential_ancestor );
- S32 getIndentation() { return mIndentation; }
+ S32 getIndentation() const { return mIndentation; }
virtual BOOL passedFilter(S32 filter_generation = -1);
virtual BOOL isPotentiallyVisible(S32 filter_generation = -1);
@@ -277,6 +281,8 @@ public:
// Does not need filter update
virtual void refreshSuffix();
+ bool isSingleFolderMode() { return mSingleFolderMode; }
+
// LLView functionality
virtual BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
virtual BOOL handleMouseDown( S32 x, S32 y, MASK mask );
@@ -387,6 +393,7 @@ public:
// destroys this folder, and all children
virtual void destroyView();
+ void destroyRoot();
// whether known children are fully loaded (arrange sets to true)
virtual bool isFolderComplete() { return mIsFolderComplete; }
diff --git a/indra/llui/llfolderviewmodel.cpp b/indra/llui/llfolderviewmodel.cpp
index 93122503d1..f217b743a0 100644
--- a/indra/llui/llfolderviewmodel.cpp
+++ b/indra/llui/llfolderviewmodel.cpp
@@ -34,7 +34,7 @@ bool LLFolderViewModelCommon::needsSort(LLFolderViewModelItem* item)
return item->getSortVersion() < mTargetSortVersion;
}
-std::string LLFolderViewModelCommon::getStatusText()
+std::string LLFolderViewModelCommon::getStatusText(bool is_empty_folder)
{
if (!contentsReady() || mFolderView->getViewModelItem()->getLastFilterGeneration() < getFilter().getCurrentGeneration())
{
@@ -42,7 +42,7 @@ std::string LLFolderViewModelCommon::getStatusText()
}
else
{
- return getFilter().getEmptyLookupMessage();
+ return getFilter().getEmptyLookupMessage(is_empty_folder);
}
}
diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h
index c5e027d314..551a60e097 100644
--- a/indra/llui/llfolderviewmodel.h
+++ b/indra/llui/llfolderviewmodel.h
@@ -69,7 +69,7 @@ public:
virtual bool checkFolder(const LLFolderViewModelItem* folder) const = 0;
virtual void setEmptyLookupMessage(const std::string& message) = 0;
- virtual std::string getEmptyLookupMessage() const = 0;
+ virtual std::string getEmptyLookupMessage(bool is_empty_folder = false) const = 0;
virtual bool showAllResults() const = 0;
@@ -125,7 +125,7 @@ public:
virtual void setFolderView(LLFolderView* folder_view) = 0;
virtual LLFolderViewFilter& getFilter() = 0;
virtual const LLFolderViewFilter& getFilter() const = 0;
- virtual std::string getStatusText() = 0;
+ virtual std::string getStatusText(bool is_empty_folder = false) = 0;
virtual bool startDrag(std::vector<LLFolderViewModelItem*>& items) = 0;
};
@@ -159,6 +159,8 @@ public:
virtual void openItem( void ) = 0;
virtual void closeItem( void ) = 0;
virtual void selectItem(void) = 0;
+
+ virtual void navigateToFolder(bool new_window = false, bool change_mode = false) = 0;
virtual BOOL isItemWearable() const { return FALSE; }
@@ -392,7 +394,7 @@ public:
// sort everything
mTargetSortVersion++;
}
- virtual std::string getStatusText();
+ virtual std::string getStatusText(bool is_empty_folder = false);
virtual void filter();
void setFolderView(LLFolderView* folder_view) { mFolderView = folder_view;}
diff --git a/indra/llui/lliconctrl.cpp b/indra/llui/lliconctrl.cpp
index e01aba402e..2791377a5e 100644
--- a/indra/llui/lliconctrl.cpp
+++ b/indra/llui/lliconctrl.cpp
@@ -37,6 +37,8 @@
#include "lluiimage.h"
#include "llwindow.h"
+#include "llgltexture.h"
+
static LLDefaultChildRegistry::Register<LLIconCtrl> r("icon");
LLIconCtrl::Params::Params()
@@ -94,6 +96,22 @@ BOOL LLIconCtrl::handleHover(S32 x, S32 y, MASK mask)
return LLUICtrl::handleHover(x, y, mask);
}
+void LLIconCtrl::onVisibilityChange(BOOL new_visibility)
+{
+ LLUICtrl::onVisibilityChange(new_visibility);
+ if (mPriority == LLGLTexture::BOOST_ICON)
+ {
+ if (new_visibility)
+ {
+ loadImage(getValue(), mPriority);
+ }
+ else
+ {
+ mImagep = nullptr;
+ }
+ }
+}
+
// virtual
// value might be a string or a UUID
void LLIconCtrl::setValue(const LLSD& value)
@@ -110,6 +128,14 @@ void LLIconCtrl::setValue(const LLSD& value, S32 priority)
tvalue = LLSD(LLUUID(value.asString()));
}
LLUICtrl::setValue(tvalue);
+
+ loadImage(tvalue, priority);
+}
+
+void LLIconCtrl::loadImage(const LLSD& tvalue, S32 priority)
+{
+ if(mPriority == LLGLTexture::BOOST_ICON && !getVisible()) return;
+
if (tvalue.isUUID())
{
mImagep = LLUI::getUIImageByID(tvalue.asUUID(), priority);
diff --git a/indra/llui/lliconctrl.h b/indra/llui/lliconctrl.h
index 9c3b517bca..e983d63a01 100644
--- a/indra/llui/lliconctrl.h
+++ b/indra/llui/lliconctrl.h
@@ -39,7 +39,9 @@ class LLUICtrlFactory;
// Classes
//
-//
+// Class for diplaying named UI textures
+// Do not use for displaying textures from network,
+// UI textures are stored permanently!
class LLIconCtrl
: public LLUICtrl
{
@@ -72,6 +74,7 @@ public:
virtual BOOL handleHover(S32 x, S32 y, MASK mask);
// lluictrl overrides
+ void onVisibilityChange(BOOL new_visibility);
virtual void setValue(const LLSD& value );
std::string getImageName() const;
@@ -95,6 +98,8 @@ protected:
bool mInteractable;
private:
+ void loadImage(const LLSD& value, S32 priority);
+
LLUIColor mColor;
LLPointer<LLUIImage> mImagep;
};
diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index 77938edf27..7e4e828a88 100644
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -89,6 +89,8 @@ LLLayoutPanel::~LLLayoutPanel()
// probably not necessary, but...
delete mResizeBar;
mResizeBar = NULL;
+
+ gFocusMgr.removeKeyboardFocusWithoutCallback(this);
}
F32 LLLayoutPanel::getAutoResizeFactor() const
@@ -214,7 +216,8 @@ LLLayoutStack::Params::Params()
drag_handle_first_indent("drag_handle_first_indent", 0),
drag_handle_second_indent("drag_handle_second_indent", 0),
drag_handle_thickness("drag_handle_thickness", 5),
- drag_handle_shift("drag_handle_shift", 2)
+ drag_handle_shift("drag_handle_shift", 2),
+ drag_handle_color("drag_handle_color", LLUIColorTable::instance().getColor("ResizebarBody"))
{
addSynonym(border_size, "drag_handle_gap");
}
@@ -234,7 +237,8 @@ LLLayoutStack::LLLayoutStack(const LLLayoutStack::Params& p)
mDragHandleFirstIndent(p.drag_handle_first_indent),
mDragHandleSecondIndent(p.drag_handle_second_indent),
mDragHandleThickness(p.drag_handle_thickness),
- mDragHandleShift(p.drag_handle_shift)
+ mDragHandleShift(p.drag_handle_shift),
+ mDragHandleColor(p.drag_handle_color())
{
}
@@ -282,6 +286,17 @@ void LLLayoutStack::draw()
}
}
+void LLLayoutStack::deleteAllChildren()
+{
+ mPanels.clear();
+ LLView::deleteAllChildren();
+
+ // Not really needed since nothing is left to
+ // display, but for the sake of consistency
+ updateFractionalSizes();
+ mNeedsLayout = true;
+}
+
void LLLayoutStack::removeChild(LLView* view)
{
LLLayoutPanel* embedded_panelp = findEmbeddedPanel(dynamic_cast<LLPanel*>(view));
@@ -289,12 +304,14 @@ void LLLayoutStack::removeChild(LLView* view)
if (embedded_panelp)
{
mPanels.erase(std::find(mPanels.begin(), mPanels.end(), embedded_panelp));
- delete embedded_panelp;
+ LLView::removeChild(view);
updateFractionalSizes();
mNeedsLayout = true;
}
-
- LLView::removeChild(view);
+ else
+ {
+ LLView::removeChild(view);
+ }
}
BOOL LLLayoutStack::postBuild()
@@ -508,6 +525,15 @@ void LLLayoutStack::updateLayout()
mNeedsLayout = continue_animating;
} // end LLLayoutStack::updateLayout
+void LLLayoutStack::setPanelSpacing(S32 val)
+{
+ if (mPanelSpacing != val)
+ {
+ mPanelSpacing = val;
+ mNeedsLayout = true;
+ }
+}
+
LLLayoutPanel* LLLayoutStack::findEmbeddedPanel(LLPanel* panelp) const
{
if (!panelp) return NULL;
@@ -561,7 +587,7 @@ void LLLayoutStack::createResizeBar(LLLayoutPanel* panelp)
resize_bar_bg_panel_p.follows.flags = FOLLOWS_ALL;
resize_bar_bg_panel_p.tab_stop = false;
resize_bar_bg_panel_p.background_visible = true;
- resize_bar_bg_panel_p.bg_alpha_color = LLUIColorTable::instance().getColor("ResizebarBody");
+ resize_bar_bg_panel_p.bg_alpha_color = mDragHandleColor;
resize_bar_bg_panel_p.has_border = true;
resize_bar_bg_panel_p.border.border_thickness = 1;
resize_bar_bg_panel_p.border.highlight_light_color = LLUIColorTable::instance().getColor("ResizebarBorderLight");
diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h
index f772dbc6b4..000b919ae7 100644
--- a/indra/llui/lllayoutstack.h
+++ b/indra/llui/lllayoutstack.h
@@ -59,6 +59,8 @@ public:
Optional<S32> drag_handle_thickness;
Optional<S32> drag_handle_shift;
+ Optional<LLUIColor> drag_handle_color;
+
Params();
};
@@ -67,6 +69,7 @@ public:
virtual ~LLLayoutStack();
/*virtual*/ void draw();
+ /*virtual*/ void deleteAllChildren();
/*virtual*/ void removeChild(LLView*);
/*virtual*/ BOOL postBuild();
/*virtual*/ bool addChild(LLView* child, S32 tab_group = 0);
@@ -88,6 +91,7 @@ public:
void updateLayout();
S32 getPanelSpacing() const { return mPanelSpacing; }
+ void setPanelSpacing(S32 val);
static void updateClass();
@@ -127,6 +131,7 @@ private:
S32 mDragHandleSecondIndent;
S32 mDragHandleThickness;
S32 mDragHandleShift;
+ LLUIColor mDragHandleColor;
}; // end class LLLayoutStack
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index 5cb840fd61..cebca70b59 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -487,9 +487,6 @@ void LLMenuItemGL::draw( void )
// let disabled items be highlighted, just don't draw them as such
if( getEnabled() && getHighlight() && !mBriefItem)
{
- int debug_count = 0;
- if (dynamic_cast<LLMenuItemCallGL*>(this))
- debug_count++;
gGL.color4fv( mHighlightBackground.get().mV );
gl_rect_2d( 0, getRect().getHeight(), getRect().getWidth(), 0 );
@@ -576,13 +573,13 @@ void LLMenuItemGL::onVisibilityChange(BOOL new_visibility)
//
// This class represents a separator.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-LLMenuItemSeparatorGL::Params::Params()
-{
-}
-
LLMenuItemSeparatorGL::LLMenuItemSeparatorGL(const LLMenuItemSeparatorGL::Params& p) :
LLMenuItemGL( p )
{
+ if (p.on_visible.isProvided())
+ {
+ mVisibleSignal.connect(initEnableCallback(p.on_visible));
+ }
}
//virtual
@@ -599,6 +596,15 @@ void LLMenuItemSeparatorGL::draw( void )
gl_line_2d( PAD, y, getRect().getWidth() - PAD, y );
}
+void LLMenuItemSeparatorGL::buildDrawLabel( void )
+{
+ if (mVisibleSignal.num_slots() > 0)
+ {
+ bool visible = mVisibleSignal(this, LLSD());
+ setVisible(visible);
+ }
+}
+
BOOL LLMenuItemSeparatorGL::handleMouseDown(S32 x, S32 y, MASK mask)
{
LLMenuGL* parent_menu = getMenu();
@@ -1882,6 +1888,13 @@ bool LLMenuGL::addContextChild(LLView* view, S32 tab_group)
return false;
}
+
+void LLMenuGL::deleteAllChildren()
+{
+ mItems.clear();
+ LLUICtrl::deleteAllChildren();
+}
+
void LLMenuGL::removeChild( LLView* ctrl)
{
// previously a dynamic_cast with if statement to check validity
diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h
index f84c4d41eb..87e3f18ebc 100644
--- a/indra/llui/llmenugl.h
+++ b/indra/llui/llmenugl.h
@@ -234,7 +234,9 @@ class LLMenuItemSeparatorGL : public LLMenuItemGL
public:
struct Params : public LLInitParam::Block<Params, LLMenuItemGL::Params>
{
- Params();
+ Optional<EnableCallbackParam > on_visible;
+ Params() : on_visible("on_visible")
+ {}
};
LLMenuItemSeparatorGL(const LLMenuItemSeparatorGL::Params& p = LLMenuItemSeparatorGL::Params());
@@ -243,7 +245,12 @@ public:
/*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
+ virtual void buildDrawLabel();
+
/*virtual*/ U32 getNominalHeight( void ) const;
+
+private:
+ enable_signal_t mVisibleSignal;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -442,6 +449,7 @@ public:
/*virtual*/ void drawBackground(LLMenuItemGL* itemp, F32 alpha);
/*virtual*/ void setVisible(BOOL visible);
/*virtual*/ bool addChild(LLView* view, S32 tab_group = 0);
+ /*virtual*/ void deleteAllChildren();
/*virtual*/ void removeChild( LLView* ctrl);
/*virtual*/ BOOL postBuild();
diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h
index b8f47ef6ba..8018365d3e 100644
--- a/indra/llui/llpanel.h
+++ b/indra/llui/llpanel.h
@@ -127,6 +127,7 @@ public:
virtual void clearCtrls(); // overridden in LLPanelObject and LLPanelVolume
// Border controls
+ const LLViewBorder* getBorder() const { return mBorder; }
void addBorder( LLViewBorder::Params p);
void addBorder();
void removeBorder();
diff --git a/indra/llui/llresizehandle.cpp b/indra/llui/llresizehandle.cpp
index 24794305ac..13ef0fdb7f 100644
--- a/indra/llui/llresizehandle.cpp
+++ b/indra/llui/llresizehandle.cpp
@@ -70,6 +70,11 @@ LLResizeHandle::LLResizeHandle(const LLResizeHandle::Params& p)
}
}
+LLResizeHandle::~LLResizeHandle()
+{
+ gFocusMgr.removeKeyboardFocusWithoutCallback(this);
+}
+
BOOL LLResizeHandle::handleMouseDown(S32 x, S32 y, MASK mask)
{
diff --git a/indra/llui/llresizehandle.h b/indra/llui/llresizehandle.h
index 7541b9e6c0..ae20ecaa77 100644
--- a/indra/llui/llresizehandle.h
+++ b/indra/llui/llresizehandle.h
@@ -45,6 +45,7 @@ public:
Params();
};
+ ~LLResizeHandle();
protected:
LLResizeHandle(const LLResizeHandle::Params&);
friend class LLUICtrlFactory;
diff --git a/indra/llui/llscrollbar.cpp b/indra/llui/llscrollbar.cpp
index fde6de4921..735e2d529e 100644
--- a/indra/llui/llscrollbar.cpp
+++ b/indra/llui/llscrollbar.cpp
@@ -188,12 +188,12 @@ void LLScrollbar::setPageSize( S32 page_size )
}
}
-BOOL LLScrollbar::isAtBeginning()
+bool LLScrollbar::isAtBeginning() const
{
return mDocPos == 0;
}
-BOOL LLScrollbar::isAtEnd()
+bool LLScrollbar::isAtEnd() const
{
return mDocPos == getDocPosMax();
}
@@ -591,7 +591,12 @@ void LLScrollbar::setValue(const LLSD& value)
BOOL LLScrollbar::handleKeyHere(KEY key, MASK mask)
{
- BOOL handled = FALSE;
+ if (getDocPosMax() == 0 && !getVisible())
+ {
+ return FALSE;
+ }
+
+ BOOL handled = FALSE;
switch( key )
{
diff --git a/indra/llui/llscrollbar.h b/indra/llui/llscrollbar.h
index 5f2f490d81..9be9d22db8 100644
--- a/indra/llui/llscrollbar.h
+++ b/indra/llui/llscrollbar.h
@@ -105,8 +105,8 @@ public:
bool setDocPos( S32 pos, BOOL update_thumb = TRUE );
S32 getDocPos() const { return mDocPos; }
- BOOL isAtBeginning();
- BOOL isAtEnd();
+ bool isAtBeginning() const;
+ bool isAtEnd() const;
// Setting both at once.
void setDocParams( S32 size, S32 pos );
diff --git a/indra/llui/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp
index 3db38bbfac..ad32f7186c 100644
--- a/indra/llui/llscrollcontainer.cpp
+++ b/indra/llui/llscrollcontainer.cpp
@@ -105,8 +105,8 @@ LLScrollContainer::LLScrollContainer(const LLScrollContainer::Params& p)
mBorder = LLUICtrlFactory::create<LLViewBorder> (params);
LLView::addChild( mBorder );
- mInnerRect.set( 0, getRect().getHeight(), getRect().getWidth(), 0 );
- mInnerRect.stretch( -getBorderWidth() );
+ mInnerRect = getLocalRect();
+ mInnerRect.stretch( -getBorderWidth() );
LLRect vertical_scroll_rect = mInnerRect;
vertical_scroll_rect.mLeft = vertical_scroll_rect.mRight - scrollbar_size;
@@ -124,8 +124,9 @@ LLScrollContainer::LLScrollContainer(const LLScrollContainer::Params& p)
mScrollbar[VERTICAL] = LLUICtrlFactory::create<LLScrollbar> (sbparams);
LLView::addChild( mScrollbar[VERTICAL] );
- LLRect horizontal_scroll_rect = mInnerRect;
- horizontal_scroll_rect.mTop = horizontal_scroll_rect.mBottom + scrollbar_size;
+ LLRect horizontal_scroll_rect;
+ horizontal_scroll_rect.mTop = scrollbar_size;
+ horizontal_scroll_rect.mRight = mInnerRect.getWidth();
sbparams.name("scrollable horizontal");
sbparams.rect(horizontal_scroll_rect);
sbparams.orientation(LLScrollbar::HORIZONTAL);
@@ -134,7 +135,7 @@ LLScrollContainer::LLScrollContainer(const LLScrollContainer::Params& p)
sbparams.page_size(mInnerRect.getWidth());
sbparams.step_size(VERTICAL_MULTIPLE);
sbparams.visible(false);
- sbparams.follows.flags(FOLLOWS_LEFT | FOLLOWS_RIGHT);
+ sbparams.follows.flags(FOLLOWS_LEFT | FOLLOWS_RIGHT | FOLLOWS_BOTTOM);
sbparams.change_callback(p.scroll_callback);
mScrollbar[HORIZONTAL] = LLUICtrlFactory::create<LLScrollbar> (sbparams);
LLView::addChild( mScrollbar[HORIZONTAL] );
diff --git a/indra/llui/llscrollcontainer.h b/indra/llui/llscrollcontainer.h
index c14099dbd5..dacea2a987 100644
--- a/indra/llui/llscrollcontainer.h
+++ b/indra/llui/llscrollcontainer.h
@@ -98,8 +98,10 @@ public:
void pageDown(S32 overlap = 0);
void goToTop();
void goToBottom();
- bool isAtTop() { return mScrollbar[VERTICAL]->isAtBeginning(); }
- bool isAtBottom() { return mScrollbar[VERTICAL]->isAtEnd(); }
+ bool isAtTop() const { return mScrollbar[VERTICAL]->isAtBeginning(); }
+ bool isAtBottom() const { return mScrollbar[VERTICAL]->isAtEnd(); }
+ S32 getDocPosVertical() const { return mScrollbar[VERTICAL]->getDocPos(); }
+ S32 getDocPosHorizontal() const { return mScrollbar[HORIZONTAL]->getDocPos(); }
S32 getBorderWidth() const;
// LLView functionality
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index 8c841540a5..76b9e448a1 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -605,6 +605,7 @@ BOOL LLTabContainer::handleMouseDown( S32 x, S32 y, MASK mask )
LLButton* tab_button = getTab(index)->mButton;
gFocusMgr.setMouseCapture(this);
tab_button->setFocus(TRUE);
+ mMouseDownTimer.start();
}
}
if (handled) {
@@ -653,7 +654,11 @@ BOOL LLTabContainer::handleHover( S32 x, S32 y, MASK mask )
handled = LLPanel::handleHover(x, y, mask);
}
- commitHoveredButton(x, y);
+ F32 drag_delay = 0.25f; // filter out clicks from dragging
+ if (mMouseDownTimer.getElapsedTimeF32() > drag_delay)
+ {
+ commitHoveredButton(x, y);
+ }
return handled;
}
@@ -699,6 +704,7 @@ BOOL LLTabContainer::handleMouseUp( S32 x, S32 y, MASK mask )
}
commitHoveredButton(x, y);
+ mMouseDownTimer.stop();
LLPanel* cur_panel = getCurrentPanel();
if (hasMouseCapture())
{
@@ -1002,7 +1008,7 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
}
else
{
- //Scip tab button space if they are invisible(EXT - 576)
+ // Skip tab button space if tabs are invisible (EXT-576)
tab_panel_top = getRect().getHeight();
tab_panel_bottom = LLPANEL_BORDER_WIDTH;
}
@@ -1017,9 +1023,9 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
}
else
{
- tab_panel_rect = LLRect(LLPANEL_BORDER_WIDTH,
+ tab_panel_rect = LLRect(LLPANEL_BORDER_WIDTH * 3,
tab_panel_top,
- getRect().getWidth()-LLPANEL_BORDER_WIDTH,
+ getRect().getWidth() - LLPANEL_BORDER_WIDTH * 2,
tab_panel_bottom );
}
child->setFollowsAll();
@@ -1106,7 +1112,7 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
p.follows.flags = p.follows.flags() | FOLLOWS_TOP;
}
else
- {
+ {
p.name("htab_"+std::string(child->getName()));
p.visible(false);
p.image_unselected(tab_img);
diff --git a/indra/llui/lltabcontainer.h b/indra/llui/lltabcontainer.h
index 8f8cedb1b9..aa4a08c4ff 100644
--- a/indra/llui/lltabcontainer.h
+++ b/indra/llui/lltabcontainer.h
@@ -320,6 +320,7 @@ private:
LLUIColor mTabsFlashingColor;
S32 mTabIconCtrlPad;
bool mUseTabEllipses;
+ LLFrameTimer mMouseDownTimer;
};
#endif // LL_TABCONTAINER_H
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 82a3c01c6d..8732a7ce45 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -361,7 +361,7 @@ void LLTextBase::onValueChange(S32 start, S32 end)
{
}
-std::vector<LLRect> LLTextBase::getSelctionRects()
+std::vector<LLRect> LLTextBase::getSelectionRects()
{
// Nor supposed to be called without selection
llassert(hasSelection());
@@ -458,7 +458,7 @@ void LLTextBase::drawSelectionBackground()
// Draw selection even if we don't have keyboard focus for search/replace
if (hasSelection() && !mLineInfoList.empty())
{
- std::vector<LLRect> selection_rects = getSelctionRects();
+ std::vector<LLRect> selection_rects = getSelectionRects();
// Draw the selection box (we're using a box instead of reversing the colors on the selected text).
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
@@ -1356,9 +1356,9 @@ void LLTextBase::draw()
drawCursor();
}
- mDocumentView->setVisible(FALSE);
+ mDocumentView->setVisibleDirect(FALSE);
LLUICtrl::draw();
- mDocumentView->setVisible(TRUE);
+ mDocumentView->setVisibleDirect(TRUE);
}
@@ -3464,7 +3464,7 @@ bool LLNormalTextSegment::getDimensionsF32(S32 first_char, S32 num_chars, F32& w
height = mFontHeight;
const LLWString &text = getWText();
// if last character is a newline, then return true, forcing line break
- width = mStyle->getFont()->getWidthF32(text.c_str(), mStart + first_char, num_chars);
+ width = mStyle->getFont()->getWidthF32(text.c_str(), mStart + first_char, num_chars, true);
}
return false;
}
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index e3cf56a5ee..3611ab0499 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -638,7 +638,7 @@ protected:
return mLabel.getString() + getToolTip();
}
- std::vector<LLRect> getSelctionRects();
+ std::vector<LLRect> getSelectionRects();
protected:
// text segmentation and flow
diff --git a/indra/llui/lltextbox.cpp b/indra/llui/lltextbox.cpp
index c567451973..521dabf9d4 100644
--- a/indra/llui/lltextbox.cpp
+++ b/indra/llui/lltextbox.cpp
@@ -171,7 +171,8 @@ void LLTextBox::reshapeToFitText(BOOL called_from_parent)
S32 width = getTextPixelWidth();
S32 height = getTextPixelHeight();
- reshape( width + 2 * mHPad, height + 2 * mVPad, called_from_parent );
+ //consider investigating reflow() to find missing width pixel (see SL-17045 changes)
+ reshape( width + 2 * mHPad + 1, height + 2 * mVPad, called_from_parent );
}
diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp
index 2f56a8b1d0..a6552d4ff1 100644
--- a/indra/llui/lltooltip.cpp
+++ b/indra/llui/lltooltip.cpp
@@ -163,6 +163,7 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)
: LLPanel(p),
mHasClickCallback(p.click_callback.isProvided()),
mPadding(p.padding),
+ mMaxWidth(p.max_width),
mTextBox(NULL),
mInfoButton(NULL),
mPlayMediaButton(NULL),
@@ -272,7 +273,7 @@ void LLToolTip::initFromParams(const LLToolTip::Params& p)
// do this *after* we've had our size set in LLPanel::initFromParams();
const S32 REALLY_LARGE_HEIGHT = 10000;
- mTextBox->reshape(p.max_width, REALLY_LARGE_HEIGHT);
+ mTextBox->reshape(mMaxWidth, REALLY_LARGE_HEIGHT);
if (p.styled_message.isProvided())
{
@@ -288,16 +289,19 @@ void LLToolTip::initFromParams(const LLToolTip::Params& p)
mTextBox->setText(p.message());
}
- S32 text_width = llmin(p.max_width(), mTextBox->getTextPixelWidth() + 1);
+ updateTextBox();
+ snapToChildren();
+}
+
+void LLToolTip::updateTextBox()
+{
+ S32 text_width = llmin(mMaxWidth, mTextBox->getTextPixelWidth() + 1);
S32 text_height = mTextBox->getTextPixelHeight();
mTextBox->reshape(text_width, text_height);
- if (mInfoButton)
- {
- LLRect text_rect = mTextBox->getRect();
- LLRect icon_rect = mInfoButton->getRect();
- mTextBox->translate(0, icon_rect.getCenterY() - text_rect.getCenterY());
- }
-
+}
+
+void LLToolTip::snapToChildren()
+{
// reshape tooltip panel to fit text box
LLRect tooltip_rect = calcBoundingRect();
tooltip_rect.mTop += mPadding;
@@ -305,7 +309,14 @@ void LLToolTip::initFromParams(const LLToolTip::Params& p)
tooltip_rect.mBottom = 0;
tooltip_rect.mLeft = 0;
- mTextBox->reshape(mTextBox->getRect().getWidth(), llmax(mTextBox->getRect().getHeight(), tooltip_rect.getHeight() - 2 * mPadding));
+ if (mInfoButton)
+ {
+ mTextBox->reshape(mTextBox->getRect().getWidth(), llmax(mTextBox->getRect().getHeight(), tooltip_rect.getHeight() - 2 * mPadding));
+
+ LLRect text_rect = mTextBox->getRect();
+ LLRect icon_rect = mInfoButton->getRect();
+ mInfoButton->translate(0, text_rect.getCenterY() - icon_rect.getCenterY());
+ }
setShape(tooltip_rect);
}
@@ -428,7 +439,10 @@ void LLToolTipMgr::createToolTip(const LLToolTip::Params& params)
}
tooltip_params.rect = LLRect (0, 1, 1, 0);
- mToolTip = LLUICtrlFactory::create<LLToolTip> (tooltip_params);
+ if (tooltip_params.create_callback.isProvided())
+ mToolTip = tooltip_params.create_callback()(tooltip_params);
+ else
+ mToolTip = LLUICtrlFactory::create<LLToolTip> (tooltip_params);
gToolTipView->addChild(mToolTip);
diff --git a/indra/llui/lltooltip.h b/indra/llui/lltooltip.h
index 0b1fbe5367..86943625ff 100644
--- a/indra/llui/lltooltip.h
+++ b/indra/llui/lltooltip.h
@@ -68,6 +68,7 @@ public:
struct Params : public LLInitParam::Block<Params, LLPanel::Params>
{
typedef boost::function<void(void)> click_callback_t;
+ typedef boost::function<LLToolTip*(LLToolTip::Params)> create_callback_t;
Optional<std::string> message;
Multiple<StyledText> styled_message;
@@ -84,6 +85,8 @@ public:
Optional<bool> time_based_media,
web_based_media,
media_playing;
+ Optional<create_callback_t> create_callback;
+ Optional<LLSD> create_params;
Optional<click_callback_t> click_callback,
click_playmedia_callback,
click_homepage_callback;
@@ -103,11 +106,15 @@ public:
bool hasClickCallback();
LLToolTip(const Params& p);
- void initFromParams(const LLToolTip::Params& params);
+ virtual void initFromParams(const LLToolTip::Params& params);
void getToolTipMessage(std::string & message);
-private:
+protected:
+ void updateTextBox();
+ void snapToChildren();
+
+protected:
class LLTextBox* mTextBox;
class LLButton* mInfoButton;
class LLButton* mPlayMediaButton;
@@ -117,6 +124,7 @@ private:
LLFrameTimer mVisibleTimer;
bool mHasClickCallback;
S32 mPadding; // pixels
+ S32 mMaxWidth;
};
// used for the inspector tooltips which need different background images etc.
diff --git a/indra/llui/lluicolortable.cpp b/indra/llui/lluicolortable.cpp
index 244f0c6f00..096336045c 100644
--- a/indra/llui/lluicolortable.cpp
+++ b/indra/llui/lluicolortable.cpp
@@ -200,7 +200,6 @@ LLUIColor LLUIColorTable::getColor(const std::string& name, const LLColor4& defa
void LLUIColorTable::setColor(const std::string& name, const LLColor4& color)
{
setColor(name, color, mUserSetColors);
- setColor(name, color, mLoadedColors);
}
bool LLUIColorTable::loadFromSettings()
@@ -229,6 +228,11 @@ void LLUIColorTable::saveUserSettings() const
it != mUserSetColors.end();
++it)
{
+ // Compare user color value with the default value, skip if equal
+ string_color_map_t::const_iterator itd = mLoadedColors.find(it->first);
+ if(itd != mLoadedColors.end() && itd->second == it->second)
+ continue;
+
ColorEntryParams color_entry;
color_entry.name = it->first;
color_entry.color.value = it->second;
diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp
index 2196ba201b..21afcae7c3 100644
--- a/indra/llui/lluictrl.cpp
+++ b/indra/llui/lluictrl.cpp
@@ -531,6 +531,15 @@ void LLUICtrl::setControlVariable(LLControlVariable* control)
}
}
+void LLUICtrl::removeControlVariable()
+{
+ if (mControlVariable)
+ {
+ mControlConnection.disconnect();
+ mControlVariable = NULL;
+ }
+}
+
//virtual
void LLUICtrl::setControlName(const std::string& control_name, LLView *context)
{
diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h
index 67dd24341c..be1c7dd0b6 100644
--- a/indra/llui/lluictrl.h
+++ b/indra/llui/lluictrl.h
@@ -175,6 +175,7 @@ public:
bool setControlValue(const LLSD& value);
void setControlVariable(LLControlVariable* control);
virtual void setControlName(const std::string& control, LLView *context = NULL);
+ void removeControlVariable();
LLControlVariable* getControlVariable() { return mControlVariable; }
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index 9ba71913d0..da7868d804 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -311,7 +311,13 @@ bool LLView::addChild(LLView* child, S32 tab_group)
}
child->mParentView = this;
- updateBoundingRect();
+ if (getVisible() && child->getVisible())
+ {
+ // if child isn't visible it won't affect bounding rect
+ // if current view is not visible it will be recalculated
+ // on visibility change
+ updateBoundingRect();
+ }
mLastTabGroup = tab_group;
return true;
}
@@ -576,9 +582,12 @@ void LLView::deleteAllChildren()
while (!mChildList.empty())
{
- LLView* viewp = mChildList.front();
- delete viewp; // will remove the child from mChildList
+ LLView* viewp = mChildList.front();
+ viewp->mParentView = NULL;
+ delete viewp;
+ mChildList.pop_front();
}
+ updateBoundingRect();
}
void LLView::setAllChildrenEnabled(BOOL b)
@@ -877,6 +886,17 @@ LLView* LLView::childFromPoint(S32 x, S32 y, bool recur)
return 0;
}
+F32 LLView::getTooltipTimeout()
+{
+ static LLCachedControl<F32> tooltip_fast_delay(*LLUI::getInstance()->mSettingGroups["config"], "ToolTipFastDelay", 0.1f);
+ static LLCachedControl<F32> tooltip_delay(*LLUI::getInstance()->mSettingGroups["config"], "ToolTipDelay", 0.7f);
+ // allow "scrubbing" over ui by showing next tooltip immediately
+ // if previous one was still visible
+ return (F32)(LLToolTipMgr::instance().toolTipVisible()
+ ? tooltip_fast_delay
+ : tooltip_delay);
+}
+
BOOL LLView::handleToolTip(S32 x, S32 y, MASK mask)
{
BOOL handled = FALSE;
@@ -886,14 +906,7 @@ BOOL LLView::handleToolTip(S32 x, S32 y, MASK mask)
std::string tooltip = getToolTip();
if (!tooltip.empty())
{
- static LLCachedControl<F32> tooltip_fast_delay(*LLUI::getInstance()->mSettingGroups["config"], "ToolTipFastDelay", 0.1f);
- static LLCachedControl<F32> tooltip_delay(*LLUI::getInstance()->mSettingGroups["config"], "ToolTipDelay", 0.7f);
static LLCachedControl<bool> allow_ui_tooltips(*LLUI::getInstance()->mSettingGroups["config"], "BasicUITooltips", true);
- // allow "scrubbing" over ui by showing next tooltip immediately
- // if previous one was still visible
- F32 timeout = LLToolTipMgr::instance().toolTipVisible()
- ? tooltip_fast_delay
- : tooltip_delay;
// Even if we don't show tooltips, consume the event, nothing below should show tooltip
if (allow_ui_tooltips)
@@ -901,7 +914,7 @@ BOOL LLView::handleToolTip(S32 x, S32 y, MASK mask)
LLToolTipMgr::instance().show(LLToolTip::Params()
.message(tooltip)
.sticky_rect(calcScreenRect())
- .delay_time(timeout));
+ .delay_time(getTooltipTimeout()));
}
handled = TRUE;
}
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index bec45df78a..7360fd0fb9 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -243,6 +243,7 @@ public:
ECursorType getHoverCursor() { return mHoverCursor; }
+ static F32 getTooltipTimeout();
virtual const std::string getToolTip() const { return mToolTipMsg.getString(); }
void sendChildToFront(LLView* child);
@@ -287,6 +288,7 @@ public:
void setAllChildrenEnabled(BOOL b);
virtual void setVisible(BOOL visible);
+ void setVisibleDirect(BOOL visible) { mVisible = visible; }
const BOOL& getVisible() const { return mVisible; }
virtual void setEnabled(BOOL enabled);
BOOL getEnabled() const { return mEnabled; }
diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h
index b1408d894f..f435d46584 100644
--- a/indra/llwindow/llwindow.h
+++ b/indra/llwindow/llwindow.h
@@ -118,7 +118,8 @@ public:
// Sets cursor, may set to arrow+hourglass
virtual void setCursor(ECursorType cursor) { mNextCursor = cursor; };
- virtual ECursorType getCursor() const;
+ virtual ECursorType getCursor() const;
+ virtual ECursorType getNextCursor() const { return mNextCursor; };
virtual void updateCursor() = 0;
virtual void captureMouse() = 0;
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index 1f91cbbaa8..42ec4ee29d 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -352,6 +352,11 @@ struct LLWindowWin32::LLWindowWin32Thread : public LL::ThreadPool
void run() override;
+ void glReady()
+ {
+ mGLReady = true;
+ }
+
// initialzie DXGI adapter (for querying available VRAM)
void initDX();
@@ -410,6 +415,9 @@ struct LLWindowWin32::LLWindowWin32Thread : public LL::ThreadPool
HWND mWindowHandle = NULL;
HDC mhDC = 0;
+ // *HACK: Attempt to prevent startup crashes by deferring memory accounting
+ // until after some graphics setup. See SL-20177. -Cosmic,2023-09-18
+ bool mGLReady = false;
// best guess at available video memory in MB
std::atomic<U32> mAvailableVRAM;
@@ -1720,6 +1728,13 @@ const S32 max_format = (S32)num_formats - 1;
// ok to post quit messages now
mPostQuit = TRUE;
+ // *HACK: Attempt to prevent startup crashes by deferring memory accounting
+ // until after some graphics setup. See SL-20177. -Cosmic,2023-09-18
+ mWindowThread->post([=]()
+ {
+ mWindowThread->glReady();
+ });
+
if (auto_show)
{
show();
@@ -4692,6 +4707,8 @@ void debugEnumerateGraphicsAdapters()
void LLWindowWin32::LLWindowWin32Thread::initDX()
{
+ if (!mGLReady) { return; }
+
if (mDXGIAdapter == NULL)
{
debugEnumerateGraphicsAdapters();
@@ -4726,6 +4743,8 @@ void LLWindowWin32::LLWindowWin32Thread::initDX()
void LLWindowWin32::LLWindowWin32Thread::initD3D()
{
+ if (!mGLReady) { return; }
+
if (mDXGIAdapter == NULL && mD3DDevice == NULL && mWindowHandle != 0)
{
mD3D = Direct3DCreate9(D3D_SDK_VERSION);
@@ -4752,6 +4771,8 @@ void LLWindowWin32::LLWindowWin32Thread::initD3D()
void LLWindowWin32::LLWindowWin32Thread::updateVRAMUsage()
{
LL_PROFILE_ZONE_SCOPED;
+ if (!mGLReady) { return; }
+
if (mDXGIAdapter != nullptr)
{
// NOTE: what lies below is hand wavy math based on compatibility testing and observation against a variety of hardware
@@ -4825,8 +4846,6 @@ void LLWindowWin32::LLWindowWin32Thread::run()
sWindowThreadId = std::this_thread::get_id();
LogChange logger("Window");
- initDX();
-
//as good a place as any to up the MM timer resolution (see ms_sleep)
//attempt to set timer resolution to 1ms
TIMECAPS tc;
@@ -4839,9 +4858,12 @@ void LLWindowWin32::LLWindowWin32Thread::run()
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_WIN32;
+ // lazily call initD3D inside this loop to catch when mGLReady has been set to true
+ initDX();
+
if (mWindowHandle != 0)
{
- // lazily call initD3D inside this loop to catch when mWindowHandle has been set
+ // lazily call initD3D inside this loop to catch when mWindowHandle has been set, and mGLReady has been set to true
// *TODO: Shutdown if this fails when mWindowHandle exists
initD3D();
diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp
index ead8634df4..2960ecf829 100644
--- a/indra/llxml/llcontrol.cpp
+++ b/indra/llxml/llcontrol.cpp
@@ -774,7 +774,6 @@ U32 LLControlGroup::loadFromFileLegacy(const std::string& filename, BOOL require
return 0;
}
- U32 item = 0;
U32 validitems = 0;
S32 version;
@@ -808,8 +807,6 @@ U32 LLControlGroup::loadFromFileLegacy(const std::string& filename, BOOL require
}
// Got an item. Load it up.
- item++;
-
// If not declared, assume it's a string
if (!declared)
{
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index c6d82ea260..8eef7cd9d4 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -195,6 +195,7 @@ set(viewer_SOURCE_FILES
llfloaterbuyland.cpp
llfloatercamera.cpp
llfloatercamerapresets.cpp
+ llfloaterchangeitemthumbnail.cpp
llfloaterchatvoicevolume.cpp
llfloaterclassified.cpp
llfloatercolorpicker.cpp
@@ -231,6 +232,7 @@ set(viewer_SOURCE_FILES
llfloaterimsession.cpp
llfloaterimcontainer.cpp
llfloaterinspect.cpp
+ llfloaterinventorysettings.cpp
llfloaterjoystick.cpp
llfloaterlagmeter.cpp
llfloaterland.cpp
@@ -246,12 +248,12 @@ set(viewer_SOURCE_FILES
llfloatermyscripts.cpp
llfloatermyenvironment.cpp
llfloaternamedesc.cpp
+ llfloaternewfeaturenotification.cpp
llfloaternotificationsconsole.cpp
llfloaternotificationstabbed.cpp
- llfloateroutfitphotopreview.cpp
llfloaterobjectweights.cpp
llfloateropenobject.cpp
- llfloatersimpleoutfitsnapshot.cpp
+ llfloatersimplesnapshot.cpp
llfloaterpathfindingcharacters.cpp
llfloaterpathfindingconsole.cpp
llfloaterpathfindinglinksets.cpp
@@ -266,7 +268,6 @@ set(viewer_SOURCE_FILES
llfloaterpreferenceviewadvanced.cpp
llfloaterpreviewtrash.cpp
llfloaterprofiletexture.cpp
- llfloaterproperties.cpp
llfloaterregiondebugconsole.cpp
llfloaterregioninfo.cpp
llfloaterreporter.cpp
@@ -338,10 +339,13 @@ set(viewer_SOURCE_FILES
llinspectgroup.cpp
llinspectobject.cpp
llinspectremoteobject.cpp
+ llinspecttexture.cpp
llinspecttoast.cpp
llinventorybridge.cpp
llinventoryfilter.cpp
llinventoryfunctions.cpp
+ llinventorygallery.cpp
+ llinventorygallerymenu.cpp
llinventoryicon.cpp
llinventoryitemslist.cpp
llinventorylistitem.cpp
@@ -571,6 +575,7 @@ set(viewer_SOURCE_FILES
lltextureinfodetails.cpp
lltexturestats.cpp
lltextureview.cpp
+ llthumbnailctrl.cpp
lltinygltfhelper.cpp
lltoast.cpp
lltoastalertpanel.cpp
@@ -840,6 +845,7 @@ set(viewer_HEADER_FILES
llfloaterbuycurrencyhtml.h
llfloaterbuyland.h
llfloatercamerapresets.h
+ llfloaterchangeitemthumbnail.h
llfloatercamera.h
llfloaterchatvoicevolume.h
llfloaterclassified.h
@@ -880,6 +886,7 @@ set(viewer_HEADER_FILES
llfloaterimsession.h
llfloaterimcontainer.h
llfloaterinspect.h
+ llfloaterinventorysettings.h
llfloaterjoystick.h
llfloaterlagmeter.h
llfloaterland.h
@@ -895,12 +902,12 @@ set(viewer_HEADER_FILES
llfloatermyscripts.h
llfloatermyenvironment.h
llfloaternamedesc.h
+ llfloaternewfeaturenotification.h
llfloaternotificationsconsole.h
llfloaternotificationstabbed.h
- llfloateroutfitphotopreview.h
llfloaterobjectweights.h
llfloateropenobject.h
- llfloatersimpleoutfitsnapshot.h
+ llfloatersimplesnapshot.h
llfloaterpathfindingcharacters.h
llfloaterpathfindingconsole.h
llfloaterpathfindinglinksets.h
@@ -915,7 +922,6 @@ set(viewer_HEADER_FILES
llfloaterpreferenceviewadvanced.h
llfloaterpreviewtrash.h
llfloaterprofiletexture.h
- llfloaterproperties.h
llfloaterregiondebugconsole.h
llfloaterregioninfo.h
llfloaterreporter.h
@@ -985,10 +991,13 @@ set(viewer_HEADER_FILES
llinspectgroup.h
llinspectobject.h
llinspectremoteobject.h
+ llinspecttexture.h
llinspecttoast.h
llinventorybridge.h
llinventoryfilter.h
llinventoryfunctions.h
+ llinventorygallery.h
+ llinventorygallerymenu.h
llinventoryicon.h
llinventoryitemslist.h
llinventorylistitem.h
@@ -1209,6 +1218,7 @@ set(viewer_HEADER_FILES
lltextureinfodetails.h
lltexturestats.h
lltextureview.h
+ llthumbnailctrl.h
lltinygltfhelper.h
lltoast.h
lltoastalertpanel.h
diff --git a/indra/newview/app_settings/cmd_line.xml b/indra/newview/app_settings/cmd_line.xml
index e16a5c7e76..340334aee8 100644
--- a/indra/newview/app_settings/cmd_line.xml
+++ b/indra/newview/app_settings/cmd_line.xml
@@ -209,6 +209,12 @@
<string>NoAudio</string>
</map>
+ <key>nofmod</key>
+ <map>
+ <key>map-to</key>
+ <string>UseMediaPluginsForStreamingAudio</string>
+ </map>
+
<key>noninteractive</key>
<map>
<key>desc</key>
diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini
index 9699eda96b..4e177ab518 100644
--- a/indra/newview/app_settings/keywords.ini
+++ b/indra/newview/app_settings/keywords.ini
@@ -274,6 +274,7 @@ INVENTORY_NOTECARD Passed to task inventory library functions to reference notec
INVENTORY_BODYPART Passed to task inventory library functions to reference body parts
INVENTORY_ANIMATION Passed to task inventory library functions to reference animations
INVENTORY_GESTURE Passed to task inventory library functions to reference gestures
+INVENTORY_MATERIAL Passed to task inventory library functions to reference materials
INVENTORY_ALL Passed to task inventory library functions to reference all inventory items
INVENTORY_NONE Returned by llGetInventoryType when no item is found
diff --git a/indra/newview/app_settings/keywords_lsl_default.xml b/indra/newview/app_settings/keywords_lsl_default.xml
index d641883d5a..893b017367 100644
--- a/indra/newview/app_settings/keywords_lsl_default.xml
+++ b/indra/newview/app_settings/keywords_lsl_default.xml
@@ -1963,6 +1963,15 @@
<key>tooltip</key>
<string/>
</map>
+ <key>INVENTORY_MATERIAL</key>
+ <map>
+ <key>type</key>
+ <string>integer</string>
+ <key>value</key>
+ <integer>57</integer>
+ <key>tooltip</key>
+ <string/>
+ </map>
<key>JSON_APPEND</key>
<map>
<key>type</key>
diff --git a/indra/newview/app_settings/logcontrol.xml b/indra/newview/app_settings/logcontrol.xml
index 2a26cb9a43..482012cdd6 100644
--- a/indra/newview/app_settings/logcontrol.xml
+++ b/indra/newview/app_settings/logcontrol.xml
@@ -73,7 +73,6 @@
<string>Avatar</string>
<string>Voice</string>
-->
- <string>Capabilities</string>
</array>
</map>
</array>
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 85dfe688a7..9a1da5311c 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -250,7 +250,7 @@
<key>TextureLivePreview</key>
<map>
<key>Comment</key>
- <string>Preview selections in texture picker immediately</string>
+ <string>Preview selections in texture picker or material picker immediately</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -5013,17 +5013,6 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>InventoryInboxToggleState</key>
- <map>
- <key>Comment</key>
- <string>Stores the open/closed state of inventory Received items panel</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>InventoryLinking</key>
<map>
<key>Comment</key>
@@ -5519,6 +5508,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>LastUIFeatureVersion</key>
+ <map>
+ <key>Comment</key>
+ <string>UI Feature Version number for tracking feature notification between viewer builds</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>LLSD</string>
+ <key>Value</key>
+ <string></string>
+ </map>
<key>LastFindPanel</key>
<map>
<key>Comment</key>
@@ -7088,6 +7088,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>UseMediaPluginsForStreamingAudio</key>
+ <map>
+ <key>Comment</key>
+ <string>Use media plugins (VLC) for streaming audio.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>NoHardwareProbe</key>
<map>
<key>Comment</key>
@@ -9035,16 +9046,16 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>RenderLocalLights</key>
+ <key>RenderLocalLightCount</key>
<map>
<key>Comment</key>
- <string>Whether or not to render local lights.</string>
+ <string>Number of local lights to render.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>Boolean</string>
+ <string>S32</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>256</integer>
</map>
<key>RenderShadowSplitExponent</key>
<map>
@@ -9340,6 +9351,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>RenderPostProcessingHDR</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable HDR for post processing buffer</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>RenderMaxOpenGLVersion</key>
<map>
<key>Comment</key>
@@ -9626,7 +9648,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>-0.001</real>
+ <real>-0.0002</real>
</map>
<key>RenderSpotShadowOffset</key>
<map>
@@ -10155,6 +10177,17 @@
<key>Value</key>
<integer>9</integer>
</map>
+ <key>RenderGlowHDR</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable HDR for glow map</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>RenderGlowStrength</key>
<map>
<key>Comment</key>
@@ -10203,6 +10236,17 @@
<key>Value</key>
<real>1.3</real>
</map>
+ <key>RenderGlowNoise</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables glow noise (dithering). Reduces banding from glow in certain cases.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
<key>DisableAllRenderTypes</key>
<map>
<key>Comment</key>
@@ -10610,7 +10654,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>0.5</real>
+ <real>1.0</real>
</map>
<key>RenderSkyAutoAdjustHDRScale</key>
<map>
@@ -10623,6 +10667,73 @@
<key>Value</key>
<real>2.0</real>
</map>
+ <key>RendeSkyAutoAdjustBlueHorizonScale</key>
+ <map>
+ <key>Comment</key>
+ <string>Blue Horizon Scale value to use when auto-adjusting legacy skies</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1.0</real>
+ </map>
+ <key>RendeSkyAutoAdjustBlueDensityScale</key>
+ <map>
+ <key>Comment</key>
+ <string>Blue Horizon Scale value to use when auto-adjusting legacy skies</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1.0</real>
+ </map>
+ <key>RenderSkyAutoAdjustSunColorScale</key>
+ <map>
+ <key>Comment</key>
+ <string>Sun color scalar when auto-adjusting legacy skies</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1.0</real>
+ </map>
+ <key>RenderSkyAutoAdjustProbeAmbiance</key>
+ <map>
+ <key>Comment</key>
+ <string>Probe ambiance value when auto-adjusting legacy skies</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.001</real>
+ </map>
+ <key>RenderSkySunlightScale</key>
+ <map>
+ <key>Comment</key>
+ <string>Sunlight scale fudge factor for matching with pre-PBR viewer</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1.0</real>
+ </map>
+ <key>RenderSkyAmbientScale</key>
+ <map>
+ <key>Comment</key>
+ <string>Ambient scale fudge factor for matching with pre-PBR viewer</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.7</real>
+ </map>
+
<key>RenderReflectionProbeMaxLocalLightAmbiance</key>
<map>
<key>Comment</key>
@@ -11531,6 +11642,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>SelectReflectionProbes</key>
+ <map>
+ <key>Comment</key>
+ <string>Select reflection probes</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>SelectOwnedOnly</key>
<map>
<key>Comment</key>
@@ -11666,11 +11788,11 @@
<key>ShowBanLines</key>
<map>
<key>Comment</key>
- <string>Show in-world ban/access borders</string>
+ <string>Show in-world ban/access borders, 0 - do not show, 1 - show on collision, 2 - show on proximity</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>Boolean</string>
+ <string>S32</string>
<key>Value</key>
<integer>1</integer>
</map>
@@ -12866,39 +12988,6 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>AmbientDisable</key>
- <map>
- <key>Comment</key>
- <string>If TRUE, ambient light has no effect</string>
- <key>Persist</key>
- <integer>0</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>SunlightDisable</key>
- <map>
- <key>Comment</key>
- <string>If TRUE, sunlight has no effect</string>
- <key>Persist</key>
- <integer>0</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>LocalLightDisable</key>
- <map>
- <key>Comment</key>
- <string>If TRUE, local lights have no effect</string>
- <key>Persist</key>
- <integer>0</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>TextureDiscardLevel</key>
<map>
<key>Comment</key>
@@ -13171,13 +13260,13 @@
<key>TranslationService</key>
<map>
<key>Comment</key>
- <string>Translation API to use. (google|bing)</string>
+ <string>Translation API to use. (google|azure)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>bing</string>
+ <string>azure</string>
</map>
<key>GoogleTranslateAPIKey</key>
<map>
@@ -13193,7 +13282,7 @@
<key>BingTranslateAPIKey</key>
<map>
<key>Comment</key>
- <string>Bing AppID to use with the Microsoft Translator API</string>
+ <string>(Deprecated) Bing AppID to use with the Microsoft Translator API</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -13201,6 +13290,28 @@
<key>Value</key>
<string></string>
</map>
+ <key>AzureTranslateAPIKey</key>
+ <map>
+ <key>Comment</key>
+ <string>Azure Translation service data to use with the MS Azure Translator API</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>LLSD</string>
+ <key>Value</key>
+ <string></string>
+ </map>
+ <key>DeepLTranslateAPIKey</key>
+ <map>
+ <key>Comment</key>
+ <string>DeepL Translation service data to use with the DeepL Translator API</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>LLSD</string>
+ <key>Value</key>
+ <string></string>
+ </map>
<key>TutorialURL</key>
<map>
<key>Comment</key>
@@ -15536,6 +15647,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>BatchSizeAIS3</key>
+ <map>
+ <key>Comment</key>
+ <string>Amount of folder ais packs into category subset request</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>20</integer>
+ </map>
<key>PoolSizeAIS</key>
<map>
<key>Comment</key>
@@ -15543,7 +15665,7 @@
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>20</integer>
</map>
<key>PoolSizeUpload</key>
<map>
@@ -17250,17 +17372,6 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>360CaptureUseInterestListCap</key>
- <map>
- <key>Comment</key>
- <string>Flag if set, uses the new InterestList cap to ask the simulator for full content</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
<key>360CaptureJPEGEncodeQuality</key>
<map>
<key>Comment</key>
@@ -17382,5 +17493,71 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>FindOriginalOpenWindow</key>
+ <map>
+ <key>Comment</key>
+ <string>Sets the action for 'Find original' and 'Show in Inventory' (0 - shows item in main Inventory, 1 - opens a new single-folder window)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>StatsReportMaxDuration</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum seconds for viewer stats file data, prevents huge file</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>300</real>
+ </map>
+ <key>StatsReportFileInterval</key>
+ <map>
+ <key>Comment</key>
+ <string>Interval to save viewer stats file data</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.2</real>
+ </map>
+ <key>StatsReportSkipZeroDataSaves</key>
+ <map>
+ <key>Comment</key>
+ <string>In viewer stats data file, skip saving entry if there is no data</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+<key>MultiModeDoubleClickFolder</key>
+<map>
+ <key>Comment</key>
+ <string>Sets the action for Double-click on folder in multi-folder view (0 - expands and collapses folder, 1 - opens a new window, 2 – stays in current floater but switches to SFV)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>0</integer>
+</map>
+<key>SingleModeDoubleClickOpenWindow</key>
+<map>
+ <key>Comment</key>
+ <string>Sets the action for Double-click on folder in single-folder view (0 - stays in current window, 1 - opens a new window)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+</map>
</map>
</llsd>
diff --git a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl
index c8eaba6418..f9ebf33b4a 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl
@@ -382,8 +382,7 @@ vec3 pbrIbl(vec3 diffuseColor,
vec3 irradiance, // irradiance map sample
float ao, // ambient occlusion factor
float nv, // normal dot view vector
- float perceptualRough,
- out vec3 specContrib)
+ float perceptualRough)
{
// retrieve a scale and bias to F0. See [1], Figure 3
vec2 brdf = BRDF(clamp(nv, 0, 1), 1.0-perceptualRough);
@@ -393,23 +392,9 @@ vec3 pbrIbl(vec3 diffuseColor,
vec3 diffuse = diffuseLight * diffuseColor;
vec3 specular = specularLight * (specularColor * brdf.x + brdf.y);
- specContrib = specular * ao;
-
return (diffuse + specular) * ao;
}
-vec3 pbrIbl(vec3 diffuseColor,
- vec3 specularColor,
- vec3 radiance, // radiance map sample
- vec3 irradiance, // irradiance map sample
- float ao, // ambient occlusion factor
- float nv, // normal dot view vector
- float perceptualRough)
-{
- vec3 specContrib;
- return pbrIbl(diffuseColor, specularColor, radiance, irradiance, ao, nv, perceptualRough, specContrib);
-}
-
// Encapsulate the various inputs used by the various functions in the shading equation
// We store values in this struct to simplify the integration of alternative implementations
@@ -475,8 +460,7 @@ vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,
float metallic,
vec3 n, // normal
vec3 v, // surface point to camera
- vec3 l, //surface point to light
- out vec3 specContrib) //specular contribution (exposed to alpha shaders to calculate "glare")
+ vec3 l) //surface point to light
{
// make sure specular highlights from punctual lights don't fall off of polished surfaces
perceptualRoughness = max(perceptualRoughness, 8.0/255.0);
@@ -524,28 +508,13 @@ vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,
// Calculation of analytical lighting contribution
vec3 diffuseContrib = (1.0 - F) * diffuse(pbrInputs);
- specContrib = F * G * D / (4.0 * NdotL * NdotV);
+ vec3 specContrib = F * G * D / (4.0 * NdotL * NdotV);
// Obtain final intensity as reflectance (BRDF) scaled by the energy of the light (cosine law)
vec3 color = NdotL * (diffuseContrib + specContrib);
- specContrib *= NdotL;
- specContrib = max(specContrib, vec3(0));
-
return clamp(color, vec3(0), vec3(10));
}
-vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,
- float perceptualRoughness,
- float metallic,
- vec3 n, // normal
- vec3 v, // surface point to camera
- vec3 l) //surface point to light
-{
- vec3 specContrib;
-
- return pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, n, v, l, specContrib);
-}
-
void calcDiffuseSpecular(vec3 baseColor, float metallic, inout vec3 diffuseColor, inout vec3 specularColor)
{
vec3 f0 = vec3(0.04);
@@ -554,30 +523,21 @@ void calcDiffuseSpecular(vec3 baseColor, float metallic, inout vec3 diffuseColor
specularColor = mix(f0, baseColor, metallic);
}
-vec3 pbrBaseLight(vec3 diffuseColor, vec3 specularColor, float metallic, vec3 v, vec3 norm, float perceptualRoughness, vec3 light_dir, vec3 sunlit, float scol, vec3 radiance, vec3 irradiance, vec3 colorEmissive, float ao, vec3 additive, vec3 atten, out vec3 specContrib)
+vec3 pbrBaseLight(vec3 diffuseColor, vec3 specularColor, float metallic, vec3 v, vec3 norm, float perceptualRoughness, vec3 light_dir, vec3 sunlit, float scol, vec3 radiance, vec3 irradiance, vec3 colorEmissive, float ao, vec3 additive, vec3 atten)
{
vec3 color = vec3(0);
float NdotV = clamp(abs(dot(norm, v)), 0.001, 1.0);
- vec3 ibl_spec;
- color += pbrIbl(diffuseColor, specularColor, radiance, irradiance, ao, NdotV, perceptualRoughness, ibl_spec);
+ color += pbrIbl(diffuseColor, specularColor, radiance, irradiance, ao, NdotV, perceptualRoughness);
- color += pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, norm, v, normalize(light_dir), specContrib) * sunlit * 3.0 * scol; //magic number to balance with legacy materials
- specContrib *= sunlit * 2.75 * scol;
- specContrib += ibl_spec;
+ color += pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, norm, v, normalize(light_dir)) * sunlit * 3.0 * scol; //magic number to balance with legacy materials
color += colorEmissive;
return color;
}
-vec3 pbrBaseLight(vec3 diffuseColor, vec3 specularColor, float metallic, vec3 v, vec3 norm, float perceptualRoughness, vec3 light_dir, vec3 sunlit, float scol, vec3 radiance, vec3 irradiance, vec3 colorEmissive, float ao, vec3 additive, vec3 atten)
-{
- vec3 specContrib;
- return pbrBaseLight(diffuseColor, specularColor, metallic, v, norm, perceptualRoughness, light_dir, sunlit, scol, radiance, irradiance, colorEmissive, ao, additive, atten, specContrib);
-}
-
uniform vec4 waterPlane;
uniform float waterSign;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl
index b752307d13..5d58cc91cd 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl
@@ -40,8 +40,6 @@ vec4 applyWaterFogView(vec3 pos, vec4 color);
#endif
vec3 srgb_to_linear(vec3 cs);
-vec3 legacy_adjust_fullbright(vec3 c);
-vec3 legacy_adjust(vec3 c);
vec3 linear_to_srgb(vec3 cl);
vec3 atmosFragLighting(vec3 light, vec3 additive, vec3 atten);
void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten);
@@ -98,9 +96,7 @@ void main()
#endif
#ifndef IS_HUD
- color.rgb = legacy_adjust(color.rgb);
color.rgb = srgb_to_linear(color.rgb);
- color.rgb = legacy_adjust_fullbright(color.rgb);
color.rgb = atmosFragLighting(color.rgb, additive, atten);
#endif
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl
index 53e4f02314..64e6bc9da2 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl
@@ -105,7 +105,8 @@ vec3 toneMap(vec3 color)
color *= exposure * exp_scale;
- color = toneMapACES_Hill(color);
+ // mix ACES and Linear here as a compromise to avoid over-darkening legacy content
+ color = mix(toneMapACES_Hill(color), color, 0.333);
#endif
return color;
diff --git a/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl b/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl
index 7a5e14566b..b5437d43d2 100644
--- a/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl
+++ b/indra/newview/app_settings/shaders/class1/effects/glowExtractF.glsl
@@ -28,6 +28,10 @@
out vec4 frag_color;
uniform sampler2D diffuseMap;
+#if HAS_NOISE
+uniform sampler2D glowNoiseMap;
+uniform vec2 screen_res;
+#endif
uniform float minLuminance;
uniform float maxExtractAlpha;
uniform vec3 lumWeights;
@@ -44,7 +48,16 @@ void main()
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)) );
- frag_color.rgb = col.rgb;
+#if HAS_NOISE
+ float TRUE_NOISE_RES = 128; // See mTrueNoiseMap
+ // *NOTE: Usually this is vary_fragcoord not vary_texcoord0, but glow extraction is in screen space
+ vec3 glow_noise = texture(glowNoiseMap, vary_texcoord0.xy * (screen_res / TRUE_NOISE_RES)).xyz;
+ // Dithering. Reduces banding effects in the reduced precision glow buffer.
+ float NOISE_DEPTH = 64.0;
+ col.rgb += glow_noise / NOISE_DEPTH;
+ col.rgb = max(col.rgb, vec3(0));
+#endif
+ frag_color.rgb = col.rgb;
frag_color.a = max(col.a, mix(lum, warmth, warmthAmount) * maxExtractAlpha);
}
diff --git a/indra/newview/app_settings/shaders/class1/environment/srgbF.glsl b/indra/newview/app_settings/shaders/class1/environment/srgbF.glsl
index 31b02377da..e3fd10447e 100644
--- a/indra/newview/app_settings/shaders/class1/environment/srgbF.glsl
+++ b/indra/newview/app_settings/shaders/class1/environment/srgbF.glsl
@@ -113,31 +113,3 @@ vec3 inv_toneMapACES_Hill(vec3 color)
return color;
}
-// adjust legacy colors to back out tonemapping and exposure
-// NOTE: obsolete now that setting probe ambiance to zero removes tonemapping and exposure, but keeping for a minute
-// while that change goes through testing - davep 6/1/2023
-#define LEGACY_ADJUST 0
-
-vec3 legacy_adjust(vec3 c)
-{
-#if LEGACY_ADJUST
- vec3 desat = rgb2hsv(c.rgb);
- desat.g *= 1.0-(1.0-desat.b)*0.5;
- desat.b += (1.0-desat.b)*0.1f;
- desat.rgb = hsv2rgb(desat);
- return desat;
-#else
- return c;
-#endif
-}
-
-vec3 legacy_adjust_fullbright(vec3 c)
-{
-#if LEGACY_ADJUST
- float exp_scale = clamp(texture(exposureMap, vec2(0.5, 0.5)).r, 0.01, 10.0);
- return c / exp_scale * 1.34; //magic 1.34 arrived at by binary search for a value that reproduces midpoint grey consistenty
-#else
- return c;
-#endif
-}
-
diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
index 437fa0a6d5..a1da4b1f9a 100644
--- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
+++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl
@@ -39,12 +39,12 @@ uniform float max_y;
uniform vec3 glow;
uniform float scene_light_strength;
uniform float sun_moon_glow_factor;
-uniform float sky_hdr_scale;
+uniform float sky_sunlight_scale;
+uniform float sky_ambient_scale;
float getAmbientClamp() { return 1.0f; }
vec3 srgb_to_linear(vec3 col);
-vec3 legacy_adjust(vec3 col);
// return colors in sRGB space
void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive,
@@ -148,12 +148,9 @@ void calcAtmosphericVarsLinear(vec3 inPositionEye, vec3 norm, vec3 light_dir, ou
// multiply to get similar colors as when the "scaleSoftClip" implementation was doubling color values
// (allows for mixing of light sources other than sunlight e.g. reflection probes)
- sunlit *= 1.5;
- amblit *= 0.5;
+ sunlit *= sky_sunlight_scale;
+ amblit *= sky_ambient_scale;
- // override amblit with ambient_color if sky probe ambiance is not zero
- amblit = mix(amblit, ambient_color, clamp(sky_hdr_scale-1.0, 0.0, 1.0));
-
amblit = srgb_to_linear(amblit);
amblit *= ambientLighting(norm, light_dir);
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl
index da5f997429..b63f3b60f9 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl
@@ -71,7 +71,6 @@ vec4 applyWaterFogViewLinear(vec3 pos, vec4 color, vec3 sunlit);
vec3 srgb_to_linear(vec3 c);
vec3 linear_to_srgb(vec3 c);
-vec3 legacy_adjust(vec3 c);
vec2 encode_normal (vec3 n);
vec3 atmosFragLightingLinear(vec3 light, vec3 additive, vec3 atten);
@@ -85,7 +84,7 @@ float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen);
float getAmbientClamp();
void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv,
- vec2 tc, vec3 pos, vec3 norm, float glossiness, float envIntensity, bool transparent);
+ vec2 tc, vec3 pos, vec3 norm, float glossiness, float envIntensity, bool transparent, vec3 amblit_linear);
vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 diffuse, vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight, float ambiance)
{
@@ -234,7 +233,6 @@ void main()
}
diffuse_srgb.rgb *= vertex_color.rgb;
- diffuse_srgb.rgb = legacy_adjust(diffuse_srgb.rgb);
diffuse_linear.rgb = srgb_to_linear(diffuse_srgb.rgb);
#endif // USE_VERTEX_COLOR
@@ -251,7 +249,7 @@ void main()
vec3 irradiance;
vec3 glossenv;
vec3 legacyenv;
- sampleReflectionProbesLegacy(irradiance, glossenv, legacyenv, frag, pos.xyz, norm.xyz, 0.0, 0.0, true);
+ sampleReflectionProbesLegacy(irradiance, glossenv, legacyenv, frag, pos.xyz, norm.xyz, 0.0, 0.0, true, amblit_linear);
float da = dot(norm.xyz, light_dir.xyz);
@@ -266,7 +264,7 @@ void main()
vec3 sun_contrib = min(final_da, shadow) * sunlit_linear;
- color.rgb = max(amblit, irradiance);
+ color.rgb = irradiance;
color.rgb += sun_contrib;
@@ -291,9 +289,7 @@ void main()
LIGHT_LOOP(7)
// sum local light contrib in linear colorspace
-#if !defined(LOCAL_LIGHT_KILL)
color.rgb += light.rgb;
-#endif // !defined(LOCAL_LIGHT_KILL)
#endif // #else // FOR_IMPOSTOR
diff --git a/indra/newview/app_settings/shaders/class2/deferred/pbralphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/pbralphaF.glsl
index e8db856b1f..35d752be02 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/pbralphaF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/pbralphaF.glsl
@@ -92,7 +92,7 @@ void calcHalfVectors(vec3 lv, vec3 n, vec3 v, out vec3 h, out vec3 l, out float
float calcLegacyDistanceAttenuation(float distance, float falloff);
float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen);
void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv,
- vec2 tc, vec3 pos, vec3 norm, float glossiness, bool transparent);
+ vec2 tc, vec3 pos, vec3 norm, float glossiness, bool transparent, vec3 amblit_linear);
void waterClip(vec3 pos);
@@ -112,16 +112,14 @@ vec3 pbrBaseLight(vec3 diffuseColor,
vec3 colorEmissive,
float ao,
vec3 additive,
- vec3 atten,
- out vec3 specContrib);
+ vec3 atten);
vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,
float perceptualRoughness,
float metallic,
vec3 n, // normal
vec3 v, // surface point to camera
- vec3 l, //surface point to light
- out vec3 specContrib);
+ vec3 l); //surface point to light
vec3 calcPointLightOrSpotLight(vec3 diffuseColor, vec3 specularColor,
float perceptualRoughness,
@@ -132,7 +130,7 @@ vec3 calcPointLightOrSpotLight(vec3 diffuseColor, vec3 specularColor,
vec3 lp, // light position
vec3 ld, // light direction (for spotlights)
vec3 lightColor,
- float lightSize, float falloff, float is_pointlight, inout float glare, float ambiance)
+ float lightSize, float falloff, float is_pointlight, float ambiance)
{
vec3 color = vec3(0,0,0);
@@ -154,10 +152,7 @@ vec3 calcPointLightOrSpotLight(vec3 diffuseColor, vec3 specularColor,
vec3 intensity = spot_atten * dist_atten * lightColor * 3.0; //magic number to balance with legacy materials
- vec3 speccol;
- color = intensity*pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, n.xyz, v, lv, speccol);
- speccol *= intensity;
- glare += max(max(speccol.r, speccol.g), speccol.b);
+ color = intensity*pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, n.xyz, v, lv);
}
return color;
@@ -166,7 +161,6 @@ vec3 calcPointLightOrSpotLight(vec3 diffuseColor, vec3 specularColor,
void main()
{
vec3 color = vec3(0,0,0);
- float glare = 0.0;
vec3 light_dir = (sun_up_factor == 1) ? sun_dir : moon_dir;
vec3 pos = vary_position;
@@ -224,20 +218,15 @@ void main()
float gloss = 1.0 - perceptualRoughness;
vec3 irradiance = vec3(0);
vec3 radiance = vec3(0);
- sampleReflectionProbes(irradiance, radiance, vary_position.xy*0.5+0.5, pos.xyz, norm.xyz, gloss, true);
- // Take maximium of legacy ambient vs irradiance sample as irradiance
- // NOTE: ao is applied in pbrIbl (see pbrBaseLight), do not apply here
- irradiance = max(amblit,irradiance);
-
+ sampleReflectionProbes(irradiance, radiance, vary_position.xy*0.5+0.5, pos.xyz, norm.xyz, gloss, true, amblit);
+
vec3 diffuseColor;
vec3 specularColor;
calcDiffuseSpecular(col.rgb, metallic, diffuseColor, specularColor);
vec3 v = -normalize(pos.xyz);
- vec3 spec;
- color = pbrBaseLight(diffuseColor, specularColor, metallic, v, norm.xyz, perceptualRoughness, light_dir, sunlit_linear, scol, radiance, irradiance, colorEmissive, ao, additive, atten, spec);
- glare += max(max(spec.r, spec.g), spec.b);
+ color = pbrBaseLight(diffuseColor, specularColor, metallic, v, norm.xyz, perceptualRoughness, light_dir, sunlit_linear, scol, radiance, irradiance, colorEmissive, ao, additive, atten);
color.rgb = atmosFragLightingLinear(color.rgb, additive, atten);
@@ -249,7 +238,7 @@ void main()
vec3 light = vec3(0);
// Punctual lights
-#define LIGHT_LOOP(i) light += calcPointLightOrSpotLight(diffuseColor, specularColor, perceptualRoughness, metallic, norm.xyz, pos.xyz, v, light_position[i].xyz, light_direction[i].xyz, light_diffuse[i].rgb, light_deferred_attenuation[i].x, light_deferred_attenuation[i].y, light_attenuation[i].z, glare, light_attenuation[i].w);
+#define LIGHT_LOOP(i) light += calcPointLightOrSpotLight(diffuseColor, specularColor, perceptualRoughness, metallic, norm.xyz, pos.xyz, v, light_position[i].xyz, light_direction[i].xyz, light_diffuse[i].rgb, light_deferred_attenuation[i].x, light_deferred_attenuation[i].y, light_attenuation[i].z, light_attenuation[i].w);
LIGHT_LOOP(1)
LIGHT_LOOP(2)
@@ -264,9 +253,6 @@ void main()
float a = basecolor.a*vertex_color.a;
- glare = min(glare, 1.0);
- a = max(a, glare);
-
frag_color = max(vec4(color.rgb,a), vec4(0));
}
diff --git a/indra/newview/app_settings/shaders/class2/deferred/reflectionProbeF.glsl b/indra/newview/app_settings/shaders/class2/deferred/reflectionProbeF.glsl
index aa6f5a3b62..52e71edcac 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/reflectionProbeF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/reflectionProbeF.glsl
@@ -34,7 +34,7 @@ uniform mat3 env_mat;
vec3 srgb_to_linear(vec3 c);
void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv,
- vec2 tc, vec3 pos, vec3 norm, float glossiness, bool transparent)
+ vec2 tc, vec3 pos, vec3 norm, float glossiness, bool transparent, vec3 amblit_linear)
{
ambenv = vec3(reflection_probe_ambiance * 0.25);
@@ -44,9 +44,9 @@ void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv,
}
void sampleReflectionProbesWater(inout vec3 ambenv, inout vec3 glossenv,
- vec2 tc, vec3 pos, vec3 norm, float glossiness)
+ vec2 tc, vec3 pos, vec3 norm, float glossiness, vec3 amblit_linear)
{
- sampleReflectionProbes(ambenv, glossenv, tc, pos, norm, glossiness, false);
+ sampleReflectionProbes(ambenv, glossenv, tc, pos, norm, glossiness, false, amblit_linear);
}
vec4 sampleReflectionProbesDebug(vec3 pos)
@@ -56,7 +56,7 @@ vec4 sampleReflectionProbesDebug(vec3 pos)
}
void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv,
- vec2 tc, vec3 pos, vec3 norm, float glossiness, float envIntensity, bool transparent)
+ vec2 tc, vec3 pos, vec3 norm, float glossiness, float envIntensity, bool transparent, vec3 amblit_linear)
{
ambenv = vec3(reflection_probe_ambiance * 0.25);
diff --git a/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl
index 1537714bb7..5483a4e29c 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl
@@ -40,8 +40,6 @@ in vec3 vary_position;
uniform samplerCube environmentMap;
vec3 atmosFragLighting(vec3 light, vec3 additive, vec3 atten);
-vec3 legacy_adjust_fullbright(vec3 c);
-vec3 legacy_adjust(vec3 c);
void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten);
vec3 linear_to_srgb(vec3 c);
@@ -49,7 +47,7 @@ vec3 srgb_to_linear(vec3 c);
// reflection probe interface
void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv,
- vec2 tc, vec3 pos, vec3 norm, float glossiness, float envIntensity, bool transparent);
+ vec2 tc, vec3 pos, vec3 norm, float glossiness, float envIntensity, bool transparent, vec3 amblit_linear);
void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity);
@@ -80,12 +78,10 @@ void main()
vec3 legacyenv;
vec3 norm = normalize(vary_texcoord1.xyz);
vec4 spec = vec4(0,0,0,0);
- sampleReflectionProbesLegacy(ambenv, glossenv, legacyenv, vec2(0), pos.xyz, norm.xyz, spec.a, env_intensity, false);
+ sampleReflectionProbesLegacy(ambenv, glossenv, legacyenv, vec2(0), pos.xyz, norm.xyz, spec.a, env_intensity, false, amblit);
- color.rgb = legacy_adjust(color.rgb);
color.rgb = srgb_to_linear(color.rgb);
- color.rgb = legacy_adjust_fullbright(color.rgb);
-
+
applyLegacyEnv(color.rgb, legacyenv, spec, pos, norm, env_intensity);
color.rgb = atmosFragLighting(color.rgb, additive, atten);
#endif
diff --git a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl
index 82e2de0c0f..acff03ec4b 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl
@@ -48,8 +48,6 @@ void calcHalfVectors(vec3 lv, vec3 n, vec3 v, out vec3 h, out vec3 l, out float
vec3 srgb_to_linear(vec3 cs);
vec3 linear_to_srgb(vec3 cs);
-vec3 legacy_adjust(vec3 c);
-vec3 legacy_adjust_fullbright(vec3 c);
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
@@ -60,7 +58,7 @@ float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen);
#endif
void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv,
- vec2 tc, vec3 pos, vec3 norm, float glossiness, float envIntensity, bool transparent);
+ vec2 tc, vec3 pos, vec3 norm, float glossiness, float envIntensity, bool transparent, vec3 amblit_linear);
void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm);
void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity);
@@ -311,7 +309,6 @@ void main()
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
//forward rendering, output lit linear color
- diffcol.rgb = legacy_adjust(diffcol.rgb);
diffcol.rgb = srgb_to_linear(diffcol.rgb);
spec.rgb = srgb_to_linear(spec.rgb);
spec.a = glossiness; // pack glossiness into spec alpha for lighting functions
@@ -339,10 +336,9 @@ void main()
vec3 ambenv;
vec3 glossenv;
vec3 legacyenv;
- sampleReflectionProbesLegacy(ambenv, glossenv, legacyenv, pos.xy*0.5+0.5, pos.xyz, norm.xyz, glossiness, env, true);
+ sampleReflectionProbesLegacy(ambenv, glossenv, legacyenv, pos.xy*0.5+0.5, pos.xyz, norm.xyz, glossiness, env, true, amblit_linear);
- // use sky settings ambient or irradiance map sample, whichever is brighter
- color = max(amblit_linear, ambenv);
+ color = ambenv;
float da = clamp(dot(norm.xyz, light_dir.xyz), 0.0, 1.0);
vec3 sun_contrib = min(da, shadow) * sunlit_linear;
@@ -378,7 +374,7 @@ void main()
applyGlossEnv(color, glossenv, spec, pos.xyz, norm.xyz);
}
- color = mix(color.rgb, legacy_adjust_fullbright(diffcol.rgb), emissive);
+ color = mix(color.rgb, diffcol.rgb, emissive);
if (env > 0.0)
{ // add environmentmap
diff --git a/indra/newview/app_settings/shaders/class3/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/multiPointLightF.glsl
index 2a096a98ec..ec8168465e 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/multiPointLightF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/multiPointLightF.glsl
@@ -52,7 +52,6 @@ vec4 getNormalEnvIntensityFlags(vec2 screenpos, out vec3 n, out float envIntensi
vec2 getScreenXY(vec4 clip);
vec2 getScreenCoord(vec4 clip);
vec3 srgb_to_linear(vec3 c);
-vec3 legacy_adjust(vec3 c);
// Util
vec3 hue_to_rgb(float hue);
@@ -67,9 +66,6 @@ vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,
void main()
{
-#if defined(LOCAL_LIGHT_KILL)
- discard; // Bail immediately
-#else
vec3 final_color = vec3(0, 0, 0);
vec2 tc = getScreenCoord(vary_fragcoord);
vec3 pos = getPosition(tc).xyz;
@@ -118,7 +114,7 @@ void main()
float dist_atten = calcLegacyDistanceAttenuation(dist, falloff);
- vec3 intensity = dist_atten * lightColor * 3.9;
+ vec3 intensity = dist_atten * lightColor * 3.25;
final_color += intensity*pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, n.xyz, v, lv);
}
@@ -126,7 +122,6 @@ void main()
}
else
{
- diffuse.rgb = legacy_adjust(diffuse.rgb);
diffuse = srgb_to_linear(diffuse);
spec.rgb = srgb_to_linear(spec.rgb);
@@ -174,7 +169,6 @@ void main()
frag_color.rgb = max(final_color, vec3(0));
frag_color.a = 0.0;
-#endif // LOCAL_LIGHT_KILL
#ifdef IS_AMD_CARD
// If it's AMD make sure the GLSL compiler sees the arrays referenced once by static index. Otherwise it seems to optimise the storage
diff --git a/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl
deleted file mode 100644
index 23120bbbbe..0000000000
--- a/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl
+++ /dev/null
@@ -1,263 +0,0 @@
-/**
- * @file class3\deferred\multiSpotLightF.glsl
- *
- * $LicenseInfo:firstyear=2022&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2022, 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$
- */
-
-/*[EXTRA_CODE_HERE]*/
-
-out vec4 frag_color;
-
-uniform sampler2D diffuseRect;
-uniform sampler2D specularRect;
-uniform sampler2D depthMap;
-uniform sampler2D normalMap;
-uniform sampler2D emissiveRect; // PBR linear packed Occlusion, Roughness, Metal. See: pbropaqueF.glsl
-uniform samplerCube environmentMap;
-uniform sampler2D lightMap;
-uniform sampler2D projectionMap; // rgba
-uniform sampler2D lightFunc;
-
-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;
-
-// Light params
-uniform vec3 center;
-uniform float size;
-uniform vec3 color;
-uniform float falloff;
-
-in vec4 vary_fragcoord;
-uniform vec2 screen_res;
-
-uniform mat4 inv_proj;
-
-void calcHalfVectors(vec3 lv, vec3 n, vec3 v, out vec3 h, out vec3 l, out float nh, out float nl, out float nv, out float vh, out float lightDist);
-float calcLegacyDistanceAttenuation(float distance, float falloff);
-vec3 colorized_dot(float x);
-bool clipProjectedLightVars(vec3 center, vec3 pos, out float dist, out float l_dist, out vec3 lv, out vec4 proj_tc );
-vec4 getNormalEnvIntensityFlags(vec2 screenpos, out vec3 n, out float envIntensity);
-vec3 getProjectedLightAmbiance(float amb_da, float attenuation, float lit, float nl, float noise, vec2 projected_uv);
-vec3 getProjectedLightDiffuseColor(float light_distance, vec2 projected_uv );
-vec3 getProjectedLightSpecularColor(vec3 pos, vec3 n);
-vec2 getScreenXY(vec4 clip);
-vec2 getScreenCoord(vec4 clip);
-vec3 srgb_to_linear(vec3 cs);
-vec3 legacy_adjust(vec3 c);
-vec4 texture2DLodSpecular(vec2 tc, float lod);
-
-vec4 getPosition(vec2 pos_screen);
-
-const float M_PI = 3.14159265;
-
-vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,
- float perceptualRoughness,
- float metallic,
- vec3 n, // normal
- vec3 v, // surface point to camera
- vec3 l); //surface point to light
-
-void main()
-{
-#if defined(LOCAL_LIGHT_KILL)
- discard;
-#else
- vec3 final_color = vec3(0,0,0);
- vec2 tc = getScreenCoord(vary_fragcoord);
- vec3 pos = getPosition(tc).xyz;
-
- vec3 lv;
- vec4 proj_tc;
- float dist, l_dist;
- if (clipProjectedLightVars(center, pos, dist, l_dist, lv, proj_tc))
- {
- discard;
- }
-
- float shadow = 1.0;
-
- if (proj_shadow_idx >= 0)
- {
- vec4 shd = texture(lightMap, tc);
- shadow = (proj_shadow_idx==0)?shd.b:shd.a;
- shadow += shadow_fade;
- shadow = clamp(shadow, 0.0, 1.0);
- }
-
- float envIntensity;
- vec3 n;
- vec4 norm = getNormalEnvIntensityFlags(tc, n, envIntensity);
-
- float dist_atten = calcLegacyDistanceAttenuation(dist, falloff);
- if (dist_atten <= 0.0)
- {
- discard;
- }
-
- lv = proj_origin-pos.xyz;
- vec3 h, l, v = -normalize(pos);
- float nh, nl, nv, vh, lightDist;
- calcHalfVectors(lv, n, v, h, l, nh, nl, nv, vh, lightDist);
-
- vec3 diffuse = texture(diffuseRect, tc).rgb;
- vec4 spec = texture(specularRect, tc);
- vec3 dlit = vec3(0, 0, 0);
- vec3 slit = vec3(0, 0, 0);
-
- vec3 amb_rgb = vec3(0);
-
- if (GET_GBUFFER_FLAG(GBUFFER_FLAG_HAS_PBR))
- {
- vec3 colorEmissive = texture(emissiveRect, tc).rgb;
- vec3 orm = spec.rgb;
- float perceptualRoughness = orm.g;
- float metallic = orm.b;
- vec3 f0 = vec3(0.04);
- vec3 baseColor = diffuse.rgb;
-
- vec3 diffuseColor = baseColor.rgb*(vec3(1.0)-f0);
- diffuseColor *= 1.0 - metallic;
-
- vec3 specularColor = mix(f0, baseColor.rgb, metallic);
-
- // We need this additional test inside a light's frustum since a spotlight's ambiance can be applied
- if (proj_tc.x > 0.0 && proj_tc.x < 1.0
- && proj_tc.y > 0.0 && proj_tc.y < 1.0)
- {
- float lit = 0.0;
- float amb_da = 0.0;
-
- if (nl > 0.0)
- {
- amb_da += (nl*0.5 + 0.5) * proj_ambiance;
-
- dlit = getProjectedLightDiffuseColor( l_dist, proj_tc.xy );
-
- vec3 intensity = dist_atten * dlit * 3.9 * shadow; // Legacy attenuation, magic number to balance with legacy materials
- final_color += intensity*pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, n.xyz, v, normalize(lv));
- }
-
- amb_rgb = getProjectedLightAmbiance( amb_da, dist_atten, lit, nl, 1.0, proj_tc.xy );
- final_color += diffuse.rgb * amb_rgb;
- }
- }
- else
- {
- diffuse = legacy_adjust(diffuse);
- diffuse = srgb_to_linear(diffuse);
- spec.rgb = srgb_to_linear(spec.rgb);
-
- 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 amb_da = 0;
- float lit = 0.0;
-
- if (nl > 0.0)
- {
- lit = nl * dist_atten;
-
- dlit = getProjectedLightDiffuseColor( l_dist, proj_tc.xy );
-
- final_color = dlit*lit*diffuse*shadow;
-
- // unshadowed for consistency between forward and deferred?
- amb_da += (nl*0.5+0.5) /* * (1.0-shadow) */ * proj_ambiance;
- }
-
- amb_rgb = getProjectedLightAmbiance( amb_da, dist_atten, lit, nl, 1.0, proj_tc.xy );
- final_color += diffuse.rgb * amb_rgb;
- }
-
- if (spec.a > 0.0)
- {
- dlit *= min(nl*6.0, 1.0) * dist_atten;
-
- float fres = pow(1 - vh, 5)*0.4+0.5;
-
- float gtdenom = 2 * nh;
- float gt = max(0, min(gtdenom * nv / vh, gtdenom * nl / vh));
-
- if (nh > 0.0)
- {
- float scol = fres*texture(lightFunc, vec2(nh, spec.a)).r*gt/(nh*nl);
- vec3 speccol = dlit*scol*spec.rgb*shadow;
- speccol = clamp(speccol, vec3(0), vec3(1));
- final_color += speccol;
- }
- }
-
- if (envIntensity > 0.0)
- {
- vec3 ref = reflect(normalize(pos), n);
-
- //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 /= stc.w;
-
- if (stc.x < 1.0 &&
- stc.y < 1.0 &&
- stc.x > 0.0 &&
- stc.y > 0.0)
- {
- final_color += color.rgb * texture2DLodSpecular(stc.xy, (1 - spec.a) * (proj_lod * 0.6)).rgb * shadow * envIntensity;
- }
- }
- }
- }
- }
-
- //not sure why, but this line prevents MATBUG-194
- final_color = max(final_color, vec3(0.0));
-
- //output linear
- frag_color.rgb = final_color;
- frag_color.a = 0.0;
-#endif // LOCAL_LIGHT_KILL
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/pointLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/pointLightF.glsl
index 42ba96148c..31af1208bd 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/pointLightF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/pointLightF.glsl
@@ -57,7 +57,6 @@ vec4 getPosition(vec2 pos_screen);
vec2 getScreenXY(vec4 clip);
vec2 getScreenCoord(vec4 clip);
vec3 srgb_to_linear(vec3 c);
-vec3 legacy_adjust(vec3 c);
float getDepth(vec2 tc);
vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,
@@ -107,7 +106,7 @@ void main()
vec3 specularColor = mix(f0, baseColor.rgb, metallic);
- vec3 intensity = dist_atten * color * 3.9; // Legacy attenuation, magic number to balance with legacy materials
+ vec3 intensity = dist_atten * color * 3.25; // Legacy attenuation, magic number to balance with legacy materials
final_color += intensity*pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, n.xyz, v, normalize(lv));
}
else
@@ -116,7 +115,6 @@ void main()
{
discard;
}
- diffuse = legacy_adjust(diffuse);
diffuse = srgb_to_linear(diffuse);
spec.rgb = srgb_to_linear(spec.rgb);
diff --git a/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl
index 41821def8e..906e66ecc8 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl
@@ -530,7 +530,7 @@ vec3 tapRefMap(vec3 pos, vec3 dir, out float w, out float dw, float lod, vec3 c,
// w - weight of sample (distance and angular attenuation)
// dw - weight of sample (distance only)
// i - index of probe
-vec3 tapIrradianceMap(vec3 pos, vec3 dir, out float w, out float dw, vec3 c, int i)
+vec3 tapIrradianceMap(vec3 pos, vec3 dir, out float w, out float dw, vec3 c, int i, vec3 amblit)
{
// parallax adjustment
vec3 v;
@@ -556,9 +556,12 @@ vec3 tapIrradianceMap(vec3 pos, vec3 dir, out float w, out float dw, vec3 c, int
v -= c;
v = env_mat * v;
- {
- return textureLod(irradianceProbes, vec4(v.xyz, refIndex[i].x), 0).rgb * refParams[i].x;
- }
+
+ vec3 col = textureLod(irradianceProbes, vec4(v.xyz, refIndex[i].x), 0).rgb * refParams[i].x;
+
+ col = mix(amblit, col, min(refParams[i].x, 1.0));
+
+ return col;
}
vec3 sampleProbes(vec3 pos, vec3 dir, float lod)
@@ -619,7 +622,7 @@ vec3 sampleProbes(vec3 pos, vec3 dir, float lod)
return col[1]+col[0];
}
-vec3 sampleProbeAmbient(vec3 pos, vec3 dir)
+vec3 sampleProbeAmbient(vec3 pos, vec3 dir, vec3 amblit)
{
// modified copy/paste of sampleProbes follows, will likely diverge from sampleProbes further
// as irradiance map mixing is tuned independently of radiance map mixing
@@ -649,7 +652,7 @@ vec3 sampleProbeAmbient(vec3 pos, vec3 dir)
float w = 0;
float dw = 0;
- vec3 refcol = tapIrradianceMap(pos, dir, w, dw, refSphere[i].xyz, i);
+ vec3 refcol = tapIrradianceMap(pos, dir, w, dw, refSphere[i].xyz, i, amblit);
col[p] += refcol*w;
wsum[p] += w;
@@ -679,14 +682,14 @@ vec3 sampleProbeAmbient(vec3 pos, vec3 dir)
}
void doProbeSample(inout vec3 ambenv, inout vec3 glossenv,
- vec2 tc, vec3 pos, vec3 norm, float glossiness, bool transparent)
+ vec2 tc, vec3 pos, vec3 norm, float glossiness, bool transparent, vec3 amblit)
{
// TODO - don't hard code lods
float reflection_lods = max_probe_lod;
vec3 refnormpersp = reflect(pos.xyz, norm.xyz);
- ambenv = sampleProbeAmbient(pos, norm);
+ ambenv = sampleProbeAmbient(pos, norm, amblit);
float lod = (1.0-glossiness)*reflection_lods;
glossenv = sampleProbes(pos, normalize(refnormpersp), lod);
@@ -712,14 +715,14 @@ void doProbeSample(inout vec3 ambenv, inout vec3 glossenv,
}
void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv,
- vec2 tc, vec3 pos, vec3 norm, float glossiness, bool transparent)
+ vec2 tc, vec3 pos, vec3 norm, float glossiness, bool transparent, vec3 amblit)
{
preProbeSample(pos);
- doProbeSample(ambenv, glossenv, tc, pos, norm, glossiness, transparent);
+ doProbeSample(ambenv, glossenv, tc, pos, norm, glossiness, transparent, amblit);
}
void sampleReflectionProbesWater(inout vec3 ambenv, inout vec3 glossenv,
- vec2 tc, vec3 pos, vec3 norm, float glossiness)
+ vec2 tc, vec3 pos, vec3 norm, float glossiness, vec3 amblit)
{
// don't sample automatic probes for water
sample_automatic = false;
@@ -728,7 +731,7 @@ void sampleReflectionProbesWater(inout vec3 ambenv, inout vec3 glossenv,
// always include void probe on water
probeIndex[probeInfluences++] = 0;
- doProbeSample(ambenv, glossenv, tc, pos, norm, glossiness, false);
+ doProbeSample(ambenv, glossenv, tc, pos, norm, glossiness, false, amblit);
// fudge factor to get PBR water at a similar luminance ot legacy water
glossenv *= 0.4;
@@ -783,14 +786,14 @@ vec4 sampleReflectionProbesDebug(vec3 pos)
}
void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv,
- vec2 tc, vec3 pos, vec3 norm, float glossiness, float envIntensity, bool transparent)
+ vec2 tc, vec3 pos, vec3 norm, float glossiness, float envIntensity, bool transparent, vec3 amblit)
{
float reflection_lods = max_probe_lod;
preProbeSample(pos);
vec3 refnormpersp = reflect(pos.xyz, norm.xyz);
- ambenv = sampleProbeAmbient(pos, norm);
+ ambenv = sampleProbeAmbient(pos, norm, amblit);
if (glossiness > 0.0)
{
diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
index 4ef003e0cb..35e99c5bd2 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
@@ -69,16 +69,15 @@ vec3 scaleSoftClipFragLinear(vec3 l);
// reflection probe interface
void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv,
- vec2 tc, vec3 pos, vec3 norm, float glossiness, bool transparent);
+ vec2 tc, vec3 pos, vec3 norm, float glossiness, bool transparent, vec3 amblit_linear);
void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv,
- vec2 tc, vec3 pos, vec3 norm, float glossiness, float envIntensity, bool transparent);
+ vec2 tc, vec3 pos, vec3 norm, float glossiness, float envIntensity, bool transparent, vec3 amblit_linear);
void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm);
void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity);
float getDepth(vec2 pos_screen);
vec3 linear_to_srgb(vec3 c);
vec3 srgb_to_linear(vec3 c);
-vec3 legacy_adjust(vec3 c);
uniform vec4 waterPlane;
@@ -117,10 +116,10 @@ vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,
vec3 l); //surface point to light
-void adjustIrradiance(inout vec3 irradiance, vec3 amblit_linear, float ambocc)
+void adjustIrradiance(inout vec3 irradiance, float ambocc)
{
// use sky settings ambient or irradiance map sample, whichever is brighter
- irradiance = max(amblit_linear, irradiance);
+ //irradiance = max(amblit_linear, irradiance);
#if defined(HAS_SSAO)
irradiance = mix(ssao_effect_mat * min(irradiance.rgb*ssao_irradiance_scale, vec3(ssao_irradiance_max)), irradiance.rgb, ambocc);
@@ -194,9 +193,9 @@ void main()
// PBR IBL
float gloss = 1.0 - perceptualRoughness;
- sampleReflectionProbes(irradiance, radiance, tc, pos.xyz, norm.xyz, gloss, false);
+ sampleReflectionProbes(irradiance, radiance, tc, pos.xyz, norm.xyz, gloss, false, amblit_linear);
- adjustIrradiance(irradiance, amblit_linear, ambocc);
+ adjustIrradiance(irradiance, ambocc);
vec3 diffuseColor;
vec3 specularColor;
@@ -220,8 +219,6 @@ void main()
else
{
// legacy shaders are still writng sRGB to gbuffer
- baseColor.rgb = legacy_adjust(baseColor.rgb);
-
baseColor.rgb = srgb_to_linear(baseColor.rgb);
spec.rgb = srgb_to_linear(spec.rgb);
@@ -232,9 +229,9 @@ void main()
vec3 glossenv = vec3(0);
vec3 legacyenv = vec3(0);
- sampleReflectionProbesLegacy(irradiance, glossenv, legacyenv, tc, pos.xyz, norm.xyz, spec.a, envIntensity, false);
+ sampleReflectionProbesLegacy(irradiance, glossenv, legacyenv, tc, pos.xyz, norm.xyz, spec.a, envIntensity, false, amblit_linear);
- adjustIrradiance(irradiance, amblit_linear, ambocc);
+ adjustIrradiance(irradiance, ambocc);
// apply lambertian IBL only (see pbrIbl)
color.rgb = irradiance;
diff --git a/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl
index 1ea801d7d7..d31b37fb60 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl
@@ -25,16 +25,6 @@
/*[EXTRA_CODE_HERE]*/
-#define DEBUG_ANY_LIGHT_TYPE 0 // Output green light cone
-#define DEBUG_LEG_LIGHT_TYPE 0 // Show Legacy objects in green
-#define DEBUG_PBR_LIGHT_TYPE 0 // Show PBR objects in green
-#define DEBUG_PBR_SPOT 0
-#define DEBUG_PBR_SPOT_DIFFUSE 0
-#define DEBUG_PBR_SPOT_SPECULAR 0
-
-#define DEBUG_SPOT_NL 0 // monochome area effected by light
-#define DEBUG_SPOT_ZERO 0 // Output zero for spotlight
-
out vec4 frag_color;
uniform sampler2D diffuseRect;
@@ -64,11 +54,16 @@ uniform float sun_wash;
uniform int proj_shadow_idx;
uniform float shadow_fade;
+// Light params
+#if defined(MULTI_SPOTLIGHT)
+uniform vec3 center;
+#else
+in vec3 trans_center;
+#endif
uniform float size;
uniform vec3 color;
uniform float falloff;
-in vec3 trans_center;
in vec4 vary_fragcoord;
uniform vec2 screen_res;
@@ -80,11 +75,8 @@ bool clipProjectedLightVars(vec3 center, vec3 pos, out float dist, out float l_d
vec4 getNormalEnvIntensityFlags(vec2 screenpos, out vec3 n, out float envIntensity);
vec3 getProjectedLightAmbiance(float amb_da, float attenuation, float lit, float nl, float noise, vec2 projected_uv);
vec3 getProjectedLightDiffuseColor(float light_distance, vec2 projected_uv );
-vec3 getProjectedLightSpecularColor(vec3 pos, vec3 n);
-vec2 getScreenXY(vec4 clip_point);
-vec2 getScreenCoord(vec4 clip_point);
-vec3 srgb_to_linear(vec3 c);
-vec3 legacy_adjust(vec3 c);
+vec2 getScreenCoord(vec4 clip);
+vec3 srgb_to_linear(vec3 cs);
vec4 texture2DLodSpecular(vec2 tc, float lod);
vec4 getPosition(vec2 pos_screen);
@@ -100,9 +92,6 @@ vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,
void main()
{
-#if defined(LOCAL_LIGHT_KILL)
- discard;
-#else
vec3 final_color = vec3(0,0,0);
vec2 tc = getScreenCoord(vary_fragcoord);
vec3 pos = getPosition(tc).xyz;
@@ -110,24 +99,31 @@ void main()
vec3 lv;
vec4 proj_tc;
float dist, l_dist;
- if (clipProjectedLightVars(trans_center, pos, dist, l_dist, lv, proj_tc))
+ vec3 c;
+#if defined(MULTI_SPOTLIGHT)
+ c = center;
+#else
+ c = trans_center;
+#endif
+
+ if (clipProjectedLightVars(c, pos, dist, l_dist, lv, proj_tc))
{
discard;
}
float shadow = 1.0;
-
+
if (proj_shadow_idx >= 0)
{
vec4 shd = texture(lightMap, tc);
- shadow = (proj_shadow_idx == 0) ? shd.b : shd.a;
+ shadow = (proj_shadow_idx==0)?shd.b:shd.a;
shadow += shadow_fade;
- shadow = clamp(shadow, 0.0, 1.0);
+ shadow = clamp(shadow, 0.0, 1.0);
}
float envIntensity;
vec3 n;
- vec4 norm = getNormalEnvIntensityFlags(tc, n, envIntensity); // need `norm.w` for GET_GBUFFER_FLAG()
+ vec4 norm = getNormalEnvIntensityFlags(tc, n, envIntensity);
float dist_atten = calcLegacyDistanceAttenuation(dist, falloff);
if (dist_atten <= 0.0)
@@ -135,7 +131,7 @@ void main()
discard;
}
- lv = proj_origin-pos.xyz; // NOTE: Re-using lv
+ lv = proj_origin-pos.xyz;
vec3 h, l, v = -normalize(pos);
float nh, nl, nv, vh, lightDist;
calcHalfVectors(lv, n, v, h, l, nh, nl, nv, vh, lightDist);
@@ -146,10 +142,11 @@ void main()
vec3 slit = vec3(0, 0, 0);
vec3 amb_rgb = vec3(0);
+
if (GET_GBUFFER_FLAG(GBUFFER_FLAG_HAS_PBR))
{
- vec3 colorEmissive = texture(emissiveRect, tc).rgb;
- vec3 orm = spec.rgb;
+ vec3 colorEmissive = texture(emissiveRect, tc).rgb;
+ vec3 orm = spec.rgb;
float perceptualRoughness = orm.g;
float metallic = orm.b;
vec3 f0 = vec3(0.04);
@@ -167,33 +164,34 @@ void main()
float lit = 0.0;
float amb_da = 0.0;
+ lv = normalize(lv);
+
if (nl > 0.0)
{
amb_da += (nl*0.5 + 0.5) * proj_ambiance;
dlit = getProjectedLightDiffuseColor( l_dist, proj_tc.xy );
- vec3 intensity = dist_atten * dlit * 3.9 * shadow; // Legacy attenuation
- final_color += intensity*pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, n.xyz, v, normalize(lv));
+ vec3 intensity = dist_atten * dlit * 3.25 * shadow; // Legacy attenuation, magic number to balance with legacy materials
+ final_color += intensity*pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, n.xyz, v, lv);
}
- amb_rgb = getProjectedLightAmbiance( amb_da, dist_atten, lit, nl, 1.0, proj_tc.xy );
- final_color += diffuse.rgb * amb_rgb;
+ amb_rgb = getProjectedLightAmbiance( amb_da, dist_atten, lit, nl, 1.0, proj_tc.xy ) * 3.25; //magic number to balance with legacy ambiance
+ final_color += amb_rgb * pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, n.xyz, v, -lv);
}
}
else
{
- diffuse = legacy_adjust(diffuse);
diffuse = srgb_to_linear(diffuse);
spec.rgb = srgb_to_linear(spec.rgb);
-
+
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 amb_da = proj_ambiance;
+ float amb_da = 0;
float lit = 0.0;
if (nl > 0.0)
@@ -204,24 +202,23 @@ void main()
final_color = dlit*lit*diffuse*shadow;
+ // unshadowed for consistency between forward and deferred?
amb_da += (nl*0.5+0.5) /* * (1.0-shadow) */ * proj_ambiance;
}
-
- vec3 amb_rgb = getProjectedLightAmbiance( amb_da, dist_atten, lit, nl, 1.0, proj_tc.xy );
- final_color += diffuse.rgb*amb_rgb;
- #if DEBUG_LEG_LIGHT_TYPE
- final_color = vec3(0,0.5,0);
- #endif
+
+ amb_rgb = getProjectedLightAmbiance( amb_da, dist_atten, lit, nl, 1.0, proj_tc.xy );
+ final_color += diffuse.rgb * amb_rgb * max(dot(-normalize(lv), n), 0.0);
}
-
+
if (spec.a > 0.0)
{
dlit *= min(nl*6.0, 1.0) * dist_atten;
- float fres = pow(1 - dot(h, v), 5)*0.4+0.5;
+
+ float fres = pow(1 - vh, 5)*0.4+0.5;
float gtdenom = 2 * nh;
float gt = max(0, min(gtdenom * nv / vh, gtdenom * nl / vh));
-
+
if (nh > 0.0)
{
float scol = fres*texture(lightFunc, vec2(nh, spec.a)).r*gt/(nh*nl);
@@ -229,26 +226,26 @@ void main()
speccol = clamp(speccol, vec3(0), vec3(1));
final_color += speccol;
}
- }
+ }
if (envIntensity > 0.0)
{
vec3 ref = reflect(normalize(pos), n);
-
+
//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 /= stc.w;
-
+
if (stc.x < 1.0 &&
stc.y < 1.0 &&
stc.x > 0.0 &&
@@ -261,24 +258,10 @@ void main()
}
}
-#if DEBUG_PBR_SPOT_DIFFUSE
- final_color = vec3(nl * dist_atten);
-#endif
-#if DEBUG_SPOT_NL
- final_color = vec3(nl);
-#endif
-#if DEBUG_SPOT_ZERO
- final_color = vec3(0,0,0);
-#endif
-#if DEBUG_ANY_LIGHT_TYPE
- final_color = vec3(0,0.3333,0);
-#endif
-
//not sure why, but this line prevents MATBUG-194
final_color = max(final_color, vec3(0.0));
- //output linear colors as gamma correction happens down stream
+ //output linear
frag_color.rgb = final_color;
frag_color.a = 0.0;
-#endif // LOCAL_LIGHT_KILL
}
diff --git a/indra/newview/app_settings/shaders/class3/environment/waterF.glsl b/indra/newview/app_settings/shaders/class3/environment/waterF.glsl
index 8fee259933..4f79dd1ac5 100644
--- a/indra/newview/app_settings/shaders/class3/environment/waterF.glsl
+++ b/indra/newview/app_settings/shaders/class3/environment/waterF.glsl
@@ -124,7 +124,7 @@ vec3 transform_normal(vec3 vNt)
}
void sampleReflectionProbesWater(inout vec3 ambenv, inout vec3 glossenv,
- vec2 tc, vec3 pos, vec3 norm, float glossiness);
+ vec2 tc, vec3 pos, vec3 norm, float glossiness, vec3 amblit_linear);
vec3 getPositionWithNDC(vec3 ndc);
@@ -237,7 +237,7 @@ void main()
vec3 irradiance = vec3(0);
vec3 radiance = vec3(0);
- sampleReflectionProbesWater(irradiance, radiance, distort2, pos.xyz, wave_ibl.xyz, gloss);
+ sampleReflectionProbesWater(irradiance, radiance, distort2, pos.xyz, wave_ibl.xyz, gloss, amblit);
irradiance = vec3(0);
diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt
index 4bc83b099f..c341097dfc 100644
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.txt
@@ -42,7 +42,7 @@ RenderGamma 1 0
RenderGlowResolutionPow 1 9
RenderMaxPartCount 1 8192
RenderObjectBump 1 1
-RenderLocalLights 1 1
+RenderLocalLightCount 1 4096
RenderTransparentWater 1 1
RenderReflectionsEnabled 1 1
RenderReflectionProbeDetail 1 2
@@ -89,10 +89,10 @@ RenderAvatarMaxComplexity 1 35000
RenderFarClip 1 64
RenderFlexTimeFactor 1 0
RenderGlowResolutionPow 1 8
-RenderLocalLights 1 0
+RenderLocalLightCount 1 8
RenderMaxPartCount 1 0
RenderTransparentWater 1 0
-RenderReflectionsEnabled 1 0
+RenderReflectionsEnabled 1 1
RenderReflectionProbeDetail 1 0
RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
@@ -120,7 +120,7 @@ RenderFarClip 1 96
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 8
RenderMaxPartCount 1 2048
-RenderLocalLights 1 1
+RenderLocalLightCount 1 256
RenderTransparentWater 1 0
RenderReflectionsEnabled 1 1
RenderReflectionProbeDetail 1 0
@@ -150,7 +150,7 @@ RenderFarClip 1 128
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderMaxPartCount 1 4096
-RenderLocalLights 1 1
+RenderLocalLightCount 1 512
RenderTransparentWater 1 0
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
@@ -180,7 +180,7 @@ RenderFarClip 1 128
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderMaxPartCount 1 4096
-RenderLocalLights 1 1
+RenderLocalLightCount 1 1024
RenderTransparentWater 1 1
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
@@ -210,7 +210,7 @@ RenderFarClip 1 128
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderMaxPartCount 1 4096
-RenderLocalLights 1 1
+RenderLocalLightCount 1 2048
RenderTransparentWater 1 1
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
@@ -240,7 +240,7 @@ RenderFarClip 1 128
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderMaxPartCount 1 4096
-RenderLocalLights 1 1
+RenderLocalLightCount 1 4096
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTerrainPBRPlanarSampleCount 1 3
@@ -268,7 +268,7 @@ RenderAvatarPhysicsLODFactor 1 1.0
RenderFarClip 1 256
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
-RenderLocalLights 1 1
+RenderLocalLightCount 1 8192
RenderMaxPartCount 1 8192
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
@@ -308,7 +308,7 @@ list safe
RenderAnisotropic 1 0
RenderAvatarMaxNonImpostors 1 16
RenderAvatarMaxComplexity 1 80000
-RenderLocalLights 1 0
+RenderLocalLightCount 1 0
RenderMaxPartCount 1 1024
RenderTerrainDetail 1 0
RenderTransparentWater 1 0
diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt
index 97dad655a2..6927915f17 100644
--- a/indra/newview/featuretable_mac.txt
+++ b/indra/newview/featuretable_mac.txt
@@ -42,7 +42,7 @@ RenderGamma 1 0
RenderGlowResolutionPow 1 9
RenderMaxPartCount 1 8192
RenderObjectBump 1 1
-RenderLocalLights 1 1
+RenderLocalLightCount 1 4096
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTerrainPBRPlanarSampleCount 1 3
@@ -86,7 +86,7 @@ RenderAvatarMaxComplexity 1 35000
RenderFarClip 1 64
RenderFlexTimeFactor 1 0
RenderGlowResolutionPow 1 8
-RenderLocalLights 1 0
+RenderLocalLightCount 1 8
RenderMaxPartCount 1 0
RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
@@ -99,7 +99,7 @@ RenderUseAdvancedAtmospherics 1 0
RenderShadowDetail 1 0
WLSkyDetail 1 96
RenderFSAASamples 1 0
-RenderReflectionsEnabled 1 0
+RenderReflectionsEnabled 1 1
RenderReflectionProbeDetail 1 0
RenderScreenSpaceReflections 1 0
RenderReflectionProbeLevel 1 0
@@ -117,7 +117,7 @@ RenderFarClip 1 96
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 8
RenderMaxPartCount 1 2048
-RenderLocalLights 1 1
+RenderLocalLightCount 1 256
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 1.0
RenderTerrainPBRPlanarSampleCount 1 1
@@ -147,7 +147,7 @@ RenderFarClip 1 128
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderMaxPartCount 1 4096
-RenderLocalLights 1 1
+RenderLocalLightCount 1 512
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTerrainPBRPlanarSampleCount 1 1
@@ -177,7 +177,7 @@ RenderFarClip 1 128
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderMaxPartCount 1 4096
-RenderLocalLights 1 1
+RenderLocalLightCount 1 1024
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTerrainPBRPlanarSampleCount 1 1
@@ -207,7 +207,7 @@ RenderFarClip 1 128
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderMaxPartCount 1 4096
-RenderLocalLights 1 1
+RenderLocalLightCount 1 2048
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTerrainPBRPlanarSampleCount 1 3
@@ -237,7 +237,7 @@ RenderFarClip 1 128
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
RenderMaxPartCount 1 4096
-RenderLocalLights 1 1
+RenderLocalLightCount 1 4096
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
RenderTerrainPBRPlanarSampleCount 1 3
@@ -265,7 +265,7 @@ RenderAvatarMaxNonImpostors 1 16
RenderFarClip 1 256
RenderFlexTimeFactor 1 1.0
RenderGlowResolutionPow 1 9
-RenderLocalLights 1 1
+RenderLocalLightCount 1 8192
RenderMaxPartCount 1 8192
RenderTerrainDetail 1 1
RenderTerrainLODFactor 1 2.0
@@ -306,7 +306,7 @@ list safe
RenderAnisotropic 1 0
RenderAvatarMaxNonImpostors 1 16
RenderAvatarMaxComplexity 1 80000
-RenderLocalLights 1 0
+RenderLocalLightCount 1 0
RenderMaxPartCount 1 1024
RenderTerrainDetail 1 0
RenderDeferredSSAO 0 0
@@ -324,7 +324,6 @@ RenderDeferredSSAO 1 0
list Intel
RenderAnisotropic 1 0
-RenderLocalLights 1 0
RenderFSAASamples 1 0
list GL3
diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi
index 778d32e66c..39247b3f47 100644
--- a/indra/newview/installers/windows/installer_template.nsi
+++ b/indra/newview/installers/windows/installer_template.nsi
@@ -507,7 +507,7 @@ Call un.UserSettingsFiles
SectionEnd
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Make sure the user can install
+;; Make sure the user can install/uninstall
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Function CheckIfAdministrator
DetailPrint $(CheckAdministratorInstDP)
@@ -518,25 +518,7 @@ Function CheckIfAdministrator
Quit
lbl_is_admin:
Return
-
-FunctionEnd
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Make sure the user can uninstall
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-/* Unused
-Function un.CheckIfAdministrator
- DetailPrint $(CheckAdministratorUnInstDP)
- UserInfo::GetAccountType
- Pop $R0
- StrCmp $R0 "Admin" lbl_is_admin
- MessageBox MB_OK $(CheckAdministratorUnInstMB)
- Quit
-lbl_is_admin:
- Return
-
FunctionEnd
-*/
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Function CheckWillUninstallV2
diff --git a/indra/newview/installers/windows/lang_zh.nsi b/indra/newview/installers/windows/lang_zh.nsi
index 7922d9df52..0985663041 100755
--- a/indra/newview/installers/windows/lang_zh.nsi
+++ b/indra/newview/installers/windows/lang_zh.nsi
Binary files differ
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 4c3891f302..a273afab52 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -120,6 +120,10 @@ const F64 CHAT_AGE_FAST_RATE = 3.0;
const F32 MIN_FIDGET_TIME = 8.f; // seconds
const F32 MAX_FIDGET_TIME = 20.f; // seconds
+const S32 UI_FEATURE_VERSION = 1;
+// For version 1: 1 - inventory, 2 - gltf
+const S32 UI_FEATURE_FLAGS = 3;
+
// The agent instance.
LLAgent gAgent;
@@ -372,7 +376,7 @@ LLAgent::LLAgent() :
mHideGroupTitle(FALSE),
mGroupID(),
- mInitialized(FALSE),
+ mInitialized(false),
mListener(),
mDoubleTapRunTimer(),
@@ -401,6 +405,7 @@ LLAgent::LLAgent() :
mHttpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID),
mTeleportState(TELEPORT_NONE),
mRegionp(NULL),
+ mInterestListMode(LLViewerRegion::IL_MODE_DEFAULT),
mAgentOriginGlobal(),
mPositionGlobal(),
@@ -447,7 +452,7 @@ LLAgent::LLAgent() :
mNextFidgetTime(0.f),
mCurrentFidget(0),
- mFirstLogin(FALSE),
+ mFirstLogin(false),
mOutfitChosen(FALSE),
mVoiceConnected(false),
@@ -504,7 +509,7 @@ void LLAgent::init()
mHttpPolicy = app_core_http.getPolicy(LLAppCoreHttp::AP_AGENT);
- mInitialized = TRUE;
+ mInitialized = true;
}
//-----------------------------------------------------------------------------
@@ -559,6 +564,93 @@ void LLAgent::onAppFocusGained()
}
}
+void LLAgent::setFirstLogin(bool b)
+{
+ mFirstLogin = b;
+
+ if (mFirstLogin)
+ {
+ // Don't notify new users about new features
+ if (getFeatureVersion() <= UI_FEATURE_VERSION)
+ {
+ setFeatureVersion(UI_FEATURE_VERSION, UI_FEATURE_FLAGS);
+ }
+ }
+}
+
+void LLAgent::setFeatureVersion(S32 version, S32 flags)
+{
+ LLSD updated_version;
+ updated_version["version"] = version;
+ updated_version["flags"] = flags;
+ gSavedSettings.setLLSD("LastUIFeatureVersion", updated_version);
+}
+
+S32 LLAgent::getFeatureVersion()
+{
+ S32 version;
+ S32 flags;
+ getFeatureVersionAndFlags(version, flags);
+ return version;
+}
+
+void LLAgent::getFeatureVersionAndFlags(S32& version, S32& flags)
+{
+ version = 0;
+ flags = 0;
+ LLSD feature_version = gSavedSettings.getLLSD("LastUIFeatureVersion");
+ if (feature_version.isInteger())
+ {
+ version = feature_version.asInteger();
+ flags = 1; // inventory flag
+ }
+ else if (feature_version.isMap())
+ {
+ version = feature_version["version"];
+ flags = feature_version["flags"];
+ }
+ else if (!feature_version.isString() && !feature_version.isUndefined())
+ {
+ // is something newer inside?
+ version = UI_FEATURE_VERSION;
+ flags = UI_FEATURE_FLAGS;
+ }
+}
+
+void LLAgent::showLatestFeatureNotification(const std::string key)
+{
+ S32 version;
+ S32 flags; // a single release can have multiple new features
+ getFeatureVersionAndFlags(version, flags);
+ if (version <= UI_FEATURE_VERSION && (flags & UI_FEATURE_FLAGS) != UI_FEATURE_FLAGS)
+ {
+ S32 flag = 0;
+
+ if (key == "inventory")
+ {
+ // Notify user about new thumbnail support
+ flag = 1;
+ }
+
+ if (key == "gltf")
+ {
+ flag = 2;
+ }
+
+ if ((flags & flag) == 0)
+ {
+ // Need to open on top even if called from onOpen,
+ // do on idle to make sure it's on top
+ LLSD floater_key(key);
+ doOnIdleOneTime([floater_key]()
+ {
+ LLFloaterReg::showInstance("new_feature_notification", floater_key);
+ });
+
+ setFeatureVersion(UI_FEATURE_VERSION, flags | flag);
+ }
+ }
+}
void LLAgent::ageChat()
{
@@ -894,11 +986,19 @@ boost::signals2::connection LLAgent::addParcelChangedCallback(parcel_changed_cal
// static
void LLAgent::capabilityReceivedCallback(const LLUUID &region_id, LLViewerRegion *regionp)
-{
- if (regionp && regionp->getRegionID() == region_id)
+{ // Changed regions and now have the region capabilities
+ if (regionp)
{
- regionp->requestSimulatorFeatures();
- LLAppViewer::instance()->updateNameLookupUrl(regionp);
+ if (regionp->getRegionID() == region_id)
+ {
+ regionp->requestSimulatorFeatures();
+ LLAppViewer::instance()->updateNameLookupUrl(regionp);
+ }
+
+ if (gAgent.getInterestListMode() == LLViewerRegion::IL_MODE_360)
+ {
+ gAgent.changeInterestListMode(LLViewerRegion::IL_MODE_360);
+ }
}
}
@@ -1358,26 +1458,21 @@ LLVector3 LLAgent::getReferenceUpVector()
void LLAgent::pitch(F32 angle)
{
// don't let user pitch if pointed almost all the way down or up
- mFrameAgent.pitch(clampPitchToLimits(angle));
-}
-
-// Radians, positive is forward into ground
-//-----------------------------------------------------------------------------
-// clampPitchToLimits()
-//-----------------------------------------------------------------------------
-F32 LLAgent::clampPitchToLimits(F32 angle)
-{
// A dot B = mag(A) * mag(B) * cos(angle between A and B)
// so... cos(angle between A and B) = A dot B / mag(A) / mag(B)
// = A dot B for unit vectors
LLVector3 skyward = getReferenceUpVector();
- const F32 look_down_limit = 179.f * DEG_TO_RAD;;
- const F32 look_up_limit = 1.f * DEG_TO_RAD;
+ // SL-19286 Avatar is upside down when viewed from below
+ // after left-clicking the mouse on the avatar and dragging down
+ //
+ // The issue is observed on angle below 10 degrees
+ const F32 look_down_limit = 179.f * DEG_TO_RAD;
+ const F32 look_up_limit = 10.f * DEG_TO_RAD;
- F32 angle_from_skyward = acos( mFrameAgent.getAtAxis() * skyward );
+ F32 angle_from_skyward = acos(mFrameAgent.getAtAxis() * skyward);
// clamp pitch to limits
if ((angle >= 0.f) && (angle_from_skyward + angle > look_down_limit))
@@ -1388,8 +1483,11 @@ F32 LLAgent::clampPitchToLimits(F32 angle)
{
angle = look_up_limit - angle_from_skyward;
}
-
- return angle;
+
+ if (fabs(angle) > 1e-4)
+ {
+ mFrameAgent.pitch(angle);
+ }
}
@@ -2906,39 +3004,60 @@ void LLAgent::processMaturityPreferenceFromServer(const LLSD &result, U8 perferr
handlePreferredMaturityResult(maturity);
}
-
-bool LLAgent::requestPostCapability(const std::string &capName, LLSD &postData, httpCallback_t cbSuccess, httpCallback_t cbFailure)
-{
- if (!getRegion())
+// Using a new capability, tell the simulator that we want it to send everything
+// it knows about and not just what is in front of the camera, in its view
+// frustum. We need this feature so that the contents of the region that appears
+// in the 6 snapshots which we cannot see and is normally not "considered", is
+// also rendered. Typically, this is turned on when the 360 capture floater is
+// opened and turned off when it is closed.
+// Note: for this version, we do not have a way to determine when "everything"
+// has arrived and has been rendered so for now, the proposal is that users
+// will need to experiment with the low resolution version and wait for some
+// (hopefully) small period of time while the full contents resolves.
+// Pass in a flag to ask the simulator/interest list to "send everything" or
+// not (the default mode)
+void LLAgent::changeInterestListMode(const std::string &new_mode)
+{
+ if (new_mode != mInterestListMode)
{
- return false;
+ mInterestListMode = new_mode;
+
+ // Change interest list mode for all regions. If they are already set for the current mode,
+ // the setting will have no effect.
+ for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
+ iter != LLWorld::getInstance()->getRegionList().end();
+ ++iter)
+ {
+ LLViewerRegion *regionp = *iter;
+ if (regionp && regionp->isAlive() && regionp->capabilitiesReceived())
+ {
+ regionp->setInterestListMode(mInterestListMode);
+ }
+ }
}
- std::string url = getRegion()->getCapability(capName);
+ else
+ {
+ LL_DEBUGS("360Capture") << "Agent interest list mode is already set to " << mInterestListMode << LL_ENDL;
+ }
+}
- if (url.empty())
+
+bool LLAgent::requestPostCapability(const std::string &capName, LLSD &postData, httpCallback_t cbSuccess, httpCallback_t cbFailure)
+{
+ if (getRegion())
{
- LL_WARNS("Agent") << "Could not retrieve region capability \"" << capName << "\"" << LL_ENDL;
- return false;
+ return getRegion()->requestPostCapability(capName, postData, cbSuccess, cbFailure);
}
-
- LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpPost(url, mHttpPolicy, postData, cbSuccess, cbFailure);
- return true;
+ return false;
}
bool LLAgent::requestGetCapability(const std::string &capName, httpCallback_t cbSuccess, httpCallback_t cbFailure)
{
- std::string url;
-
- url = getRegionCapability(capName);
-
- if (url.empty())
+ if (getRegion())
{
- LL_WARNS("Agent") << "Could not retrieve region capability \"" << capName << "\"" << LL_ENDL;
- return false;
+ return getRegion()->requestGetCapability(capName, cbSuccess, cbFailure);
}
-
- LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpGet(url, mHttpPolicy, cbSuccess, cbFailure);
- return true;
+ return false;
}
BOOL LLAgent::getAdminOverride() const
@@ -3704,7 +3823,6 @@ void LLAgent::processScriptControlChange(LLMessageSystem *msg, void **)
// take controls
msg->getU32("Data", "Controls", controls, block_index );
msg->getBOOL("Data", "PassToAgent", passon, block_index );
- U32 total_count = 0;
for (i = 0; i < TOTAL_CONTROLS; i++)
{
if (controls & ( 1 << i))
@@ -3717,7 +3835,6 @@ void LLAgent::processScriptControlChange(LLMessageSystem *msg, void **)
{
gAgent.mControlsTakenCount[i]++;
}
- total_count++;
}
}
}
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index 498bea3c07..fd3a9b1d7b 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -117,15 +117,20 @@ private:
//--------------------------------------------------------------------
public:
void onAppFocusGained();
- void setFirstLogin(BOOL b) { mFirstLogin = b; }
+ void setFirstLogin(bool b);
// Return TRUE if the database reported this login as the first for this particular user.
- BOOL isFirstLogin() const { return mFirstLogin; }
- BOOL isInitialized() const { return mInitialized; }
+ bool isFirstLogin() const { return mFirstLogin; }
+ bool isInitialized() const { return mInitialized; }
+
+ void setFeatureVersion(S32 version, S32 flags);
+ S32 getFeatureVersion();
+ void getFeatureVersionAndFlags(S32 &version, S32 &flags);
+ void showLatestFeatureNotification(const std::string key);
public:
std::string mMOTD; // Message of the day
private:
- BOOL mInitialized;
- BOOL mFirstLogin;
+ bool mInitialized;
+ bool mFirstLogin;
boost::shared_ptr<LLAgentListener> mListener;
//--------------------------------------------------------------------
@@ -294,10 +299,16 @@ public:
boost::signals2::connection addRegionChangedCallback(const region_changed_signal_t::slot_type& cb);
void removeRegionChangedCallback(boost::signals2::connection callback);
+
+ void changeInterestListMode(const std::string & new_mode);
+ const std::string & getInterestListMode() const { return mInterestListMode; }
+
private:
LLViewerRegion *mRegionp;
region_changed_signal_t mRegionChangedSignal;
+ std::string mInterestListMode; // How agent wants regions to send updates
+
//--------------------------------------------------------------------
// History
//--------------------------------------------------------------------
@@ -548,7 +559,6 @@ public:
void roll(F32 angle);
void yaw(F32 angle);
LLVector3 getReferenceUpVector();
- F32 clampPitchToLimits(F32 angle);
//--------------------------------------------------------------------
// Autopilot
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index 826a4ba761..29642d3f45 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -401,10 +401,15 @@ LLVector3 LLAgentCamera::calcFocusOffset(LLViewerObject *object, LLVector3 origi
// if is avatar - don't do any funk heuristics to position the focal point
// see DEV-30589
- if (object->isAvatar() || (object->isAnimatedObject() && object->getControlAvatar()))
+ if ((object->isAvatar() && !object->isRoot()) || (object->isAnimatedObject() && object->getControlAvatar()))
{
return original_focus_point - obj_pos;
}
+ if (object->isAvatar())
+ {
+ LLVOAvatar* av = object->asAvatar();
+ return original_focus_point - av->getCharacterPosition();
+ }
LLQuaternion inv_obj_rot = ~obj_rot; // get inverse of rotation
LLVector3 object_extents = object->getScale();
@@ -1765,13 +1770,24 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit)
LL_WARNS() << "Null avatar drawable!" << LL_ENDL;
return LLVector3d::zero;
}
+
head_offset.clearVec();
+ F32 fixup;
+ if (gAgentAvatarp->hasPelvisFixup(fixup))
+ {
+ head_offset[VZ] -= fixup;
+ }
+ if (gAgentAvatarp->isSitting())
+ {
+ head_offset.mdV[VZ] += 0.1;
+ }
+
if (gAgentAvatarp->isSitting() && gAgentAvatarp->getParent())
{
gAgentAvatarp->updateHeadOffset();
- head_offset.mdV[VX] = gAgentAvatarp->mHeadOffset.mV[VX];
- head_offset.mdV[VY] = gAgentAvatarp->mHeadOffset.mV[VY];
- head_offset.mdV[VZ] = gAgentAvatarp->mHeadOffset.mV[VZ] + 0.1f;
+ head_offset.mdV[VX] += gAgentAvatarp->mHeadOffset.mV[VX];
+ head_offset.mdV[VY] += gAgentAvatarp->mHeadOffset.mV[VY];
+ head_offset.mdV[VZ] += gAgentAvatarp->mHeadOffset.mV[VZ];
const LLMatrix4& mat = ((LLViewerObject*) gAgentAvatarp->getParent())->getRenderMatrix();
camera_position_global = gAgent.getPosGlobalFromAgent
((gAgentAvatarp->getPosition()+
@@ -1779,11 +1795,7 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit)
}
else
{
- head_offset.mdV[VZ] = gAgentAvatarp->mHeadOffset.mV[VZ];
- if (gAgentAvatarp->isSitting())
- {
- head_offset.mdV[VZ] += 0.1;
- }
+ head_offset.mdV[VZ] += gAgentAvatarp->mHeadOffset.mV[VZ];
camera_position_global = gAgent.getPosGlobalFromAgent(gAgentAvatarp->getRenderPosition());//frame_center_global;
head_offset = head_offset * gAgentAvatarp->getRenderRotation();
camera_position_global = camera_position_global + head_offset;
diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp
index b7f5aeb8e0..77a3d47aea 100644
--- a/indra/newview/llagentlistener.cpp
+++ b/indra/newview/llagentlistener.cpp
@@ -35,6 +35,7 @@
#include "llcommandhandler.h"
#include "llslurl.h"
#include "llurldispatcher.h"
+#include "llviewernetwork.h"
#include "llviewerobject.h"
#include "llviewerobjectlist.h"
#include "llviewerregion.h"
@@ -148,7 +149,7 @@ void LLAgentListener::requestTeleport(LLSD const & event_data) const
params.append(event_data["x"]);
params.append(event_data["y"]);
params.append(event_data["z"]);
- LLCommandDispatcher::dispatch("teleport", params, LLSD(), NULL, LLCommandHandler::NAV_TYPE_CLICKED, true);
+ LLCommandDispatcher::dispatch("teleport", params, LLSD(), LLGridManager::getInstance()->getGrid(), NULL, LLCommandHandler::NAV_TYPE_CLICKED, true);
// *TODO - lookup other LLCommandHandlers for "agent", "classified", "event", "group", "floater", "parcel", "login", login_refresh", "balance", "chat"
// should we just compose LLCommandHandler and LLDispatchListener?
}
diff --git a/indra/newview/llagentui.cpp b/indra/newview/llagentui.cpp
index c19ad2ae6f..acb1a37ff5 100644
--- a/indra/newview/llagentui.cpp
+++ b/indra/newview/llagentui.cpp
@@ -82,9 +82,9 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const
if (!region || !parcel) return FALSE;
- S32 pos_x = S32(agent_pos_region.mV[VX]);
- S32 pos_y = S32(agent_pos_region.mV[VY]);
- S32 pos_z = S32(agent_pos_region.mV[VZ]);
+ S32 pos_x = S32(agent_pos_region.mV[VX] + 0.5f);
+ S32 pos_y = S32(agent_pos_region.mV[VY] + 0.5f);
+ S32 pos_z = S32(agent_pos_region.mV[VZ] + 0.5f);
// Round the numbers based on the velocity
F32 velocity_mag_sq = gAgent.getVelocity().magVecSquared();
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 2e769dc737..db99f20775 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -41,7 +41,6 @@
#include "llinventoryobserver.h"
#include "llinventorypanel.h"
#include "lllocaltextureobject.h"
-#include "llmd5.h"
#include "llnotificationsutil.h"
#include "lloutfitobserver.h"
#include "llsidepanelappearance.h"
@@ -1307,8 +1306,9 @@ void LLAgentWearables::findAttachmentsAddRemoveInfo(LLInventoryModel::item_array
}
// Build up list of objects to be removed and items currently attached.
- for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin();
- iter != gAgentAvatarp->mAttachmentPoints.end();)
+ LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin();
+ LLVOAvatar::attachment_map_t::iterator end = gAgentAvatarp->mAttachmentPoints.end();
+ while (iter != end)
{
LLVOAvatar::attachment_map_t::iterator curiter = iter++;
LLViewerJointAttachment* attachment = curiter->second;
@@ -1527,7 +1527,7 @@ bool LLAgentWearables::moveWearable(const LLViewerInventoryItem* item, bool clos
}
// static
-void LLAgentWearables::createWearable(LLWearableType::EType type, bool wear, const LLUUID& parent_id)
+void LLAgentWearables::createWearable(LLWearableType::EType type, bool wear, const LLUUID& parent_id, std::function<void(const LLUUID&)> created_cb)
{
if (type == LLWearableType::WT_INVALID || type == LLWearableType::WT_NONE) return;
@@ -1539,7 +1539,7 @@ void LLAgentWearables::createWearable(LLWearableType::EType type, bool wear, con
LLViewerWearable* wearable = LLWearableList::instance().createNewWearable(type, gAgentAvatarp);
LLAssetType::EType asset_type = wearable->getAssetType();
- LLPointer<LLInventoryCallback> cb;
+ LLPointer<LLBoostFuncInventoryCallback> cb;
if(wear)
{
cb = new LLBoostFuncInventoryCallback(wear_and_edit_cb);
@@ -1548,6 +1548,10 @@ void LLAgentWearables::createWearable(LLWearableType::EType type, bool wear, con
{
cb = new LLBoostFuncInventoryCallback(wear_cb);
}
+ if (created_cb != NULL)
+ {
+ cb->addOnFireFunc(created_cb);
+ }
LLUUID folder_id;
diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h
index 2710262910..e20f5df7fa 100644
--- a/indra/newview/llagentwearables.h
+++ b/indra/newview/llagentwearables.h
@@ -129,7 +129,7 @@ protected:
//--------------------------------------------------------------------
public:
- static void createWearable(LLWearableType::EType type, bool wear = false, const LLUUID& parent_id = LLUUID::null);
+ static void createWearable(LLWearableType::EType type, bool wear = false, const LLUUID& parent_id = LLUUID::null, std::function<void(const LLUUID&)> created_cb = NULL);
static void editWearable(const LLUUID& item_id);
bool moveWearable(const LLViewerInventoryItem* item, bool closer_to_body);
diff --git a/indra/newview/llaisapi.cpp b/indra/newview/llaisapi.cpp
index 005259bcb8..17e1a27934 100644
--- a/indra/newview/llaisapi.cpp
+++ b/indra/newview/llaisapi.cpp
@@ -29,11 +29,15 @@
#include "llaisapi.h"
#include "llagent.h"
+#include "llappviewer.h"
#include "llcallbacklist.h"
#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
+#include "llnotificationsutil.h"
#include "llsdutil.h"
#include "llviewerregion.h"
-#include "llinventoryobserver.h"
+#include "llvoavatar.h"
+#include "llvoavatarself.h"
#include "llviewercontrol.h"
///----------------------------------------------------------------------------
@@ -43,11 +47,16 @@
//=========================================================================
const std::string AISAPI::INVENTORY_CAP_NAME("InventoryAPIv3");
const std::string AISAPI::LIBRARY_CAP_NAME("LibraryAPIv3");
+const S32 AISAPI::HTTP_TIMEOUT = 180;
std::list<AISAPI::ais_query_item_t> AISAPI::sPostponedQuery;
const S32 MAX_SIMULTANEOUS_COROUTINES = 2048;
+// AIS3 allows '*' requests, but in reality those will be cut at some point
+// Specify own depth to be able to anticipate it and mark folders as incomplete
+const S32 MAX_FOLDER_DEPTH_REQUEST = 50;
+
//-------------------------------------------------------------------------
/*static*/
bool AISAPI::isAvailable()
@@ -93,6 +102,10 @@ void AISAPI::CreateInventory(const LLUUID& parentId, const LLSD& newInventory, c
if (cap.empty())
{
LL_WARNS("Inventory") << "Inventory cap not found!" << LL_ENDL;
+ if (callback)
+ {
+ callback(LLUUID::null);
+ }
return;
}
@@ -100,7 +113,7 @@ void AISAPI::CreateInventory(const LLUUID& parentId, const LLSD& newInventory, c
tid.generate();
std::string url = cap + std::string("/category/") + parentId.asString() + "?tid=" + tid.asString();
- LL_DEBUGS("Inventory") << "url: " << url << LL_ENDL;
+ LL_DEBUGS("Inventory") << "url: " << url << " parentID " << parentId << " newInventory " << newInventory << LL_ENDL;
// I may be suffering from golden hammer here, but the first part of this bind
// is actually a static cast for &HttpCoroutineAdapter::postAndSuspend so that
@@ -124,7 +137,7 @@ void AISAPI::CreateInventory(const LLUUID& parentId, const LLSD& newInventory, c
(&LLCoreHttpUtil::HttpCoroutineAdapter::postAndSuspend), _1, _2, _3, _4, _5, _6);
LLCoprocedureManager::CoProcedure_t proc(boost::bind(&AISAPI::InvokeAISCommandCoro,
- _1, postFn, url, parentId, newInventory, callback, COPYINVENTORY));
+ _1, postFn, url, parentId, newInventory, callback, CREATEINVENTORY));
EnqueueAISCommand("CreateInventory", proc);
}
@@ -135,6 +148,10 @@ void AISAPI::SlamFolder(const LLUUID& folderId, const LLSD& newInventory, comple
if (cap.empty())
{
LL_WARNS("Inventory") << "Inventory cap not found!" << LL_ENDL;
+ if (callback)
+ {
+ callback(LLUUID::null);
+ }
return;
}
@@ -170,6 +187,10 @@ void AISAPI::RemoveCategory(const LLUUID &categoryId, completion_t callback)
if (cap.empty())
{
LL_WARNS("Inventory") << "Inventory cap not found!" << LL_ENDL;
+ if (callback)
+ {
+ callback(LLUUID::null);
+ }
return;
}
@@ -203,6 +224,10 @@ void AISAPI::RemoveItem(const LLUUID &itemId, completion_t callback)
if (cap.empty())
{
LL_WARNS("Inventory") << "Inventory cap not found!" << LL_ENDL;
+ if (callback)
+ {
+ callback(LLUUID::null);
+ }
return;
}
@@ -235,6 +260,10 @@ void AISAPI::CopyLibraryCategory(const LLUUID& sourceId, const LLUUID& destId, b
if (cap.empty())
{
LL_WARNS("Inventory") << "Library cap not found!" << LL_ENDL;
+ if (callback)
+ {
+ callback(LLUUID::null);
+ }
return;
}
@@ -279,6 +308,10 @@ void AISAPI::PurgeDescendents(const LLUUID &categoryId, completion_t callback)
if (cap.empty())
{
LL_WARNS("Inventory") << "Inventory cap not found!" << LL_ENDL;
+ if (callback)
+ {
+ callback(LLUUID::null);
+ }
return;
}
@@ -313,6 +346,10 @@ void AISAPI::UpdateCategory(const LLUUID &categoryId, const LLSD &updates, compl
if (cap.empty())
{
LL_WARNS("Inventory") << "Inventory cap not found!" << LL_ENDL;
+ if (callback)
+ {
+ callback(LLUUID::null);
+ }
return;
}
std::string url = cap + std::string("/category/") + categoryId.asString();
@@ -345,6 +382,10 @@ void AISAPI::UpdateItem(const LLUUID &itemId, const LLSD &updates, completion_t
if (cap.empty())
{
LL_WARNS("Inventory") << "Inventory cap not found!" << LL_ENDL;
+ if (callback)
+ {
+ callback(LLUUID::null);
+ }
return;
}
std::string url = cap + std::string("/item/") + itemId.asString();
@@ -368,6 +409,380 @@ void AISAPI::UpdateItem(const LLUUID &itemId, const LLSD &updates, completion_t
}
/*static*/
+void AISAPI::FetchItem(const LLUUID &itemId, ITEM_TYPE type, completion_t callback)
+{
+ std::string cap;
+
+ cap = (type == INVENTORY) ? getInvCap() : getLibCap();
+ if (cap.empty())
+ {
+ LL_WARNS("Inventory") << "Inventory cap not found!" << LL_ENDL;
+ if (callback)
+ {
+ callback(LLUUID::null);
+ }
+ return;
+ }
+ std::string url = cap + std::string("/item/") + itemId.asString();
+
+ invokationFn_t getFn = boost::bind(
+ // Humans ignore next line. It is just a cast to specify which LLCoreHttpUtil::HttpCoroutineAdapter routine overload.
+ static_cast<LLSD(LLCoreHttpUtil::HttpCoroutineAdapter::*)(LLCore::HttpRequest::ptr_t, const std::string &, LLCore::HttpOptions::ptr_t, LLCore::HttpHeaders::ptr_t)>
+ //----
+ // _1 -> httpAdapter
+ // _2 -> httpRequest
+ // _3 -> url
+ // _4 -> body
+ // _5 -> httpOptions
+ // _6 -> httpHeaders
+ (&LLCoreHttpUtil::HttpCoroutineAdapter::getAndSuspend), _1, _2, _3, _5, _6);
+
+ LLCoprocedureManager::CoProcedure_t proc(boost::bind(&AISAPI::InvokeAISCommandCoro,
+ _1, getFn, url, itemId, LLSD(), callback, FETCHITEM));
+
+ EnqueueAISCommand("FetchItem", proc);
+}
+
+/*static*/
+void AISAPI::FetchCategoryChildren(const LLUUID &catId, ITEM_TYPE type, bool recursive, completion_t callback, S32 depth)
+{
+ std::string cap;
+
+ cap = (type == INVENTORY) ? getInvCap() : getLibCap();
+ if (cap.empty())
+ {
+ LL_WARNS("Inventory") << "Inventory cap not found!" << LL_ENDL;
+ if (callback)
+ {
+ callback(LLUUID::null);
+ }
+ return;
+ }
+ std::string url = cap + std::string("/category/") + catId.asString() + "/children";
+
+ if (recursive)
+ {
+ // can specify depth=*, but server side is going to cap requests
+ // and reject everything 'over the top',.
+ depth = MAX_FOLDER_DEPTH_REQUEST;
+ }
+ else
+ {
+ depth = llmin(depth, MAX_FOLDER_DEPTH_REQUEST);
+ }
+
+ url += "?depth=" + std::to_string(depth);
+
+ invokationFn_t getFn = boost::bind(
+ // Humans ignore next line. It is just a cast to specify which LLCoreHttpUtil::HttpCoroutineAdapter routine overload.
+ static_cast<LLSD(LLCoreHttpUtil::HttpCoroutineAdapter::*)(LLCore::HttpRequest::ptr_t, const std::string &, LLCore::HttpOptions::ptr_t, LLCore::HttpHeaders::ptr_t)>
+ //----
+ // _1 -> httpAdapter
+ // _2 -> httpRequest
+ // _3 -> url
+ // _4 -> body
+ // _5 -> httpOptions
+ // _6 -> httpHeaders
+ (&LLCoreHttpUtil::HttpCoroutineAdapter::getAndSuspend), _1, _2, _3, _5, _6);
+
+ // get doesn't use body, can pass additional data
+ LLSD body;
+ body["depth"] = depth;
+ LLCoprocedureManager::CoProcedure_t proc(boost::bind(&AISAPI::InvokeAISCommandCoro,
+ _1, getFn, url, catId, body, callback, FETCHCATEGORYCHILDREN));
+
+ EnqueueAISCommand("FetchCategoryChildren", proc);
+}
+
+// some folders can be requested by name, like
+// animatn | bodypart | clothing | current | favorite | gesture | inbox | landmark | lsltext
+// lstndfnd | my_otfts | notecard | object | outbox | root | snapshot | sound | texture | trash
+void AISAPI::FetchCategoryChildren(const std::string &identifier, bool recursive, completion_t callback, S32 depth)
+{
+ std::string cap;
+
+ cap = getInvCap();
+ if (cap.empty())
+ {
+ LL_WARNS("Inventory") << "Inventory cap not found!" << LL_ENDL;
+ if (callback)
+ {
+ callback(LLUUID::null);
+ }
+ return;
+ }
+ std::string url = cap + std::string("/category/") + identifier + "/children";
+
+ if (recursive)
+ {
+ // can specify depth=*, but server side is going to cap requests
+ // and reject everything 'over the top',.
+ depth = MAX_FOLDER_DEPTH_REQUEST;
+ }
+ else
+ {
+ depth = llmin(depth, MAX_FOLDER_DEPTH_REQUEST);
+ }
+
+ url += "?depth=" + std::to_string(depth);
+
+ invokationFn_t getFn = boost::bind(
+ // Humans ignore next line. It is just a cast to specify which LLCoreHttpUtil::HttpCoroutineAdapter routine overload.
+ static_cast<LLSD(LLCoreHttpUtil::HttpCoroutineAdapter::*)(LLCore::HttpRequest::ptr_t, const std::string &, LLCore::HttpOptions::ptr_t, LLCore::HttpHeaders::ptr_t)>
+ //----
+ // _1 -> httpAdapter
+ // _2 -> httpRequest
+ // _3 -> url
+ // _4 -> body
+ // _5 -> httpOptions
+ // _6 -> httpHeaders
+ (&LLCoreHttpUtil::HttpCoroutineAdapter::getAndSuspend), _1, _2, _3, _5, _6);
+
+ // get doesn't use body, can pass additional data
+ LLSD body;
+ body["depth"] = depth;
+ LLCoprocedureManager::CoProcedure_t proc(boost::bind(&AISAPI::InvokeAISCommandCoro,
+ _1, getFn, url, LLUUID::null, body, callback, FETCHCATEGORYCHILDREN));
+
+ EnqueueAISCommand("FetchCategoryChildren", proc);
+}
+
+/*static*/
+void AISAPI::FetchCategoryCategories(const LLUUID &catId, ITEM_TYPE type, bool recursive, completion_t callback, S32 depth)
+{
+ std::string cap;
+
+ cap = (type == INVENTORY) ? getInvCap() : getLibCap();
+ if (cap.empty())
+ {
+ LL_WARNS("Inventory") << "Inventory cap not found!" << LL_ENDL;
+ if (callback)
+ {
+ callback(LLUUID::null);
+ }
+ return;
+ }
+ std::string url = cap + std::string("/category/") + catId.asString() + "/categories";
+
+ if (recursive)
+ {
+ // can specify depth=*, but server side is going to cap requests
+ // and reject everything 'over the top',.
+ depth = MAX_FOLDER_DEPTH_REQUEST;
+ }
+ else
+ {
+ depth = llmin(depth, MAX_FOLDER_DEPTH_REQUEST);
+ }
+
+ url += "?depth=" + std::to_string(depth);
+
+ invokationFn_t getFn = boost::bind(
+ // Humans ignore next line. It is just a cast to specify which LLCoreHttpUtil::HttpCoroutineAdapter routine overload.
+ static_cast<LLSD(LLCoreHttpUtil::HttpCoroutineAdapter::*)(LLCore::HttpRequest::ptr_t, const std::string &, LLCore::HttpOptions::ptr_t, LLCore::HttpHeaders::ptr_t)>
+ //----
+ // _1 -> httpAdapter
+ // _2 -> httpRequest
+ // _3 -> url
+ // _4 -> body
+ // _5 -> httpOptions
+ // _6 -> httpHeaders
+ (&LLCoreHttpUtil::HttpCoroutineAdapter::getAndSuspend), _1, _2, _3, _5, _6);
+
+ // get doesn't use body, can pass additional data
+ LLSD body;
+ body["depth"] = depth;
+ LLCoprocedureManager::CoProcedure_t proc(boost::bind(&AISAPI::InvokeAISCommandCoro,
+ _1, getFn, url, catId, body, callback, FETCHCATEGORYCATEGORIES));
+
+ EnqueueAISCommand("FetchCategoryCategories", proc);
+}
+
+void AISAPI::FetchCategorySubset(const LLUUID& catId,
+ const uuid_vec_t specificChildren,
+ ITEM_TYPE type,
+ bool recursive,
+ completion_t callback,
+ S32 depth)
+{
+ std::string cap = (type == INVENTORY) ? getInvCap() : getLibCap();
+ if (cap.empty())
+ {
+ LL_WARNS("Inventory") << "Inventory cap not found!" << LL_ENDL;
+ if (callback)
+ {
+ callback(LLUUID::null);
+ }
+ return;
+ }
+ if (specificChildren.empty())
+ {
+ LL_WARNS("Inventory") << "Empty request!" << LL_ENDL;
+ if (callback)
+ {
+ callback(LLUUID::null);
+ }
+ return;
+ }
+ // category/any_folder_id/children?depth=*&children=child_id1,child_id2,child_id3
+ std::string url = cap + std::string("/category/") + catId.asString() + "/children";
+
+ if (recursive)
+ {
+ depth = MAX_FOLDER_DEPTH_REQUEST;
+ }
+ else
+ {
+ depth = llmin(depth, MAX_FOLDER_DEPTH_REQUEST);
+ }
+
+ uuid_vec_t::const_iterator iter = specificChildren.begin();
+ uuid_vec_t::const_iterator end = specificChildren.end();
+
+ url += "?depth=" + std::to_string(depth) + "&children=" + iter->asString();
+ iter++;
+
+ while (iter != end)
+ {
+ url += "," + iter->asString();
+ iter++;
+ }
+
+ const S32 MAX_URL_LENGH = 2000; // RFC documentation specifies a maximum length of 2048
+ if (url.length() > MAX_URL_LENGH)
+ {
+ LL_WARNS("Inventory") << "Request url is too long, url: " << url << LL_ENDL;
+ }
+
+ invokationFn_t getFn = boost::bind(
+ // Humans ignore next line. It is just a cast to specify which LLCoreHttpUtil::HttpCoroutineAdapter routine overload.
+ static_cast<LLSD(LLCoreHttpUtil::HttpCoroutineAdapter::*)(LLCore::HttpRequest::ptr_t, const std::string&, LLCore::HttpOptions::ptr_t, LLCore::HttpHeaders::ptr_t)>
+ //----
+ // _1 -> httpAdapter
+ // _2 -> httpRequest
+ // _3 -> url
+ // _4 -> body
+ // _5 -> httpOptions
+ // _6 -> httpHeaders
+ (&LLCoreHttpUtil::HttpCoroutineAdapter::getAndSuspend), _1, _2, _3, _5, _6);
+
+ // get doesn't use body, can pass additional data
+ LLSD body;
+ body["depth"] = depth;
+ LLCoprocedureManager::CoProcedure_t proc(boost::bind(&AISAPI::InvokeAISCommandCoro,
+ _1, getFn, url, catId, body, callback, FETCHCATEGORYSUBSET));
+
+ EnqueueAISCommand("FetchCategorySubset", proc);
+}
+
+/*static*/
+// Will get COF folder, links in it and items those links point to
+void AISAPI::FetchCOF(completion_t callback)
+{
+ std::string cap = getInvCap();
+ if (cap.empty())
+ {
+ LL_WARNS("Inventory") << "Inventory cap not found!" << LL_ENDL;
+ if (callback)
+ {
+ callback(LLUUID::null);
+ }
+ return;
+ }
+ std::string url = cap + std::string("/category/current/links");
+
+ invokationFn_t getFn = boost::bind(
+ // Humans ignore next line. It is just a cast to specify which LLCoreHttpUtil::HttpCoroutineAdapter routine overload.
+ static_cast<LLSD(LLCoreHttpUtil::HttpCoroutineAdapter::*)(LLCore::HttpRequest::ptr_t, const std::string&, LLCore::HttpOptions::ptr_t, LLCore::HttpHeaders::ptr_t)>
+ //----
+ // _1 -> httpAdapter
+ // _2 -> httpRequest
+ // _3 -> url
+ // _4 -> body
+ // _5 -> httpOptions
+ // _6 -> httpHeaders
+ (&LLCoreHttpUtil::HttpCoroutineAdapter::getAndSuspend), _1, _2, _3, _5, _6);
+
+ LLSD body;
+ // Only cof folder will be full, but cof can contain an outfit
+ // link with embedded outfit folder for request to parse
+ body["depth"] = 0;
+ LLCoprocedureManager::CoProcedure_t proc(boost::bind(&AISAPI::InvokeAISCommandCoro,
+ _1, getFn, url, LLUUID::null, body, callback, FETCHCOF));
+
+ EnqueueAISCommand("FetchCOF", proc);
+}
+
+void AISAPI::FetchCategoryLinks(const LLUUID &catId, completion_t callback)
+{
+ std::string cap = getInvCap();
+ if (cap.empty())
+ {
+ LL_WARNS("Inventory") << "Inventory cap not found!" << LL_ENDL;
+ if (callback)
+ {
+ callback(LLUUID::null);
+ }
+ return;
+ }
+ std::string url = cap + std::string("/category/") + catId.asString() + "/links";
+
+ invokationFn_t getFn = boost::bind(
+ // Humans ignore next line. It is just a cast to specify which LLCoreHttpUtil::HttpCoroutineAdapter routine overload.
+ static_cast<LLSD (LLCoreHttpUtil::HttpCoroutineAdapter::*)(LLCore::HttpRequest::ptr_t, const std::string &,
+ LLCore::HttpOptions::ptr_t, LLCore::HttpHeaders::ptr_t)>
+ //----
+ // _1 -> httpAdapter
+ // _2 -> httpRequest
+ // _3 -> url
+ // _4 -> body
+ // _5 -> httpOptions
+ // _6 -> httpHeaders
+ (&LLCoreHttpUtil::HttpCoroutineAdapter::getAndSuspend),
+ _1, _2, _3, _5, _6);
+
+ LLSD body;
+ body["depth"] = 0;
+ LLCoprocedureManager::CoProcedure_t proc(
+ boost::bind(&AISAPI::InvokeAISCommandCoro, _1, getFn, url, LLUUID::null, body, callback, FETCHCATEGORYLINKS));
+
+ EnqueueAISCommand("FetchCategoryLinks", proc);
+}
+
+/*static*/
+void AISAPI::FetchOrphans(completion_t callback)
+{
+ std::string cap = getInvCap();
+ if (cap.empty())
+ {
+ LL_WARNS("Inventory") << "Inventory cap not found!" << LL_ENDL;
+ if (callback)
+ {
+ callback(LLUUID::null);
+ }
+ return;
+ }
+ std::string url = cap + std::string("/orphans");
+
+ invokationFn_t getFn = boost::bind(
+ // Humans ignore next line. It is just a cast to specify which LLCoreHttpUtil::HttpCoroutineAdapter routine overload.
+ static_cast<LLSD(LLCoreHttpUtil::HttpCoroutineAdapter::*)(LLCore::HttpRequest::ptr_t , const std::string& , LLCore::HttpOptions::ptr_t , LLCore::HttpHeaders::ptr_t)>
+ //----
+ // _1 -> httpAdapter
+ // _2 -> httpRequest
+ // _3 -> url
+ // _4 -> body
+ // _5 -> httpOptions
+ // _6 -> httpHeaders
+ (&LLCoreHttpUtil::HttpCoroutineAdapter::getAndSuspend) , _1 , _2 , _3 , _5 , _6);
+
+ LLCoprocedureManager::CoProcedure_t proc(boost::bind(&AISAPI::InvokeAISCommandCoro ,
+ _1 , getFn , url , LLUUID::null , LLSD() , callback , FETCHORPHANS));
+
+ EnqueueAISCommand("FetchOrphans" , proc);
+}
+
+/*static*/
void AISAPI::EnqueueAISCommand(const std::string &procName, LLCoprocedureManager::CoProcedure_t proc)
{
LLCoprocedureManager &inst = LLCoprocedureManager::instance();
@@ -418,21 +833,49 @@ void AISAPI::onIdle(void *userdata)
}
/*static*/
+void AISAPI::onUpdateReceived(const LLSD& update, COMMAND_TYPE type, const LLSD& request_body)
+{
+ LLTimer timer;
+ if ( (type == UPDATECATEGORY || type == UPDATEITEM)
+ && gSavedSettings.getBOOL("DebugAvatarAppearanceMessage"))
+ {
+ dump_sequential_xml(gAgentAvatarp->getFullname() + "_ais_update", update);
+ }
+
+ AISUpdate ais_update(update, type, request_body);
+ ais_update.doUpdate(); // execute the updates in the appropriate order.
+ LL_DEBUGS("Inventory", "AIS3") << "Elapsed processing: " << timer.getElapsedTimeF32() << LL_ENDL;
+}
+
+/*static*/
void AISAPI::InvokeAISCommandCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter,
invokationFn_t invoke, std::string url,
LLUUID targetId, LLSD body, completion_t callback, COMMAND_TYPE type)
{
+ if (gDisconnected)
+ {
+ if (callback)
+ {
+ callback(LLUUID::null);
+ }
+ return;
+ }
+
LLCore::HttpOptions::ptr_t httpOptions(new LLCore::HttpOptions);
LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest());
LLCore::HttpHeaders::ptr_t httpHeaders;
- httpOptions->setTimeout(LLCoreHttpUtil::HTTP_REQUEST_EXPIRY_SECS);
+ httpOptions->setTimeout(HTTP_TIMEOUT);
- LL_DEBUGS("Inventory") << "url: " << url << LL_ENDL;
+ LL_DEBUGS("Inventory") << "Request url: " << url << LL_ENDL;
- LLSD result = invoke(httpAdapter, httpRequest, url, body, httpOptions, httpHeaders);
- LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
- LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
+ LLSD result;
+ LLSD httpResults;
+ LLCore::HttpStatus status;
+
+ result = invoke(httpAdapter , httpRequest , url , body , httpOptions , httpHeaders);
+ httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
+ status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
if (!status || !result.isMap())
{
@@ -474,29 +917,127 @@ void AISAPI::InvokeAISCommandCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t ht
}
}
}
+ else if (status == LLCore::HttpStatus(HTTP_FORBIDDEN) /*403*/)
+ {
+ if (type == FETCHCATEGORYCHILDREN)
+ {
+ if (body.has("depth") && body["depth"].asInteger() == 0)
+ {
+ // Can't fetch a single folder with depth 0, folder is too big.
+ static bool first_call = true;
+ if (first_call)
+ {
+ first_call = false;
+ LLNotificationsUtil::add("InventoryLimitReachedAISAlert");
+ }
+ else
+ {
+ LLNotificationsUtil::add("InventoryLimitReachedAIS");
+ }
+ LL_WARNS("Inventory") << "Fetch failed, content is over limit, url: " << url << LL_ENDL;
+ }
+ else
+ {
+ // Result was too big, but situation is recoverable by requesting with lower depth
+ LL_DEBUGS("Inventory") << "Fetch failed, content is over limit, url: " << url << LL_ENDL;
+ }
+ }
+ }
LL_WARNS("Inventory") << "Inventory error: " << status.toString() << LL_ENDL;
LL_WARNS("Inventory") << ll_pretty_print_sd(result) << LL_ENDL;
}
- gInventory.onAISUpdateReceived("AISCommand", result);
+ LL_DEBUGS("Inventory", "AIS3") << "Result: " << result << LL_ENDL;
+ onUpdateReceived(result, type, body);
if (callback && !callback.empty())
- {
+ {
+ bool needs_callback = true;
LLUUID id(LLUUID::null);
- if (result.has("category_id") && (type == COPYLIBRARYCATEGORY))
- {
- id = result["category_id"];
- }
+ switch (type)
+ {
+ case COPYLIBRARYCATEGORY:
+ case FETCHCATEGORYCATEGORIES:
+ case FETCHCATEGORYCHILDREN:
+ case FETCHCATEGORYSUBSET:
+ case FETCHCATEGORYLINKS:
+ case FETCHCOF:
+ if (result.has("category_id"))
+ {
+ id = result["category_id"];
+ }
+ break;
+ case FETCHITEM:
+ if (result.has("item_id"))
+ {
+ // Error message might contain an item_id!!!
+ id = result["item_id"];
+ }
+ if (result.has("linked_id"))
+ {
+ id = result["linked_id"];
+ }
+ break;
+ case CREATEINVENTORY:
+ // CREATEINVENTORY can have multiple callbacks
+ if (result.has("_created_categories"))
+ {
+ LLSD& cats = result["_created_categories"];
+ LLSD::array_const_iterator cat_iter;
+ for (cat_iter = cats.beginArray(); cat_iter != cats.endArray(); ++cat_iter)
+ {
+ LLUUID cat_id = *cat_iter;
+ callback(cat_id);
+ needs_callback = false;
+ }
+ }
+ if (result.has("_created_items"))
+ {
+ LLSD& items = result["_created_items"];
+ LLSD::array_const_iterator item_iter;
+ for (item_iter = items.beginArray(); item_iter != items.endArray(); ++item_iter)
+ {
+ LLUUID item_id = *item_iter;
+ callback(item_id);
+ needs_callback = false;
+ }
+ }
+ break;
+ default:
+ break;
+ }
- callback(id);
+ if (needs_callback)
+ {
+ // Call callback at least once regardless of failure.
+ // UPDATEITEM doesn't expect an id
+ callback(id);
+ }
}
}
//-------------------------------------------------------------------------
-AISUpdate::AISUpdate(const LLSD& update)
+AISUpdate::AISUpdate(const LLSD& update, AISAPI::COMMAND_TYPE type, const LLSD& request_body)
+: mType(type)
{
+ mFetch = (type == AISAPI::FETCHITEM)
+ || (type == AISAPI::FETCHCATEGORYCHILDREN)
+ || (type == AISAPI::FETCHCATEGORYCATEGORIES)
+ || (type == AISAPI::FETCHCATEGORYSUBSET)
+ || (type == AISAPI::FETCHCOF)
+ || (type == AISAPI::FETCHCATEGORYLINKS)
+ || (type == AISAPI::FETCHORPHANS);
+ // parse update llsd into stuff to do or parse received items.
+ mFetchDepth = MAX_FOLDER_DEPTH_REQUEST;
+ if (mFetch && request_body.has("depth"))
+ {
+ mFetchDepth = request_body["depth"].asInteger();
+ }
+
+ mTimer.setTimerExpirySec(AIS_EXPIRY_SECONDS);
+ mTimer.start();
parseUpdate(update);
}
@@ -506,6 +1047,7 @@ void AISUpdate::clearParseResults()
mCatDescendentsKnown.clear();
mCatVersionsUpdated.clear();
mItemsCreated.clear();
+ mItemsLost.clear();
mItemsUpdated.clear();
mCategoriesCreated.clear();
mCategoriesUpdated.clear();
@@ -514,6 +1056,16 @@ void AISUpdate::clearParseResults()
mCategoryIds.clear();
}
+void AISUpdate::checkTimeout()
+{
+ if (mTimer.hasExpired())
+ {
+ llcoro::suspend();
+ LLCoros::checkStop();
+ mTimer.setTimerExpirySec(AIS_EXPIRY_SECONDS);
+ }
+}
+
void AISUpdate::parseUpdate(const LLSD& update)
{
clearParseResults();
@@ -601,24 +1153,37 @@ void AISUpdate::parseMeta(const LLSD& update)
void AISUpdate::parseContent(const LLSD& update)
{
- if (update.has("linked_id"))
+ // Errors from a fetch request might contain id without
+ // full item or folder.
+ // Todo: Depending on error we might want to do something,
+ // like removing a 404 item or refetching parent folder
+ if (update.has("linked_id") && update.has("parent_id"))
{
- parseLink(update);
+ parseLink(update, mFetchDepth);
}
- else if (update.has("item_id"))
+ else if (update.has("item_id") && update.has("parent_id"))
{
parseItem(update);
}
- if (update.has("category_id"))
- {
- parseCategory(update);
- }
+ if (mType == AISAPI::FETCHCATEGORYSUBSET)
+ {
+ // initial category is incomplete, don't process it,
+ // go for content instead
+ if (update.has("_embedded"))
+ {
+ parseEmbedded(update["_embedded"], mFetchDepth - 1);
+ }
+ }
+ else if (update.has("category_id") && update.has("parent_id"))
+ {
+ parseCategory(update, mFetchDepth);
+ }
else
{
if (update.has("_embedded"))
{
- parseEmbedded(update["_embedded"]);
+ parseEmbedded(update["_embedded"], mFetchDepth);
}
}
}
@@ -636,7 +1201,17 @@ void AISUpdate::parseItem(const LLSD& item_map)
BOOL rv = new_item->unpackMessage(item_map);
if (rv)
{
- if (curr_item)
+ if (mFetch)
+ {
+ mItemsCreated[item_id] = new_item;
+ new_item->setComplete(true);
+
+ if (new_item->getParentUUID().isNull())
+ {
+ mItemsLost[item_id] = new_item;
+ }
+ }
+ else if (curr_item)
{
mItemsUpdated[item_id] = new_item;
// This statement is here to cause a new entry with 0
@@ -648,6 +1223,7 @@ void AISUpdate::parseItem(const LLSD& item_map)
{
mItemsCreated[item_id] = new_item;
mCatDescendentDeltas[new_item->getParentUUID()]++;
+ new_item->setComplete(true);
}
}
else
@@ -657,7 +1233,7 @@ void AISUpdate::parseItem(const LLSD& item_map)
}
}
-void AISUpdate::parseLink(const LLSD& link_map)
+void AISUpdate::parseLink(const LLSD& link_map, S32 depth)
{
LLUUID item_id = link_map["item_id"].asUUID();
LLPointer<LLViewerInventoryItem> new_link(new LLViewerInventoryItem);
@@ -671,7 +1247,24 @@ void AISUpdate::parseLink(const LLSD& link_map)
if (rv)
{
const LLUUID& parent_id = new_link->getParentUUID();
- if (curr_link)
+ if (mFetch)
+ {
+ LLPermissions default_perms;
+ default_perms.init(gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null);
+ default_perms.initMasks(PERM_NONE, PERM_NONE, PERM_NONE, PERM_NONE, PERM_NONE);
+ new_link->setPermissions(default_perms);
+ LLSaleInfo default_sale_info;
+ new_link->setSaleInfo(default_sale_info);
+ //LL_DEBUGS("Inventory") << "creating link from llsd: " << ll_pretty_print_sd(link_map) << LL_ENDL;
+ mItemsCreated[item_id] = new_link;
+ new_link->setComplete(true);
+
+ if (new_link->getParentUUID().isNull())
+ {
+ mItemsLost[item_id] = new_link;
+ }
+ }
+ else if (curr_link)
{
mItemsUpdated[item_id] = new_link;
// This statement is here to cause a new entry with 0
@@ -690,7 +1283,13 @@ void AISUpdate::parseLink(const LLSD& link_map)
//LL_DEBUGS("Inventory") << "creating link from llsd: " << ll_pretty_print_sd(link_map) << LL_ENDL;
mItemsCreated[item_id] = new_link;
mCatDescendentDeltas[parent_id]++;
+ new_link->setComplete(true);
}
+
+ if (link_map.has("_embedded"))
+ {
+ parseEmbedded(link_map["_embedded"], depth);
+ }
}
else
{
@@ -700,19 +1299,30 @@ void AISUpdate::parseLink(const LLSD& link_map)
}
-void AISUpdate::parseCategory(const LLSD& category_map)
+void AISUpdate::parseCategory(const LLSD& category_map, S32 depth)
{
- LLUUID category_id = category_map["category_id"].asUUID();
+ LLUUID category_id = category_map["category_id"].asUUID();
+ S32 version = LLViewerInventoryCategory::VERSION_UNKNOWN;
- // Check descendent count first, as it may be needed
- // to populate newly created categories
- if (category_map.has("_embedded"))
- {
- parseDescendentCount(category_id, category_map["_embedded"]);
- }
+ if (category_map.has("version"))
+ {
+ version = category_map["version"].asInteger();
+ }
+
+ LLViewerInventoryCategory *curr_cat = gInventory.getCategory(category_id);
+
+ if (curr_cat
+ && curr_cat->getVersion() > LLViewerInventoryCategory::VERSION_UNKNOWN
+ && curr_cat->getDescendentCount() != LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN
+ && version > LLViewerInventoryCategory::VERSION_UNKNOWN
+ && version < curr_cat->getVersion())
+ {
+ LL_WARNS() << "Got stale folder, known: " << curr_cat->getVersion()
+ << ", received: " << version << LL_ENDL;
+ return;
+ }
LLPointer<LLViewerInventoryCategory> new_cat;
- LLViewerInventoryCategory *curr_cat = gInventory.getCategory(category_id);
if (curr_cat)
{
// Default to current values where not provided.
@@ -732,13 +1342,58 @@ void AISUpdate::parseCategory(const LLSD& category_map)
}
BOOL rv = new_cat->unpackMessage(category_map);
// *NOTE: unpackMessage does not unpack version or descendent count.
- //if (category_map.has("version"))
- //{
- // mCatVersionsUpdated[category_id] = category_map["version"].asInteger();
- //}
if (rv)
{
- if (curr_cat)
+ // Check descendent count first, as it may be needed
+ // to populate newly created categories
+ if (category_map.has("_embedded"))
+ {
+ parseDescendentCount(category_id, new_cat->getPreferredType(), category_map["_embedded"]);
+ }
+
+ if (mFetch)
+ {
+ uuid_int_map_t::const_iterator lookup_it = mCatDescendentsKnown.find(category_id);
+ if (mCatDescendentsKnown.end() != lookup_it)
+ {
+ S32 descendent_count = lookup_it->second;
+ LL_DEBUGS("Inventory") << "Setting descendents count to " << descendent_count
+ << " for category " << category_id << LL_ENDL;
+ new_cat->setDescendentCount(descendent_count);
+
+ // set version only if we are sure this update has full data and embeded items
+ // since viewer uses version to decide if folder and content still need fetching
+ if (version > LLViewerInventoryCategory::VERSION_UNKNOWN
+ && depth >= 0)
+ {
+ if (curr_cat && curr_cat->getVersion() > version)
+ {
+ LL_WARNS("Inventory") << "Version was " << curr_cat->getVersion()
+ << ", but fetch returned version " << version
+ << " for category " << category_id << LL_ENDL;
+ }
+ else
+ {
+ LL_DEBUGS("Inventory") << "Setting version to " << version
+ << " for category " << category_id << LL_ENDL;
+ }
+
+ new_cat->setVersion(version);
+ }
+ }
+ else if (curr_cat
+ && curr_cat->getVersion() > LLViewerInventoryCategory::VERSION_UNKNOWN
+ && version > curr_cat->getVersion())
+ {
+ // Potentially should new_cat->setVersion(unknown) here,
+ // but might be waiting for a callback that would increment
+ LL_DEBUGS("Inventory") << "Category " << category_id
+ << " is stale. Known version: " << curr_cat->getVersion()
+ << " server version: " << version << LL_ENDL;
+ }
+ mCategoriesCreated[category_id] = new_cat;
+ }
+ else if (curr_cat)
{
mCategoriesUpdated[category_id] = new_cat;
// This statement is here to cause a new entry with 0
@@ -751,20 +1406,22 @@ void AISUpdate::parseCategory(const LLSD& category_map)
else
{
// Set version/descendents for newly created categories.
- if (category_map.has("version"))
- {
- S32 version = category_map["version"].asInteger();
- LL_DEBUGS("Inventory") << "Setting version to " << version
- << " for new category " << category_id << LL_ENDL;
- new_cat->setVersion(version);
- }
- uuid_int_map_t::const_iterator lookup_it = mCatDescendentsKnown.find(category_id);
- if (mCatDescendentsKnown.end() != lookup_it)
- {
- S32 descendent_count = lookup_it->second;
- LL_DEBUGS("Inventory") << "Setting descendents count to " << descendent_count
- << " for new category " << category_id << LL_ENDL;
- new_cat->setDescendentCount(descendent_count);
+ uuid_int_map_t::const_iterator lookup_it = mCatDescendentsKnown.find(category_id);
+ if (mCatDescendentsKnown.end() != lookup_it)
+ {
+ S32 descendent_count = lookup_it->second;
+ LL_DEBUGS("Inventory") << "Setting descendents count to " << descendent_count
+ << " for new category " << category_id << LL_ENDL;
+ new_cat->setDescendentCount(descendent_count);
+
+ // Don't set version unles correct children count is present
+ if (category_map.has("version"))
+ {
+ S32 version = category_map["version"].asInteger();
+ LL_DEBUGS("Inventory") << "Setting version to " << version
+ << " for new category " << category_id << LL_ENDL;
+ new_cat->setVersion(version);
+ }
}
mCategoriesCreated[category_id] = new_cat;
mCatDescendentDeltas[new_cat->getParentUUID()]++;
@@ -779,28 +1436,35 @@ void AISUpdate::parseCategory(const LLSD& category_map)
// Check for more embedded content.
if (category_map.has("_embedded"))
{
- parseEmbedded(category_map["_embedded"]);
+ parseEmbedded(category_map["_embedded"], depth - 1);
}
}
-void AISUpdate::parseDescendentCount(const LLUUID& category_id, const LLSD& embedded)
+void AISUpdate::parseDescendentCount(const LLUUID& category_id, LLFolderType::EType type, const LLSD& embedded)
{
- // We can only determine true descendent count if this contains all descendent types.
- if (embedded.has("categories") &&
- embedded.has("links") &&
- embedded.has("items"))
- {
- mCatDescendentsKnown[category_id] = embedded["categories"].size();
- mCatDescendentsKnown[category_id] += embedded["links"].size();
- mCatDescendentsKnown[category_id] += embedded["items"].size();
- }
+ // We can only determine true descendent count if this contains all descendent types.
+ if (embedded.has("categories") &&
+ embedded.has("links") &&
+ embedded.has("items"))
+ {
+ mCatDescendentsKnown[category_id] = embedded["categories"].size();
+ mCatDescendentsKnown[category_id] += embedded["links"].size();
+ mCatDescendentsKnown[category_id] += embedded["items"].size();
+ }
+ else if (mFetch && embedded.has("links") && (type == LLFolderType::FT_CURRENT_OUTFIT || type == LLFolderType::FT_OUTFIT))
+ {
+ // COF and outfits contain links only
+ mCatDescendentsKnown[category_id] = embedded["links"].size();
+ }
}
-void AISUpdate::parseEmbedded(const LLSD& embedded)
+void AISUpdate::parseEmbedded(const LLSD& embedded, S32 depth)
{
+ checkTimeout();
+
if (embedded.has("links")) // _embedded in a category
{
- parseEmbeddedLinks(embedded["links"]);
+ parseEmbeddedLinks(embedded["links"], depth);
}
if (embedded.has("items")) // _embedded in a category
{
@@ -812,11 +1476,11 @@ void AISUpdate::parseEmbedded(const LLSD& embedded)
}
if (embedded.has("categories")) // _embedded in a category
{
- parseEmbeddedCategories(embedded["categories"]);
+ parseEmbeddedCategories(embedded["categories"], depth);
}
if (embedded.has("category")) // _embedded in a link
{
- parseEmbeddedCategory(embedded["category"]);
+ parseEmbeddedCategory(embedded["category"], depth);
}
}
@@ -833,7 +1497,7 @@ void AISUpdate::parseUUIDArray(const LLSD& content, const std::string& name, uui
}
}
-void AISUpdate::parseEmbeddedLinks(const LLSD& links)
+void AISUpdate::parseEmbeddedLinks(const LLSD& links, S32 depth)
{
for(LLSD::map_const_iterator linkit = links.beginMap(),
linkend = links.endMap();
@@ -841,13 +1505,13 @@ void AISUpdate::parseEmbeddedLinks(const LLSD& links)
{
const LLUUID link_id((*linkit).first);
const LLSD& link_map = (*linkit).second;
- if (mItemIds.end() == mItemIds.find(link_id))
+ if (!mFetch && mItemIds.end() == mItemIds.find(link_id))
{
LL_DEBUGS("Inventory") << "Ignoring link not in items list " << link_id << LL_ENDL;
}
else
{
- parseLink(link_map);
+ parseLink(link_map, depth);
}
}
}
@@ -857,7 +1521,7 @@ void AISUpdate::parseEmbeddedItem(const LLSD& item)
// a single item (_embedded in a link)
if (item.has("item_id"))
{
- if (mItemIds.end() != mItemIds.find(item["item_id"].asUUID()))
+ if (mFetch || mItemIds.end() != mItemIds.find(item["item_id"].asUUID()))
{
parseItem(item);
}
@@ -873,7 +1537,7 @@ void AISUpdate::parseEmbeddedItems(const LLSD& items)
{
const LLUUID item_id((*itemit).first);
const LLSD& item_map = (*itemit).second;
- if (mItemIds.end() == mItemIds.find(item_id))
+ if (!mFetch && mItemIds.end() == mItemIds.find(item_id))
{
LL_DEBUGS("Inventory") << "Ignoring item not in items list " << item_id << LL_ENDL;
}
@@ -884,19 +1548,19 @@ void AISUpdate::parseEmbeddedItems(const LLSD& items)
}
}
-void AISUpdate::parseEmbeddedCategory(const LLSD& category)
+void AISUpdate::parseEmbeddedCategory(const LLSD& category, S32 depth)
{
// a single category (_embedded in a link)
if (category.has("category_id"))
{
- if (mCategoryIds.end() != mCategoryIds.find(category["category_id"].asUUID()))
+ if (mFetch || mCategoryIds.end() != mCategoryIds.find(category["category_id"].asUUID()))
{
- parseCategory(category);
+ parseCategory(category, depth);
}
}
}
-void AISUpdate::parseEmbeddedCategories(const LLSD& categories)
+void AISUpdate::parseEmbeddedCategories(const LLSD& categories, S32 depth)
{
// a map of categories (_embedded in a category)
for(LLSD::map_const_iterator categoryit = categories.beginMap(),
@@ -905,19 +1569,21 @@ void AISUpdate::parseEmbeddedCategories(const LLSD& categories)
{
const LLUUID category_id((*categoryit).first);
const LLSD& category_map = (*categoryit).second;
- if (mCategoryIds.end() == mCategoryIds.find(category_id))
+ if (!mFetch && mCategoryIds.end() == mCategoryIds.find(category_id))
{
LL_DEBUGS("Inventory") << "Ignoring category not in categories list " << category_id << LL_ENDL;
}
else
{
- parseCategory(category_map);
+ parseCategory(category_map, depth);
}
}
}
void AISUpdate::doUpdate()
{
+ checkTimeout();
+
// Do version/descendant accounting.
for (std::map<LLUUID,S32>::const_iterator catit = mCatDescendentDeltas.begin();
catit != mCatDescendentDeltas.end(); ++catit)
@@ -959,6 +1625,7 @@ void AISUpdate::doUpdate()
}
// CREATE CATEGORIES
+ const S32 MAX_UPDATE_BACKLOG = 50; // stall prevention
for (deferred_category_map_t::const_iterator create_it = mCategoriesCreated.begin();
create_it != mCategoriesCreated.end(); ++create_it)
{
@@ -967,6 +1634,13 @@ void AISUpdate::doUpdate()
gInventory.updateCategory(new_category, LLInventoryObserver::CREATE);
LL_DEBUGS("Inventory") << "created category " << category_id << LL_ENDL;
+
+ // fetching can receive massive amount of items and folders
+ if (gInventory.getChangedIDs().size() > MAX_UPDATE_BACKLOG)
+ {
+ gInventory.notifyObservers();
+ checkTimeout();
+ }
}
// UPDATE CATEGORIES
@@ -991,6 +1665,24 @@ void AISUpdate::doUpdate()
}
}
+ // LOST ITEMS
+ if (!mItemsLost.empty())
+ {
+ LL_INFOS("Inventory") << "Received " << (S32)mItemsLost.size() << " items without a parent" << LL_ENDL;
+ const LLUUID lost_uuid(gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND));
+ if (lost_uuid.notNull())
+ {
+ for (deferred_item_map_t::const_iterator lost_it = mItemsLost.begin();
+ lost_it != mItemsLost.end(); ++lost_it)
+ {
+ LLPointer<LLViewerInventoryItem> new_item = lost_it->second;
+
+ new_item->setParent(lost_uuid);
+ new_item->updateParentOnServer(FALSE);
+ }
+ }
+ }
+
// CREATE ITEMS
for (deferred_item_map_t::const_iterator create_it = mItemsCreated.begin();
create_it != mItemsCreated.end(); ++create_it)
@@ -1003,6 +1695,13 @@ void AISUpdate::doUpdate()
// case this is create.
LL_DEBUGS("Inventory") << "created item " << item_id << LL_ENDL;
gInventory.updateItem(new_item, LLInventoryObserver::CREATE);
+
+ // fetching can receive massive amount of items and folders
+ if (gInventory.getChangedIDs().size() > MAX_UPDATE_BACKLOG)
+ {
+ gInventory.notifyObservers();
+ checkTimeout();
+ }
}
// UPDATE ITEMS
@@ -1063,6 +1762,8 @@ void AISUpdate::doUpdate()
}
}
+ checkTimeout();
+
gInventory.notifyObservers();
}
diff --git a/indra/newview/llaisapi.h b/indra/newview/llaisapi.h
index 856f3fc180..f254f21e42 100644
--- a/indra/newview/llaisapi.h
+++ b/indra/newview/llaisapi.h
@@ -38,6 +38,12 @@
class AISAPI
{
public:
+ static const S32 HTTP_TIMEOUT;
+ typedef enum {
+ INVENTORY,
+ LIBRARY
+ } ITEM_TYPE;
+
typedef boost::function<void(const LLUUID &invItem)> completion_t;
static bool isAvailable();
@@ -50,9 +56,16 @@ public:
static void PurgeDescendents(const LLUUID &categoryId, completion_t callback = completion_t());
static void UpdateCategory(const LLUUID &categoryId, const LLSD &updates, completion_t callback = completion_t());
static void UpdateItem(const LLUUID &itemId, const LLSD &updates, completion_t callback = completion_t());
+ static void FetchItem(const LLUUID &itemId, ITEM_TYPE type, completion_t callback = completion_t());
+ static void FetchCategoryChildren(const LLUUID &catId, ITEM_TYPE type = AISAPI::ITEM_TYPE::INVENTORY, bool recursive = false, completion_t callback = completion_t(), S32 depth = 0);
+ static void FetchCategoryChildren(const std::string &identifier, bool recursive = false, completion_t callback = completion_t(), S32 depth = 0);
+ static void FetchCategoryCategories(const LLUUID &catId, ITEM_TYPE type = AISAPI::ITEM_TYPE::INVENTORY, bool recursive = false, completion_t callback = completion_t(), S32 depth = 0);
+ static void FetchCategorySubset(const LLUUID& catId, const uuid_vec_t specificChildren, ITEM_TYPE type = AISAPI::ITEM_TYPE::INVENTORY, bool recursive = false, completion_t callback = completion_t(), S32 depth = 0);
+ static void FetchCOF(completion_t callback = completion_t());
+ static void FetchCategoryLinks(const LLUUID &catId, completion_t callback = completion_t());
+ static void FetchOrphans(completion_t callback = completion_t() );
static void CopyLibraryCategory(const LLUUID& sourceId, const LLUUID& destId, bool copySubfolders, completion_t callback = completion_t());
-private:
typedef enum {
COPYINVENTORY,
SLAMFOLDER,
@@ -61,9 +74,18 @@ private:
PURGEDESCENDENTS,
UPDATECATEGORY,
UPDATEITEM,
- COPYLIBRARYCATEGORY
+ COPYLIBRARYCATEGORY,
+ CREATEINVENTORY,
+ FETCHITEM,
+ FETCHCATEGORYCHILDREN,
+ FETCHCATEGORYCATEGORIES,
+ FETCHCATEGORYSUBSET,
+ FETCHCOF,
+ FETCHORPHANS,
+ FETCHCATEGORYLINKS
} COMMAND_TYPE;
+private:
static const std::string INVENTORY_CAP_NAME;
static const std::string LIBRARY_CAP_NAME;
@@ -72,6 +94,7 @@ private:
static void EnqueueAISCommand(const std::string &procName, LLCoprocedureManager::CoProcedure_t proc);
static void onIdle(void *userdata); // launches postponed AIS commands
+ static void onUpdateReceived(const LLSD& update, COMMAND_TYPE type, const LLSD& request_body);
static std::string getInvCap();
static std::string getLibCap();
@@ -87,24 +110,29 @@ private:
class AISUpdate
{
public:
- AISUpdate(const LLSD& update);
+ AISUpdate(const LLSD& update, AISAPI::COMMAND_TYPE type, const LLSD& request_body);
void parseUpdate(const LLSD& update);
void parseMeta(const LLSD& update);
void parseContent(const LLSD& update);
void parseUUIDArray(const LLSD& content, const std::string& name, uuid_list_t& ids);
- void parseLink(const LLSD& link_map);
+ void parseLink(const LLSD& link_map, S32 depth);
void parseItem(const LLSD& link_map);
- void parseCategory(const LLSD& link_map);
- void parseDescendentCount(const LLUUID& category_id, const LLSD& embedded);
- void parseEmbedded(const LLSD& embedded);
- void parseEmbeddedLinks(const LLSD& links);
+ void parseCategory(const LLSD& link_map, S32 depth);
+ void parseDescendentCount(const LLUUID& category_id, LLFolderType::EType type, const LLSD& embedded);
+ void parseEmbedded(const LLSD& embedded, S32 depth);
+ void parseEmbeddedLinks(const LLSD& links, S32 depth);
void parseEmbeddedItems(const LLSD& items);
- void parseEmbeddedCategories(const LLSD& categories);
+ void parseEmbeddedCategories(const LLSD& categories, S32 depth);
void parseEmbeddedItem(const LLSD& item);
- void parseEmbeddedCategory(const LLSD& category);
+ void parseEmbeddedCategory(const LLSD& category, S32 depth);
void doUpdate();
private:
void clearParseResults();
+ void checkTimeout();
+
+ // Fetch can return large packets of data, throttle it to not cause lags
+ // Todo: make throttle work over all fetch requests isntead of per-request
+ const F32 AIS_EXPIRY_SECONDS = 0.008f;
typedef std::map<LLUUID,S32> uuid_int_map_t;
uuid_int_map_t mCatDescendentDeltas;
@@ -113,6 +141,7 @@ private:
typedef std::map<LLUUID,LLPointer<LLViewerInventoryItem> > deferred_item_map_t;
deferred_item_map_t mItemsCreated;
+ deferred_item_map_t mItemsLost;
deferred_item_map_t mItemsUpdated;
typedef std::map<LLUUID,LLPointer<LLViewerInventoryCategory> > deferred_category_map_t;
deferred_category_map_t mCategoriesCreated;
@@ -123,6 +152,10 @@ private:
uuid_list_t mObjectsDeletedIds;
uuid_list_t mItemIds;
uuid_list_t mCategoryIds;
+ bool mFetch;
+ S32 mFetchDepth;
+ LLTimer mTimer;
+ AISAPI::COMMAND_TYPE mType;
};
#endif
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 3c93a9df7e..8010b84c20 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -40,8 +40,11 @@
#include "llgesturemgr.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
+#include "llinventorymodelbackgroundfetch.h"
#include "llinventoryobserver.h"
+#include "llmd5.h"
#include "llnotificationsutil.h"
+#include "llmd5.h"
#include "lloutfitobserver.h"
#include "lloutfitslist.h"
#include "llselectmgr.h"
@@ -145,7 +148,10 @@ public:
// requests will be throttled from a non-trusted browser
LLAppearanceHandler() : LLCommandHandler("appearance", UNTRUSTED_THROTTLE) {}
- bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
+ bool handle(const LLSD& params,
+ const LLSD& query_map,
+ const std::string& grid,
+ LLMediaCtrl* web)
{
// support secondlife:///app/appearance/show, but for now we just
// make all secondlife:///app/appearance SLapps behave this way
@@ -585,6 +591,71 @@ LLUpdateAppearanceAndEditWearableOnDestroy::~LLUpdateAppearanceAndEditWearableOn
}
}
+class LLBrokenLinkObserver : public LLInventoryObserver
+{
+public:
+ LLUUID mUUID;
+ bool mEnforceItemRestrictions;
+ bool mEnforceOrdering;
+ nullary_func_t mPostUpdateFunc;
+
+ LLBrokenLinkObserver(const LLUUID& uuid,
+ bool enforce_item_restrictions ,
+ bool enforce_ordering ,
+ nullary_func_t post_update_func) :
+ mUUID(uuid),
+ mEnforceItemRestrictions(enforce_item_restrictions),
+ mEnforceOrdering(enforce_ordering),
+ mPostUpdateFunc(post_update_func)
+ {
+ }
+ /* virtual */ void changed(U32 mask);
+ void postProcess();
+};
+
+void LLBrokenLinkObserver::changed(U32 mask)
+{
+ if (mask & LLInventoryObserver::REBUILD)
+ {
+ // This observer should be executed after LLInventoryPanel::itemChanged(),
+ // but if it isn't, consider calling updateAppearanceFromCOF with a delay
+ const uuid_set_t& changed_item_ids = gInventory.getChangedIDs();
+ for (uuid_set_t::const_iterator it = changed_item_ids.begin(); it != changed_item_ids.end(); ++it)
+ {
+ const LLUUID& id = *it;
+ if (id == mUUID)
+ {
+ // Might not be processed yet and it is not a
+ // good idea to update appearane here, postpone.
+ doOnIdleOneTime([this]()
+ {
+ postProcess();
+ });
+
+ gInventory.removeObserver(this);
+ return;
+ }
+ }
+ }
+}
+
+void LLBrokenLinkObserver::postProcess()
+{
+ LLViewerInventoryItem* item = gInventory.getItem(mUUID);
+ llassert(item && !item->getIsBrokenLink()); // the whole point was to get a correct link
+ if (item && item->getIsBrokenLink())
+ {
+ LL_INFOS_ONCE("Avatar") << "Outfit link broken despite being regenerated" << LL_ENDL;
+ LL_DEBUGS("Avatar", "Inventory") << "Outfit link " << mUUID << " \"" << item->getName() << "\" is broken despite being regenerated" << LL_ENDL;
+ }
+
+ LLAppearanceMgr::instance().updateAppearanceFromCOF(
+ mEnforceItemRestrictions ,
+ mEnforceOrdering ,
+ mPostUpdateFunc);
+ delete this;
+}
+
struct LLFoundData
{
@@ -1701,12 +1772,18 @@ void LLAppearanceMgr::shallowCopyCategory(const LLUUID& src_id, const LLUUID& ds
{
parent_id = gInventory.getRootFolderID();
}
- LLUUID subfolder_id = gInventory.createNewCategory( parent_id,
- LLFolderType::FT_NONE,
- src_cat->getName());
- shallowCopyCategoryContents(src_id, subfolder_id, cb);
+ gInventory.createNewCategory(
+ parent_id,
+ LLFolderType::FT_NONE,
+ src_cat->getName(),
+ [src_id, cb](const LLUUID &new_id)
+ {
+ LLAppearanceMgr::getInstance()->shallowCopyCategoryContents(src_id, new_id, cb);
- gInventory.notifyObservers();
+ gInventory.notifyObservers();
+ },
+ src_cat->getThumbnailUUID()
+ );
}
void LLAppearanceMgr::slamCategoryLinks(const LLUUID& src_id, const LLUUID& dst_id,
@@ -2409,6 +2486,39 @@ void LLAppearanceMgr::updateAppearanceFromCOF(bool enforce_item_restrictions,
LL_DEBUGS("Avatar") << self_av_string() << "starting" << LL_ENDL;
+ if (gInventory.hasPosiblyBrockenLinks())
+ {
+ // Inventory has either broken links or links that
+ // haven't loaded yet.
+ // Check if LLAppearanceMgr needs to wait.
+ LLUUID current_outfit_id = getCOF();
+ LLInventoryModel::item_array_t cof_items;
+ LLInventoryModel::cat_array_t cof_cats;
+ LLFindBrokenLinks is_brocken_link;
+ gInventory.collectDescendentsIf(current_outfit_id,
+ cof_cats,
+ cof_items,
+ LLInventoryModel::EXCLUDE_TRASH,
+ is_brocken_link);
+
+ if (cof_items.size() > 0)
+ {
+ // Some links haven't loaded yet, but fetch isn't complete so
+ // links are likely fine and we will have to wait for them to
+ // load
+ if (LLInventoryModelBackgroundFetch::getInstance()->folderFetchActive())
+ {
+
+ LLBrokenLinkObserver* observer = new LLBrokenLinkObserver(cof_items.front()->getUUID(),
+ enforce_item_restrictions,
+ enforce_ordering,
+ post_update_func);
+ gInventory.addObserver(observer);
+ return;
+ }
+ }
+ }
+
if (enforce_item_restrictions)
{
// The point here is just to call
@@ -2725,22 +2835,29 @@ void LLAppearanceMgr::wearCategoryFinal(LLUUID& cat_id, bool copy_items, bool ap
{
pid = gInventory.getRootFolderID();
}
-
- LLUUID new_cat_id = gInventory.createNewCategory(
+
+ gInventory.createNewCategory(
pid,
LLFolderType::FT_NONE,
- name);
-
- // Create a CopyMgr that will copy items, manage its own destruction
- new LLCallAfterInventoryCopyMgr(
- *items, new_cat_id, std::string("wear_inventory_category_callback"),
- boost::bind(&LLAppearanceMgr::wearInventoryCategoryOnAvatar,
- LLAppearanceMgr::getInstance(),
- gInventory.getCategory(new_cat_id),
- append));
-
- // BAP fixes a lag in display of created dir.
- gInventory.notifyObservers();
+ name,
+ [cat_id, append](const LLUUID& new_cat_id)
+ {
+ LLInventoryModel::cat_array_t* cats;
+ LLInventoryModel::item_array_t* items;
+ gInventory.getDirectDescendentsOf(cat_id, cats, items);
+ // Create a CopyMgr that will copy items, manage its own destruction
+ new LLCallAfterInventoryCopyMgr(
+ *items, new_cat_id, std::string("wear_inventory_category_callback"),
+ boost::bind(&LLAppearanceMgr::wearInventoryCategoryOnAvatar,
+ LLAppearanceMgr::getInstance(),
+ gInventory.getCategory(new_cat_id),
+ append));
+
+ // BAP fixes a lag in display of created dir.
+ gInventory.notifyObservers();
+ },
+ cat->getThumbnailUUID()
+ );
}
else
{
@@ -3198,7 +3315,7 @@ void LLAppearanceMgr::copyLibraryGestures()
// Copy gestures
LLUUID lib_gesture_cat_id =
- gInventory.findLibraryCategoryUUIDForType(LLFolderType::FT_GESTURE,false);
+ gInventory.findLibraryCategoryUUIDForType(LLFolderType::FT_GESTURE);
if (lib_gesture_cat_id.isNull())
{
LL_WARNS() << "Unable to copy gestures, source category not found" << LL_ENDL;
@@ -3709,7 +3826,7 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
if (cofVersion == LLViewerInventoryCategory::VERSION_UNKNOWN)
{
- LL_WARNS("AVatar") << "COF version is unknown... not requesting until COF version is known." << LL_ENDL;
+ LL_INFOS("AVatar") << "COF version is unknown... not requesting until COF version is known." << LL_ENDL;
return;
}
else
@@ -3981,26 +4098,15 @@ void LLAppearanceMgr::makeNewOutfitLinks(const std::string& new_folder_name, boo
// First, make a folder in the My Outfits directory.
const LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
- if (AISAPI::isAvailable())
- {
- // cap-based category creation was buggy until recently. use
- // existence of AIS as an indicator the fix is present. Does
- // not actually use AIS to create the category.
- inventory_func_type func = boost::bind(&LLAppearanceMgr::onOutfitFolderCreated,this,_1,show_panel);
- gInventory.createNewCategory(
- parent_id,
- LLFolderType::FT_OUTFIT,
- new_folder_name,
- func);
- }
- else
- {
- LLUUID folder_id = gInventory.createNewCategory(
- parent_id,
- LLFolderType::FT_OUTFIT,
- new_folder_name);
- onOutfitFolderCreated(folder_id, show_panel);
- }
+
+ gInventory.createNewCategory(
+ parent_id,
+ LLFolderType::FT_OUTFIT,
+ new_folder_name,
+ [show_panel](const LLUUID &new_cat_id)
+ {
+ LLAppearanceMgr::getInstance()->onOutfitFolderCreated(new_cat_id, show_panel);
+ });
}
void LLAppearanceMgr::wearBaseOutfit()
@@ -4333,6 +4439,73 @@ public:
~CallAfterCategoryFetchStage1()
{
}
+ /*virtual*/ void startFetch()
+ {
+ bool ais3 = AISAPI::isAvailable();
+ for (uuid_vec_t::const_iterator it = mIDs.begin(); it != mIDs.end(); ++it)
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
+ if (!cat) continue;
+ if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN)
+ {
+ // CHECK IT: isCategoryComplete() checks both version and descendant count but
+ // fetch() only works for Unknown version and doesn't care about descentants,
+ // as result fetch won't start and folder will potentially get stuck as
+ // incomplete in observer.
+ // Likely either both should use only version or both should check descendants.
+ cat->fetch(); //blindly fetch it without seeing if anything else is fetching it.
+ mIncomplete.push_back(*it); //Add to list of things being downloaded for this observer.
+ }
+ else if (!isCategoryComplete(cat))
+ {
+ LL_DEBUGS("Inventory") << "Categoty " << *it << " incomplete despite having version" << LL_ENDL;
+ LLInventoryModelBackgroundFetch::instance().scheduleFolderFetch(*it, true);
+ mIncomplete.push_back(*it);
+ }
+ else if (ais3)
+ {
+ LLInventoryModel::cat_array_t* cats;
+ LLInventoryModel::item_array_t* items;
+ gInventory.getDirectDescendentsOf(cat->getUUID(), cats, items);
+
+ if (items)
+ {
+ S32 complete_count = 0;
+ S32 incomplete_count = 0;
+ for (LLInventoryModel::item_array_t::const_iterator it = items->begin(); it < items->end(); ++it)
+ {
+ if (!(*it)->isFinished())
+ {
+ incomplete_count++;
+ }
+ else
+ {
+ complete_count++;
+ }
+ }
+ // AIS can fetch couple items, but if there
+ // is more than a dozen it will be very slow
+ // it's faster to get whole folder in such case
+ if (incomplete_count > LLInventoryFetchItemsObserver::MAX_INDIVIDUAL_ITEM_REQUESTS
+ || (incomplete_count > 1 && complete_count == 0))
+ {
+ LLInventoryModelBackgroundFetch::instance().scheduleFolderFetch(*it, true);
+ mIncomplete.push_back(*it);
+ }
+ else
+ {
+ // let stage2 handle incomplete ones
+ mComplete.push_back(*it);
+ }
+ }
+ // else should have been handled by isCategoryComplete
+ }
+ else
+ {
+ mComplete.push_back(*it);
+ }
+ }
+ }
virtual void done()
{
if (mComplete.size() <= 0)
@@ -4349,13 +4522,11 @@ public:
// What we do here is get the complete information on the
// items in the requested category, and set up an observer
// that will wait for that to happen.
- LLInventoryModel::cat_array_t cat_array;
- LLInventoryModel::item_array_t item_array;
- gInventory.collectDescendents(mComplete.front(),
- cat_array,
- item_array,
- LLInventoryModel::EXCLUDE_TRASH);
- S32 count = item_array.size();
+ LLInventoryModel::cat_array_t* cats;
+ LLInventoryModel::item_array_t* items;
+ gInventory.getDirectDescendentsOf(mComplete.front(), cats, items);
+
+ S32 count = items->size();
if(!count)
{
LL_WARNS() << "Nothing fetched in category " << mComplete.front()
@@ -4367,11 +4538,13 @@ public:
return;
}
- LL_INFOS() << "stage1 got " << item_array.size() << " items, passing to stage2 " << LL_ENDL;
+ LLViewerInventoryCategory* cat = gInventory.getCategory(mComplete.front());
+ S32 version = cat ? cat->getVersion() : -2;
+ LL_INFOS() << "stage1, category " << mComplete.front() << " got " << count << " items, version " << version << " passing to stage2 " << LL_ENDL;
uuid_vec_t ids;
for(S32 i = 0; i < count; ++i)
{
- ids.push_back(item_array.at(i)->getUUID());
+ ids.push_back(items->at(i)->getUUID());
}
gInventory.removeObserver(this);
@@ -4396,18 +4569,78 @@ protected:
nullary_func_t mCallable;
};
+void callAfterCOFFetch(nullary_func_t cb)
+{
+ LLUUID cat_id = LLAppearanceMgr::instance().getCOF();
+ LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
+
+ if (AISAPI::isAvailable())
+ {
+ // Mark cof (update timer) so that background fetch won't request it
+ cat->setFetching(LLViewerInventoryCategory::FETCH_RECURSIVE);
+ // For reliability assume that we have no relevant cache, so
+ // fetch cof along with items cof's links point to.
+ AISAPI::FetchCOF([cb](const LLUUID& id)
+ {
+ cb();
+ LLUUID cat_id = LLAppearanceMgr::instance().getCOF();
+ LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
+ if (cat)
+ {
+ cat->setFetching(LLViewerInventoryCategory::FETCH_NONE);
+ }
+ });
+ }
+ else
+ {
+ LL_INFOS() << "AIS API v3 not available, using callAfterCategoryFetch" << LL_ENDL;
+ // startup should have marked folder as fetching, remove that
+ cat->setFetching(LLViewerInventoryCategory::FETCH_NONE);
+ callAfterCategoryFetch(cat_id, cb);
+ }
+}
+
void callAfterCategoryFetch(const LLUUID& cat_id, nullary_func_t cb)
{
- CallAfterCategoryFetchStage1 *stage1 = new CallAfterCategoryFetchStage1(cat_id, cb);
- stage1->startFetch();
- if (stage1->isFinished())
- {
- stage1->done();
- }
- else
- {
- gInventory.addObserver(stage1);
- }
+ CallAfterCategoryFetchStage1* stage1 = new CallAfterCategoryFetchStage1(cat_id, cb);
+ stage1->startFetch();
+ if (stage1->isFinished())
+ {
+ stage1->done();
+ }
+ else
+ {
+ gInventory.addObserver(stage1);
+ }
+}
+
+void callAfterCategoryLinksFetch(const LLUUID &cat_id, nullary_func_t cb)
+{
+ LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);
+ if (AISAPI::isAvailable())
+ {
+ // Mark folder (update timer) so that background fetch won't request it
+ cat->setFetching(LLViewerInventoryCategory::FETCH_RECURSIVE);
+ // Assume that we have no relevant cache. Fetch folder, and items folder's links point to.
+ AISAPI::FetchCategoryLinks(cat_id,
+ [cb, cat_id](const LLUUID &id)
+ {
+ cb();
+ LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);
+ if (cat)
+ {
+ cat->setFetching(LLViewerInventoryCategory::FETCH_NONE);
+ }
+ });
+ }
+ else
+ {
+ LL_WARNS() << "AIS API v3 not available, can't use AISAPI::FetchCOF" << LL_ENDL;
+ // startup should have marked folder as fetching, remove that
+ cat->setFetching(LLViewerInventoryCategory::FETCH_NONE);
+ callAfterCategoryFetch(cat_id, cb);
+ }
+
}
void add_wearable_type_counts(const uuid_vec_t& ids,
@@ -4470,8 +4703,10 @@ public:
// not allowed from outside the app
LLWearFolderHandler() : LLCommandHandler("wear_folder", UNTRUSTED_BLOCK) { }
- bool handle(const LLSD& tokens, const LLSD& query_map,
- LLMediaCtrl* web)
+ bool handle(const LLSD& tokens,
+ const LLSD& query_map,
+ const std::string& grid,
+ LLMediaCtrl* web)
{
LLSD::UUID folder_uuid;
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index cf953d21ac..43839e47a6 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -338,7 +338,9 @@ public:
LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id,const std::string& name);
// Invoke a given callable after category contents are fully fetched.
+void callAfterCOFFetch(nullary_func_t cb);
void callAfterCategoryFetch(const LLUUID& cat_id, nullary_func_t cb);
+void callAfterCategoryLinksFetch(const LLUUID &cat_id, nullary_func_t cb);
// Wear all items in a uuid vector.
void wear_multiple(const uuid_vec_t& ids, bool replace);
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index edbae465f7..6d34930cb8 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -36,6 +36,7 @@
#include "llenvironment.h"
#include "llerrorcontrol.h"
#include "lleventtimer.h"
+#include "llfile.h"
#include "llviewertexturelist.h"
#include "llgroupmgr.h"
#include "llagent.h"
@@ -214,7 +215,7 @@
#include "llcommandlineparser.h"
#include "llfloatermemleak.h"
#include "llfloaterreg.h"
-#include "llfloatersimpleoutfitsnapshot.h"
+#include "llfloatersimplesnapshot.h"
#include "llfloatersnapshot.h"
#include "llsidepanelinventory.h"
#include "llatmosphere.h"
@@ -1519,9 +1520,14 @@ bool LLAppViewer::doFrame()
pingMainloopTimeout("Main:Snapshot");
gPipeline.mReflectionMapManager.update();
LLFloaterSnapshot::update(); // take snapshots
- LLFloaterSimpleOutfitSnapshot::update();
+ LLFloaterSimpleSnapshot::update();
gGLActive = FALSE;
}
+
+ if (LLViewerStatsRecorder::instanceExists())
+ {
+ LLViewerStatsRecorder::instance().idle();
+ }
}
}
@@ -2974,9 +2980,33 @@ void LLAppViewer::initStrings()
std::string strings_path_full = gDirUtilp->findSkinnedFilenameBaseLang(LLDir::XUI, strings_file);
if (strings_path_full.empty() || !LLFile::isfile(strings_path_full))
{
+ if (strings_path_full.empty())
+ {
+ LL_WARNS() << "The file '" << strings_file << "' is not found" << LL_ENDL;
+ }
+ else
+ {
+ llstat st;
+ int rc = LLFile::stat(strings_path_full, &st);
+ if (rc != 0)
+ {
+ LL_WARNS() << "The file '" << strings_path_full << "' failed to get status. Error code: " << rc << LL_ENDL;
+ }
+ else if (S_ISDIR(st.st_mode))
+ {
+ LL_WARNS() << "The filename '" << strings_path_full << "' is a directory name" << LL_ENDL;
+ }
+ else
+ {
+ LL_WARNS() << "The filename '" << strings_path_full << "' doesn't seem to be a regular file name" << LL_ENDL;
+ }
+ }
+
// initial check to make sure files are there failed
gDirUtilp->dumpCurrentDirectories(LLError::LEVEL_WARN);
- LL_ERRS() << "Viewer failed to find localization and UI files. Please reinstall viewer from https://secondlife.com/support/downloads/ and contact https://support.secondlife.com if issue persists after reinstall." << LL_ENDL;
+ LL_ERRS() << "Viewer failed to find localization and UI files."
+ << " Please reinstall viewer from https://secondlife.com/support/downloads"
+ << " and contact https://support.secondlife.com if issue persists after reinstall." << LL_ENDL;
}
LLTransUtil::parseStrings(strings_file, default_trans_args);
LLTransUtil::parseLanguageStrings("language_settings.xml");
@@ -3575,8 +3605,6 @@ void LLAppViewer::writeSystemInfo()
// "CrashNotHandled" is set here, while things are running well,
// in case of a freeze. If there is a freeze, the crash logger will be launched
// and can read this value from the debug_info.log.
- // If the crash is handled by LLAppViewer::handleViewerCrash, ie not a freeze,
- // then the value of "CrashNotHandled" will be set to true.
gDebugInfo["CrashNotHandled"] = LLSD::Boolean(true);
#else // LL_BUGSPLAT
// "CrashNotHandled" is obsolete; it used (not very successsfully)
@@ -3668,163 +3696,6 @@ void getFileList()
}
#endif
-void LLAppViewer::handleViewerCrash()
-{
- LL_INFOS("CRASHREPORT") << "Handle viewer crash entry." << LL_ENDL;
-
- LL_INFOS("CRASHREPORT") << "Last render pool type: " << LLPipeline::sCurRenderPoolType << LL_ENDL ;
-
- LLMemory::logMemoryInfo(true) ;
-
- //print out recorded call stacks if there are any.
- LLError::LLCallStacks::print();
-
- LLAppViewer* pApp = LLAppViewer::instance();
- if (pApp->beingDebugged())
- {
- // This will drop us into the debugger.
- abort();
- }
-
- if (LLApp::isCrashloggerDisabled())
- {
- abort();
- }
-
- // Returns whether a dialog was shown.
- // Only do the logic in here once
- if (pApp->mReportedCrash)
- {
- return;
- }
- pApp->mReportedCrash = TRUE;
-
- // Insert crash host url (url to post crash log to) if configured.
- std::string crashHostUrl = gSavedSettings.get<std::string>("CrashHostUrl");
- if(crashHostUrl != "")
- {
- gDebugInfo["Dynamic"]["CrashHostUrl"] = crashHostUrl;
- }
-
- LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
- if ( parcel && parcel->getMusicURL()[0])
- {
- gDebugInfo["Dynamic"]["ParcelMusicURL"] = parcel->getMusicURL();
- }
- if ( parcel && parcel->getMediaURL()[0])
- {
- gDebugInfo["Dynamic"]["ParcelMediaURL"] = parcel->getMediaURL();
- }
-
- gDebugInfo["Dynamic"]["SessionLength"] = F32(LLFrameTimer::getElapsedSeconds());
- gDebugInfo["Dynamic"]["RAMInfo"]["Allocated"] = LLSD::Integer(LLMemory::getCurrentRSS() / 1024);
-
- if(gLogoutInProgress)
- {
- gDebugInfo["Dynamic"]["LastExecEvent"] = LAST_EXEC_LOGOUT_CRASH;
- }
- else
- {
- gDebugInfo["Dynamic"]["LastExecEvent"] = gLLErrorActivated ? LAST_EXEC_LLERROR_CRASH : LAST_EXEC_OTHER_CRASH;
- }
-
- if(gAgent.getRegion())
- {
- gDebugInfo["Dynamic"]["CurrentSimHost"] = gAgent.getRegion()->getSimHostName();
- gDebugInfo["Dynamic"]["CurrentRegion"] = gAgent.getRegion()->getName();
-
- const LLVector3& loc = gAgent.getPositionAgent();
- gDebugInfo["Dynamic"]["CurrentLocationX"] = loc.mV[0];
- gDebugInfo["Dynamic"]["CurrentLocationY"] = loc.mV[1];
- gDebugInfo["Dynamic"]["CurrentLocationZ"] = loc.mV[2];
- }
-
- if(LLAppViewer::instance()->mMainloopTimeout)
- {
- gDebugInfo["Dynamic"]["MainloopTimeoutState"] = LLAppViewer::instance()->mMainloopTimeout->getState();
- }
-
- // The crash is being handled here so set this value to false.
- // Otherwise the crash logger will think this crash was a freeze.
- gDebugInfo["Dynamic"]["CrashNotHandled"] = LLSD::Boolean(false);
-
- //Write out the crash status file
- //Use marker file style setup, as that's the simplest, especially since
- //we're already in a crash situation
- if (gDirUtilp)
- {
- std::string crash_marker_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
- gLLErrorActivated
- ? LLERROR_MARKER_FILE_NAME
- : ERROR_MARKER_FILE_NAME);
- LLAPRFile crash_marker_file ;
- crash_marker_file.open(crash_marker_file_name, LL_APR_WB);
- if (crash_marker_file.getFileHandle())
- {
- LL_INFOS("MarkerFile") << "Created crash marker file " << crash_marker_file_name << LL_ENDL;
- recordMarkerVersion(crash_marker_file);
- }
- else
- {
- LL_WARNS("MarkerFile") << "Cannot create error marker file " << crash_marker_file_name << LL_ENDL;
- }
- }
- else
- {
- LL_WARNS("MarkerFile") << "No gDirUtilp with which to create error marker file name" << LL_ENDL;
- }
-
-#ifdef LL_WINDOWS
- Sleep(200);
-#endif
-
- char *minidump_file = pApp->getMiniDumpFilename();
- LL_DEBUGS("CRASHREPORT") << "minidump file name " << minidump_file << LL_ENDL;
- if(minidump_file && minidump_file[0] != 0)
- {
- gDebugInfo["Dynamic"]["MinidumpPath"] = minidump_file;
- }
- else
- {
-#ifdef LL_WINDOWS
- getFileList();
-#else
- LL_WARNS("CRASHREPORT") << "no minidump file?" << LL_ENDL;
-#endif
- }
- gDebugInfo["Dynamic"]["CrashType"]="crash";
-
- if (gMessageSystem && gDirUtilp)
- {
- std::string filename;
- filename = gDirUtilp->getExpandedFilename(LL_PATH_DUMP, "stats.log");
- LL_DEBUGS("CRASHREPORT") << "recording stats " << filename << LL_ENDL;
- llofstream file(filename.c_str(), std::ios_base::binary);
- if(file.good())
- {
- gMessageSystem->summarizeLogs(file);
- file.close();
- }
- else
- {
- LL_WARNS("CRASHREPORT") << "problem recording stats" << LL_ENDL;
- }
- }
-
- if (gMessageSystem)
- {
- gMessageSystem->getCircuitInfo(gDebugInfo["CircuitInfo"]);
- gMessageSystem->stopLogging();
- }
-
- if (LLWorld::instanceExists()) LLWorld::getInstance()->getInfo(gDebugInfo["Dynamic"]);
-
- gDebugInfo["FatalMessage"] = LLError::getFatalMessage();
-
- // Close the debug file
- pApp->writeDebugInfo(false); //false answers the isStatic question with the least overhead.
-}
-
// static
void LLAppViewer::recordMarkerVersion(LLAPRFile& marker_file)
{
@@ -4298,7 +4169,7 @@ U32 LLAppViewer::getObjectCacheVersion()
{
// Viewer object cache version, change if object update
// format changes. JC
- const U32 INDRA_OBJECT_CACHE_VERSION = 16;
+ const U32 INDRA_OBJECT_CACHE_VERSION = 17;
return INDRA_OBJECT_CACHE_VERSION;
}
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index 6e35da1b10..6d1496d517 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -115,7 +115,6 @@ public:
virtual bool restoreErrorTrap() = 0; // Require platform specific override to reset error handling mechanism.
// return false if the error trap needed restoration.
- static void handleViewerCrash(); // Hey! The viewer crashed. Do this, soon.
void checkForCrash();
// Thread accessors
diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp
index dc487967fc..9f58f90326 100644
--- a/indra/newview/llappviewerlinux.cpp
+++ b/indra/newview/llappviewerlinux.cpp
@@ -80,8 +80,6 @@ int main( int argc, char **argv )
// install unexpected exception handler
gOldTerminateHandler = std::set_terminate(exceptionTerminateHandler);
- // install crash handlers
- viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash);
bool ok = viewer_app_ptr->init();
if(!ok)
diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp
index cb5cac6f2d..8b313a321b 100644
--- a/indra/newview/llappviewermacosx.cpp
+++ b/indra/newview/llappviewermacosx.cpp
@@ -83,8 +83,6 @@ void constructViewer()
}
gViewerAppPtr = new LLAppViewerMacOSX();
-
- gViewerAppPtr->setErrorHandler(LLAppViewer::handleViewerCrash);
}
bool initViewer()
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index fde8ff5c1f..8cf80f388b 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -428,8 +428,6 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,
gOldTerminateHandler = std::set_terminate(exceptionTerminateHandler);
- viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash);
-
// Set a debug info flag to indicate if multiple instances are running.
bool found_other_instance = !create_app_mutex();
gDebugInfo["FoundOtherInstanceAtStartup"] = LLSD::Boolean(found_other_instance);
diff --git a/indra/newview/llattachmentsmgr.cpp b/indra/newview/llattachmentsmgr.cpp
index d43048a8b6..d3fce306bc 100644
--- a/indra/newview/llattachmentsmgr.cpp
+++ b/indra/newview/llattachmentsmgr.cpp
@@ -31,6 +31,7 @@
#include "llagent.h"
#include "llappearancemgr.h"
#include "llinventorymodel.h"
+#include "llstartup.h"
#include "lltooldraganddrop.h" // pack_permissions_slam
#include "llviewerinventory.h"
#include "llviewerregion.h"
@@ -239,6 +240,13 @@ void LLAttachmentsMgr::linkRecentlyArrivedAttachments()
return;
}
+ if (LLAppearanceMgr::instance().getCOFVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN)
+ {
+ // Wait for cof to load
+ LL_DEBUGS_ONCE("Avatar") << "Received atachments, but cof isn't loaded yet, postponing processing" << LL_ENDL;
+ return;
+ }
+
LL_DEBUGS("Avatar") << "ATT checking COF linkability for " << mRecentlyArrivedAttachments.size()
<< " recently arrived items" << LL_ENDL;
@@ -372,7 +380,7 @@ void LLAttachmentsMgr::onAttachmentArrived(const LLUUID& inv_item_id)
{
LLTimer timer;
bool expected = mAttachmentRequests.getTime(inv_item_id, timer);
- if (!expected)
+ if (!expected && LLStartUp::getStartupState() > STATE_WEARABLES_WAIT)
{
LLInventoryItem *item = gInventory.getItem(inv_item_id);
LL_WARNS() << "ATT Attachment was unexpected or arrived after " << MAX_ATTACHMENT_REQUEST_LIFETIME << " seconds: "
@@ -411,11 +419,15 @@ void LLAttachmentsMgr::onDetachCompleted(const LLUUID& inv_item_id)
LL_DEBUGS("Avatar") << "ATT all detach requests have completed" << LL_ENDL;
}
}
- else
+ else if (!LLApp::isExiting())
{
LL_WARNS() << "ATT unexpected detach for "
<< (item ? item->getName() : "UNKNOWN") << " id " << inv_item_id << LL_ENDL;
}
+ else
+ {
+ LL_DEBUGS("Avatar") << "ATT detach on shutdown for " << (item ? item->getName() : "UNKNOWN") << " " << inv_item_id << LL_ENDL;
+ }
LL_DEBUGS("Avatar") << "ATT detached item flagging as questionable for COF link checking "
<< (item ? item->getName() : "UNKNOWN") << " id " << inv_item_id << LL_ENDL;
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 3e450e6dec..313339f131 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -730,39 +730,55 @@ namespace action_give_inventory
/**
* Checks My Inventory visibility.
*/
+ static bool is_give_inventory_acceptable_ids(const std::set<LLUUID> inventory_selected_uuids)
+ {
+ if (inventory_selected_uuids.empty()) return false; // nothing selected
+
+ bool acceptable = false;
+ std::set<LLUUID>::const_iterator it = inventory_selected_uuids.begin();
+ const std::set<LLUUID>::const_iterator it_end = inventory_selected_uuids.end();
+ for (; it != it_end; ++it)
+ {
+ LLViewerInventoryCategory* inv_cat = gInventory.getCategory(*it);
+ // any category can be offered.
+ if (inv_cat)
+ {
+ acceptable = true;
+ continue;
+ }
+
+ LLViewerInventoryItem* inv_item = gInventory.getItem(*it);
+ // check if inventory item can be given
+ if (LLGiveInventory::isInventoryGiveAcceptable(inv_item))
+ {
+ acceptable = true;
+ continue;
+ }
+
+ // there are neither item nor category in inventory
+ acceptable = false;
+ break;
+ }
+ return acceptable;
+ }
static bool is_give_inventory_acceptable(LLInventoryPanel* panel = NULL)
{
// check selection in the panel
- const std::set<LLUUID> inventory_selected_uuids = LLAvatarActions::getInventorySelectedUUIDs(panel);
- if (inventory_selected_uuids.empty()) return false; // nothing selected
-
- bool acceptable = false;
- std::set<LLUUID>::const_iterator it = inventory_selected_uuids.begin();
- const std::set<LLUUID>::const_iterator it_end = inventory_selected_uuids.end();
- for (; it != it_end; ++it)
- {
- LLViewerInventoryCategory* inv_cat = gInventory.getCategory(*it);
- // any category can be offered.
- if (inv_cat)
- {
- acceptable = true;
- continue;
- }
-
- LLViewerInventoryItem* inv_item = gInventory.getItem(*it);
- // check if inventory item can be given
- if (LLGiveInventory::isInventoryGiveAcceptable(inv_item))
- {
- acceptable = true;
- continue;
- }
+ std::set<LLUUID> inventory_selected_uuids = LLAvatarActions::getInventorySelectedUUIDs(panel);
+ if (inventory_selected_uuids.empty())
+ {
+ if(panel && panel->getRootFolder() && panel->getRootFolder()->isSingleFolderMode())
+ {
+ inventory_selected_uuids.insert(panel->getRootFolderID());
+ }
+ else
+ {
+ return false; // nothing selected
+ }
+ }
- // there are neither item nor category in inventory
- acceptable = false;
- break;
- }
- return acceptable;
+ return is_give_inventory_acceptable_ids(inventory_selected_uuids);
}
static void build_items_string(const std::set<LLUUID>& inventory_selected_uuids , std::string& items_string)
@@ -890,46 +906,65 @@ namespace action_give_inventory
* @param avatar_names - avatar names request to be sent.
* @param avatar_uuids - avatar names request to be sent.
*/
- static void give_inventory(const uuid_vec_t& avatar_uuids, const std::vector<LLAvatarName> avatar_names, LLInventoryPanel* panel = NULL)
- {
- llassert(avatar_names.size() == avatar_uuids.size());
- const std::set<LLUUID> inventory_selected_uuids = LLAvatarActions::getInventorySelectedUUIDs(panel);
- if (inventory_selected_uuids.empty())
- {
- return;
- }
+ static void give_inventory_ids(const uuid_vec_t& avatar_uuids, const std::vector<LLAvatarName> avatar_names, const uuid_set_t inventory_selected_uuids)
+ {
+ llassert(avatar_names.size() == avatar_uuids.size());
- std::string residents;
- LLAvatarActions::buildResidentsString(avatar_names, residents, true);
+ if (inventory_selected_uuids.empty())
+ {
+ return;
+ }
- std::string items;
- build_items_string(inventory_selected_uuids, items);
+ std::string residents;
+ LLAvatarActions::buildResidentsString(avatar_names, residents, true);
- int folders_count = 0;
- std::set<LLUUID>::const_iterator it = inventory_selected_uuids.begin();
+ std::string items;
+ build_items_string(inventory_selected_uuids, items);
- //traverse through selected inventory items and count folders among them
- for ( ; it != inventory_selected_uuids.end() && folders_count <=1 ; ++it)
- {
- LLViewerInventoryCategory* inv_cat = gInventory.getCategory(*it);
- if (NULL != inv_cat)
- {
- folders_count++;
- }
- }
+ int folders_count = 0;
+ std::set<LLUUID>::const_iterator it = inventory_selected_uuids.begin();
- // EXP-1599
- // In case of sharing multiple folders, make the confirmation
- // dialog contain a warning that only one folder can be shared at a time.
- std::string notification = (folders_count > 1) ? "ShareFolderConfirmation" : "ShareItemsConfirmation";
- LLSD substitutions;
- substitutions["RESIDENTS"] = residents;
- substitutions["ITEMS"] = items;
- LLShareInfo::instance().mAvatarNames = avatar_names;
- LLShareInfo::instance().mAvatarUuids = avatar_uuids;
- LLNotificationsUtil::add(notification, substitutions, LLSD(), boost::bind(&give_inventory_cb, _1, _2, inventory_selected_uuids));
- }
+ //traverse through selected inventory items and count folders among them
+ for ( ; it != inventory_selected_uuids.end() && folders_count <=1 ; ++it)
+ {
+ LLViewerInventoryCategory* inv_cat = gInventory.getCategory(*it);
+ if (NULL != inv_cat)
+ {
+ folders_count++;
+ }
+ }
+
+ // EXP-1599
+ // In case of sharing multiple folders, make the confirmation
+ // dialog contain a warning that only one folder can be shared at a time.
+ std::string notification = (folders_count > 1) ? "ShareFolderConfirmation" : "ShareItemsConfirmation";
+ LLSD substitutions;
+ substitutions["RESIDENTS"] = residents;
+ substitutions["ITEMS"] = items;
+ LLShareInfo::instance().mAvatarNames = avatar_names;
+ LLShareInfo::instance().mAvatarUuids = avatar_uuids;
+ LLNotificationsUtil::add(notification, substitutions, LLSD(), boost::bind(&give_inventory_cb, _1, _2, inventory_selected_uuids));
+ }
+
+ static void give_inventory(const uuid_vec_t& avatar_uuids, const std::vector<LLAvatarName> avatar_names, LLInventoryPanel* panel = NULL)
+ {
+ llassert(avatar_names.size() == avatar_uuids.size());
+ std::set<LLUUID> inventory_selected_uuids = LLAvatarActions::getInventorySelectedUUIDs(panel);;
+
+ if (inventory_selected_uuids.empty())
+ {
+ if(panel && panel->getRootFolder() && panel->getRootFolder()->isSingleFolderMode())
+ {
+ inventory_selected_uuids.insert(panel->getRootFolderID());
+ }
+ else
+ {
+ return;
+ }
+ }
+ give_inventory_ids(avatar_uuids, avatar_names, inventory_selected_uuids);
+ }
}
// static
@@ -1037,6 +1072,28 @@ void LLAvatarActions::shareWithAvatars(LLView * panel)
LLNotificationsUtil::add("ShareNotification");
}
+//static
+void LLAvatarActions::shareWithAvatars(const uuid_set_t inventory_selected_uuids, LLFloater* root_floater)
+{
+ using namespace action_give_inventory;
+
+ LLFloaterAvatarPicker* picker =
+ LLFloaterAvatarPicker::show(boost::bind(give_inventory_ids, _1, _2, inventory_selected_uuids), TRUE, FALSE, FALSE, root_floater->getName());
+ if (!picker)
+ {
+ return;
+ }
+
+ picker->setOkBtnEnableCb(boost::bind(is_give_inventory_acceptable_ids, inventory_selected_uuids));
+ picker->openFriendsTab();
+
+ if (root_floater)
+ {
+ root_floater->addDependentFloater(picker);
+ }
+ LLNotificationsUtil::add("ShareNotification");
+}
+
// static
bool LLAvatarActions::canShareSelectedItems(LLInventoryPanel* inv_panel /* = NULL*/)
{
diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h
index 86183cc119..8a0f40dd52 100644
--- a/indra/newview/llavataractions.h
+++ b/indra/newview/llavataractions.h
@@ -133,6 +133,7 @@ public:
* Share items with the picked avatars.
*/
static void shareWithAvatars(LLView * panel);
+ static void shareWithAvatars(const uuid_set_t inventory_selected_uuids, LLFloater* root_floater);
/**
* Block/unblock the avatar by id.
diff --git a/indra/newview/llavatarpropertiesprocessor.h b/indra/newview/llavatarpropertiesprocessor.h
index f778634d25..10cde35f9c 100644
--- a/indra/newview/llavatarpropertiesprocessor.h
+++ b/indra/newview/llavatarpropertiesprocessor.h
@@ -85,6 +85,7 @@ struct LLAvatarData
std::string profile_url;
U8 caption_index;
std::string caption_text;
+ std::string customer_type;
U32 flags;
BOOL allow_publish;
};
diff --git a/indra/newview/llbuycurrencyhtml.cpp b/indra/newview/llbuycurrencyhtml.cpp
index 7ad06f8eaa..37de89a48b 100644
--- a/indra/newview/llbuycurrencyhtml.cpp
+++ b/indra/newview/llbuycurrencyhtml.cpp
@@ -43,7 +43,7 @@ public:
// requests will be throttled from a non-trusted browser
LLBuyCurrencyHTMLHandler() : LLCommandHandler( "buycurrencyhtml", UNTRUSTED_THROTTLE) {}
- bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
+ bool handle(const LLSD& params, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web)
{
std::string action( "" );
if ( params.size() >= 1 )
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 9a608fba8e..43dc10ef5f 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -82,7 +82,7 @@ public:
// requests will be throttled from a non-trusted browser
LLObjectIMHandler() : LLCommandHandler("objectim", UNTRUSTED_THROTTLE) {}
- bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
+ bool handle(const LLSD& params, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web)
{
if (params.size() < 1)
{
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index 1c22e055bb..dc2cc57f0f 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -57,7 +57,7 @@ class LLObjectHandler : public LLCommandHandler
public:
LLObjectHandler() : LLCommandHandler("object", UNTRUSTED_BLOCK) { }
- bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
+ bool handle(const LLSD& params, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web)
{
if (params.size() < 2) return false;
diff --git a/indra/newview/llcommanddispatcherlistener.cpp b/indra/newview/llcommanddispatcherlistener.cpp
index 518f5bc374..46ec97d5c0 100644
--- a/indra/newview/llcommanddispatcherlistener.cpp
+++ b/indra/newview/llcommanddispatcherlistener.cpp
@@ -64,10 +64,10 @@ void LLCommandDispatcherListener::dispatch(const LLSD& params) const
// But for testing, allow a caller to specify untrusted.
trusted_browser = params["trusted"].asBoolean();
}
- LLCommandDispatcher::dispatch(
- params["cmd"],
+ LLCommandDispatcher::dispatch(params["cmd"],
params["params"],
params["query"],
+ "",
NULL,
LLCommandHandler::NAV_TYPE_CLICKED,
trusted_browser);
diff --git a/indra/newview/llcommandhandler.cpp b/indra/newview/llcommandhandler.cpp
index 9640b05b06..caa27e530b 100644
--- a/indra/newview/llcommandhandler.cpp
+++ b/indra/newview/llcommandhandler.cpp
@@ -62,6 +62,7 @@ public:
bool dispatch(const std::string& cmd,
const LLSD& params,
const LLSD& query_map,
+ const std::string& grid,
LLMediaCtrl* web,
const std::string& nav_type,
bool trusted_browser);
@@ -98,6 +99,7 @@ void LLCommandHandlerRegistry::add(const char* cmd,
bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,
const LLSD& params,
const LLSD& query_map,
+ const std::string& grid,
LLMediaCtrl* web,
const std::string& nav_type,
bool trusted_browser)
@@ -165,7 +167,7 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,
}
}
if (!info.mHandler) return false;
- return info.mHandler->handle(params, query_map, web);
+ return info.mHandler->handle(params, query_map, grid, web);
}
void LLCommandHandlerRegistry::notifySlurlBlocked()
@@ -220,12 +222,13 @@ LLCommandHandler::~LLCommandHandler()
bool LLCommandDispatcher::dispatch(const std::string& cmd,
const LLSD& params,
const LLSD& query_map,
+ const std::string& grid,
LLMediaCtrl* web,
const std::string& nav_type,
bool trusted_browser)
{
return LLCommandHandlerRegistry::instance().dispatch(
- cmd, params, query_map, web, nav_type, trusted_browser);
+ cmd, params, query_map, grid, web, nav_type, trusted_browser);
}
static std::string lookup(LLCommandHandler::EUntrustedAccess value);
diff --git a/indra/newview/llcommandhandler.h b/indra/newview/llcommandhandler.h
index 486feecca6..1a354b04f7 100644
--- a/indra/newview/llcommandhandler.h
+++ b/indra/newview/llcommandhandler.h
@@ -42,7 +42,7 @@ public:
LLFooHandler() : LLCommandHandler("foo", UNTRUSTED_BLOCK) { }
// Your code here
- bool handle(const LLSD& tokens, const LLSD& query_map,
+ bool handle(const LLSD& tokens, const LLSD& query_map, const std::string& grid,
LLMediaCtrl* web)
{
if (tokens.size() < 1) return false;
@@ -90,6 +90,7 @@ public:
virtual bool handle(const LLSD& params,
const LLSD& query_map,
+ const std::string& grid,
LLMediaCtrl* web) = 0;
// For URL secondlife:///app/foo/bar/baz?cat=1&dog=2
// @params - array of "bar", "baz", possibly empty
@@ -106,6 +107,7 @@ public:
static bool dispatch(const std::string& cmd,
const LLSD& params,
const LLSD& query_map,
+ const std::string& grid,
LLMediaCtrl* web,
const std::string& nav_type,
bool trusted_browser);
diff --git a/indra/newview/llcontrolavatar.cpp b/indra/newview/llcontrolavatar.cpp
index 9b06936c1c..7def9c045f 100644
--- a/indra/newview/llcontrolavatar.cpp
+++ b/indra/newview/llcontrolavatar.cpp
@@ -47,6 +47,7 @@ LLControlAvatar::LLControlAvatar(const LLUUID& id, const LLPCode pcode, LLViewer
mGlobalScale(1.0f),
mMarkedForDeath(false),
mRootVolp(NULL),
+ mControlAVBridge(NULL),
mScaleConstraintFixup(1.0),
mRegionChanged(false)
{
@@ -376,6 +377,12 @@ void LLControlAvatar::idleUpdate(LLAgent &agent, const F64 &time)
}
}
+void LLControlAvatar::markDead()
+{
+ super::markDead();
+ mControlAVBridge = NULL;
+}
+
bool LLControlAvatar::computeNeedsUpdate()
{
computeUpdatePeriod();
diff --git a/indra/newview/llcontrolavatar.h b/indra/newview/llcontrolavatar.h
index ea91d70e69..34db285514 100644
--- a/indra/newview/llcontrolavatar.h
+++ b/indra/newview/llcontrolavatar.h
@@ -35,9 +35,12 @@ class LLControlAvatar:
{
LOG_CLASS(LLControlAvatar);
+ using super = LLVOAvatar;
+
public:
LLControlAvatar(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);
- virtual void initInstance(); // Called after construction to initialize the class.
+ virtual void initInstance(); // Called after construction to initialize the class.
+ virtual void markDead();
virtual ~LLControlAvatar();
// If this is an attachment, return the avatar it is attached to. Otherwise NULL.
@@ -88,6 +91,7 @@ public:
F32 mGlobalScale;
LLVOVolume *mRootVolp;
+ class LLControlAVBridge* mControlAVBridge;
bool mMarkedForDeath;
diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h
index 7c6980a7e6..3f607d434e 100644
--- a/indra/newview/llconversationmodel.h
+++ b/indra/newview/llconversationmodel.h
@@ -111,6 +111,7 @@ public:
virtual void previewItem( void );
virtual void selectItem(void) { }
virtual void showProperties(void);
+ virtual void navigateToFolder(bool new_window = false, bool change_mode = false) {}
// Methods used in sorting (see LLConversationSort::operator())
EConversationType const getType() const { return mConvType; }
@@ -249,7 +250,7 @@ public:
bool check(const LLFolderViewModelItem* item) { return true; }
bool checkFolder(const LLFolderViewModelItem* folder) const { return true; }
void setEmptyLookupMessage(const std::string& message) { }
- std::string getEmptyLookupMessage() const { return mEmpty; }
+ std::string getEmptyLookupMessage(bool is_empty_folder = false) const { return mEmpty; }
bool showAllResults() const { return true; }
std::string::size_type getStringMatchOffset(LLFolderViewModelItem* item) const { return std::string::npos; }
std::string::size_type getFilterStringSize() const { return 0; }
diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index 6b9c159291..ac80f1f73b 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -760,6 +760,19 @@ void LLDrawable::movePartition()
if (part)
{
part->move(this, getSpatialGroup());
+
+ // SL-18251 "On-screen animesh characters using pelvis offset animations
+ // disappear when root goes off-screen"
+ //
+ // Update extents of the root node when Control Avatar changes it's bounds
+ if (mRenderType == LLPipeline::RENDER_TYPE_CONTROL_AV && isRoot())
+ {
+ LLControlAvatar* controlAvatar = dynamic_cast<LLControlAvatar*>(getVObj().get());
+ if (controlAvatar && controlAvatar->mControlAVBridge)
+ {
+ ((LLSpatialGroup*)controlAvatar->mControlAVBridge->mOctree->getListener(0))->setState(LLViewerOctreeGroup::DIRTY);
+ }
+ }
}
}
@@ -1206,10 +1219,11 @@ LLSpatialPartition* LLDrawable::getSpatialPartition()
{
setSpatialBridge(new LLHUDBridge(this, getRegion()));
}
- else if (mVObjp->isAnimatedObject() && mVObjp->getControlAvatar())
- {
- setSpatialBridge(new LLControlAVBridge(this, getRegion()));
- }
+ else if (mVObjp->isAnimatedObject() && mVObjp->getControlAvatar())
+ {
+ setSpatialBridge(new LLControlAVBridge(this, getRegion()));
+ mVObjp->getControlAvatar()->mControlAVBridge = (LLControlAVBridge*)getSpatialBridge();
+ }
// check HUD first, because HUD is also attachment
else if (mVObjp->isAttachment())
{
diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp
index a9f35b3360..fca0f1c978 100644
--- a/indra/newview/lldrawpool.cpp
+++ b/indra/newview/lldrawpool.cpp
@@ -696,6 +696,18 @@ void teardown_texture_matrix(LLDrawInfo& params)
}
}
+void LLRenderPass::pushGLTFBatches(U32 type, bool textured)
+{
+ if (textured)
+ {
+ pushGLTFBatches(type);
+ }
+ else
+ {
+ pushRiggedGLTFBatches(type);
+ }
+}
+
void LLRenderPass::pushGLTFBatches(U32 type)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;
@@ -711,6 +723,21 @@ void LLRenderPass::pushGLTFBatches(U32 type)
}
}
+void LLRenderPass::pushUntexturedGLTFBatches(U32 type)
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;
+ auto* begin = gPipeline.beginRenderMap(type);
+ auto* end = gPipeline.endRenderMap(type);
+ for (LLCullResult::drawinfo_iterator i = begin; i != end; )
+ {
+ LL_PROFILE_ZONE_NAMED_CATEGORY_DRAWPOOL("pushGLTFBatch");
+ LLDrawInfo& params = **i;
+ LLCullResult::increment_iterator(i, end);
+
+ pushUntexturedGLTFBatch(params);
+ }
+}
+
void LLRenderPass::pushGLTFBatch(LLDrawInfo& params)
{
auto& mat = params.mGLTFMaterial;
@@ -729,6 +756,30 @@ void LLRenderPass::pushGLTFBatch(LLDrawInfo& params)
teardown_texture_matrix(params);
}
+void LLRenderPass::pushUntexturedGLTFBatch(LLDrawInfo& params)
+{
+ auto& mat = params.mGLTFMaterial;
+
+ LLGLDisable cull_face(mat->mDoubleSided ? GL_CULL_FACE : 0);
+
+ applyModelMatrix(params);
+
+ params.mVertexBuffer->setBuffer();
+ params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
+}
+
+void LLRenderPass::pushRiggedGLTFBatches(U32 type, bool textured)
+{
+ if (textured)
+ {
+ pushRiggedGLTFBatches(type);
+ }
+ else
+ {
+ pushUntexturedRiggedGLTFBatches(type);
+ }
+}
+
void LLRenderPass::pushRiggedGLTFBatches(U32 type)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;
@@ -747,6 +798,25 @@ void LLRenderPass::pushRiggedGLTFBatches(U32 type)
}
}
+void LLRenderPass::pushUntexturedRiggedGLTFBatches(U32 type)
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;
+ LLVOAvatar* lastAvatar = nullptr;
+ U64 lastMeshId = 0;
+
+ auto* begin = gPipeline.beginRenderMap(type);
+ auto* end = gPipeline.endRenderMap(type);
+ for (LLCullResult::drawinfo_iterator i = begin; i != end; )
+ {
+ LL_PROFILE_ZONE_NAMED_CATEGORY_DRAWPOOL("pushRiggedGLTFBatch");
+ LLDrawInfo& params = **i;
+ LLCullResult::increment_iterator(i, end);
+
+ pushUntexturedRiggedGLTFBatch(params, lastAvatar, lastMeshId);
+ }
+}
+
+
void LLRenderPass::pushRiggedGLTFBatch(LLDrawInfo& params, LLVOAvatar*& lastAvatar, U64& lastMeshId)
{
if (params.mAvatar.notNull() && (lastAvatar != params.mAvatar || lastMeshId != params.mSkinInfo->mHash))
@@ -759,3 +829,15 @@ void LLRenderPass::pushRiggedGLTFBatch(LLDrawInfo& params, LLVOAvatar*& lastAvat
pushGLTFBatch(params);
}
+void LLRenderPass::pushUntexturedRiggedGLTFBatch(LLDrawInfo& params, LLVOAvatar*& lastAvatar, U64& lastMeshId)
+{
+ if (params.mAvatar.notNull() && (lastAvatar != params.mAvatar || lastMeshId != params.mSkinInfo->mHash))
+ {
+ uploadMatrixPalette(params);
+ lastAvatar = params.mAvatar;
+ lastMeshId = params.mSkinInfo->mHash;
+ }
+
+ pushUntexturedGLTFBatch(params);
+}
+
diff --git a/indra/newview/lldrawpool.h b/indra/newview/lldrawpool.h
index c0bcb2b48d..320c3f5cf6 100644
--- a/indra/newview/lldrawpool.h
+++ b/indra/newview/lldrawpool.h
@@ -356,10 +356,29 @@ public:
void pushRiggedBatches(U32 type, bool texture = true, bool batch_textures = false);
void pushUntexturedRiggedBatches(U32 type);
+
+ // push full GLTF batches
+ // assumes draw infos of given type have valid GLTF materials
void pushGLTFBatches(U32 type);
- void pushGLTFBatch(LLDrawInfo& params);
+
+ // like pushGLTFBatches, but will not bind textures or set up texture transforms
+ void pushUntexturedGLTFBatches(U32 type);
+
+ // helper function for dispatching to textured or untextured pass based on bool
+ void pushGLTFBatches(U32 type, bool textured);
+
+
+ // rigged variants of above
void pushRiggedGLTFBatches(U32 type);
+ void pushRiggedGLTFBatches(U32 type, bool textured);
+ void pushUntexturedRiggedGLTFBatches(U32 type);
+
+ // push a single GLTF draw call
+ void pushGLTFBatch(LLDrawInfo& params);
void pushRiggedGLTFBatch(LLDrawInfo& params, LLVOAvatar*& lastAvatar, U64& lastMeshId);
+ void pushUntexturedGLTFBatch(LLDrawInfo& params);
+ void pushUntexturedRiggedGLTFBatch(LLDrawInfo& params, LLVOAvatar*& lastAvatar, U64& lastMeshId);
+
void pushMaskBatches(U32 type, bool texture = true, bool batch_textures = false);
void pushRiggedMaskBatches(U32 type, bool texture = true, bool batch_textures = false);
void pushBatch(LLDrawInfo& params, bool texture, bool batch_textures = false);
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index 07b7be0fc8..052a1d796a 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -204,6 +204,10 @@ void LLDrawPoolAlpha::renderPostDeferred(S32 pass)
prepare_alpha_shader(pbr_shader, false, true, water_sign);
+ // explicitly unbind here so render loop doesn't make assumptions about the last shader
+ // already being setup for rendering
+ LLGLSLShader::unbind();
+
if (!LLPipeline::sRenderingHUDs)
{
// first pass, render rigged objects only and render to depth buffer
@@ -214,7 +218,7 @@ void LLDrawPoolAlpha::renderPostDeferred(S32 pass)
forwardRender();
// final pass, render to depth for depth of field effects
- if (!LLPipeline::sImpostorRender && gSavedSettings.getBOOL("RenderDepthOfField") && !gCubeSnapshot && !LLPipeline::sRenderingHUDs)
+ if (!LLPipeline::sImpostorRender && gSavedSettings.getBOOL("RenderDepthOfField") && !gCubeSnapshot && !LLPipeline::sRenderingHUDs && getType() == LLDrawPool::POOL_ALPHA_POST_WATER)
{
//update depth buffer sampler
simple_shader = fullbright_shader = &gDeferredFullbrightAlphaMaskProgram;
@@ -282,6 +286,7 @@ void LLDrawPoolAlpha::renderDebugAlpha()
gGL.diffuseColor4f(1, 0, 0, 1);
gGL.getTexUnit(0)->bindFast(LLViewerFetchedTexture::getSmokeImage());
+
renderAlphaHighlight();
pushUntexturedBatches(LLRenderPass::PASS_ALPHA_MASK);
@@ -509,6 +514,7 @@ void LLDrawPoolAlpha::renderPbrEmissives(std::vector<LLDrawInfo*>& emissives)
for (LLDrawInfo* draw : emissives)
{
llassert(draw->mGLTFMaterial);
+ LLGLDisable cull_face(draw->mGLTFMaterial->mDoubleSided ? GL_CULL_FACE : 0);
draw->mGLTFMaterial->bind(draw->mTexture);
draw->mVertexBuffer->setBuffer();
draw->mVertexBuffer->drawRange(LLRender::TRIANGLES, draw->mStart, draw->mEnd, draw->mCount, draw->mOffset);
@@ -564,6 +570,7 @@ void LLDrawPoolAlpha::renderRiggedPbrEmissives(std::vector<LLDrawInfo*>& emissiv
lastMeshId = draw->mSkinInfo->mHash;
}
+ LLGLDisable cull_face(draw->mGLTFMaterial->mDoubleSided ? GL_CULL_FACE : 0);
draw->mGLTFMaterial->bind(draw->mTexture);
draw->mVertexBuffer->setBuffer();
draw->mVertexBuffer->drawRange(LLRender::TRIANGLES, draw->mStart, draw->mEnd, draw->mCount, draw->mOffset);
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index f3a6c4a3a7..342b76d93b 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -171,8 +171,8 @@ void LLDrawPoolAvatar::beginDeferredPass(S32 pass)
is_deferred_render = true;
if (LLPipeline::sImpostorRender)
- { //impostor pass does not have rigid or impostor rendering
- pass += 2;
+ { //impostor pass does not have impostor rendering
+ ++pass;
}
switch (pass)
@@ -198,7 +198,7 @@ void LLDrawPoolAvatar::endDeferredPass(S32 pass)
if (LLPipeline::sImpostorRender)
{
- pass += 2;
+ ++pass;
}
switch (pass)
@@ -418,7 +418,7 @@ void LLDrawPoolAvatar::render(S32 pass)
LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
if (LLPipeline::sImpostorRender)
{
- renderAvatars(NULL, pass+2);
+ renderAvatars(NULL, ++pass);
return;
}
@@ -433,7 +433,7 @@ void LLDrawPoolAvatar::beginRenderPass(S32 pass)
if (LLPipeline::sImpostorRender)
{ //impostor render does not have impostors or rigid rendering
- pass += 2;
+ ++pass;
}
switch (pass)
@@ -461,7 +461,7 @@ void LLDrawPoolAvatar::endRenderPass(S32 pass)
if (LLPipeline::sImpostorRender)
{
- pass += 2;
+ ++pass;
}
switch (pass)
diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp
index d73a486877..edc7bdef5f 100644
--- a/indra/newview/llenvironment.cpp
+++ b/indra/newview/llenvironment.cpp
@@ -816,7 +816,7 @@ const F64Seconds LLEnvironment::TRANSITION_ALTITUDE(5.0f);
const LLUUID LLEnvironment::KNOWN_SKY_SUNRISE("01e41537-ff51-2f1f-8ef7-17e4df760bfb");
const LLUUID LLEnvironment::KNOWN_SKY_MIDDAY("651510b8-5f4d-8991-1592-e7eeab2a5a06");
-const LLUUID LLEnvironment::KNOWN_SKY_LEGACY_MIDDAY("6c83e853-e7f8-cad7-8ee6-5f31c453721c");
+const LLUUID LLEnvironment::KNOWN_SKY_LEGACY_MIDDAY("cef49723-0292-af49-9b14-9598a616b8a3");
const LLUUID LLEnvironment::KNOWN_SKY_SUNSET("084e26cd-a900-28e8-08d0-64a9de5c15e2");
const LLUUID LLEnvironment::KNOWN_SKY_MIDNIGHT("8a01b97a-cb20-c1ea-ac63-f7ea84ad0090");
@@ -2954,12 +2954,20 @@ void LLEnvironment::DayTransition::animate()
setWater(mNextInstance->getWater());
});
+
+ // pause probe updates and reset reflection maps on sky change
+ gPipeline.mReflectionMapManager.pause();
+ gPipeline.mReflectionMapManager.reset();
+
mSky = mStartSky->buildClone();
mBlenderSky = std::make_shared<LLSettingsBlenderTimeDelta>(mSky, mStartSky, mNextInstance->getSky(), mTransitionTime);
mBlenderSky->setOnFinished(
[this](LLSettingsBlender::ptr_t blender) {
mBlenderSky.reset();
+ // resume reflection probe updates
+ gPipeline.mReflectionMapManager.resume();
+
if (!mBlenderSky && !mBlenderWater)
LLEnvironment::instance().mCurrentEnvironment = mNextInstance;
else
@@ -3550,12 +3558,19 @@ namespace
LLSettingsSky::ptr_t target_sky(start_sky->buildClone());
mInjectedSky->setSource(target_sky);
+ // clear reflection probes and pause updates during sky change
+ gPipeline.mReflectionMapManager.pause();
+ gPipeline.mReflectionMapManager.reset();
+
mBlenderSky = std::make_shared<LLSettingsBlenderTimeDelta>(target_sky, start_sky, psky, transition);
mBlenderSky->setOnFinished(
[this, psky](LLSettingsBlender::ptr_t blender)
{
mBlenderSky.reset();
mInjectedSky->setSource(psky);
+
+ // resume updating reflection probes when done animating sky
+ gPipeline.mReflectionMapManager.resume();
setSky(mInjectedSky);
if (!mBlenderWater && (countExperiencesActive() == 0))
{
diff --git a/indra/newview/lleventnotifier.cpp b/indra/newview/lleventnotifier.cpp
index f1a44a68c9..788b61b381 100644
--- a/indra/newview/lleventnotifier.cpp
+++ b/indra/newview/lleventnotifier.cpp
@@ -43,8 +43,10 @@ class LLEventHandler : public LLCommandHandler
public:
// requires trusted browser to trigger
LLEventHandler() : LLCommandHandler("event", UNTRUSTED_THROTTLE) { }
- bool handle(const LLSD& params, const LLSD& query_map,
- LLMediaCtrl* web)
+ bool handle(const LLSD& params,
+ const LLSD& query_map,
+ const std::string& grid,
+ LLMediaCtrl* web)
{
if (params.size() < 2)
{
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 3c71d3e49d..c1776705f9 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -1144,22 +1144,32 @@ void push_for_transform(LLVertexBuffer* buff, U32 source_count, U32 dest_count)
}
BOOL LLFace::getGeometryVolume(const LLVolume& volume,
- const S32 &f,
- const LLMatrix4& mat_vert_in, const LLMatrix3& mat_norm_in,
- const U16 &index_offset,
- bool force_rebuild)
+ S32 face_index,
+ const LLMatrix4& mat_vert_in,
+ const LLMatrix3& mat_norm_in,
+ U16 index_offset,
+ bool force_rebuild,
+ bool no_debug_assert)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_FACE;
llassert(verify());
- if (volume.getNumVolumeFaces() <= f) {
- LL_WARNS() << "Attempt get volume face out of range! Total Faces: " << volume.getNumVolumeFaces() << " Attempt get access to: " << f << LL_ENDL;
- return FALSE;
- }
+ if (face_index < 0 || face_index >= volume.getNumVolumeFaces())
+ {
+ if (gDebugGL)
+ {
+ LL_WARNS() << "Face index is out of bounds!" << LL_ENDL;
+ LL_WARNS() << "Attempt get volume face out of range!"
+ " Total Faces: " << volume.getNumVolumeFaces() <<
+ " Attempt get access to: " << face_index << LL_ENDL;
+ llassert(no_debug_assert);
+ }
+ return FALSE;
+ }
bool rigged = isState(RIGGED);
- const LLVolumeFace &vf = volume.getVolumeFace(f);
+ const LLVolumeFace &vf = volume.getVolumeFace(face_index);
S32 num_vertices = (S32)vf.mNumVertices;
S32 num_indices = (S32) vf.mNumIndices;
@@ -1174,14 +1184,14 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
{
if (gDebugGL)
{
- llassert(false);
- LL_WARNS() << "Index buffer overflow!" << LL_ENDL;
+ LL_WARNS() << "Index buffer overflow!" << LL_ENDL;
LL_WARNS() << "Indices Count: " << mIndicesCount
<< " VF Num Indices: " << num_indices
<< " Indices Index: " << mIndicesIndex
<< " VB Num Indices: " << mVertexBuffer->getNumIndices() << LL_ENDL;
- LL_WARNS() << " Face Index: " << f
+ LL_WARNS() << " Face Index: " << face_index
<< " Pool Type: " << mPoolType << LL_ENDL;
+ llassert(no_debug_assert);
}
return FALSE;
}
@@ -1190,8 +1200,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
{
if (gDebugGL)
{
- llassert(false);
LL_WARNS() << "Vertex buffer overflow!" << LL_ENDL;
+ llassert(no_debug_assert);
}
return FALSE;
}
@@ -1228,7 +1238,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
bool rebuild_tangent = rebuild_pos && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TANGENT);
bool rebuild_weights = rebuild_pos && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_WEIGHT4);
- const LLTextureEntry *tep = mVObjp->getTE(f);
+ const LLTextureEntry *tep = mVObjp->getTE(face_index);
const U8 bump_code = tep ? tep->getBumpmap() : 0;
BOOL is_static = mDrawablep->isStatic();
@@ -1443,7 +1453,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
if (bump_code)
{
- mVObjp->getVolume()->genTangents(f);
+ mVObjp->getVolume()->genTangents(face_index);
F32 offset_multiple;
switch( bump_code )
{
@@ -1492,7 +1502,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
U8 texgen = getTextureEntry()->getTexGen();
if (rebuild_tcoord && texgen != LLTextureEntry::TEX_GEN_DEFAULT)
{ //planar texgen needs binormals
- mVObjp->getVolume()->genTangents(f);
+ mVObjp->getVolume()->genTangents(face_index);
}
U8 tex_mode = 0;
@@ -1775,7 +1785,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
{
mVertexBuffer->getTexCoord1Strider(tex_coords1, mGeomIndex, mGeomCount);
- mVObjp->getVolume()->genTangents(f);
+ mVObjp->getVolume()->genTangents(face_index);
for (S32 i = 0; i < num_vertices; i++)
{
@@ -1895,7 +1905,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
mVertexBuffer->getTangentStrider(tangent, mGeomIndex, mGeomCount);
F32* tangents = (F32*) tangent.get();
- mVObjp->getVolume()->genTangents(f);
+ mVObjp->getVolume()->genTangents(face_index);
LLVector4Logical mask;
mask.clear();
diff --git a/indra/newview/llface.h b/indra/newview/llface.h
index 0a66dc6ba6..eb3b47d6d6 100644
--- a/indra/newview/llface.h
+++ b/indra/newview/llface.h
@@ -156,10 +156,12 @@ public:
void updateRebuildFlags();
bool canRenderAsMask(); // logic helper
BOOL getGeometryVolume(const LLVolume& volume,
- const S32 &f,
- const LLMatrix4& mat_vert, const LLMatrix3& mat_normal,
- const U16 &index_offset,
- bool force_rebuild = false);
+ S32 face_index,
+ const LLMatrix4& mat_vert,
+ const LLMatrix3& mat_normal,
+ U16 index_offset,
+ bool force_rebuild = false,
+ bool no_debug_assert = false);
// For avatar
U16 getGeometryAvatar(
diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp
index c2667bedaa..4ad136e13a 100644
--- a/indra/newview/llfilepicker.cpp
+++ b/indra/newview/llfilepicker.cpp
@@ -194,11 +194,11 @@ BOOL LLFilePicker::setupFilter(ELoadFilter filter)
mOFN.lpstrFilter = ANIM_FILTER \
L"\0";
break;
- case FFLOAD_GLTF:
- mOFN.lpstrFilter = GLTF_FILTER \
- L"\0";
- break;
- case FFLOAD_COLLADA:
+ case FFLOAD_GLTF:
+ mOFN.lpstrFilter = GLTF_FILTER \
+ L"\0";
+ break;
+ case FFLOAD_COLLADA:
mOFN.lpstrFilter = COLLADA_FILTER \
L"\0";
break;
@@ -780,7 +780,6 @@ void set_nav_save_data(LLFilePicker::ESaveFilter filter, std::string &extension,
creator = "\?\?\?\?";
extension = "xaf";
break;
-
case LLFilePicker::FFSAVE_GLTF:
type = "\?\?\?\?";
creator = "\?\?\?\?";
diff --git a/indra/newview/llfilepicker_mac.mm b/indra/newview/llfilepicker_mac.mm
index e5965abbd6..4dd8bea4e1 100644
--- a/indra/newview/llfilepicker_mac.mm
+++ b/indra/newview/llfilepicker_mac.mm
@@ -103,7 +103,6 @@ std::unique_ptr<std::vector<std::string>> doLoadDialog(const std::vector<std::st
}
}
}
-
return outfiles;
}
@@ -150,7 +149,7 @@ void doLoadDialogModeless(const std::vector<std::string>* allowed_types,
}
}
-std::unique_ptr<std::string> doSaveDialog(const std::string* file,
+std::unique_ptr<std::string> doSaveDialog(const std::string* file,
const std::string* type,
const std::string* creator,
const std::string* extension,
diff --git a/indra/newview/llfloater360capture.cpp b/indra/newview/llfloater360capture.cpp
index 23f86e2361..2c638fa959 100644
--- a/indra/newview/llfloater360capture.cpp
+++ b/indra/newview/llfloater360capture.cpp
@@ -64,12 +64,10 @@ LLFloater360Capture::LLFloater360Capture(const LLSD& key)
// such time as we ask it not to (the dtor). If we crash or
// otherwise, exit before this is turned off, the Simulator
// will take care of cleaning up for us.
- if (gSavedSettings.getBOOL("360CaptureUseInterestListCap"))
- {
- // send everything to us for as long as this floater is open
- const bool send_everything = true;
- changeInterestListMode(send_everything);
- }
+ mStartILMode = gAgent.getInterestListMode();
+
+ // send everything to us for as long as this floater is open
+ gAgent.changeInterestListMode(LLViewerRegion::IL_MODE_360);
}
LLFloater360Capture::~LLFloater360Capture()
@@ -81,13 +79,15 @@ LLFloater360Capture::~LLFloater360Capture()
mWebBrowser->unloadMediaSource();
}
- // Tell the Simulator not to send us everything anymore
- // and revert to the regular "keyhole" frustum of interest
+ // Restore interest list mode to the state when started
+ // Normally LLFloater360Capture tells the Simulator send everything
+ // and now reverts to the regular "keyhole" frustum of interest
// list updates.
- if (!LLApp::isExiting() && gSavedSettings.getBOOL("360CaptureUseInterestListCap"))
+ if (!LLApp::isExiting() &&
+ gSavedSettings.getBOOL("360CaptureUseInterestListCap") &&
+ mStartILMode != gAgent.getInterestListMode())
{
- const bool send_everything = false;
- changeInterestListMode(send_everything);
+ gAgent.changeInterestListMode(mStartILMode);
}
}
@@ -170,52 +170,6 @@ void LLFloater360Capture::onChooseQualityRadioGroup()
setSourceImageSize();
}
-// Using a new capability, tell the simulator that we want it to send everything
-// it knows about and not just what is in front of the camera, in its view
-// frustum. We need this feature so that the contents of the region that appears
-// in the 6 snapshots which we cannot see and is normally not "considered", is
-// also rendered. Typically, this is turned on when the 360 capture floater is
-// opened and turned off when it is closed.
-// Note: for this version, we do not have a way to determine when "everything"
-// has arrived and has been rendered so for now, the proposal is that users
-// will need to experiment with the low resolution version and wait for some
-// (hopefully) small period of time while the full contents resolves.
-// Pass in a flag to ask the simulator/interest list to "send everything" or
-// not (the default mode)
-void LLFloater360Capture::changeInterestListMode(bool send_everything)
-{
- LLSD body;
-
- if (send_everything)
- {
- body["mode"] = LLSD::String("360");
- }
- else
- {
- body["mode"] = LLSD::String("default");
- }
-
- if (gAgent.requestPostCapability("InterestList", body, [](const LLSD & response)
- {
- LL_INFOS("360Capture") <<
- "InterestList capability responded: \n" <<
- ll_pretty_print_sd(response) <<
- LL_ENDL;
- }))
- {
- LL_INFOS("360Capture") <<
- "Successfully posted an InterestList capability request with payload: \n" <<
- ll_pretty_print_sd(body) <<
- LL_ENDL;
- }
- else
- {
- LL_INFOS("360Capture") <<
- "Unable to post an InterestList capability request with payload: \n" <<
- ll_pretty_print_sd(body) <<
- LL_ENDL;
- }
-}
// There is is a setting (360CaptureSourceImageSize) that holds the size
// (width == height since it's a square) of each of the 6 source snapshots.
@@ -632,11 +586,8 @@ void LLFloater360Capture::capture360Images()
// display time to encode all 6 images. It tends to be a fairly linear
// time for each so we don't need to worry about displaying the time
// for each - this gives us plenty to use for optimizing
- LL_INFOS("360Capture") <<
- "Time to encode and save 6 images was " <<
- encode_time_total <<
- " seconds" <<
- LL_ENDL;
+ LL_INFOS("360Capture") << "Time to encode and save 6 images was " <<
+ encode_time_total << " seconds" << LL_ENDL;
// Write the JavaScript file footer (the bottom of the file after the
// declarations of the actual data URLs array). The footer comprises of
@@ -668,7 +619,7 @@ void LLFloater360Capture::capture360Images()
// as a change - only the subsequent 5 are
if (camera_changed_times < 5)
{
- LL_INFOS("360Capture") << "Warning: we only captured " << camera_changed_times << " images." << LL_ENDL;
+ LL_WARNS("360Capture") << "360 image capture expected 5 or more images, only captured " << camera_changed_times << " images." << LL_ENDL;
}
// now we have the 6 shots saved in a well specified location,
diff --git a/indra/newview/llfloater360capture.h b/indra/newview/llfloater360capture.h
index 8f765c0b1b..3fb2c7f3c7 100644
--- a/indra/newview/llfloater360capture.h
+++ b/indra/newview/llfloater360capture.h
@@ -50,8 +50,6 @@ class LLFloater360Capture:
void onOpen(const LLSD& key) override;
void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) override;
- void changeInterestListMode(bool send_everything);
-
const std::string getHTMLBaseFolder();
void capture360Images();
@@ -93,6 +91,8 @@ class LLFloater360Capture:
std::string mImageSaveDir;
LLPointer<LLImageRaw> mRawImages[6];
+
+ std::string mStartILMode;
};
#endif // LL_FLOATER_360CAPTURE_H
diff --git a/indra/newview/llfloaterbulkpermission.cpp b/indra/newview/llfloaterbulkpermission.cpp
index a3cc939f85..abc9cdbcc2 100644
--- a/indra/newview/llfloaterbulkpermission.cpp
+++ b/indra/newview/llfloaterbulkpermission.cpp
@@ -76,6 +76,8 @@ BOOL LLFloaterBulkPermission::postBuild()
mBulkChangeIncludeSounds = gSavedSettings.getBOOL("BulkChangeIncludeSounds");
mBulkChangeIncludeTextures = gSavedSettings.getBOOL("BulkChangeIncludeTextures");
mBulkChangeIncludeSettings = gSavedSettings.getBOOL("BulkChangeIncludeSettings");
+ mBulkChangeIncludeMaterials = gSavedSettings.getBOOL("BulkChangeIncludeMaterials");
+
mBulkChangeShareWithGroup = gSavedSettings.getBOOL("BulkChangeShareWithGroup");
mBulkChangeEveryoneCopy = gSavedSettings.getBOOL("BulkChangeEveryoneCopy");
mBulkChangeNextOwnerModify = gSavedSettings.getBOOL("BulkChangeNextOwnerModify");
@@ -188,6 +190,8 @@ void LLFloaterBulkPermission::onCloseBtn()
gSavedSettings.setBOOL("BulkChangeIncludeSounds", mBulkChangeIncludeSounds);
gSavedSettings.setBOOL("BulkChangeIncludeTextures", mBulkChangeIncludeTextures);
gSavedSettings.setBOOL("BulkChangeIncludeSettings", mBulkChangeIncludeSettings);
+ gSavedSettings.setBOOL("BulkChangeIncludeMaterials", mBulkChangeIncludeMaterials);
+
gSavedSettings.setBOOL("BulkChangeShareWithGroup", mBulkChangeShareWithGroup);
gSavedSettings.setBOOL("BulkChangeEveryoneCopy", mBulkChangeEveryoneCopy);
gSavedSettings.setBOOL("BulkChangeNextOwnerModify", mBulkChangeNextOwnerModify);
@@ -284,6 +288,7 @@ void LLFloaterBulkPermission::doCheckUncheckAll(BOOL check)
gSavedSettings.setBOOL("BulkChangeIncludeSounds" , check);
gSavedSettings.setBOOL("BulkChangeIncludeTextures" , check);
gSavedSettings.setBOOL("BulkChangeIncludeSettings" , check);
+ gSavedSettings.setBOOL("BulkChangeIncludeMaterials" , check);
}
diff --git a/indra/newview/llfloaterbulkpermission.h b/indra/newview/llfloaterbulkpermission.h
index 1afc876bba..ab5d568667 100644
--- a/indra/newview/llfloaterbulkpermission.h
+++ b/indra/newview/llfloaterbulkpermission.h
@@ -103,6 +103,8 @@ private:
bool mBulkChangeIncludeSounds;
bool mBulkChangeIncludeTextures;
bool mBulkChangeIncludeSettings;
+ bool mBulkChangeIncludeMaterials;
+
bool mBulkChangeShareWithGroup;
bool mBulkChangeEveryoneCopy;
bool mBulkChangeNextOwnerModify;
diff --git a/indra/newview/llfloatercamerapresets.cpp b/indra/newview/llfloatercamerapresets.cpp
index 300c945a85..a1cbffd094 100644
--- a/indra/newview/llfloatercamerapresets.cpp
+++ b/indra/newview/llfloatercamerapresets.cpp
@@ -24,6 +24,7 @@
*/
#include "llviewerprecompiledheaders.h"
+#include "llfloatercamera.h"
#include "llfloatercamerapresets.h"
#include "llfloaterreg.h"
#include "llnotificationsutil.h"
@@ -40,7 +41,8 @@ LLFloaterCameraPresets::~LLFloaterCameraPresets()
BOOL LLFloaterCameraPresets::postBuild()
{
mPresetList = getChild<LLFlatListView>("preset_list");
-
+ mPresetList->setCommitCallback(boost::bind(&LLFloaterCameraPresets::onSelectionChange, this));
+ mPresetList->setCommitOnSelectionChange(true);
LLPresetsManager::getInstance()->setPresetListChangeCameraCallback(boost::bind(&LLFloaterCameraPresets::populateList, this));
return TRUE;
@@ -58,6 +60,7 @@ void LLFloaterCameraPresets::populateList()
std::list<std::string> preset_names;
presetsMgr->loadPresetNamesFromDir(PRESETS_CAMERA, preset_names, DEFAULT_BOTTOM);
+ std::string active_preset = gSavedSettings.getString("PresetCameraActive");
for (std::list<std::string>::const_iterator it = preset_names.begin(); it != preset_names.end(); ++it)
{
@@ -66,6 +69,19 @@ void LLFloaterCameraPresets::populateList()
LLCameraPresetFlatItem* item = new LLCameraPresetFlatItem(name, is_default);
item->postBuild();
mPresetList->addItem(item);
+ if(name == active_preset)
+ {
+ mPresetList->selectItem(item);
+ }
+ }
+}
+
+void LLFloaterCameraPresets::onSelectionChange()
+{
+ LLCameraPresetFlatItem* selected_preset = dynamic_cast<LLCameraPresetFlatItem*>(mPresetList->getSelectedItem());
+ if(selected_preset)
+ {
+ LLFloaterCamera::switchToPreset(selected_preset->getPresetName());
}
}
diff --git a/indra/newview/llfloatercamerapresets.h b/indra/newview/llfloatercamerapresets.h
index 66430fa399..4430a4209e 100644
--- a/indra/newview/llfloatercamerapresets.h
+++ b/indra/newview/llfloatercamerapresets.h
@@ -38,6 +38,7 @@ class LLFloaterCameraPresets : public LLFloater
virtual void onOpen(const LLSD& key);
void populateList();
+ void onSelectionChange();
private:
LLFloaterCameraPresets(const LLSD& key);
@@ -58,6 +59,8 @@ public:
virtual void onMouseEnter(S32 x, S32 y, MASK mask);
virtual void onMouseLeave(S32 x, S32 y, MASK mask);
+ std::string getPresetName() { return mPresetName; }
+
private:
void onDeleteBtnClick();
void onResetBtnClick();
diff --git a/indra/newview/llfloaterchangeitemthumbnail.cpp b/indra/newview/llfloaterchangeitemthumbnail.cpp
new file mode 100644
index 0000000000..f54240f6f4
--- /dev/null
+++ b/indra/newview/llfloaterchangeitemthumbnail.cpp
@@ -0,0 +1,955 @@
+/**
+ * @file llfloaterchangeitemthumbnail.cpp
+ * @brief LLFloaterChangeItemThumbnail class implementation
+ *
+ * $LicenseInfo:firstyear=2023&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2023, 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 "llfloaterchangeitemthumbnail.h"
+
+#include "llbutton.h"
+#include "llclipboard.h"
+#include "lliconctrl.h"
+#include "llinventoryfunctions.h"
+#include "llinventoryicon.h"
+#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
+#include "llfloaterreg.h"
+#include "llfloatersimplesnapshot.h"
+#include "lllineeditor.h"
+#include "llnotificationsutil.h"
+#include "lltextbox.h"
+#include "lltexturectrl.h"
+#include "llthumbnailctrl.h"
+#include "llviewerfoldertype.h"
+#include "llviewermenufile.h"
+#include "llviewerobjectlist.h"
+#include "llviewertexturelist.h"
+#include "llwindow.h"
+
+
+class LLThumbnailImagePicker : public LLFilePickerThread
+{
+public:
+ LLThumbnailImagePicker(const LLUUID &item_id);
+ LLThumbnailImagePicker(const LLUUID &item_id, const LLUUID &task_id);
+ ~LLThumbnailImagePicker();
+ void notify(const std::vector<std::string>& filenames) override;
+
+private:
+ LLUUID mInventoryId;
+ LLUUID mTaskId;
+};
+
+LLThumbnailImagePicker::LLThumbnailImagePicker(const LLUUID &item_id)
+ : LLFilePickerThread(LLFilePicker::FFLOAD_IMAGE)
+ , mInventoryId(item_id)
+{
+}
+
+LLThumbnailImagePicker::LLThumbnailImagePicker(const LLUUID &item_id, const LLUUID &task_id)
+ : LLFilePickerThread(LLFilePicker::FFLOAD_IMAGE)
+ , mInventoryId(item_id)
+ , mTaskId(task_id)
+{
+}
+
+LLThumbnailImagePicker::~LLThumbnailImagePicker()
+{
+}
+
+void LLThumbnailImagePicker::notify(const std::vector<std::string>& filenames)
+{
+ if (filenames.empty())
+ {
+ return;
+ }
+ std::string file_path = filenames[0];
+ if (file_path.empty())
+ {
+ return;
+ }
+
+ LLFloaterSimpleSnapshot::uploadThumbnail(file_path, mInventoryId, mTaskId);
+}
+
+LLFloaterChangeItemThumbnail::LLFloaterChangeItemThumbnail(const LLSD& key)
+ : LLFloater(key)
+ , mObserverInitialized(false)
+ , mTooltipState(TOOLTIP_NONE)
+{
+}
+
+LLFloaterChangeItemThumbnail::~LLFloaterChangeItemThumbnail()
+{
+ gInventory.removeObserver(this);
+ removeVOInventoryListener();
+}
+
+BOOL LLFloaterChangeItemThumbnail::postBuild()
+{
+ mItemNameText = getChild<LLUICtrl>("item_name");
+ mItemTypeIcon = getChild<LLIconCtrl>("item_type_icon");
+ mThumbnailCtrl = getChild<LLThumbnailCtrl>("item_thumbnail");
+ mToolTipTextBox = getChild<LLTextBox>("tooltip_text");
+
+ LLSD tooltip_text;
+ mToolTipTextBox->setValue(tooltip_text);
+
+ LLButton *upload_local = getChild<LLButton>("upload_local");
+ upload_local->setClickedCallback(onUploadLocal, (void*)this);
+ upload_local->setMouseEnterCallback(boost::bind(&LLFloaterChangeItemThumbnail::onButtonMouseEnter, this, _1, _2, TOOLTIP_UPLOAD_LOCAL));
+ upload_local->setMouseLeaveCallback(boost::bind(&LLFloaterChangeItemThumbnail::onButtonMouseLeave, this, _1, _2, TOOLTIP_UPLOAD_LOCAL));
+
+ LLButton *upload_snapshot = getChild<LLButton>("upload_snapshot");
+ upload_snapshot->setClickedCallback(onUploadSnapshot, (void*)this);
+ upload_snapshot->setMouseEnterCallback(boost::bind(&LLFloaterChangeItemThumbnail::onButtonMouseEnter, this, _1, _2, TOOLTIP_UPLOAD_SNAPSHOT));
+ upload_snapshot->setMouseLeaveCallback(boost::bind(&LLFloaterChangeItemThumbnail::onButtonMouseLeave, this, _1, _2, TOOLTIP_UPLOAD_SNAPSHOT));
+
+ LLButton *use_texture = getChild<LLButton>("use_texture");
+ use_texture->setClickedCallback(onUseTexture, (void*)this);
+ use_texture->setMouseEnterCallback(boost::bind(&LLFloaterChangeItemThumbnail::onButtonMouseEnter, this, _1, _2, TOOLTIP_USE_TEXTURE));
+ use_texture->setMouseLeaveCallback(boost::bind(&LLFloaterChangeItemThumbnail::onButtonMouseLeave, this, _1, _2, TOOLTIP_USE_TEXTURE));
+
+ mCopyToClipboardBtn = getChild<LLButton>("copy_to_clipboard");
+ mCopyToClipboardBtn->setClickedCallback(onCopyToClipboard, (void*)this);
+ mCopyToClipboardBtn->setMouseEnterCallback(boost::bind(&LLFloaterChangeItemThumbnail::onButtonMouseEnter, this, _1, _2, TOOLTIP_COPY_TO_CLIPBOARD));
+ mCopyToClipboardBtn->setMouseLeaveCallback(boost::bind(&LLFloaterChangeItemThumbnail::onButtonMouseLeave, this, _1, _2, TOOLTIP_COPY_TO_CLIPBOARD));
+
+ mPasteFromClipboardBtn = getChild<LLButton>("paste_from_clipboard");
+ mPasteFromClipboardBtn->setClickedCallback(onPasteFromClipboard, (void*)this);
+ mPasteFromClipboardBtn->setMouseEnterCallback(boost::bind(&LLFloaterChangeItemThumbnail::onButtonMouseEnter, this, _1, _2, TOOLTIP_COPY_FROM_CLIPBOARD));
+ mPasteFromClipboardBtn->setMouseLeaveCallback(boost::bind(&LLFloaterChangeItemThumbnail::onButtonMouseLeave, this, _1, _2, TOOLTIP_COPY_FROM_CLIPBOARD));
+
+ mRemoveImageBtn = getChild<LLButton>("remove_image");
+ mRemoveImageBtn->setClickedCallback(onRemove, (void*)this);
+ mRemoveImageBtn->setMouseEnterCallback(boost::bind(&LLFloaterChangeItemThumbnail::onButtonMouseEnter, this, _1, _2, TOOLTIP_REMOVE));
+ mRemoveImageBtn->setMouseLeaveCallback(boost::bind(&LLFloaterChangeItemThumbnail::onButtonMouseLeave, this, _1, _2, TOOLTIP_REMOVE));
+
+ return LLFloater::postBuild();
+}
+
+void LLFloaterChangeItemThumbnail::onOpen(const LLSD& key)
+{
+ if (!key.has("item_id") && !key.isUUID())
+ {
+ closeFloater();
+ }
+
+ if (key.isUUID())
+ {
+ mItemId = key.asUUID();
+ }
+ else
+ {
+ mItemId = key["item_id"].asUUID();
+ mTaskId = key["task_id"].asUUID();
+ }
+
+ refreshFromInventory();
+}
+
+void LLFloaterChangeItemThumbnail::onFocusReceived()
+{
+ mPasteFromClipboardBtn->setEnabled(LLClipboard::instance().hasContents());
+}
+
+void LLFloaterChangeItemThumbnail::onMouseEnter(S32 x, S32 y, MASK mask)
+{
+ mPasteFromClipboardBtn->setEnabled(LLClipboard::instance().hasContents());
+}
+
+BOOL LLFloaterChangeItemThumbnail::handleDragAndDrop(
+ S32 x,
+ S32 y,
+ MASK mask,
+ BOOL drop,
+ EDragAndDropType cargo_type,
+ void *cargo_data,
+ EAcceptance *accept,
+ std::string& tooltip_msg)
+{
+ if (cargo_type == DAD_TEXTURE)
+ {
+ LLInventoryItem *item = (LLInventoryItem *)cargo_data;
+ if (item->getAssetUUID().notNull())
+ {
+ if (drop)
+ {
+ assignAndValidateAsset(item->getAssetUUID());
+ }
+
+ *accept = ACCEPT_YES_SINGLE;
+ }
+ else
+ {
+ *accept = ACCEPT_NO;
+ }
+ }
+ else
+ {
+ *accept = ACCEPT_NO;
+ }
+
+ LL_DEBUGS("UserInput") << "dragAndDrop handled by LLFloaterChangeItemThumbnail " << getKey() << LL_ENDL;
+
+ return TRUE;
+}
+
+void LLFloaterChangeItemThumbnail::changed(U32 mask)
+{
+ //LLInventoryObserver
+
+ if (mTaskId.notNull() || mItemId.isNull())
+ {
+ // Task inventory or not set up yet
+ return;
+ }
+
+ const std::set<LLUUID>& mChangedItemIDs = gInventory.getChangedIDs();
+ std::set<LLUUID>::const_iterator it;
+
+ for (it = mChangedItemIDs.begin(); it != mChangedItemIDs.end(); it++)
+ {
+ // set dirty for 'item profile panel' only if changed item is the item for which 'item profile panel' is shown (STORM-288)
+ if (*it == mItemId)
+ {
+ // if there's a change we're interested in.
+ if ((mask & (LLInventoryObserver::LABEL | LLInventoryObserver::INTERNAL | LLInventoryObserver::REMOVE)) != 0)
+ {
+ refreshFromInventory();
+ }
+ }
+ }
+}
+
+void LLFloaterChangeItemThumbnail::inventoryChanged(LLViewerObject* object,
+ LLInventoryObject::object_list_t* inventory,
+ S32 serial_num,
+ void* user_data)
+{
+ //LLVOInventoryListener
+ refreshFromInventory();
+}
+
+LLInventoryObject* LLFloaterChangeItemThumbnail::getInventoryObject()
+{
+ LLInventoryObject* obj = NULL;
+ if (mTaskId.isNull())
+ {
+ // it is in agent inventory
+ if (!mObserverInitialized)
+ {
+ gInventory.addObserver(this);
+ mObserverInitialized = true;
+ }
+
+ obj = gInventory.getObject(mItemId);
+ }
+ else
+ {
+ LLViewerObject* object = gObjectList.findObject(mTaskId);
+ if (object)
+ {
+ if (!mObserverInitialized)
+ {
+ registerVOInventoryListener(object, NULL);
+ mObserverInitialized = false;
+ }
+
+ obj = object->getInventoryObject(mItemId);
+ }
+ }
+ return obj;
+}
+
+void LLFloaterChangeItemThumbnail::refreshFromInventory()
+{
+ LLInventoryObject* obj = getInventoryObject();
+ if (!obj)
+ {
+ closeFloater();
+ }
+
+ if (obj)
+ {
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ bool in_trash = gInventory.isObjectDescendentOf(obj->getUUID(), trash_id);
+ if (in_trash && obj->getUUID() != trash_id)
+ {
+ // Close properties when moving to trash
+ // Aren't supposed to view properties from trash
+ closeFloater();
+ }
+ else
+ {
+ refreshFromObject(obj);
+ }
+ }
+ else
+ {
+ closeFloater();
+ }
+}
+
+class LLIsOutfitTextureType : public LLInventoryCollectFunctor
+{
+public:
+ LLIsOutfitTextureType() {}
+ virtual ~LLIsOutfitTextureType() {}
+ virtual bool operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item);
+};
+
+bool LLIsOutfitTextureType::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
+{
+ return item && (item->getType() == LLAssetType::AT_TEXTURE);
+}
+
+void LLFloaterChangeItemThumbnail::refreshFromObject(LLInventoryObject* obj)
+{
+ LLUIImagePtr icon_img;
+ LLUUID thumbnail_id = obj->getThumbnailUUID();
+
+ LLViewerInventoryItem* item = dynamic_cast<LLViewerInventoryItem*>(obj);
+ if (item)
+ {
+ setTitle(getString("title_item_thumbnail"));
+
+ icon_img = LLInventoryIcon::getIcon(item->getType(), item->getInventoryType(), item->getFlags(), FALSE);
+ mRemoveImageBtn->setEnabled(thumbnail_id.notNull() && ((item->getActualType() != LLAssetType::AT_TEXTURE) || (item->getAssetUUID() != thumbnail_id)));
+ }
+ else
+ {
+ LLViewerInventoryCategory* cat = dynamic_cast<LLViewerInventoryCategory*>(obj);
+
+ if (cat)
+ {
+ setTitle(getString("title_folder_thumbnail"));
+ icon_img = LLUI::getUIImage(LLViewerFolderType::lookupIconName(cat->getPreferredType(), true));
+
+ if (thumbnail_id.isNull() && (cat->getPreferredType() == LLFolderType::FT_OUTFIT))
+ {
+ // Legacy support, check if there is an image inside
+
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
+ // Not LLIsOfAssetType, because we allow links
+ LLIsOutfitTextureType f;
+ gInventory.getDirectDescendentsOf(mItemId, cats, items, f);
+
+ if (1 == items.size())
+ {
+ LLViewerInventoryItem* item = items.front();
+ if (item && item->getIsLinkType())
+ {
+ item = item->getLinkedItem();
+ }
+ if (item)
+ {
+ thumbnail_id = item->getAssetUUID();
+ if (thumbnail_id.notNull())
+ {
+ // per SL-19188, set this image as a thumbnail
+ LL_INFOS() << "Setting image " << thumbnail_id
+ << " from outfit as a thumbnail for inventory object " << obj->getUUID()
+ << LL_ENDL;
+ assignAndValidateAsset(thumbnail_id, true);
+ }
+ }
+ }
+ }
+
+ mRemoveImageBtn->setEnabled(thumbnail_id.notNull());
+ }
+ }
+ mItemTypeIcon->setImage(icon_img);
+ mItemNameText->setValue(obj->getName());
+
+ mThumbnailCtrl->setValue(thumbnail_id);
+
+ mCopyToClipboardBtn->setEnabled(thumbnail_id.notNull());
+ mPasteFromClipboardBtn->setEnabled(LLClipboard::instance().hasContents());
+
+ // todo: some elements might not support setting thumbnails
+ // since they already have them
+ // It is unclear how system folders should function
+}
+
+void LLFloaterChangeItemThumbnail::onUploadLocal(void *userdata)
+{
+ LLFloaterChangeItemThumbnail *self = (LLFloaterChangeItemThumbnail*)userdata;
+
+ (new LLThumbnailImagePicker(self->mItemId, self->mTaskId))->getFile();
+
+ LLFloater* floaterp = self->mPickerHandle.get();
+ if (floaterp)
+ {
+ floaterp->closeFloater();
+ }
+ floaterp = self->mSnapshotHandle.get();
+ if (floaterp)
+ {
+ floaterp->closeFloater();
+ }
+}
+
+void LLFloaterChangeItemThumbnail::onUploadSnapshot(void *userdata)
+{
+ LLFloaterChangeItemThumbnail *self = (LLFloaterChangeItemThumbnail*)userdata;
+
+ LLFloater* floaterp = self->mSnapshotHandle.get();
+ // Show the dialog
+ if (floaterp)
+ {
+ floaterp->openFloater();
+ }
+ else
+ {
+ LLSD key;
+ key["item_id"] = self->mItemId;
+ key["task_id"] = self->mTaskId;
+ LLFloaterSimpleSnapshot* snapshot_floater = (LLFloaterSimpleSnapshot*)LLFloaterReg::showInstance("simple_snapshot", key, true);
+ if (snapshot_floater)
+ {
+ self->addDependentFloater(snapshot_floater);
+ self->mSnapshotHandle = snapshot_floater->getHandle();
+ snapshot_floater->setOwner(self);
+ }
+ }
+
+ floaterp = self->mPickerHandle.get();
+ if (floaterp)
+ {
+ floaterp->closeFloater();
+ }
+}
+
+void LLFloaterChangeItemThumbnail::onUseTexture(void *userdata)
+{
+ LLFloaterChangeItemThumbnail *self = (LLFloaterChangeItemThumbnail*)userdata;
+ LLInventoryObject* obj = self->getInventoryObject();
+ if (obj)
+ {
+ self->showTexturePicker(obj->getThumbnailUUID());
+ }
+
+ LLFloater* floaterp = self->mSnapshotHandle.get();
+ if (floaterp)
+ {
+ floaterp->closeFloater();
+ }
+}
+
+void LLFloaterChangeItemThumbnail::onCopyToClipboard(void *userdata)
+{
+ LLFloaterChangeItemThumbnail *self = (LLFloaterChangeItemThumbnail*)userdata;
+ LLInventoryObject* obj = self->getInventoryObject();
+ if (obj)
+ {
+ LLClipboard::instance().reset();
+ LLClipboard::instance().addToClipboard(obj->getThumbnailUUID(), LLAssetType::AT_NONE);
+ self->mPasteFromClipboardBtn->setEnabled(true);
+ }
+}
+
+void LLFloaterChangeItemThumbnail::onPasteFromClipboard(void *userdata)
+{
+ LLFloaterChangeItemThumbnail *self = (LLFloaterChangeItemThumbnail*)userdata;
+ std::vector<LLUUID> objects;
+ LLClipboard::instance().pasteFromClipboard(objects);
+ if (objects.size() > 0)
+ {
+ LLUUID potential_uuid = objects[0];
+ LLUUID asset_id;
+
+ if (potential_uuid.notNull())
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(potential_uuid);
+ if (item)
+ {
+ // no point checking snapshot?
+ if (item->getType() == LLAssetType::AT_TEXTURE)
+ {
+ bool copy = item->getPermissions().allowCopyBy(gAgent.getID());
+ bool xfer = item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID());
+
+ if (copy && xfer)
+ {
+ asset_id = item->getAssetUUID();
+ }
+ else
+ {
+ LLNotificationsUtil::add("ThumbnailInsufficientPermissions");
+ return;
+ }
+ }
+ }
+ else
+ {
+ // assume that this is a texture
+ asset_id = potential_uuid;
+ }
+ }
+
+ LLInventoryObject* obj = self->getInventoryObject();
+ if (obj && obj->getThumbnailUUID() == asset_id)
+ {
+ // nothing to do
+ return;
+ }
+ if (asset_id.notNull())
+ {
+ self->assignAndValidateAsset(asset_id);
+ }
+ // else show 'buffer has no texture' warning?
+ }
+}
+
+void LLFloaterChangeItemThumbnail::onRemove(void *userdata)
+{
+ LLFloaterChangeItemThumbnail *self = (LLFloaterChangeItemThumbnail*)userdata;
+
+ LLSD payload;
+ payload["item_id"] = self->mItemId;
+ payload["object_id"] = self->mTaskId;
+ LLNotificationsUtil::add("DeleteThumbnail", LLSD(), payload, boost::bind(&LLFloaterChangeItemThumbnail::onRemovalConfirmation, _1, _2, self->getHandle()));
+}
+
+// static
+void LLFloaterChangeItemThumbnail::onRemovalConfirmation(const LLSD& notification, const LLSD& response, LLHandle<LLFloater> handle)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option == 0 && !handle.isDead() && !handle.get()->isDead())
+ {
+ LLFloaterChangeItemThumbnail* self = (LLFloaterChangeItemThumbnail*)handle.get();
+ self->setThumbnailId(LLUUID::null);
+ }
+}
+
+struct ImageLoadedData
+{
+ LLUUID mThumbnailId;
+ LLUUID mObjectId;
+ LLHandle<LLFloater> mFloaterHandle;
+ bool mSilent;
+ // Keep image reference to prevent deletion on timeout
+ LLPointer<LLViewerFetchedTexture> mTexturep;
+};
+
+void LLFloaterChangeItemThumbnail::assignAndValidateAsset(const LLUUID &asset_id, bool silent)
+{
+ LLPointer<LLViewerFetchedTexture> texturep = LLViewerTextureManager::getFetchedTexture(asset_id);
+ if (texturep->isMissingAsset())
+ {
+ LL_WARNS() << "Attempted to assign missing asset " << asset_id << LL_ENDL;
+ if (!silent)
+ {
+ LLNotificationsUtil::add("ThumbnailDimentionsLimit");
+ }
+ }
+ else if (texturep->getFullWidth() == 0)
+ {
+ if (silent)
+ {
+ mExpectingAssetId = LLUUID::null;
+ }
+ else
+ {
+ // don't warn user multiple times if some textures took their time
+ mExpectingAssetId = asset_id;
+ }
+ ImageLoadedData *data = new ImageLoadedData();
+ data->mObjectId = mItemId;
+ data->mThumbnailId = asset_id;
+ data->mFloaterHandle = getHandle();
+ data->mSilent = silent;
+ data->mTexturep = texturep;
+
+ texturep->setLoadedCallback(onImageDataLoaded,
+ MAX_DISCARD_LEVEL, // Don't need full image, just size data
+ FALSE,
+ FALSE,
+ (void*)data,
+ NULL,
+ FALSE);
+ }
+ else
+ {
+ if (validateAsset(asset_id))
+ {
+ setThumbnailId(asset_id);
+ }
+ else if (!silent)
+ {
+ LLNotificationsUtil::add("ThumbnailDimentionsLimit");
+ }
+ }
+}
+bool LLFloaterChangeItemThumbnail::validateAsset(const LLUUID &asset_id)
+{
+ if (asset_id.isNull())
+ {
+ return false;
+ }
+
+ LLPointer<LLViewerFetchedTexture> texturep = LLViewerTextureManager::findFetchedTexture(asset_id, TEX_LIST_STANDARD);
+
+ if (!texturep)
+ {
+ return false;
+ }
+
+ if (texturep->isMissingAsset())
+ {
+ return false;
+ }
+
+ if (texturep->getFullWidth() != texturep->getFullHeight())
+ {
+ return false;
+ }
+
+ if (texturep->getFullWidth() > LLFloaterSimpleSnapshot::THUMBNAIL_SNAPSHOT_DIM_MAX
+ || texturep->getFullHeight() > LLFloaterSimpleSnapshot::THUMBNAIL_SNAPSHOT_DIM_MAX)
+ {
+ return false;
+ }
+
+ if (texturep->getFullWidth() < LLFloaterSimpleSnapshot::THUMBNAIL_SNAPSHOT_DIM_MIN
+ || texturep->getFullHeight() < LLFloaterSimpleSnapshot::THUMBNAIL_SNAPSHOT_DIM_MIN)
+ {
+ return false;
+ }
+ return true;
+}
+
+//static
+void LLFloaterChangeItemThumbnail::onImageDataLoaded(
+ BOOL success,
+ LLViewerFetchedTexture *src_vi,
+ LLImageRaw* src,
+ LLImageRaw* aux_src,
+ S32 discard_level,
+ BOOL final,
+ void* userdata)
+{
+ if (!userdata) return;
+
+ if (!final && success) return; //not done yet
+
+ ImageLoadedData* data = (ImageLoadedData*)userdata;
+
+ if (success)
+ {
+ // Update the item, set it even if floater is dead
+ if (validateAsset(data->mThumbnailId))
+ {
+ setThumbnailId(data->mThumbnailId, data->mObjectId);
+ }
+ else if (!data->mSilent)
+ {
+ // Should this only appear if floater is alive?
+ LLNotificationsUtil::add("ThumbnailDimentionsLimit");
+ }
+ }
+
+ // Update floater
+ if (!data->mSilent && !data->mFloaterHandle.isDead())
+ {
+ LLFloaterChangeItemThumbnail* self = static_cast<LLFloaterChangeItemThumbnail*>(data->mFloaterHandle.get());
+ if (self && self->mExpectingAssetId == data->mThumbnailId)
+ {
+ self->mExpectingAssetId = LLUUID::null;
+ }
+ }
+
+ delete data;
+}
+
+//static
+void LLFloaterChangeItemThumbnail::onFullImageLoaded(
+ BOOL success,
+ LLViewerFetchedTexture* src_vi,
+ LLImageRaw* src,
+ LLImageRaw* aux_src,
+ S32 discard_level,
+ BOOL final,
+ void* userdata)
+{
+ if (!userdata) return;
+
+ if (!final && success) return; //not done yet
+
+ ImageLoadedData* data = (ImageLoadedData*)userdata;
+
+ if (success)
+ {
+ if (src_vi->getFullWidth() != src_vi->getFullHeight()
+ || src_vi->getFullWidth() < LLFloaterSimpleSnapshot::THUMBNAIL_SNAPSHOT_DIM_MIN)
+ {
+ if (!data->mSilent)
+ {
+ LLNotificationsUtil::add("ThumbnailDimentionsLimit");
+ }
+ }
+ else if (src_vi->getFullWidth() > LLFloaterSimpleSnapshot::THUMBNAIL_SNAPSHOT_DIM_MAX)
+ {
+ LLFloaterSimpleSnapshot::uploadThumbnail(src, data->mObjectId, LLUUID::null);
+ }
+ else
+ {
+ setThumbnailId(data->mThumbnailId, data->mObjectId);
+ }
+ }
+
+ delete data;
+}
+
+void LLFloaterChangeItemThumbnail::showTexturePicker(const LLUUID &thumbnail_id)
+{
+ // show hourglass cursor when loading inventory window
+ getWindow()->setCursor(UI_CURSOR_WAIT);
+
+ LLFloater* floaterp = mPickerHandle.get();
+ // Show the dialog
+ if (floaterp)
+ {
+ floaterp->openFloater();
+ }
+ else
+ {
+ floaterp = new LLFloaterTexturePicker(
+ this,
+ thumbnail_id,
+ thumbnail_id,
+ thumbnail_id,
+ FALSE,
+ TRUE,
+ "SELECT PHOTO",
+ PERM_NONE,
+ PERM_NONE,
+ FALSE,
+ NULL);
+
+ mPickerHandle = floaterp->getHandle();
+
+ LLFloaterTexturePicker* texture_floaterp = dynamic_cast<LLFloaterTexturePicker*>(floaterp);
+ if (texture_floaterp)
+ {
+ //texture_floaterp->setTextureSelectedCallback();
+ //texture_floaterp->setOnUpdateImageStatsCallback();
+ texture_floaterp->setOnFloaterCommitCallback([this](LLTextureCtrl::ETexturePickOp op, LLPickerSource, const LLUUID&, const LLUUID&)
+ {
+ if (op == LLTextureCtrl::TEXTURE_SELECT)
+ {
+ onTexturePickerCommit();
+ }
+ }
+ );
+
+ texture_floaterp->setLocalTextureEnabled(FALSE);
+ texture_floaterp->setBakeTextureEnabled(FALSE);
+ texture_floaterp->setCanApplyImmediately(false);
+ texture_floaterp->setCanApply(false, true, false /*Hide 'preview disabled'*/);
+ texture_floaterp->setMinDimentionsLimits(LLFloaterSimpleSnapshot::THUMBNAIL_SNAPSHOT_DIM_MIN);
+
+ addDependentFloater(texture_floaterp);
+ }
+
+ floaterp->openFloater();
+ }
+ floaterp->setFocus(TRUE);
+}
+
+void LLFloaterChangeItemThumbnail::onTexturePickerCommit()
+{
+ LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)mPickerHandle.get();
+
+ if (floaterp)
+ {
+ LLUUID asset_id = floaterp->getAssetID();
+
+ if (asset_id.isNull())
+ {
+ setThumbnailId(asset_id);
+ return;
+ }
+
+ LLInventoryObject* obj = getInventoryObject();
+ if (obj && obj->getThumbnailUUID() == asset_id)
+ {
+ // nothing to do
+ return;
+ }
+
+ LLPointer<LLViewerFetchedTexture> texturep = LLViewerTextureManager::findFetchedTexture(asset_id, TEX_LIST_STANDARD);
+ if (!texturep)
+ {
+ LL_WARNS() << "Image " << asset_id << " doesn't exist" << LL_ENDL;
+ return;
+ }
+
+ if (texturep->isMissingAsset())
+ {
+ LL_WARNS() << "Image " << asset_id << " is missing" << LL_ENDL;
+ return;
+ }
+
+ if (texturep->getFullWidth() != texturep->getFullHeight())
+ {
+ LLNotificationsUtil::add("ThumbnailDimentionsLimit");
+ return;
+ }
+
+ if (texturep->getFullWidth() < LLFloaterSimpleSnapshot::THUMBNAIL_SNAPSHOT_DIM_MIN
+ && texturep->getFullWidth() > 0)
+ {
+ LLNotificationsUtil::add("ThumbnailDimentionsLimit");
+ return;
+ }
+
+ if (texturep->getFullWidth() > LLFloaterSimpleSnapshot::THUMBNAIL_SNAPSHOT_DIM_MAX
+ || texturep->getFullWidth() == 0)
+ {
+ if (texturep->isFullyLoaded()
+ && (texturep->getCachedRawImageLevel() == 0 || texturep->getRawImageLevel() == 0)
+ && (texturep->isCachedRawImageReady() || texturep->isRawImageValid()))
+ {
+ if (texturep->isRawImageValid())
+ {
+ LLFloaterSimpleSnapshot::uploadThumbnail(texturep->getRawImage(), mItemId, mTaskId);
+ }
+ else
+ {
+ LLFloaterSimpleSnapshot::uploadThumbnail(texturep->getCachedRawImage(), mItemId, mTaskId);
+ }
+ }
+ else
+ {
+ ImageLoadedData* data = new ImageLoadedData();
+ data->mObjectId = mItemId;
+ data->mThumbnailId = asset_id;
+ data->mFloaterHandle = getHandle();
+ data->mSilent = false;
+ data->mTexturep = texturep;
+
+ texturep->setBoostLevel(LLGLTexture::BOOST_PREVIEW);
+ texturep->setMinDiscardLevel(0);
+ texturep->setLoadedCallback(onFullImageLoaded,
+ 0, // Need best quality
+ TRUE,
+ FALSE,
+ (void*)data,
+ NULL,
+ FALSE);
+ texturep->forceToSaveRawImage(0);
+ }
+ return;
+ }
+
+ setThumbnailId(asset_id);
+ }
+}
+
+
+void LLFloaterChangeItemThumbnail::setThumbnailId(const LLUUID &new_thumbnail_id)
+{
+ LLInventoryObject* obj = getInventoryObject();
+ if (!obj)
+ {
+ return;
+ }
+
+ if (mTaskId.notNull())
+ {
+ LL_ERRS() << "Not implemented yet" << LL_ENDL;
+ return;
+ }
+
+ setThumbnailId(new_thumbnail_id, mItemId, obj);
+}
+
+void LLFloaterChangeItemThumbnail::setThumbnailId(const LLUUID& new_thumbnail_id, const LLUUID& object_id)
+{
+ LLInventoryObject* obj = gInventory.getObject(object_id);
+ if (!obj)
+ {
+ return;
+ }
+
+ setThumbnailId(new_thumbnail_id, object_id, obj);
+}
+void LLFloaterChangeItemThumbnail::setThumbnailId(const LLUUID& new_thumbnail_id, const LLUUID& object_id, LLInventoryObject* obj)
+{
+ if (obj->getThumbnailUUID() != new_thumbnail_id)
+ {
+ LLSD updates;
+ if (new_thumbnail_id.notNull())
+ {
+ // At the moment server expects id as a string
+ updates["thumbnail"] = LLSD().with("asset_id", new_thumbnail_id.asString());
+ }
+ else
+ {
+ // No thumbnail isntead of 'null id thumbnail'
+ updates["thumbnail"] = LLSD();
+ }
+ LLViewerInventoryCategory* view_folder = dynamic_cast<LLViewerInventoryCategory*>(obj);
+ if (view_folder)
+ {
+ update_inventory_category(object_id, updates, NULL);
+ }
+ LLViewerInventoryItem* view_item = dynamic_cast<LLViewerInventoryItem*>(obj);
+ if (view_item)
+ {
+ update_inventory_item(object_id, updates, NULL);
+ }
+ }
+}
+
+void LLFloaterChangeItemThumbnail::onButtonMouseEnter(LLUICtrl* button, const LLSD& param, EToolTipState state)
+{
+ mTooltipState = state;
+
+ std::string tooltip_text;
+ std::string tooltip_name = "tooltip_" + button->getName();
+ if (hasString(tooltip_name))
+ {
+ tooltip_text = getString(tooltip_name);
+ }
+
+ mToolTipTextBox->setValue(tooltip_text);
+}
+
+void LLFloaterChangeItemThumbnail::onButtonMouseLeave(LLUICtrl* button, const LLSD& param, EToolTipState state)
+{
+ if (mTooltipState == state)
+ {
+ mTooltipState = TOOLTIP_NONE;
+ LLSD tooltip_text;
+ mToolTipTextBox->setValue(tooltip_text);
+ }
+}
+
diff --git a/indra/newview/llfloaterchangeitemthumbnail.h b/indra/newview/llfloaterchangeitemthumbnail.h
new file mode 100644
index 0000000000..a91e9b8ee9
--- /dev/null
+++ b/indra/newview/llfloaterchangeitemthumbnail.h
@@ -0,0 +1,139 @@
+/**
+ * @file llfloaterchangeitemthumbnail.h
+ * @brief LLFloaterChangeItemThumbnail class definition
+ *
+ * $LicenseInfo:firstyear=2023&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2023, 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$
+ */
+
+#ifndef LL_LLFLOATERCHANGEITEMTHUMBNAIL_H
+#define LL_LLFLOATERCHANGEITEMTHUMBNAIL_H
+
+#include "llfloater.h"
+#include "llinventoryobserver.h"
+#include "llvoinventorylistener.h"
+
+class LLButton;
+class LLIconCtrl;
+class LLTextBox;
+class LLThumbnailCtrl;
+class LLUICtrl;
+class LLViewerInventoryItem;
+class LLViewerFetchedTexture;
+
+class LLFloaterChangeItemThumbnail : public LLFloater, public LLInventoryObserver, public LLVOInventoryListener
+{
+public:
+ LLFloaterChangeItemThumbnail(const LLSD& key);
+ ~LLFloaterChangeItemThumbnail();
+
+ BOOL postBuild() override;
+ void onOpen(const LLSD& key) override;
+ void onFocusReceived() override;
+ void onMouseEnter(S32 x, S32 y, MASK mask) override;
+
+ BOOL handleDragAndDrop(
+ S32 x,
+ S32 y,
+ MASK mask,
+ BOOL drop,
+ EDragAndDropType cargo_type,
+ void *cargo_data,
+ EAcceptance *accept,
+ std::string& tooltip_msg) override;
+
+ void changed(U32 mask) override;
+ void inventoryChanged(LLViewerObject* object,
+ LLInventoryObject::object_list_t* inventory,
+ S32 serial_num,
+ void* user_data) override;
+
+ static bool validateAsset(const LLUUID &asset_id);
+
+private:
+
+ LLInventoryObject* getInventoryObject();
+ void refreshFromInventory();
+ void refreshFromObject(LLInventoryObject* obj);
+
+ static void onUploadLocal(void*);
+ static void onUploadSnapshot(void*);
+ static void onUseTexture(void*);
+ static void onCopyToClipboard(void*);
+ static void onPasteFromClipboard(void*);
+ static void onRemove(void*);
+ static void onRemovalConfirmation(const LLSD& notification, const LLSD& response, LLHandle<LLFloater> handle);
+
+ void assignAndValidateAsset(const LLUUID &asset_id, bool silent = false);
+ static void onImageDataLoaded(BOOL success,
+ LLViewerFetchedTexture *src_vi,
+ LLImageRaw* src,
+ LLImageRaw* aux_src,
+ S32 discard_level,
+ BOOL final,
+ void* userdata);
+ static void onFullImageLoaded(BOOL success,
+ LLViewerFetchedTexture* src_vi,
+ LLImageRaw* src,
+ LLImageRaw* aux_src,
+ S32 discard_level,
+ BOOL final,
+ void* userdata);
+
+ void showTexturePicker(const LLUUID &thumbnail_id);
+ void onTexturePickerCommit();
+
+ void setThumbnailId(const LLUUID &new_thumbnail_id);
+ static void setThumbnailId(const LLUUID& new_thumbnail_id, const LLUUID& object_id);
+ static void setThumbnailId(const LLUUID& new_thumbnail_id, const LLUUID& object_id, LLInventoryObject* obj);
+
+ enum EToolTipState
+ {
+ TOOLTIP_NONE,
+ TOOLTIP_UPLOAD_LOCAL,
+ TOOLTIP_UPLOAD_SNAPSHOT,
+ TOOLTIP_USE_TEXTURE,
+ TOOLTIP_COPY_TO_CLIPBOARD,
+ TOOLTIP_COPY_FROM_CLIPBOARD,
+ TOOLTIP_REMOVE,
+ };
+
+ void onButtonMouseEnter(LLUICtrl* button, const LLSD& param, EToolTipState state);
+ void onButtonMouseLeave(LLUICtrl* button, const LLSD& param, EToolTipState state);
+
+ bool mObserverInitialized;
+ EToolTipState mTooltipState;
+ LLUUID mItemId;
+ LLUUID mTaskId;
+ LLUUID mExpectingAssetId;
+
+ LLIconCtrl *mItemTypeIcon;
+ LLUICtrl *mItemNameText;
+ LLThumbnailCtrl *mThumbnailCtrl;
+ LLTextBox *mToolTipTextBox;
+ LLButton *mCopyToClipboardBtn;
+ LLButton *mPasteFromClipboardBtn;
+ LLButton *mRemoveImageBtn;
+
+ LLHandle<LLFloater> mPickerHandle;
+ LLHandle<LLFloater> mSnapshotHandle;
+};
+#endif // LL_LLFLOATERCHANGEITEMTHUMBNAIL_H
diff --git a/indra/newview/llfloatereditenvironmentbase.cpp b/indra/newview/llfloatereditenvironmentbase.cpp
index 2850951668..cd24d79b7f 100644
--- a/indra/newview/llfloatereditenvironmentbase.cpp
+++ b/indra/newview/llfloatereditenvironmentbase.cpp
@@ -260,7 +260,7 @@ void LLFloaterEditEnvironmentBase::onSaveAsCommit(const LLSD& notification, cons
}
else if (mInventoryItem)
{
- const LLUUID &marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ const LLUUID &marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
LLUUID parent_id = mInventoryItem->getParentUUID();
if (marketplacelistings_id == parent_id || gInventory.isObjectDescendentOf(mInventoryItem->getUUID(), gInventory.getLibraryRootFolderID()))
{
diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp
index 6e8143384a..bb47feaa95 100644
--- a/indra/newview/llfloatereditextdaycycle.cpp
+++ b/indra/newview/llfloatereditextdaycycle.cpp
@@ -475,6 +475,8 @@ void LLFloaterEditExtDayCycle::refresh()
void LLFloaterEditExtDayCycle::setEditSettingsAndUpdate(const LLSettingsBase::ptr_t &settings)
{
setEditDayCycle(std::dynamic_pointer_cast<LLSettingsDay>(settings));
+
+ showHDRNotification(std::dynamic_pointer_cast<LLSettingsDay>(settings));
}
void LLFloaterEditExtDayCycle::setEditDayCycle(const LLSettingsDay::ptr_t &pday)
@@ -1710,6 +1712,28 @@ void LLFloaterEditExtDayCycle::onPickerCommitSetting(LLUUID item_id, S32 track)
}
}
+void LLFloaterEditExtDayCycle::showHDRNotification(const LLSettingsDay::ptr_t &pday)
+{
+ for (U32 i = LLSettingsDay::TRACK_GROUND_LEVEL; i <= LLSettingsDay::TRACK_MAX; i++)
+ {
+ LLSettingsDay::CycleTrack_t &day_track = pday->getCycleTrack(i);
+
+ LLSettingsDay::CycleTrack_t::iterator iter = day_track.begin();
+ LLSettingsDay::CycleTrack_t::iterator end = day_track.end();
+
+ while (iter != end)
+ {
+ LLSettingsSky::ptr_t sky = std::static_pointer_cast<LLSettingsSky>(iter->second);
+ if (sky && sky->canAutoAdjust())
+ {
+ LLNotificationsUtil::add("AutoAdjustHDRSky");
+ return;
+ }
+ iter++;
+ }
+ }
+}
+
void LLFloaterEditExtDayCycle::onAssetLoadedForInsertion(LLUUID item_id, LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status, S32 source_track, S32 dest_track, LLSettingsBase::TrackPosition frame)
{
std::function<void()> cb = [this, settings, frame, source_track, dest_track]()
diff --git a/indra/newview/llfloatereditextdaycycle.h b/indra/newview/llfloatereditextdaycycle.h
index ab5d12fa36..025a2ee5d1 100644
--- a/indra/newview/llfloatereditextdaycycle.h
+++ b/indra/newview/llfloatereditextdaycycle.h
@@ -188,6 +188,8 @@ private:
bool isRemovingFrameAllowed();
bool isAddingFrameAllowed();
+ void showHDRNotification(const LLSettingsDay::ptr_t &pday);
+
LLSettingsDay::ptr_t mEditDay; // edited copy
LLSettingsDay::Seconds mDayLength;
U32 mCurrentTrack;
diff --git a/indra/newview/llfloaterenvironmentadjust.cpp b/indra/newview/llfloaterenvironmentadjust.cpp
index 18be4fffda..f3133ecb37 100644
--- a/indra/newview/llfloaterenvironmentadjust.cpp
+++ b/indra/newview/llfloaterenvironmentadjust.cpp
@@ -495,10 +495,12 @@ void LLFloaterEnvironmentAdjust::updateGammaLabel()
if (ambiance != 0.f)
{
childSetValue("scene_gamma_label", getString("hdr_string"));
+ getChild<LLUICtrl>(FIELD_SKY_SCENE_GAMMA)->setToolTip(getString("hdr_tooltip"));
}
else
{
childSetValue("scene_gamma_label", getString("brightness_string"));
+ getChild<LLUICtrl>(FIELD_SKY_SCENE_GAMMA)->setToolTip(std::string());
}
}
diff --git a/indra/newview/llfloaterexperienceprofile.cpp b/indra/newview/llfloaterexperienceprofile.cpp
index a99a096ea7..f6afdd29fb 100644
--- a/indra/newview/llfloaterexperienceprofile.cpp
+++ b/indra/newview/llfloaterexperienceprofile.cpp
@@ -92,8 +92,10 @@ class LLExperienceHandler : public LLCommandHandler
public:
LLExperienceHandler() : LLCommandHandler("experience", UNTRUSTED_THROTTLE) { }
- bool handle(const LLSD& params, const LLSD& query_map,
- LLMediaCtrl* web)
+ bool handle(const LLSD& params,
+ const LLSD& query_map,
+ const std::string& grid,
+ LLMediaCtrl* web)
{
if(params.size() != 2 || params[1].asString() != "profile")
return false;
diff --git a/indra/newview/llfloaterforgetuser.cpp b/indra/newview/llfloaterforgetuser.cpp
index 97b022699f..f576ce7a76 100644
--- a/indra/newview/llfloaterforgetuser.cpp
+++ b/indra/newview/llfloaterforgetuser.cpp
@@ -164,6 +164,12 @@ bool LLFloaterForgetUser::onConfirmLogout(const LLSD& notification, const LLSD&
if (option == 0)
{
// Remove creds
+ std::string grid_id = LLGridManager::getInstance()->getGridId(grid);
+ if (grid_id.empty())
+ {
+ grid_id = grid;
+ }
+ gSecAPIHandler->removeFromProtectedMap("mfa_hash", grid_id, LLStartUp::getUserId()); // doesn't write
gSecAPIHandler->removeFromCredentialMap("login_list", grid, LLStartUp::getUserId());
LLPointer<LLCredential> cred = gSecAPIHandler->loadCredential(grid);
@@ -228,7 +234,13 @@ void LLFloaterForgetUser::processForgetUser()
void LLFloaterForgetUser::forgetUser(const std::string &userid, const std::string &fav_id, const std::string &grid, bool delete_data)
{
// Remove creds
- gSecAPIHandler->removeFromCredentialMap("login_list", grid, userid);
+ std::string grid_id = LLGridManager::getInstance()->getGridId(grid);
+ if (grid_id.empty())
+ {
+ grid_id = grid;
+ }
+ gSecAPIHandler->removeFromProtectedMap("mfa_hash", grid_id, userid); // doesn't write
+ gSecAPIHandler->removeFromCredentialMap("login_list", grid, userid); // write operation
LLPointer<LLCredential> cred = gSecAPIHandler->loadCredential(grid);
if (cred.notNull() && cred->userID() == userid)
diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp
index d17889bed1..f29046c513 100644
--- a/indra/newview/llfloatergesture.cpp
+++ b/indra/newview/llfloatergesture.cpp
@@ -211,7 +211,7 @@ BOOL LLFloaterGesture::postBuild()
getChildView("play_btn")->setVisible( true);
getChildView("stop_btn")->setVisible( false);
setDefaultBtn("play_btn");
- mGestureFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE, false);
+ mGestureFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE);
uuid_vec_t folders;
folders.push_back(mGestureFolderID);
diff --git a/indra/newview/llfloaterhandler.cpp b/indra/newview/llfloaterhandler.cpp
index 8ebb14149c..b66049de7f 100644
--- a/indra/newview/llfloaterhandler.cpp
+++ b/indra/newview/llfloaterhandler.cpp
@@ -49,7 +49,7 @@ LLFloater* get_parent_floater(LLView* view)
}
-bool LLFloaterHandler::handle(const LLSD &params, const LLSD &query_map, LLMediaCtrl *web)
+bool LLFloaterHandler::handle(const LLSD &params, const LLSD &query_map, const std::string& grid, LLMediaCtrl *web)
{
if (params.size() < 1) return false;
LLFloater* floater = NULL;
diff --git a/indra/newview/llfloaterhandler.h b/indra/newview/llfloaterhandler.h
index 5915642d66..959c972275 100644
--- a/indra/newview/llfloaterhandler.h
+++ b/indra/newview/llfloaterhandler.h
@@ -33,7 +33,7 @@ class LLFloaterHandler
{
public:
LLFloaterHandler() : LLCommandHandler("floater", UNTRUSTED_BLOCK) { }
- bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web);
+ bool handle(const LLSD& params, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web);
};
#endif
diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp
index 2720b7fcf7..011ad67011 100644
--- a/indra/newview/llfloaterimcontainer.cpp
+++ b/indra/newview/llfloaterimcontainer.cpp
@@ -289,6 +289,9 @@ void LLFloaterIMContainer::onOpen(const LLSD& key)
LLMultiFloater::onOpen(key);
reSelectConversation();
assignResizeLimits();
+
+ LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::getConversation(mSelectedSession);
+ session_floater->onOpen(key);
}
// virtual
diff --git a/indra/newview/llfloaterimnearbychat.cpp b/indra/newview/llfloaterimnearbychat.cpp
index f1807f1c5b..bb4cc9bca3 100644
--- a/indra/newview/llfloaterimnearbychat.cpp
+++ b/indra/newview/llfloaterimnearbychat.cpp
@@ -108,6 +108,8 @@ LLFloaterIMNearbyChat::LLFloaterIMNearbyChat(const LLSD& llsd)
mEnableCallbackRegistrar.add("Avatar.EnableGearItem", boost::bind(&cb_do_nothing));
mCommitCallbackRegistrar.add("Avatar.GearDoToSelected", boost::bind(&cb_do_nothing));
mEnableCallbackRegistrar.add("Avatar.CheckGearItem", boost::bind(&cb_do_nothing));
+
+ mMinFloaterHeight = EXPANDED_MIN_HEIGHT;
}
//static
@@ -901,8 +903,10 @@ public:
LLChatCommandHandler() : LLCommandHandler("chat", UNTRUSTED_BLOCK) { }
// Your code here
- bool handle(const LLSD& tokens, const LLSD& query_map,
- LLMediaCtrl* web)
+ bool handle(const LLSD& tokens,
+ const LLSD& query_map,
+ const std::string& grid,
+ LLMediaCtrl* web)
{
bool retval = false;
// Need at least 2 tokens to have a valid message.
diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp
index 78271369d2..0b0dce29fb 100644
--- a/indra/newview/llfloaterimsessiontab.cpp
+++ b/indra/newview/llfloaterimsessiontab.cpp
@@ -92,6 +92,8 @@ LLFloaterIMSessionTab::LLFloaterIMSessionTab(const LLSD& session_id)
mEnableCallbackRegistrar.add("Avatar.EnableItem", boost::bind(&LLFloaterIMSessionTab::enableContextMenuItem, this, _2));
mCommitCallbackRegistrar.add("Avatar.DoToSelected", boost::bind(&LLFloaterIMSessionTab::doToSelected, this, _2));
mCommitCallbackRegistrar.add("Group.DoToSelected", boost::bind(&cb_group_do_nothing));
+
+ mMinFloaterHeight = getMinHeight();
}
LLFloaterIMSessionTab::~LLFloaterIMSessionTab()
@@ -934,10 +936,13 @@ void LLFloaterIMSessionTab::reshapeFloater(bool collapse)
S32 height = mContentPanel->getRect().getHeight() + mToolbarPanel->getRect().getHeight()
+ mChatLayoutPanel->getRect().getHeight() - mChatLayoutPanelHeight + 2;
floater_rect.mTop -= height;
+
+ setResizeLimits(getMinWidth(), floater_rect.getHeight());
}
else
{
floater_rect.mTop = floater_rect.mBottom + mFloaterHeight;
+ setResizeLimits(getMinWidth(), mMinFloaterHeight);
}
enableResizeCtrls(true, true, !collapse);
@@ -962,6 +967,7 @@ void LLFloaterIMSessionTab::restoreFloater()
setShape(floater_rect, true);
mBodyStack->updateLayout();
mExpandCollapseLineBtn->setImageOverlay(getString("expandline_icon"));
+ setResizeLimits(getMinWidth(), mMinFloaterHeight);
setMessagePaneExpanded(true);
saveCollapsedState();
mInputEditor->enableSingleLineMode(false);
@@ -980,6 +986,8 @@ void LLFloaterIMSessionTab::onOpen(const LLSD& key)
}
mInputButtonPanel->setVisible(isTornOff());
+
+ setFocus(TRUE);
}
diff --git a/indra/newview/llfloaterimsessiontab.h b/indra/newview/llfloaterimsessiontab.h
index 9f00917647..d478922617 100644
--- a/indra/newview/llfloaterimsessiontab.h
+++ b/indra/newview/llfloaterimsessiontab.h
@@ -152,6 +152,7 @@ protected:
bool mMessagePaneExpanded;
bool mIsParticipantListExpanded;
+ S32 mMinFloaterHeight;
LLIMModel::LLIMSession* mSession;
diff --git a/indra/newview/llfloaterinventorysettings.cpp b/indra/newview/llfloaterinventorysettings.cpp
new file mode 100644
index 0000000000..29d6e90a33
--- /dev/null
+++ b/indra/newview/llfloaterinventorysettings.cpp
@@ -0,0 +1,44 @@
+/**
+ * @file llfloaterinventorysettings.cpp
+ * @brief LLFloaterInventorySettings class implementation
+ *
+ * $LicenseInfo:firstyear=2023&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2023, 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 "llfloaterinventorysettings.h"
+
+LLFloaterInventorySettings::LLFloaterInventorySettings(const LLSD& key)
+ : LLFloater(key)
+{
+}
+
+LLFloaterInventorySettings::~LLFloaterInventorySettings()
+{}
+
+BOOL LLFloaterInventorySettings::postBuild()
+{
+ getChild<LLButton>("ok_btn")->setCommitCallback(boost::bind(&LLFloater::closeFloater, this, false));
+ return TRUE;
+}
+
diff --git a/indra/newview/llfloaterinventorysettings.h b/indra/newview/llfloaterinventorysettings.h
new file mode 100644
index 0000000000..50304276c7
--- /dev/null
+++ b/indra/newview/llfloaterinventorysettings.h
@@ -0,0 +1,45 @@
+/**
+ * @file llfloaterinventorysettings.h
+ * @brief LLFloaterInventorySettings class definition
+ *
+ * $LicenseInfo:firstyear=2023&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2023, 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$
+ */
+
+#ifndef LL_LLFLOATERINVENTORYSETTINGS_H
+#define LL_LLFLOATERINVENTORYSETTINGS_H
+
+#include "llfloater.h"
+
+class LLFloaterInventorySettings
+ : public LLFloater
+{
+ friend class LLFloaterReg;
+
+public:
+ virtual BOOL postBuild();
+
+private:
+ LLFloaterInventorySettings(const LLSD& key);
+ ~LLFloaterInventorySettings();
+};
+
+#endif
diff --git a/indra/newview/llfloaterlinkreplace.cpp b/indra/newview/llfloaterlinkreplace.cpp
index 8ee7a72055..b42c49c607 100644
--- a/indra/newview/llfloaterlinkreplace.cpp
+++ b/indra/newview/llfloaterlinkreplace.cpp
@@ -335,8 +335,8 @@ BOOL LLFloaterLinkReplace::tick()
void LLFloaterLinkReplace::processBatch(LLInventoryModel::item_array_t items)
{
const LLViewerInventoryItem* target_item = gInventory.getItem(mTargetUUID);
- const LLUUID cof_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);
- const LLUUID outfit_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS, false);
+ const LLUUID cof_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
+ const LLUUID outfit_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
for (LLInventoryModel::item_array_t::iterator it = items.begin(); it != items.end(); ++it)
{
diff --git a/indra/newview/llfloatermarketplacelistings.cpp b/indra/newview/llfloatermarketplacelistings.cpp
index e755e9924c..71b3b16809 100644
--- a/indra/newview/llfloatermarketplacelistings.cpp
+++ b/indra/newview/llfloatermarketplacelistings.cpp
@@ -41,8 +41,11 @@
#include "llnotificationmanager.h"
#include "llnotificationsutil.h"
#include "llsidepaneliteminfo.h"
+#include "llsidepaneltaskinfo.h"
+#include "lltabcontainer.h"
#include "lltextbox.h"
#include "lltrans.h"
+#include "llviewerwindow.h"
///----------------------------------------------------------------------------
/// LLPanelMarketplaceListings
@@ -227,18 +230,31 @@ void LLPanelMarketplaceListings::onTabChange()
void LLPanelMarketplaceListings::onAddButtonClicked()
{
- // Find active panel
- LLInventoryPanel* panel = (LLInventoryPanel*)getChild<LLTabContainer>("marketplace_filter_tabs")->getCurrentPanel();
- if (panel)
- {
- LLUUID marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
- llassert(marketplacelistings_id.notNull());
- LLFolderType::EType preferred_type = LLFolderType::lookup("category");
- LLUUID category = gInventory.createNewCategory(marketplacelistings_id, preferred_type, LLStringUtil::null);
- gInventory.notifyObservers();
- panel->setSelectionByID(category, TRUE);
- panel->getRootFolder()->setNeedsAutoRename(TRUE);
+ LLUUID marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
+ llassert(marketplacelistings_id.notNull());
+ LLFolderType::EType preferred_type = LLFolderType::lookup("category");
+ LLHandle<LLPanel> handle = getHandle();
+ gInventory.createNewCategory(
+ marketplacelistings_id,
+ preferred_type,
+ LLStringUtil::null,
+ [handle](const LLUUID &new_cat_id)
+ {
+ // Find active panel
+ LLPanel *marketplace_panel = handle.get();
+ if (!marketplace_panel)
+ {
+ return;
+ }
+ LLInventoryPanel* panel = (LLInventoryPanel*)marketplace_panel->getChild<LLTabContainer>("marketplace_filter_tabs")->getCurrentPanel();
+ if (panel)
+ {
+ gInventory.notifyObservers();
+ panel->setSelectionByID(new_cat_id, TRUE);
+ panel->getRootFolder()->setNeedsAutoRename(TRUE);
+ }
}
+ );
}
void LLPanelMarketplaceListings::onAuditButtonClicked()
@@ -359,6 +375,7 @@ LLFloaterMarketplaceListings::LLFloaterMarketplaceListings(const LLSD& key)
, mInventoryTitle(NULL)
, mPanelListings(NULL)
, mPanelListingsSet(false)
+, mRootFolderCreating(false)
{
}
@@ -431,7 +448,7 @@ void LLFloaterMarketplaceListings::fetchContents()
{
LLMarketplaceData::instance().setDataFetchedSignal(boost::bind(&LLFloaterMarketplaceListings::updateView, this));
LLMarketplaceData::instance().setSLMDataFetched(MarketplaceFetchCodes::MARKET_FETCH_LOADING);
- LLInventoryModelBackgroundFetch::instance().start(mRootFolderId);
+ LLInventoryModelBackgroundFetch::instance().start(mRootFolderId, true);
LLMarketplaceData::instance().getSLMListings();
}
}
@@ -444,15 +461,50 @@ void LLFloaterMarketplaceListings::setRootFolder()
// If we are *not* a merchant or we have no market place connection established yet, do nothing
return;
}
+ if (!gInventory.isInventoryUsable())
+ {
+ return;
+ }
+ LLFolderType::EType preferred_type = LLFolderType::FT_MARKETPLACE_LISTINGS;
// We are a merchant. Get the Marketplace listings folder, create it if needs be.
- LLUUID marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, true);
- if (marketplacelistings_id.isNull())
- {
- // We should never get there unless the inventory fails badly
- LL_ERRS("SLM") << "Inventory problem: failure to create the marketplace listings folder for a merchant!" << LL_ENDL;
- return;
- }
+ LLUUID marketplacelistings_id = gInventory.findCategoryUUIDForType(preferred_type);
+
+ if (marketplacelistings_id.isNull())
+ {
+ if (!mRootFolderCreating)
+ {
+ mRootFolderCreating = true;
+ gInventory.createNewCategory(
+ gInventory.getRootFolderID(),
+ preferred_type,
+ LLStringUtil::null,
+ [](const LLUUID &new_cat_id)
+ {
+ LLFloaterMarketplaceListings* marketplace = LLFloaterReg::findTypedInstance<LLFloaterMarketplaceListings>("marketplace_listings");
+ if (marketplace)
+ {
+ if (new_cat_id.notNull())
+ {
+ // will call setRootFolder again
+ marketplace->updateView();
+ }
+ // don't update in case of failure, createNewCategory can return
+ // immediately if cap is missing and will cause a loop
+ else
+ {
+ // unblock
+ marketplace->mRootFolderCreating = false;
+ LL_WARNS("SLM") << "Inventory warning: Failed to create marketplace listings folder for a merchant" << LL_ENDL;
+ }
+ }
+ }
+ );
+ }
+ return;
+ }
+
+ mRootFolderCreating = false;
// No longer need to observe new category creation
if (mCategoryAddedObserver && gInventory.containsObserver(mCategoryAddedObserver))
@@ -540,6 +592,11 @@ void LLFloaterMarketplaceListings::updateView()
{
setRootFolder();
}
+ if (mRootFolderCreating)
+ {
+ // waiting for callback
+ return;
+ }
// Update the bottom initializing status and progress dial if we are initializing or if we're a merchant and still loading
if ((mkt_status <= MarketplaceStatusCodes::MARKET_PLACE_INITIALIZING) || (is_merchant && (data_fetched <= MarketplaceFetchCodes::MARKET_FETCH_LOADING)) )
@@ -843,14 +900,17 @@ void LLFloaterMarketplaceValidation::onOpen(const LLSD& key)
LLUUID cat_id(key.asUUID());
if (cat_id.isNull())
{
- cat_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ cat_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
}
// Validates the folder
if (cat_id.notNull())
{
- LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
- validate_marketplacelistings(cat, boost::bind(&LLFloaterMarketplaceValidation::appendMessage, this, _1, _2, _3), false);
+ LLMarketplaceValidator::getInstance()->validateMarketplaceListings(
+ cat_id,
+ NULL,
+ boost::bind(&LLFloaterMarketplaceValidation::appendMessage, this, _1, _2, _3),
+ false);
}
// Handle the listing folder being processed
@@ -954,18 +1014,44 @@ LLFloaterItemProperties::~LLFloaterItemProperties()
BOOL LLFloaterItemProperties::postBuild()
{
- // On the standalone properties floater, we have no need for a back button...
- LLSidepanelItemInfo* panel = getChild<LLSidepanelItemInfo>("item_panel");
- LLButton* back_btn = panel->getChild<LLButton>("back_btn");
- back_btn->setVisible(FALSE);
-
return LLFloater::postBuild();
}
void LLFloaterItemProperties::onOpen(const LLSD& key)
{
// Tell the panel which item it needs to visualize
- LLSidepanelItemInfo* panel = getChild<LLSidepanelItemInfo>("item_panel");
- panel->setItemID(key["id"].asUUID());
+ LLPanel* panel = findChild<LLPanel>("sidepanel");
+
+ LLSidepanelItemInfo* item_panel = dynamic_cast<LLSidepanelItemInfo*>(panel);
+ if (item_panel)
+ {
+ item_panel->setItemID(key["id"].asUUID());
+ if (key.has("object"))
+ {
+ item_panel->setObjectID(key["object"].asUUID());
+ }
+ item_panel->setParentFloater(this);
+ }
+
+ LLSidepanelTaskInfo* task_panel = dynamic_cast<LLSidepanelTaskInfo*>(panel);
+ if (task_panel)
+ {
+ task_panel->setObjectSelection(LLSelectMgr::getInstance()->getSelection());
+ }
}
+LLMultiItemProperties::LLMultiItemProperties(const LLSD& key)
+ : LLMultiFloater(LLSD())
+{
+ // start with a small rect in the top-left corner ; will get resized
+ LLRect rect;
+ rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeightScaled(), 350, 350);
+ setRect(rect);
+ LLFloater* last_floater = LLFloaterReg::getLastFloaterInGroup(key.asString());
+ if (last_floater)
+ {
+ stackWith(*last_floater);
+ }
+ setTitle(LLTrans::getString("MultiPropertiesTitle"));
+ buildTabContainer();
+}
diff --git a/indra/newview/llfloatermarketplacelistings.h b/indra/newview/llfloatermarketplacelistings.h
index ffc098e28a..085e517a9d 100644
--- a/indra/newview/llfloatermarketplacelistings.h
+++ b/indra/newview/llfloatermarketplacelistings.h
@@ -33,6 +33,7 @@
#include "llinventorypanel.h"
#include "llnotificationptr.h"
#include "llmodaldialog.h"
+#include "llmultifloater.h"
#include "lltexteditor.h"
class LLInventoryCategoriesObserver;
@@ -139,6 +140,7 @@ private:
LLTextBox * mInventoryTitle;
LLUUID mRootFolderId;
+ bool mRootFolderCreating;
LLPanelMarketplaceListings * mPanelListings;
bool mPanelListingsSet;
};
@@ -223,4 +225,10 @@ public:
private:
};
+class LLMultiItemProperties : public LLMultiFloater
+{
+public:
+ LLMultiItemProperties(const LLSD& key);
+};
+
#endif // LL_LLFLOATERMARKETPLACELISTINGS_H
diff --git a/indra/newview/llfloaternewfeaturenotification.cpp b/indra/newview/llfloaternewfeaturenotification.cpp
new file mode 100644
index 0000000000..1e50024967
--- /dev/null
+++ b/indra/newview/llfloaternewfeaturenotification.cpp
@@ -0,0 +1,83 @@
+/**
+ * @file llfloaternewfeaturenotification.cpp
+ * @brief LLFloaterNewFeatureNotification class implementation
+ *
+ * $LicenseInfo:firstyear=2023&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2023, 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 "llfloaternewfeaturenotification.h"
+
+
+LLFloaterNewFeatureNotification::LLFloaterNewFeatureNotification(const LLSD& key)
+ : LLFloater(key)
+{
+}
+
+LLFloaterNewFeatureNotification::~LLFloaterNewFeatureNotification()
+{
+}
+
+BOOL LLFloaterNewFeatureNotification::postBuild()
+{
+ setCanDrag(FALSE);
+ getChild<LLButton>("close_btn")->setCommitCallback(boost::bind(&LLFloaterNewFeatureNotification::onCloseBtn, this));
+
+ const std::string title_txt = "title_txt";
+ const std::string dsc_txt = "description_txt";
+ std::string feature = "_" + getKey().asString();
+
+ getChild<LLUICtrl>(title_txt)->setValue(getString(title_txt + feature));
+ getChild<LLUICtrl>(dsc_txt)->setValue(getString(dsc_txt + feature));
+
+ if (getKey().asString() == "gltf")
+ {
+ LLRect rect = getRect();
+ // make automatic?
+ reshape(rect.getWidth() + 90, rect.getHeight() + 45);
+ }
+
+ return TRUE;
+}
+
+void LLFloaterNewFeatureNotification::onOpen(const LLSD& key)
+{
+ centerOnScreen();
+}
+
+void LLFloaterNewFeatureNotification::onCloseBtn()
+{
+ closeFloater();
+}
+
+void LLFloaterNewFeatureNotification::centerOnScreen()
+{
+ LLVector2 window_size = LLUI::getInstance()->getWindowSize();
+ centerWithin(LLRect(0, 0, ll_round(window_size.mV[VX]), ll_round(window_size.mV[VY])));
+ LLFloaterView* parent = dynamic_cast<LLFloaterView*>(getParent());
+ if (parent)
+ {
+ parent->bringToFront(this);
+ }
+}
+
diff --git a/indra/newview/llfloaternewfeaturenotification.h b/indra/newview/llfloaternewfeaturenotification.h
new file mode 100644
index 0000000000..95501451dc
--- /dev/null
+++ b/indra/newview/llfloaternewfeaturenotification.h
@@ -0,0 +1,49 @@
+/**
+ * @file llfloaternewfeaturenotification.h
+ * @brief LLFloaterNewFeatureNotification class definition
+ *
+ * $LicenseInfo:firstyear=2023&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2023, 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$
+ */
+
+#ifndef LL_FLOATER_NEW_FEATURE_NOTOFICATION_H
+#define LL_FLOATER_NEW_FEATURE_NOTOFICATION_H
+
+#include "llfloater.h"
+
+class LLFloaterNewFeatureNotification:
+ public LLFloater
+{
+ friend class LLFloaterReg;
+public:
+ BOOL postBuild() override;
+ void onOpen(const LLSD& key) override;
+
+private:
+ LLFloaterNewFeatureNotification(const LLSD& key);
+ /*virtual*/ ~LLFloaterNewFeatureNotification();
+
+ void centerOnScreen();
+
+ void onCloseBtn();
+};
+
+#endif
diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp
index a682064dad..d3ab22f792 100644
--- a/indra/newview/llfloateropenobject.cpp
+++ b/indra/newview/llfloateropenobject.cpp
@@ -164,34 +164,12 @@ void LLFloaterOpenObject::moveToInventory(bool wear, bool replace)
}
inventory_func_type func = boost::bind(LLFloaterOpenObject::callbackCreateInventoryCategory,_1,object_id,wear,replace);
- LLUUID category_id = gInventory.createNewCategory(parent_category_id,
- LLFolderType::FT_NONE,
- name,
- func);
-
- //If we get a null category ID, we are using a capability in createNewCategory and we will
- //handle the following in the callbackCreateInventoryCategory routine.
- if ( category_id.notNull() )
- {
- LLCatAndWear* data = new LLCatAndWear;
- data->mCatID = category_id;
- data->mWear = wear;
- data->mFolderResponded = false;
- data->mReplace = replace;
-
- // Copy and/or move the items into the newly created folder.
- // Ignore any "you're going to break this item" messages.
- BOOL success = move_inv_category_world_to_agent(object_id, category_id, TRUE,
- callbackMoveInventory,
- (void*)data);
- if (!success)
- {
- delete data;
- data = NULL;
-
- LLNotificationsUtil::add("OpenObjectCannotCopy");
- }
- }
+ // D567 copy thumbnail info
+ gInventory.createNewCategory(
+ parent_category_id,
+ LLFolderType::FT_NONE,
+ name,
+ func);
}
// static
@@ -206,9 +184,14 @@ void LLFloaterOpenObject::callbackCreateInventoryCategory(const LLUUID& category
// Copy and/or move the items into the newly created folder.
// Ignore any "you're going to break this item" messages.
- BOOL success = move_inv_category_world_to_agent(object_id, category_id, TRUE,
- callbackMoveInventory,
- (void*)wear_data);
+ BOOL success = move_inv_category_world_to_agent(object_id,
+ category_id,
+ TRUE,
+ [](S32 result, void* data, const LLMoveInv*)
+ {
+ callbackMoveInventory(result, data);
+ },
+ (void*)wear_data);
if (!success)
{
delete wear_data;
diff --git a/indra/newview/llfloateroutfitphotopreview.cpp b/indra/newview/llfloateroutfitphotopreview.cpp
deleted file mode 100644
index ade258aef7..0000000000
--- a/indra/newview/llfloateroutfitphotopreview.cpp
+++ /dev/null
@@ -1,288 +0,0 @@
-/**
- * @file llfloateroutfitphotopreview.cpp
- * @brief LLFloaterOutfitPhotoPreview class implementation
- *
- * $LicenseInfo:firstyear=2002&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 "llwindow.h"
-
-#include "llfloateroutfitphotopreview.h"
-
-#include "llagent.h"
-#include "llappearancemgr.h"
-#include "llbutton.h"
-#include "llcombobox.h"
-#include "llfilepicker.h"
-#include "llfloaterreg.h"
-#include "llimagetga.h"
-#include "llimagepng.h"
-#include "llinventory.h"
-#include "llinventorymodel.h"
-#include "llnotificationsutil.h"
-#include "llresmgr.h"
-#include "lltrans.h"
-#include "lltextbox.h"
-#include "lltextureview.h"
-#include "llui.h"
-#include "llviewerinventory.h"
-#include "llviewertexture.h"
-#include "llviewertexturelist.h"
-#include "lluictrlfactory.h"
-#include "llviewerwindow.h"
-#include "lllineeditor.h"
-
-const S32 MAX_OUTFIT_PHOTO_WIDTH = 256;
-const S32 MAX_OUTFIT_PHOTO_HEIGHT = 256;
-
-const S32 CLIENT_RECT_VPAD = 4;
-
-LLFloaterOutfitPhotoPreview::LLFloaterOutfitPhotoPreview(const LLSD& key)
- : LLPreview(key),
- mUpdateDimensions(TRUE),
- mImage(NULL),
- mOutfitID(LLUUID()),
- mImageOldBoostLevel(LLGLTexture::BOOST_NONE),
- mExceedLimits(FALSE)
-{
- updateImageID();
-}
-
-LLFloaterOutfitPhotoPreview::~LLFloaterOutfitPhotoPreview()
-{
- LLLoadedCallbackEntry::cleanUpCallbackList(&mCallbackTextureList) ;
-
- if (mImage.notNull())
- {
- mImage->setBoostLevel(mImageOldBoostLevel);
- mImage = NULL;
- }
-}
-
-// virtual
-BOOL LLFloaterOutfitPhotoPreview::postBuild()
-{
- getChild<LLButton>("ok_btn")->setClickedCallback(boost::bind(&LLFloaterOutfitPhotoPreview::onOkBtn, this));
- getChild<LLButton>("cancel_btn")->setClickedCallback(boost::bind(&LLFloaterOutfitPhotoPreview::onCancelBtn, this));
-
- return LLPreview::postBuild();
-}
-
-void LLFloaterOutfitPhotoPreview::draw()
-{
- updateDimensions();
-
- LLPreview::draw();
-
- if (!isMinimized())
- {
- LLGLSUIDefault gls_ui;
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-
- const LLRect& border = mClientRect;
- LLRect interior = mClientRect;
- interior.stretch( -PREVIEW_BORDER_WIDTH );
-
- // ...border
- gl_rect_2d( border, LLColor4(0.f, 0.f, 0.f, 1.f));
- gl_rect_2d_checkerboard( interior );
-
- if ( mImage.notNull() )
- {
- // Draw the texture
- gGL.diffuseColor3f( 1.f, 1.f, 1.f );
- gl_draw_scaled_image(interior.mLeft,
- interior.mBottom,
- interior.getWidth(),
- interior.getHeight(),
- mImage);
-
- // Pump the texture priority
- F32 pixel_area = (F32)(interior.getWidth() * interior.getHeight() );
- mImage->addTextureStats( pixel_area );
-
- S32 int_width = interior.getWidth();
- S32 int_height = interior.getHeight();
- mImage->setKnownDrawSize(int_width, int_height);
- }
- }
-
-}
-
-// virtual
-void LLFloaterOutfitPhotoPreview::reshape(S32 width, S32 height, BOOL called_from_parent)
-{
- LLPreview::reshape(width, height, called_from_parent);
-
- LLRect dim_rect(getChildView("dimensions")->getRect());
-
- S32 horiz_pad = 2 * (LLPANEL_BORDER_WIDTH + PREVIEW_PAD) + PREVIEW_RESIZE_HANDLE_SIZE;
-
- S32 info_height = dim_rect.mTop + CLIENT_RECT_VPAD;
-
- LLRect client_rect(horiz_pad, getRect().getHeight(), getRect().getWidth() - horiz_pad, 0);
- client_rect.mTop -= (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD);
- client_rect.mBottom += PREVIEW_BORDER + CLIENT_RECT_VPAD + info_height ;
-
- S32 client_width = client_rect.getWidth();
- S32 client_height = client_width;
-
- if(client_height > client_rect.getHeight())
- {
- client_height = client_rect.getHeight();
- client_width = client_height;
- }
- mClientRect.setLeftTopAndSize(client_rect.getCenterX() - (client_width / 2), client_rect.getCenterY() + (client_height / 2), client_width, client_height);
-
-}
-
-
-void LLFloaterOutfitPhotoPreview::updateDimensions()
-{
- if (!mImage)
- {
- return;
- }
- if ((mImage->getFullWidth() * mImage->getFullHeight()) == 0)
- {
- return;
- }
-
- if (mAssetStatus != PREVIEW_ASSET_LOADED)
- {
- mAssetStatus = PREVIEW_ASSET_LOADED;
- mUpdateDimensions = TRUE;
- }
-
- getChild<LLUICtrl>("dimensions")->setTextArg("[WIDTH]", llformat("%d", mImage->getFullWidth()));
- getChild<LLUICtrl>("dimensions")->setTextArg("[HEIGHT]", llformat("%d", mImage->getFullHeight()));
-
- if ((mImage->getFullWidth() <= MAX_OUTFIT_PHOTO_WIDTH) && (mImage->getFullHeight() <= MAX_OUTFIT_PHOTO_HEIGHT))
- {
- getChild<LLButton>("ok_btn")->setEnabled(TRUE);
- mExceedLimits = FALSE;
- }
- else
- {
- mExceedLimits = TRUE;
- LLStringUtil::format_map_t args;
- args["MAX_WIDTH"] = llformat("%d", MAX_OUTFIT_PHOTO_WIDTH);
- args["MAX_HEIGHT"] = llformat("%d", MAX_OUTFIT_PHOTO_HEIGHT);
- std::string label = getString("exceed_limits", args);
- getChild<LLUICtrl>("notification")->setValue(label);
- getChild<LLUICtrl>("notification")->setColor(LLColor4::yellow);
- getChild<LLButton>("ok_btn")->setEnabled(FALSE);
- }
-
- if (mUpdateDimensions)
- {
- mUpdateDimensions = FALSE;
-
- reshape(getRect().getWidth(), getRect().getHeight());
- gFloaterView->adjustToFitScreen(this, FALSE);
- }
-}
-
-void LLFloaterOutfitPhotoPreview::loadAsset()
-{
- if (mImage.notNull())
- {
- mImage->setBoostLevel(mImageOldBoostLevel);
- }
- mImage = LLViewerTextureManager::getFetchedTexture(mImageID, FTT_DEFAULT, MIPMAP_TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
- mImageOldBoostLevel = mImage->getBoostLevel();
- mImage->setBoostLevel(LLGLTexture::BOOST_PREVIEW);
- mImage->forceToSaveRawImage(0) ;
- mAssetStatus = PREVIEW_ASSET_LOADING;
- mUpdateDimensions = TRUE;
- updateDimensions();
-}
-
-LLPreview::EAssetStatus LLFloaterOutfitPhotoPreview::getAssetStatus()
-{
- if (mImage.notNull() && (mImage->getFullWidth() * mImage->getFullHeight() > 0))
- {
- mAssetStatus = PREVIEW_ASSET_LOADED;
- }
- return mAssetStatus;
-}
-
-void LLFloaterOutfitPhotoPreview::updateImageID()
-{
- const LLViewerInventoryItem *item = static_cast<const LLViewerInventoryItem*>(getItem());
- if(item)
- {
- mImageID = item->getAssetUUID();
- }
- else
- {
- mImageID = mItemUUID;
- }
-
-}
-
-/* virtual */
-void LLFloaterOutfitPhotoPreview::setObjectID(const LLUUID& object_id)
-{
- mObjectUUID = object_id;
-
- const LLUUID old_image_id = mImageID;
-
- updateImageID();
- if (mImageID != old_image_id)
- {
- mAssetStatus = PREVIEW_ASSET_UNLOADED;
- loadAsset();
- }
- refreshFromItem();
-}
-
-void LLFloaterOutfitPhotoPreview::setOutfitID(const LLUUID& outfit_id)
-{
- mOutfitID = outfit_id;
- LLViewerInventoryCategory* outfit_folder = gInventory.getCategory(mOutfitID);
- if(outfit_folder && !mExceedLimits)
- {
- getChild<LLUICtrl>("notification")->setValue( getString("photo_confirmation"));
- getChild<LLUICtrl>("notification")->setTextArg("[OUTFIT]", outfit_folder->getName());
- getChild<LLUICtrl>("notification")->setColor(LLColor4::white);
- }
-
-}
-
-void LLFloaterOutfitPhotoPreview::onOkBtn()
-{
- if(mOutfitID.notNull() && getItem())
- {
- LLAppearanceMgr::instance().removeOutfitPhoto(mOutfitID);
- LLPointer<LLInventoryCallback> cb = NULL;
- link_inventory_object(mOutfitID, LLConstPointer<LLInventoryObject>(getItem()), cb);
- }
- closeFloater();
-}
-
-void LLFloaterOutfitPhotoPreview::onCancelBtn()
-{
- closeFloater();
-}
diff --git a/indra/newview/llfloateroutfitphotopreview.h b/indra/newview/llfloateroutfitphotopreview.h
deleted file mode 100644
index a1e7b58abe..0000000000
--- a/indra/newview/llfloateroutfitphotopreview.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/**
- * @file llfloateroutfitphotopreview.h
- * @brief LLFloaterOutfitPhotoPreview class definition
- *
- * $LicenseInfo:firstyear=2002&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$
- */
-
-#ifndef LL_LLFLOATEROUTFITPHOTOPREVIEW_H
-#define LL_LLFLOATEROUTFITPHOTOPREVIEW_H
-
-#include "llpreview.h"
-#include "llbutton.h"
-#include "llframetimer.h"
-#include "llviewertexture.h"
-
-class LLComboBox;
-class LLImageRaw;
-
-class LLFloaterOutfitPhotoPreview : public LLPreview
-{
-public:
- LLFloaterOutfitPhotoPreview(const LLSD& key);
- ~LLFloaterOutfitPhotoPreview();
-
- virtual void draw();
-
- virtual void loadAsset();
- virtual EAssetStatus getAssetStatus();
-
- virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
-
- /*virtual*/ void setObjectID(const LLUUID& object_id);
-
- void setOutfitID(const LLUUID& outfit_id);
- void onOkBtn();
- void onCancelBtn();
-
-protected:
- void init();
- /* virtual */ BOOL postBuild();
-
-private:
- void updateImageID(); // set what image is being uploaded.
- void updateDimensions();
- LLUUID mImageID;
- LLUUID mOutfitID;
- LLPointer<LLViewerFetchedTexture> mImage;
- S32 mImageOldBoostLevel;
-
- // This is stored off in a member variable, because the save-as
- // button and drag and drop functionality need to know.
- BOOL mUpdateDimensions;
-
- BOOL mExceedLimits;
-
- LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList ;
-};
-#endif // LL_LLFLOATEROUTFITPHOTOPREVIEW_H
diff --git a/indra/newview/llfloaterperms.cpp b/indra/newview/llfloaterperms.cpp
index fb55c6c6c4..b53839977e 100644
--- a/indra/newview/llfloaterperms.cpp
+++ b/indra/newview/llfloaterperms.cpp
@@ -122,7 +122,7 @@ const std::string LLFloaterPermsDefault::sCategoryNames[CAT_LAST] =
"Notecards",
"Gestures",
"Wearables",
- "Settings"
+ "Settings",
"Materials"
};
diff --git a/indra/newview/llfloaterperms.h b/indra/newview/llfloaterperms.h
index 02359a256e..97ddec7cba 100644
--- a/indra/newview/llfloaterperms.h
+++ b/indra/newview/llfloaterperms.h
@@ -75,6 +75,7 @@ enum Categories
CAT_GESTURES,
CAT_WEARABLES,
CAT_SETTINGS,
+ CAT_MATERIALS,
CAT_LAST
};
diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp
deleted file mode 100644
index 64ad40f419..0000000000
--- a/indra/newview/llfloaterproperties.cpp
+++ /dev/null
@@ -1,891 +0,0 @@
-/**
- * @file llfloaterproperties.cpp
- * @brief A floater which shows an inventory item's properties.
- *
- * $LicenseInfo:firstyear=2002&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 "llfloaterproperties.h"
-
-#include <algorithm>
-#include <functional>
-#include "llcachename.h"
-#include "llavatarnamecache.h"
-#include "lldbstrings.h"
-#include "llfloaterreg.h"
-
-#include "llagent.h"
-#include "llbutton.h"
-#include "llcheckboxctrl.h"
-#include "llcombobox.h"
-#include "llavataractions.h"
-#include "llinventorydefines.h"
-#include "llinventoryobserver.h"
-#include "llinventorymodel.h"
-#include "lllineeditor.h"
-//#include "llspinctrl.h"
-#include "llradiogroup.h"
-#include "llresmgr.h"
-#include "roles_constants.h"
-#include "llselectmgr.h"
-#include "lltextbox.h"
-#include "lltrans.h"
-#include "lluiconstants.h"
-#include "llviewerinventory.h"
-#include "llviewerobjectlist.h"
-#include "llviewerregion.h"
-#include "llviewercontrol.h"
-#include "llviewerwindow.h"
-#include "llgroupactions.h"
-
-#include "lluictrlfactory.h"
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLPropertiesObserver
-//
-// helper class to watch the inventory.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-// Ugh. This can't be a singleton because it needs to remove itself
-// from the inventory observer list when destroyed, which could
-// happen after gInventory has already been destroyed if a singleton.
-// Instead, do our own ref counting and create / destroy it as needed
-class LLPropertiesObserver : public LLInventoryObserver
-{
-public:
- LLPropertiesObserver(LLFloaterProperties* floater)
- : mFloater(floater)
- {
- gInventory.addObserver(this);
- }
- virtual ~LLPropertiesObserver()
- {
- gInventory.removeObserver(this);
- }
- virtual void changed(U32 mask);
-private:
- LLFloaterProperties* mFloater; // Not a handle because LLFloaterProperties is managing LLPropertiesObserver
-};
-
-void LLPropertiesObserver::changed(U32 mask)
-{
- // if there's a change we're interested in.
- if((mask & (LLInventoryObserver::LABEL | LLInventoryObserver::INTERNAL | LLInventoryObserver::REMOVE)) != 0)
- {
- mFloater->dirty();
- }
-}
-
-
-
-///----------------------------------------------------------------------------
-/// Class LLFloaterProperties
-///----------------------------------------------------------------------------
-
-// Default constructor
-LLFloaterProperties::LLFloaterProperties(const LLUUID& item_id)
- : LLFloater(mItemID),
- mItemID(item_id),
- mDirty(TRUE)
-{
- mPropertiesObserver = new LLPropertiesObserver(this);
-}
-
-// Destroys the object
-LLFloaterProperties::~LLFloaterProperties()
-{
- delete mPropertiesObserver;
- mPropertiesObserver = NULL;
-}
-
-// virtual
-BOOL LLFloaterProperties::postBuild()
-{
- // build the UI
- // item name & description
- getChild<LLLineEditor>("LabelItemName")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
- getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLFloaterProperties::onCommitName,this));
- getChild<LLLineEditor>("LabelItemDesc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
- getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLFloaterProperties:: onCommitDescription, this));
- // Creator information
- getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLFloaterProperties::onClickCreator,this));
- // owner information
- getChild<LLUICtrl>("BtnOwner")->setCommitCallback(boost::bind(&LLFloaterProperties::onClickOwner,this));
- // acquired date
- // owner permissions
- // Permissions debug text
- // group permissions
- getChild<LLUICtrl>("CheckShareWithGroup")->setCommitCallback(boost::bind(&LLFloaterProperties::onCommitPermissions, this));
- // everyone permissions
- getChild<LLUICtrl>("CheckEveryoneCopy")->setCommitCallback(boost::bind(&LLFloaterProperties::onCommitPermissions, this));
- // next owner permissions
- getChild<LLUICtrl>("CheckNextOwnerModify")->setCommitCallback(boost::bind(&LLFloaterProperties::onCommitPermissions, this));
- getChild<LLUICtrl>("CheckNextOwnerCopy")->setCommitCallback(boost::bind(&LLFloaterProperties::onCommitPermissions, this));
- getChild<LLUICtrl>("CheckNextOwnerTransfer")->setCommitCallback(boost::bind(&LLFloaterProperties::onCommitPermissions, this));
- // Mark for sale or not, and sale info
- getChild<LLUICtrl>("CheckPurchase")->setCommitCallback(boost::bind(&LLFloaterProperties::onCommitSaleInfo, this));
- getChild<LLUICtrl>("ComboBoxSaleType")->setCommitCallback(boost::bind(&LLFloaterProperties::onCommitSaleType, this));
- // "Price" label for edit
- getChild<LLUICtrl>("Edit Cost")->setCommitCallback(boost::bind(&LLFloaterProperties::onCommitSaleInfo, this));
- // The UI has been built, now fill in all the values
- refresh();
-
- return TRUE;
-}
-
-// virtual
-void LLFloaterProperties::onOpen(const LLSD& key)
-{
- refresh();
-}
-
-void LLFloaterProperties::refresh()
-{
- LLInventoryItem* item = findItem();
- if(item)
- {
- refreshFromItem(item);
- }
- else
- {
- //RN: it is possible that the container object is in the middle of an inventory refresh
- // causing findItem() to fail, so just temporarily disable everything
-
- mDirty = TRUE;
-
- const char* enableNames[]={
- "LabelItemName",
- "LabelItemDesc",
- "LabelCreatorName",
- "BtnCreator",
- "LabelOwnerName",
- "BtnOwner",
- "CheckOwnerModify",
- "CheckOwnerCopy",
- "CheckOwnerTransfer",
- "CheckShareWithGroup",
- "CheckEveryoneCopy",
- "CheckNextOwnerModify",
- "CheckNextOwnerCopy",
- "CheckNextOwnerTransfer",
- "CheckPurchase",
- "ComboBoxSaleType",
- "Edit Cost"
- };
- for(size_t t=0; t<LL_ARRAY_SIZE(enableNames); ++t)
- {
- getChildView(enableNames[t])->setEnabled(false);
- }
- const char* hideNames[]={
- "BaseMaskDebug",
- "OwnerMaskDebug",
- "GroupMaskDebug",
- "EveryoneMaskDebug",
- "NextMaskDebug"
- };
- for(size_t t=0; t<LL_ARRAY_SIZE(hideNames); ++t)
- {
- getChildView(hideNames[t])->setVisible(false);
- }
- }
-}
-
-void LLFloaterProperties::draw()
-{
- if (mDirty)
- {
- // RN: clear dirty first because refresh can set dirty to TRUE
- mDirty = FALSE;
- refresh();
- }
-
- LLFloater::draw();
-}
-
-void LLFloaterProperties::refreshFromItem(LLInventoryItem* item)
-{
- ////////////////////////
- // PERMISSIONS LOOKUP //
- ////////////////////////
-
- // do not enable the UI for incomplete items.
- LLViewerInventoryItem* i = (LLViewerInventoryItem*)item;
- BOOL is_complete = i->isFinished();
- const BOOL cannot_restrict_permissions = LLInventoryType::cannotRestrictPermissions(i->getInventoryType());
- const BOOL is_calling_card = (i->getInventoryType() == LLInventoryType::IT_CALLINGCARD);
- const LLPermissions& perm = item->getPermissions();
- const BOOL can_agent_manipulate = gAgent.allowOperation(PERM_OWNER, perm,
- GP_OBJECT_MANIPULATE);
- const BOOL can_agent_sell = gAgent.allowOperation(PERM_OWNER, perm,
- GP_OBJECT_SET_SALE) &&
- !cannot_restrict_permissions;
- const BOOL is_link = i->getIsLinkType();
-
- // You need permission to modify the object to modify an inventory
- // item in it.
- LLViewerObject* object = NULL;
- if(!mObjectID.isNull()) object = gObjectList.findObject(mObjectID);
- BOOL is_obj_modify = TRUE;
- if(object)
- {
- is_obj_modify = object->permOwnerModify();
- }
-
- //////////////////////
- // ITEM NAME & DESC //
- //////////////////////
- BOOL is_modifiable = gAgent.allowOperation(PERM_MODIFY, perm,
- GP_OBJECT_MANIPULATE)
- && is_obj_modify && is_complete;
-
- getChildView("LabelItemNameTitle")->setEnabled(TRUE);
- getChildView("LabelItemName")->setEnabled(is_modifiable && !is_calling_card); // for now, don't allow rename of calling cards
- getChild<LLUICtrl>("LabelItemName")->setValue(item->getName());
- getChildView("LabelItemDescTitle")->setEnabled(TRUE);
- getChildView("LabelItemDesc")->setEnabled(is_modifiable);
- getChildView("IconLocked")->setVisible(!is_modifiable);
- getChild<LLUICtrl>("LabelItemDesc")->setValue(item->getDescription());
-
- //////////////////
- // CREATOR NAME //
- //////////////////
- if(!gCacheName) return;
- if(!gAgent.getRegion()) return;
-
- if (item->getCreatorUUID().notNull())
- {
- LLAvatarName av_name;
- LLAvatarNameCache::get(item->getCreatorUUID(), &av_name);
- getChildView("BtnCreator")->setEnabled(TRUE);
- getChildView("LabelCreatorTitle")->setEnabled(TRUE);
- getChildView("LabelCreatorName")->setEnabled(TRUE);
- getChild<LLUICtrl>("LabelCreatorName")->setValue(av_name.getUserName());
- }
- else
- {
- getChildView("BtnCreator")->setEnabled(FALSE);
- getChildView("LabelCreatorTitle")->setEnabled(FALSE);
- getChildView("LabelCreatorName")->setEnabled(FALSE);
- getChild<LLUICtrl>("LabelCreatorName")->setValue(getString("unknown"));
- }
-
- ////////////////
- // OWNER NAME //
- ////////////////
- if(perm.isOwned())
- {
- std::string name;
- if (perm.isGroupOwned())
- {
- gCacheName->getGroupName(perm.getGroup(), name);
- }
- else
- {
- LLAvatarName av_name;
- LLAvatarNameCache::get(perm.getOwner(), &av_name);
- name = av_name.getUserName();
- }
- getChildView("BtnOwner")->setEnabled(TRUE);
- getChildView("LabelOwnerTitle")->setEnabled(TRUE);
- getChildView("LabelOwnerName")->setEnabled(TRUE);
- getChild<LLUICtrl>("LabelOwnerName")->setValue(name);
- }
- else
- {
- getChildView("BtnOwner")->setEnabled(FALSE);
- getChildView("LabelOwnerTitle")->setEnabled(FALSE);
- getChildView("LabelOwnerName")->setEnabled(FALSE);
- getChild<LLUICtrl>("LabelOwnerName")->setValue(getString("public"));
- }
-
- //////////////////
- // ACQUIRE DATE //
- //////////////////
-
- time_t time_utc = item->getCreationDate();
- if (0 == time_utc)
- {
- getChild<LLUICtrl>("LabelAcquiredDate")->setValue(getString("unknown"));
- }
- else
- {
- std::string timeStr = getString("acquiredDate");
- LLSD substitution;
- substitution["datetime"] = (S32) time_utc;
- LLStringUtil::format (timeStr, substitution);
- getChild<LLUICtrl>("LabelAcquiredDate")->setValue(timeStr);
- }
-
- ///////////////////////
- // OWNER PERMISSIONS //
- ///////////////////////
- if(can_agent_manipulate)
- {
- getChild<LLUICtrl>("OwnerLabel")->setValue(getString("you_can"));
- }
- else
- {
- getChild<LLUICtrl>("OwnerLabel")->setValue(getString("owner_can"));
- }
-
- U32 base_mask = perm.getMaskBase();
- U32 owner_mask = perm.getMaskOwner();
- U32 group_mask = perm.getMaskGroup();
- U32 everyone_mask = perm.getMaskEveryone();
- U32 next_owner_mask = perm.getMaskNextOwner();
-
- getChildView("OwnerLabel")->setEnabled(TRUE);
- getChildView("CheckOwnerModify")->setEnabled(FALSE);
- getChild<LLUICtrl>("CheckOwnerModify")->setValue(LLSD((BOOL)(owner_mask & PERM_MODIFY)));
- getChildView("CheckOwnerCopy")->setEnabled(FALSE);
- getChild<LLUICtrl>("CheckOwnerCopy")->setValue(LLSD((BOOL)(owner_mask & PERM_COPY)));
- getChildView("CheckOwnerTransfer")->setEnabled(FALSE);
- getChild<LLUICtrl>("CheckOwnerTransfer")->setValue(LLSD((BOOL)(owner_mask & PERM_TRANSFER)));
-
- ///////////////////////
- // DEBUG PERMISSIONS //
- ///////////////////////
-
- if( gSavedSettings.getBOOL("DebugPermissions") )
- {
- BOOL slam_perm = FALSE;
- BOOL overwrite_group = FALSE;
- BOOL overwrite_everyone = FALSE;
-
- if (item->getType() == LLAssetType::AT_OBJECT)
- {
- U32 flags = item->getFlags();
- slam_perm = flags & LLInventoryItemFlags::II_FLAGS_OBJECT_SLAM_PERM;
- overwrite_everyone = flags & LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE;
- overwrite_group = flags & LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP;
- }
-
- std::string perm_string;
-
- perm_string = "B: ";
- perm_string += mask_to_string(base_mask);
- getChild<LLUICtrl>("BaseMaskDebug")->setValue(perm_string);
- getChildView("BaseMaskDebug")->setVisible(TRUE);
-
- perm_string = "O: ";
- perm_string += mask_to_string(owner_mask);
- getChild<LLUICtrl>("OwnerMaskDebug")->setValue(perm_string);
- getChildView("OwnerMaskDebug")->setVisible(TRUE);
-
- perm_string = "G";
- perm_string += overwrite_group ? "*: " : ": ";
- perm_string += mask_to_string(group_mask);
- getChild<LLUICtrl>("GroupMaskDebug")->setValue(perm_string);
- getChildView("GroupMaskDebug")->setVisible(TRUE);
-
- perm_string = "E";
- perm_string += overwrite_everyone ? "*: " : ": ";
- perm_string += mask_to_string(everyone_mask);
- getChild<LLUICtrl>("EveryoneMaskDebug")->setValue(perm_string);
- getChildView("EveryoneMaskDebug")->setVisible(TRUE);
-
- perm_string = "N";
- perm_string += slam_perm ? "*: " : ": ";
- perm_string += mask_to_string(next_owner_mask);
- getChild<LLUICtrl>("NextMaskDebug")->setValue(perm_string);
- getChildView("NextMaskDebug")->setVisible(TRUE);
- }
- else
- {
- getChildView("BaseMaskDebug")->setVisible(FALSE);
- getChildView("OwnerMaskDebug")->setVisible(FALSE);
- getChildView("GroupMaskDebug")->setVisible(FALSE);
- getChildView("EveryoneMaskDebug")->setVisible(FALSE);
- getChildView("NextMaskDebug")->setVisible(FALSE);
- }
-
- /////////////
- // SHARING //
- /////////////
-
- // Check for ability to change values.
- if (is_link || cannot_restrict_permissions)
- {
- getChildView("CheckShareWithGroup")->setEnabled(FALSE);
- getChildView("CheckEveryoneCopy")->setEnabled(FALSE);
- }
- else if (is_obj_modify && can_agent_manipulate)
- {
- getChildView("CheckShareWithGroup")->setEnabled(TRUE);
- getChildView("CheckEveryoneCopy")->setEnabled((owner_mask & PERM_COPY) && (owner_mask & PERM_TRANSFER));
- }
- else
- {
- getChildView("CheckShareWithGroup")->setEnabled(FALSE);
- getChildView("CheckEveryoneCopy")->setEnabled(FALSE);
- }
-
- // Set values.
- BOOL is_group_copy = (group_mask & PERM_COPY) ? TRUE : FALSE;
- BOOL is_group_modify = (group_mask & PERM_MODIFY) ? TRUE : FALSE;
- BOOL is_group_move = (group_mask & PERM_MOVE) ? TRUE : FALSE;
-
- if (is_group_copy && is_group_modify && is_group_move)
- {
- getChild<LLUICtrl>("CheckShareWithGroup")->setValue(LLSD((BOOL)TRUE));
-
- LLCheckBoxCtrl* ctl = getChild<LLCheckBoxCtrl>("CheckShareWithGroup");
- if(ctl)
- {
- ctl->setTentative(FALSE);
- }
- }
- else if (!is_group_copy && !is_group_modify && !is_group_move)
- {
- getChild<LLUICtrl>("CheckShareWithGroup")->setValue(LLSD((BOOL)FALSE));
- LLCheckBoxCtrl* ctl = getChild<LLCheckBoxCtrl>("CheckShareWithGroup");
- if(ctl)
- {
- ctl->setTentative(FALSE);
- }
- }
- else
- {
- LLCheckBoxCtrl* ctl = getChild<LLCheckBoxCtrl>("CheckShareWithGroup");
- if(ctl)
- {
- ctl->setTentative(TRUE);
- ctl->set(TRUE);
- }
- }
-
- getChild<LLUICtrl>("CheckEveryoneCopy")->setValue(LLSD((BOOL)(everyone_mask & PERM_COPY)));
-
- ///////////////
- // SALE INFO //
- ///////////////
-
- const LLSaleInfo& sale_info = item->getSaleInfo();
- BOOL is_for_sale = sale_info.isForSale();
- LLComboBox* combo_sale_type = getChild<LLComboBox>("ComboBoxSaleType");
- LLUICtrl* edit_cost = getChild<LLUICtrl>("Edit Cost");
-
- // Check for ability to change values.
- if (is_obj_modify && can_agent_sell
- && gAgent.allowOperation(PERM_TRANSFER, perm, GP_OBJECT_MANIPULATE))
- {
- getChildView("CheckPurchase")->setEnabled(is_complete);
-
- getChildView("NextOwnerLabel")->setEnabled(TRUE);
- getChildView("CheckNextOwnerModify")->setEnabled((base_mask & PERM_MODIFY) && !cannot_restrict_permissions);
- getChildView("CheckNextOwnerCopy")->setEnabled((base_mask & PERM_COPY) && !cannot_restrict_permissions);
- getChildView("CheckNextOwnerTransfer")->setEnabled((next_owner_mask & PERM_COPY) && !cannot_restrict_permissions);
-
- combo_sale_type->setEnabled(is_complete && is_for_sale);
- edit_cost->setEnabled(is_complete && is_for_sale);
- }
- else
- {
- getChildView("CheckPurchase")->setEnabled(FALSE);
-
- getChildView("NextOwnerLabel")->setEnabled(FALSE);
- getChildView("CheckNextOwnerModify")->setEnabled(FALSE);
- getChildView("CheckNextOwnerCopy")->setEnabled(FALSE);
- getChildView("CheckNextOwnerTransfer")->setEnabled(FALSE);
-
- combo_sale_type->setEnabled(FALSE);
- edit_cost->setEnabled(FALSE);
- }
-
- // Set values.
- getChild<LLUICtrl>("CheckPurchase")->setValue(is_for_sale);
- getChild<LLUICtrl>("CheckNextOwnerModify")->setValue(LLSD(BOOL(next_owner_mask & PERM_MODIFY)));
- getChild<LLUICtrl>("CheckNextOwnerCopy")->setValue(LLSD(BOOL(next_owner_mask & PERM_COPY)));
- getChild<LLUICtrl>("CheckNextOwnerTransfer")->setValue(LLSD(BOOL(next_owner_mask & PERM_TRANSFER)));
-
- if (is_for_sale)
- {
- S32 numerical_price;
- numerical_price = sale_info.getSalePrice();
- edit_cost->setValue(llformat("%d",numerical_price));
- combo_sale_type->setValue(sale_info.getSaleType());
- }
- else
- {
- edit_cost->setValue(llformat("%d",0));
- combo_sale_type->setValue(LLSaleInfo::FS_COPY);
- }
-}
-
-void LLFloaterProperties::onClickCreator()
-{
- LLInventoryItem* item = findItem();
- if(!item) return;
- if(!item->getCreatorUUID().isNull())
- {
- LLAvatarActions::showProfile(item->getCreatorUUID());
- }
-}
-
-// static
-void LLFloaterProperties::onClickOwner()
-{
- LLInventoryItem* item = findItem();
- if(!item) return;
- if(item->getPermissions().isGroupOwned())
- {
- LLGroupActions::show(item->getPermissions().getGroup());
- }
- else
- {
- LLAvatarActions::showProfile(item->getPermissions().getOwner());
- }
-}
-
-// static
-void LLFloaterProperties::onCommitName()
-{
- //LL_INFOS() << "LLFloaterProperties::onCommitName()" << LL_ENDL;
- LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem();
- if(!item)
- {
- return;
- }
- LLLineEditor* labelItemName = getChild<LLLineEditor>("LabelItemName");
-
- if(labelItemName&&
- (item->getName() != labelItemName->getText()) &&
- (gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE)) )
- {
- LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
- new_item->rename(labelItemName->getText());
- if(mObjectID.isNull())
- {
- new_item->updateServer(FALSE);
- gInventory.updateItem(new_item);
- gInventory.notifyObservers();
- }
- else
- {
- LLViewerObject* object = gObjectList.findObject(mObjectID);
- if(object)
- {
- object->updateInventory(
- new_item,
- TASK_INVENTORY_ITEM_KEY,
- false);
- }
- }
- }
-}
-
-void LLFloaterProperties::onCommitDescription()
-{
- //LL_INFOS() << "LLFloaterProperties::onCommitDescription()" << LL_ENDL;
- LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem();
- if(!item) return;
-
- LLLineEditor* labelItemDesc = getChild<LLLineEditor>("LabelItemDesc");
- if(!labelItemDesc)
- {
- return;
- }
- if((item->getDescription() != labelItemDesc->getText()) &&
- (gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE)))
- {
- LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
-
- new_item->setDescription(labelItemDesc->getText());
- if(mObjectID.isNull())
- {
- new_item->updateServer(FALSE);
- gInventory.updateItem(new_item);
- gInventory.notifyObservers();
- }
- else
- {
- LLViewerObject* object = gObjectList.findObject(mObjectID);
- if(object)
- {
- object->updateInventory(
- new_item,
- TASK_INVENTORY_ITEM_KEY,
- false);
- }
- }
- }
-}
-
-// static
-void LLFloaterProperties::onCommitPermissions()
-{
- //LL_INFOS() << "LLFloaterProperties::onCommitPermissions()" << LL_ENDL;
- LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem();
- if(!item) return;
- LLPermissions perm(item->getPermissions());
-
-
- LLCheckBoxCtrl* CheckShareWithGroup = getChild<LLCheckBoxCtrl>("CheckShareWithGroup");
-
- if(CheckShareWithGroup)
- {
- perm.setGroupBits(gAgent.getID(), gAgent.getGroupID(),
- CheckShareWithGroup->get(),
- PERM_MODIFY | PERM_MOVE | PERM_COPY);
- }
- LLCheckBoxCtrl* CheckEveryoneCopy = getChild<LLCheckBoxCtrl>("CheckEveryoneCopy");
- if(CheckEveryoneCopy)
- {
- perm.setEveryoneBits(gAgent.getID(), gAgent.getGroupID(),
- CheckEveryoneCopy->get(), PERM_COPY);
- }
-
- LLCheckBoxCtrl* CheckNextOwnerModify = getChild<LLCheckBoxCtrl>("CheckNextOwnerModify");
- if(CheckNextOwnerModify)
- {
- perm.setNextOwnerBits(gAgent.getID(), gAgent.getGroupID(),
- CheckNextOwnerModify->get(), PERM_MODIFY);
- }
- LLCheckBoxCtrl* CheckNextOwnerCopy = getChild<LLCheckBoxCtrl>("CheckNextOwnerCopy");
- if(CheckNextOwnerCopy)
- {
- perm.setNextOwnerBits(gAgent.getID(), gAgent.getGroupID(),
- CheckNextOwnerCopy->get(), PERM_COPY);
- }
- LLCheckBoxCtrl* CheckNextOwnerTransfer = getChild<LLCheckBoxCtrl>("CheckNextOwnerTransfer");
- if(CheckNextOwnerTransfer)
- {
- perm.setNextOwnerBits(gAgent.getID(), gAgent.getGroupID(),
- CheckNextOwnerTransfer->get(), PERM_TRANSFER);
- }
- if(perm != item->getPermissions()
- && item->isFinished())
- {
- LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
- new_item->setPermissions(perm);
- U32 flags = new_item->getFlags();
- // If next owner permissions have changed (and this is an object)
- // then set the slam permissions flag so that they are applied on rez.
- if((perm.getMaskNextOwner()!=item->getPermissions().getMaskNextOwner())
- && (item->getType() == LLAssetType::AT_OBJECT))
- {
- flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_SLAM_PERM;
- }
- // If everyone permissions have changed (and this is an object)
- // then set the overwrite everyone permissions flag so they
- // are applied on rez.
- if ((perm.getMaskEveryone()!=item->getPermissions().getMaskEveryone())
- && (item->getType() == LLAssetType::AT_OBJECT))
- {
- flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE;
- }
- // If group permissions have changed (and this is an object)
- // then set the overwrite group permissions flag so they
- // are applied on rez.
- if ((perm.getMaskGroup()!=item->getPermissions().getMaskGroup())
- && (item->getType() == LLAssetType::AT_OBJECT))
- {
- flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP;
- }
- new_item->setFlags(flags);
- if(mObjectID.isNull())
- {
- new_item->updateServer(FALSE);
- gInventory.updateItem(new_item);
- gInventory.notifyObservers();
- }
- else
- {
- LLViewerObject* object = gObjectList.findObject(mObjectID);
- if(object)
- {
- object->updateInventory(
- new_item,
- TASK_INVENTORY_ITEM_KEY,
- false);
- }
- }
- }
- else
- {
- // need to make sure we don't just follow the click
- refresh();
- }
-}
-
-// static
-void LLFloaterProperties::onCommitSaleInfo()
-{
- //LL_INFOS() << "LLFloaterProperties::onCommitSaleInfo()" << LL_ENDL;
- updateSaleInfo();
-}
-
-// static
-void LLFloaterProperties::onCommitSaleType()
-{
- //LL_INFOS() << "LLFloaterProperties::onCommitSaleType()" << LL_ENDL;
- updateSaleInfo();
-}
-
-void LLFloaterProperties::updateSaleInfo()
-{
- LLViewerInventoryItem* item = (LLViewerInventoryItem*)findItem();
- if(!item) return;
- LLSaleInfo sale_info(item->getSaleInfo());
- if(!gAgent.allowOperation(PERM_TRANSFER, item->getPermissions(), GP_OBJECT_SET_SALE))
- {
- getChild<LLUICtrl>("CheckPurchase")->setValue(LLSD((BOOL)FALSE));
- }
-
- if((BOOL)getChild<LLUICtrl>("CheckPurchase")->getValue())
- {
- // turn on sale info
- LLSaleInfo::EForSale sale_type = LLSaleInfo::FS_COPY;
-
- LLComboBox* combo_sale_type = getChild<LLComboBox>("ComboBoxSaleType");
- if (combo_sale_type)
- {
- sale_type = static_cast<LLSaleInfo::EForSale>(combo_sale_type->getValue().asInteger());
- }
-
- if (sale_type == LLSaleInfo::FS_COPY
- && !gAgent.allowOperation(PERM_COPY, item->getPermissions(),
- GP_OBJECT_SET_SALE))
- {
- sale_type = LLSaleInfo::FS_ORIGINAL;
- }
-
-
-
- S32 price = -1;
- price = getChild<LLUICtrl>("Edit Cost")->getValue().asInteger();;
-
- // Invalid data - turn off the sale
- if (price < 0)
- {
- sale_type = LLSaleInfo::FS_NOT;
- price = 0;
- }
-
- sale_info.setSaleType(sale_type);
- sale_info.setSalePrice(price);
- }
- else
- {
- sale_info.setSaleType(LLSaleInfo::FS_NOT);
- }
- if(sale_info != item->getSaleInfo()
- && item->isFinished())
- {
- LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
-
- // Force an update on the sale price at rez
- if (item->getType() == LLAssetType::AT_OBJECT)
- {
- U32 flags = new_item->getFlags();
- flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_SLAM_SALE;
- new_item->setFlags(flags);
- }
-
- new_item->setSaleInfo(sale_info);
- if(mObjectID.isNull())
- {
- // This is in the agent's inventory.
- new_item->updateServer(FALSE);
- gInventory.updateItem(new_item);
- gInventory.notifyObservers();
- }
- else
- {
- // This is in an object's contents.
- LLViewerObject* object = gObjectList.findObject(mObjectID);
- if(object)
- {
- object->updateInventory(
- new_item,
- TASK_INVENTORY_ITEM_KEY,
- false);
- }
- }
- }
- else
- {
- // need to make sure we don't just follow the click
- refresh();
- }
-}
-
-LLInventoryItem* LLFloaterProperties::findItem() const
-{
- LLInventoryItem* item = NULL;
- if(mObjectID.isNull())
- {
- // it is in agent inventory
- item = gInventory.getItem(mItemID);
- }
- else
- {
- LLViewerObject* object = gObjectList.findObject(mObjectID);
- if(object)
- {
- item = (LLInventoryItem*)object->getInventoryObject(mItemID);
- }
- }
- return item;
-}
-
-//static
-void LLFloaterProperties::dirtyAll()
-{
- LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("properties");
- for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin();
- iter != inst_list.end(); ++iter)
- {
- LLFloaterProperties* floater = dynamic_cast<LLFloaterProperties*>(*iter);
- llassert(floater); // else cast failed - wrong type D:
- if (floater)
- {
- floater->dirty();
- }
- }
-}
-
-///----------------------------------------------------------------------------
-/// LLMultiProperties
-///----------------------------------------------------------------------------
-
-LLMultiProperties::LLMultiProperties()
- : LLMultiFloater(LLSD())
-{
- // start with a small rect in the top-left corner ; will get resized
- LLRect rect;
- rect.setLeftTopAndSize(0, gViewerWindow->getWindowHeightScaled(), 20, 20);
- setRect(rect);
- LLFloater* last_floater = LLFloaterReg::getLastFloaterInGroup("properties");
- if (last_floater)
- {
- stackWith(*last_floater);
- }
- setTitle(LLTrans::getString("MultiPropertiesTitle"));
- buildTabContainer();
-}
-
-///----------------------------------------------------------------------------
-/// Local function definitions
-///----------------------------------------------------------------------------
diff --git a/indra/newview/llfloaterproperties.h b/indra/newview/llfloaterproperties.h
deleted file mode 100644
index aa3fcec337..0000000000
--- a/indra/newview/llfloaterproperties.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/**
- * @file llfloaterproperties.h
- * @brief A floater which shows an inventory item's properties.
- *
- * $LicenseInfo:firstyear=2002&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$
- */
-
-#ifndef LL_LLFLOATERPROPERTIES_H
-#define LL_LLFLOATERPROPERTIES_H
-
-#include <map>
-#include "llmultifloater.h"
-#include "lliconctrl.h"
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLFloaterProperties
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLButton;
-class LLCheckBoxCtrl;
-class LLInventoryItem;
-class LLLineEditor;
-class LLRadioGroup;
-class LLTextBox;
-
-class LLPropertiesObserver;
-
-class LLFloaterProperties : public LLFloater
-{
-public:
- LLFloaterProperties(const LLUUID& item_id);
- /*virtual*/ ~LLFloaterProperties();
-
- /*virtual*/ BOOL postBuild();
- /*virtual*/ void onOpen(const LLSD& key);
- void setObjectID(const LLUUID& object_id) { mObjectID = object_id; }
-
- void dirty() { mDirty = TRUE; }
- void refresh();
-
- static void dirtyAll();
-
-protected:
- // ui callbacks
- void onClickCreator();
- void onClickOwner();
- void onCommitName();
- void onCommitDescription();
- void onCommitPermissions();
- void onCommitSaleInfo();
- void onCommitSaleType();
- void updateSaleInfo();
-
- LLInventoryItem* findItem() const;
-
- void refreshFromItem(LLInventoryItem* item);
- virtual void draw();
-
-protected:
- // The item id of the inventory item in question.
- LLUUID mItemID;
-
- // mObjectID will have a value if it is associated with a task in
- // the world, and will be == LLUUID::null if it's in the agent
- // inventory.
- LLUUID mObjectID;
-
- BOOL mDirty;
-
- LLPropertiesObserver* mPropertiesObserver;
-};
-
-class LLMultiProperties : public LLMultiFloater
-{
-public:
- LLMultiProperties();
-};
-
-#endif // LL_LLFLOATERPROPERTIES_H
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index 2635ac3a71..15ac46dc21 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -317,7 +317,6 @@ void LLFloaterRegionInfo::onOpen(const LLSD& key)
}
refreshFromRegion(gAgent.getRegion());
requestRegionInfo();
- requestMeshRezInfo();
if (!mGodLevelChangeSlot.connected())
{
@@ -1026,19 +1025,6 @@ bool LLPanelRegionGeneralInfo::onMessageCommit(const LLSD& notification, const L
return false;
}
-void LLFloaterRegionInfo::requestMeshRezInfo()
-{
- std::string sim_console_url = gAgent.getRegionCapability("SimConsoleAsync");
-
- if (!sim_console_url.empty())
- {
- std::string request_str = "get mesh_rez_enabled";
-
- LLCoreHttpUtil::HttpCoroutineAdapter::messageHttpPost(sim_console_url, LLSD(request_str),
- "Requested mesh_rez_enabled", "Error requesting mesh_rez_enabled");
- }
-}
-
// setregioninfo
// strings[0] = 'Y' - block terraform, 'N' - not
// strings[1] = 'Y' - block fly, 'N' - not
@@ -2943,7 +2929,7 @@ BOOL LLPanelEstateAccess::postBuild()
if (banned_name_list)
{
banned_name_list->setCommitOnSelectionChange(TRUE);
- banned_name_list->setMaxItemCount(ESTATE_MAX_ACCESS_IDS);
+ banned_name_list->setMaxItemCount(ESTATE_MAX_BANNED_IDS);
}
getChild<LLUICtrl>("banned_search_input")->setCommitCallback(boost::bind(&LLPanelEstateAccess::onBannedSearchEdit, this, _2));
@@ -3087,10 +3073,10 @@ void LLPanelEstateAccess::onClickAddBannedAgent()
{
LLCtrlListInterface *list = childGetListInterface("banned_avatar_name_list");
if (!list) return;
- if (list->getItemCount() >= ESTATE_MAX_ACCESS_IDS)
+ if (list->getItemCount() >= ESTATE_MAX_BANNED_IDS)
{
LLSD args;
- args["MAX_BANNED"] = llformat("%d", ESTATE_MAX_ACCESS_IDS);
+ args["MAX_BANNED"] = llformat("%d", ESTATE_MAX_BANNED_IDS);
LLNotificationsUtil::add("MaxBannedAgentsOnRegion", args);
return;
}
@@ -3328,13 +3314,13 @@ void LLPanelEstateAccess::accessAddCore3(const uuid_vec_t& ids, std::vector<LLAv
LLNameListCtrl* name_list = panel->getChild<LLNameListCtrl>("banned_avatar_name_list");
LLNameListCtrl* em_list = panel->getChild<LLNameListCtrl>("estate_manager_name_list");
int currentCount = (name_list ? name_list->getItemCount() : 0);
- if (ids.size() + currentCount > ESTATE_MAX_ACCESS_IDS)
+ if (ids.size() + currentCount > ESTATE_MAX_BANNED_IDS)
{
LLSD args;
args["NUM_ADDED"] = llformat("%d", ids.size());
- args["MAX_AGENTS"] = llformat("%d", ESTATE_MAX_ACCESS_IDS);
+ args["MAX_AGENTS"] = llformat("%d", ESTATE_MAX_BANNED_IDS);
args["LIST_TYPE"] = LLTrans::getString("RegionInfoListTypeBannedAgents");
- args["NUM_EXCESS"] = llformat("%d", (ids.size() + currentCount) - ESTATE_MAX_ACCESS_IDS);
+ args["NUM_EXCESS"] = llformat("%d", (ids.size() + currentCount) - ESTATE_MAX_BANNED_IDS);
LLNotificationsUtil::add("MaxAgentOnRegionBatch", args);
delete change_info;
return;
@@ -3713,7 +3699,7 @@ void LLPanelEstateAccess::requestEstateGetAccessCoro(std::string url)
{
LLStringUtil::format_map_t args;
args["[BANNEDAGENTS]"] = llformat("%d", result["BannedAgents"].size());
- args["[MAXBANNED]"] = llformat("%d", ESTATE_MAX_ACCESS_IDS);
+ args["[MAXBANNED]"] = llformat("%d", ESTATE_MAX_BANNED_IDS);
std::string msg = LLTrans::getString("RegionInfoBannedResidents", args);
panel->getChild<LLUICtrl>("ban_resident_label")->setValue(LLSD(msg));
diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h
index bfdeb9440d..91fd54fcf9 100644
--- a/indra/newview/llfloaterregioninfo.h
+++ b/indra/newview/llfloaterregioninfo.h
@@ -102,7 +102,6 @@ public:
void onRegionChanged();
void requestRegionInfo();
- void requestMeshRezInfo();
void enableTopButtons();
void disableTopButtons();
diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp
index 7e6af45515..37ae80fa8f 100644
--- a/indra/newview/llfloatersearch.cpp
+++ b/indra/newview/llfloatersearch.cpp
@@ -46,7 +46,7 @@ class LLSearchHandler : public LLCommandHandler
public:
// requires trusted browser to trigger
LLSearchHandler() : LLCommandHandler("search", UNTRUSTED_CLICK_ONLY) { }
- bool handle(const LLSD& tokens, const LLSD& query_map, LLMediaCtrl* web)
+ bool handle(const LLSD& tokens, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web)
{
if (!LLUI::getInstance()->mSettingGroups["config"]->getBOOL("EnableSearch"))
{
diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp
index dd7ce40e97..a875d33679 100644
--- a/indra/newview/llfloatersidepanelcontainer.cpp
+++ b/indra/newview/llfloatersidepanelcontainer.cpp
@@ -90,6 +90,29 @@ void LLFloaterSidePanelContainer::closeFloater(bool app_quitting)
}
}
+LLFloater* LLFloaterSidePanelContainer::getTopmostInventoryFloater()
+{
+ LLFloater* topmost_floater = NULL;
+ S32 z_min = S32_MAX;
+
+ LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
+ for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
+ {
+ LLFloater* inventory_floater = (*iter);
+
+ if (inventory_floater && inventory_floater->getVisible())
+ {
+ S32 z_order = gFloaterView->getZOrder(inventory_floater);
+ if (z_order < z_min)
+ {
+ z_min = z_order;
+ topmost_floater = inventory_floater;
+ }
+ }
+ }
+ return topmost_floater;
+}
+
LLPanel* LLFloaterSidePanelContainer::openChildPanel(const std::string& panel_name, const LLSD& params)
{
LLView* view = findChildView(panel_name, true);
diff --git a/indra/newview/llfloatersidepanelcontainer.h b/indra/newview/llfloatersidepanelcontainer.h
index 20baf28184..5e7e755d1f 100644
--- a/indra/newview/llfloatersidepanelcontainer.h
+++ b/indra/newview/llfloatersidepanelcontainer.h
@@ -57,6 +57,8 @@ public:
LLPanel* openChildPanel(const std::string& panel_name, const LLSD& params);
+ static LLFloater* getTopmostInventoryFloater();
+
static void showPanel(const std::string& floater_name, const LLSD& key);
static void showPanel(const std::string& floater_name, const std::string& panel_name, const LLSD& key);
diff --git a/indra/newview/llfloatersimpleoutfitsnapshot.cpp b/indra/newview/llfloatersimpleoutfitsnapshot.cpp
deleted file mode 100644
index bab2efbbd5..0000000000
--- a/indra/newview/llfloatersimpleoutfitsnapshot.cpp
+++ /dev/null
@@ -1,333 +0,0 @@
-/**
-* @file llfloatersimpleoutfitsnapshot.cpp
-* @brief Snapshot preview window for saving as an outfit thumbnail in visual outfit gallery
-*
-* $LicenseInfo:firstyear=2022&license=viewerlgpl$
-* Second Life Viewer Source Code
-* Copyright (C) 2022, 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 "llfloatersimpleoutfitsnapshot.h"
-
-#include "llfloaterreg.h"
-#include "llimagefiltersmanager.h"
-#include "llstatusbar.h" // can_afford_transaction()
-#include "llnotificationsutil.h"
-#include "llagentbenefits.h"
-#include "llviewercontrol.h"
-
-LLSimpleOutfitSnapshotFloaterView* gSimpleOutfitSnapshotFloaterView = NULL;
-
-const S32 OUTFIT_SNAPSHOT_WIDTH = 256;
-const S32 OUTFIT_SNAPSHOT_HEIGHT = 256;
-
-static LLDefaultChildRegistry::Register<LLSimpleOutfitSnapshotFloaterView> r("simple_snapshot_outfit_floater_view");
-
-///----------------------------------------------------------------------------
-/// Class LLFloaterSimpleOutfitSnapshot::Impl
-///----------------------------------------------------------------------------
-
-LLSnapshotModel::ESnapshotFormat LLFloaterSimpleOutfitSnapshot::Impl::getImageFormat(LLFloaterSnapshotBase* floater)
-{
- return LLSnapshotModel::SNAPSHOT_FORMAT_PNG;
-}
-
-LLSnapshotModel::ESnapshotLayerType LLFloaterSimpleOutfitSnapshot::Impl::getLayerType(LLFloaterSnapshotBase* floater)
-{
- return LLSnapshotModel::SNAPSHOT_TYPE_COLOR;
-}
-
-void LLFloaterSimpleOutfitSnapshot::Impl::updateControls(LLFloaterSnapshotBase* floater)
-{
- LLSnapshotLivePreview* previewp = getPreviewView();
- updateResolution(floater);
- if (previewp)
- {
- previewp->setSnapshotType(LLSnapshotModel::ESnapshotType::SNAPSHOT_TEXTURE);
- previewp->setSnapshotFormat(LLSnapshotModel::ESnapshotFormat::SNAPSHOT_FORMAT_PNG);
- previewp->setSnapshotBufferType(LLSnapshotModel::ESnapshotLayerType::SNAPSHOT_TYPE_COLOR);
- }
-}
-
-std::string LLFloaterSimpleOutfitSnapshot::Impl::getSnapshotPanelPrefix()
-{
- return "panel_outfit_snapshot_";
-}
-
-void LLFloaterSimpleOutfitSnapshot::Impl::updateResolution(void* data)
-{
- LLFloaterSimpleOutfitSnapshot *view = (LLFloaterSimpleOutfitSnapshot *)data;
-
- if (!view)
- {
- llassert(view);
- return;
- }
-
- S32 width = OUTFIT_SNAPSHOT_WIDTH;
- S32 height = OUTFIT_SNAPSHOT_HEIGHT;
-
- LLSnapshotLivePreview* previewp = getPreviewView();
- if (previewp)
- {
- S32 original_width = 0, original_height = 0;
- previewp->getSize(original_width, original_height);
-
- if (gSavedSettings.getBOOL("RenderHUDInSnapshot"))
- { //clamp snapshot resolution to window size when showing UI HUD in snapshot
- width = llmin(width, gViewerWindow->getWindowWidthRaw());
- height = llmin(height, gViewerWindow->getWindowHeightRaw());
- }
-
- llassert(width > 0 && height > 0);
-
- previewp->setSize(width, height);
-
- if (original_width != width || original_height != height)
- {
- // hide old preview as the aspect ratio could be wrong
- checkAutoSnapshot(previewp, FALSE);
- previewp->updateSnapshot(TRUE);
- }
- }
-}
-
-void LLFloaterSimpleOutfitSnapshot::Impl::setStatus(EStatus status, bool ok, const std::string& msg)
-{
- switch (status)
- {
- case STATUS_READY:
- mFloater->setCtrlsEnabled(true);
- break;
- case STATUS_WORKING:
- mFloater->setCtrlsEnabled(false);
- break;
- case STATUS_FINISHED:
- mFloater->setCtrlsEnabled(true);
- break;
- }
-
- mStatus = status;
-}
-
-///----------------------------------------------------------------re------------
-/// Class LLFloaterSimpleOutfitSnapshot
-///----------------------------------------------------------------------------
-
-LLFloaterSimpleOutfitSnapshot::LLFloaterSimpleOutfitSnapshot(const LLSD& key)
- : LLFloaterSnapshotBase(key),
- mOutfitGallery(NULL)
-{
- impl = new Impl(this);
-}
-
-LLFloaterSimpleOutfitSnapshot::~LLFloaterSimpleOutfitSnapshot()
-{
-}
-
-BOOL LLFloaterSimpleOutfitSnapshot::postBuild()
-{
- getChild<LLUICtrl>("save_btn")->setLabelArg("[UPLOAD_COST]", std::to_string(LLAgentBenefitsMgr::current().getTextureUploadCost()));
-
- childSetAction("new_snapshot_btn", ImplBase::onClickNewSnapshot, this);
- childSetAction("save_btn", boost::bind(&LLFloaterSimpleOutfitSnapshot::onSend, this));
- childSetAction("cancel_btn", boost::bind(&LLFloaterSimpleOutfitSnapshot::onCancel, this));
-
- mThumbnailPlaceholder = getChild<LLUICtrl>("thumbnail_placeholder");
-
- // create preview window
- LLRect full_screen_rect = getRootView()->getRect();
- LLSnapshotLivePreview::Params p;
- p.rect(full_screen_rect);
- LLSnapshotLivePreview* previewp = new LLSnapshotLivePreview(p);
- LLView* parent_view = gSnapshotFloaterView->getParent();
-
- parent_view->removeChild(gSnapshotFloaterView);
- // make sure preview is below snapshot floater
- parent_view->addChild(previewp);
- parent_view->addChild(gSnapshotFloaterView);
-
- //move snapshot floater to special purpose snapshotfloaterview
- gFloaterView->removeChild(this);
- gSnapshotFloaterView->addChild(this);
-
- impl->mPreviewHandle = previewp->getHandle();
- previewp->setContainer(this);
- impl->updateControls(this);
- impl->setAdvanced(true);
- impl->setSkipReshaping(true);
-
- previewp->mKeepAspectRatio = FALSE;
- previewp->setThumbnailPlaceholderRect(getThumbnailPlaceholderRect());
- previewp->setAllowRenderUI(false);
-
- return TRUE;
-}
-const S32 PREVIEW_OFFSET_X = 12;
-const S32 PREVIEW_OFFSET_Y = 70;
-
-void LLFloaterSimpleOutfitSnapshot::draw()
-{
- LLSnapshotLivePreview* previewp = getPreviewView();
-
- if (previewp && (previewp->isSnapshotActive() || previewp->getThumbnailLock()))
- {
- // don't render snapshot window in snapshot, even if "show ui" is turned on
- return;
- }
-
- LLFloater::draw();
-
- if (previewp && !isMinimized() && mThumbnailPlaceholder->getVisible())
- {
- if(previewp->getThumbnailImage())
- {
- bool working = impl->getStatus() == ImplBase::STATUS_WORKING;
- const LLRect& thumbnail_rect = getThumbnailPlaceholderRect();
- const S32 thumbnail_w = previewp->getThumbnailWidth();
- const S32 thumbnail_h = previewp->getThumbnailHeight();
-
- S32 offset_x = PREVIEW_OFFSET_X;
- S32 offset_y = PREVIEW_OFFSET_Y;
-
- gGL.matrixMode(LLRender::MM_MODELVIEW);
- // Apply floater transparency to the texture unless the floater is focused.
- F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency();
- LLColor4 color = working ? LLColor4::grey4 : LLColor4::white;
- gl_draw_scaled_image(offset_x, offset_y,
- thumbnail_w, thumbnail_h,
- previewp->getThumbnailImage(), color % alpha);
-#if LL_DARWIN
- std::string alpha_color = getTransparencyType() == TT_ACTIVE ? "OutfitSnapshotMacMask" : "OutfitSnapshotMacMask2";
-#else
- std::string alpha_color = getTransparencyType() == TT_ACTIVE ? "FloaterFocusBackgroundColor" : "DkGray";
-#endif
-
- previewp->drawPreviewRect(offset_x, offset_y, LLUIColorTable::instance().getColor(alpha_color));
-
- gGL.pushUIMatrix();
- LLUI::translate((F32) thumbnail_rect.mLeft, (F32) thumbnail_rect.mBottom);
- mThumbnailPlaceholder->draw();
- gGL.popUIMatrix();
- }
- }
- impl->updateLayout(this);
-}
-
-void LLFloaterSimpleOutfitSnapshot::onOpen(const LLSD& key)
-{
- LLSnapshotLivePreview* preview = getPreviewView();
- if (preview)
- {
- preview->updateSnapshot(TRUE);
- }
- focusFirstItem(FALSE);
- gSnapshotFloaterView->setEnabled(TRUE);
- gSnapshotFloaterView->setVisible(TRUE);
- gSnapshotFloaterView->adjustToFitScreen(this, FALSE);
-
- impl->updateControls(this);
- impl->setStatus(ImplBase::STATUS_READY);
-}
-
-void LLFloaterSimpleOutfitSnapshot::onCancel()
-{
- closeFloater();
-}
-
-void LLFloaterSimpleOutfitSnapshot::onSend()
-{
- S32 expected_upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost();
- if (can_afford_transaction(expected_upload_cost))
- {
- saveTexture();
- postSave();
- }
- else
- {
- LLSD args;
- args["COST"] = llformat("%d", expected_upload_cost);
- LLNotificationsUtil::add("ErrorPhotoCannotAfford", args);
- inventorySaveFailed();
- }
-}
-
-void LLFloaterSimpleOutfitSnapshot::postSave()
-{
- impl->setStatus(ImplBase::STATUS_WORKING);
-}
-
-// static
-void LLFloaterSimpleOutfitSnapshot::update()
-{
- LLFloaterSimpleOutfitSnapshot* inst = findInstance();
- if (inst != NULL)
- {
- inst->impl->updateLivePreview();
- }
-}
-
-
-// static
-LLFloaterSimpleOutfitSnapshot* LLFloaterSimpleOutfitSnapshot::findInstance()
-{
- return LLFloaterReg::findTypedInstance<LLFloaterSimpleOutfitSnapshot>("simple_outfit_snapshot");
-}
-
-// static
-LLFloaterSimpleOutfitSnapshot* LLFloaterSimpleOutfitSnapshot::getInstance()
-{
- return LLFloaterReg::getTypedInstance<LLFloaterSimpleOutfitSnapshot>("simple_outfit_snapshot");
-}
-
-void LLFloaterSimpleOutfitSnapshot::saveTexture()
-{
- LLSnapshotLivePreview* previewp = getPreviewView();
- if (!previewp)
- {
- llassert(previewp != NULL);
- return;
- }
-
- if (mOutfitGallery)
- {
- mOutfitGallery->onBeforeOutfitSnapshotSave();
- }
- previewp->saveTexture(TRUE, getOutfitID().asString());
- if (mOutfitGallery)
- {
- mOutfitGallery->onAfterOutfitSnapshotSave();
- }
- closeFloater();
-}
-
-///----------------------------------------------------------------------------
-/// Class LLSimpleOutfitSnapshotFloaterView
-///----------------------------------------------------------------------------
-
-LLSimpleOutfitSnapshotFloaterView::LLSimpleOutfitSnapshotFloaterView(const Params& p) : LLFloaterView(p)
-{
-}
-
-LLSimpleOutfitSnapshotFloaterView::~LLSimpleOutfitSnapshotFloaterView()
-{
-}
diff --git a/indra/newview/llfloatersimplesnapshot.cpp b/indra/newview/llfloatersimplesnapshot.cpp
new file mode 100644
index 0000000000..58604c5628
--- /dev/null
+++ b/indra/newview/llfloatersimplesnapshot.cpp
@@ -0,0 +1,499 @@
+/**
+* @file llfloatersimplesnapshot.cpp
+* @brief Snapshot preview window for saving as a thumbnail
+*
+* $LicenseInfo:firstyear=2022&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2022, 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 "llfloatersimplesnapshot.h"
+
+#include "llfloaterreg.h"
+#include "llimagefiltersmanager.h"
+#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
+#include "llstatusbar.h" // can_afford_transaction()
+#include "llnotificationsutil.h"
+#include "llagent.h"
+#include "llagentbenefits.h"
+#include "llviewercontrol.h"
+#include "llviewertexturelist.h"
+
+
+
+LLSimpleSnapshotFloaterView* gSimpleSnapshotFloaterView = NULL;
+
+const S32 LLFloaterSimpleSnapshot::THUMBNAIL_SNAPSHOT_DIM_MAX = 256;
+const S32 LLFloaterSimpleSnapshot::THUMBNAIL_SNAPSHOT_DIM_MIN = 64;
+
+// Thumbnail posting coro
+
+static const std::string THUMBNAIL_UPLOAD_CAP = "InventoryThumbnailUpload";
+
+void post_thumbnail_image_coro(std::string cap_url, std::string path_to_image, LLSD first_data)
+{
+ LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
+ LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
+ httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("post_profile_image_coro", httpPolicy));
+ LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
+ LLCore::HttpHeaders::ptr_t httpHeaders;
+
+ LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions);
+ httpOpts->setFollowRedirects(true);
+
+ LLSD result = httpAdapter->postAndSuspend(httpRequest, cap_url, first_data, httpOpts, httpHeaders);
+
+ LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
+ LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
+
+ if (!status)
+ {
+ // todo: notification?
+ LL_WARNS("AvatarProperties") << "Failed to get uploader cap " << status.toString() << LL_ENDL;
+ return;
+ }
+ if (!result.has("uploader"))
+ {
+ // todo: notification?
+ LL_WARNS("AvatarProperties") << "Failed to get uploader cap, response contains no data." << LL_ENDL;
+ return;
+ }
+ std::string uploader_cap = result["uploader"].asString();
+ if (uploader_cap.empty())
+ {
+ LL_WARNS("AvatarProperties") << "Failed to get uploader cap, cap invalid." << LL_ENDL;
+ return;
+ }
+
+ // Upload the image
+
+ LLCore::HttpRequest::ptr_t uploaderhttpRequest(new LLCore::HttpRequest);
+ LLCore::HttpHeaders::ptr_t uploaderhttpHeaders(new LLCore::HttpHeaders);
+ LLCore::HttpOptions::ptr_t uploaderhttpOpts(new LLCore::HttpOptions);
+ S64 length;
+
+ {
+ llifstream instream(path_to_image.c_str(), std::iostream::binary | std::iostream::ate);
+ if (!instream.is_open())
+ {
+ LL_WARNS("AvatarProperties") << "Failed to open file " << path_to_image << LL_ENDL;
+ return;
+ }
+ length = instream.tellg();
+ }
+
+ uploaderhttpHeaders->append(HTTP_OUT_HEADER_CONTENT_TYPE, "application/jp2"); // optional
+ uploaderhttpHeaders->append(HTTP_OUT_HEADER_CONTENT_LENGTH, llformat("%d", length)); // required!
+ uploaderhttpOpts->setFollowRedirects(true);
+
+ result = httpAdapter->postFileAndSuspend(uploaderhttpRequest, uploader_cap, path_to_image, uploaderhttpOpts, uploaderhttpHeaders);
+
+ httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
+ status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
+
+ LL_DEBUGS("Thumbnail") << result << LL_ENDL;
+
+ if (!status)
+ {
+ LL_WARNS("Thumbnail") << "Failed to upload image " << status.toString() << LL_ENDL;
+ return;
+ }
+
+ if (result["state"].asString() != "complete")
+ {
+ if (result.has("message"))
+ {
+ LL_WARNS("Thumbnail") << "Failed to upload image, state " << result["state"] << " message: " << result["message"] << LL_ENDL;
+ }
+ else
+ {
+ LL_WARNS("Thumbnail") << "Failed to upload image " << result << LL_ENDL;
+ }
+ return;
+ }
+
+ if (first_data.has("category_id"))
+ {
+ LLUUID cat_id = first_data["category_id"].asUUID();
+ LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
+ if (cat)
+ {
+ cat->setThumbnailUUID(result["new_asset"].asUUID());
+ }
+ gInventory.addChangedMask(LLInventoryObserver::INTERNAL, cat_id);
+ }
+ if (first_data.has("item_id"))
+ {
+ LLUUID item_id = first_data["item_id"].asUUID();
+ LLViewerInventoryItem* item = gInventory.getItem(item_id);
+ if (item)
+ {
+ item->setThumbnailUUID(result["new_asset"].asUUID());
+ }
+ // Are we supposed to get BulkUpdateInventory?
+ gInventory.addChangedMask(LLInventoryObserver::INTERNAL, item_id);
+ }
+}
+
+///----------------------------------------------------------------------------
+/// Class LLFloaterSimpleSnapshot::Impl
+///----------------------------------------------------------------------------
+
+LLSnapshotModel::ESnapshotFormat LLFloaterSimpleSnapshot::Impl::getImageFormat(LLFloaterSnapshotBase* floater)
+{
+ return LLSnapshotModel::SNAPSHOT_FORMAT_PNG;
+}
+
+LLSnapshotModel::ESnapshotLayerType LLFloaterSimpleSnapshot::Impl::getLayerType(LLFloaterSnapshotBase* floater)
+{
+ return LLSnapshotModel::SNAPSHOT_TYPE_COLOR;
+}
+
+void LLFloaterSimpleSnapshot::Impl::updateControls(LLFloaterSnapshotBase* floater)
+{
+ LLSnapshotLivePreview* previewp = getPreviewView();
+ updateResolution(floater);
+ if (previewp)
+ {
+ previewp->setSnapshotType(LLSnapshotModel::ESnapshotType::SNAPSHOT_TEXTURE);
+ previewp->setSnapshotFormat(LLSnapshotModel::ESnapshotFormat::SNAPSHOT_FORMAT_PNG);
+ previewp->setSnapshotBufferType(LLSnapshotModel::ESnapshotLayerType::SNAPSHOT_TYPE_COLOR);
+ }
+}
+
+std::string LLFloaterSimpleSnapshot::Impl::getSnapshotPanelPrefix()
+{
+ return "panel_outfit_snapshot_";
+}
+
+void LLFloaterSimpleSnapshot::Impl::updateResolution(void* data)
+{
+ LLFloaterSimpleSnapshot *view = (LLFloaterSimpleSnapshot *)data;
+
+ if (!view)
+ {
+ llassert(view);
+ return;
+ }
+
+ S32 width = THUMBNAIL_SNAPSHOT_DIM_MAX;
+ S32 height = THUMBNAIL_SNAPSHOT_DIM_MAX;
+
+ LLSnapshotLivePreview* previewp = getPreviewView();
+ if (previewp)
+ {
+ S32 original_width = 0, original_height = 0;
+ previewp->getSize(original_width, original_height);
+
+ if (gSavedSettings.getBOOL("RenderHUDInSnapshot"))
+ { //clamp snapshot resolution to window size when showing UI HUD in snapshot
+ width = llmin(width, gViewerWindow->getWindowWidthRaw());
+ height = llmin(height, gViewerWindow->getWindowHeightRaw());
+ }
+
+ llassert(width > 0 && height > 0);
+
+ previewp->setSize(width, height);
+
+ if (original_width != width || original_height != height)
+ {
+ // hide old preview as the aspect ratio could be wrong
+ checkAutoSnapshot(previewp, FALSE);
+ previewp->updateSnapshot(TRUE);
+ }
+ }
+}
+
+void LLFloaterSimpleSnapshot::Impl::setStatus(EStatus status, bool ok, const std::string& msg)
+{
+ switch (status)
+ {
+ case STATUS_READY:
+ mFloater->setCtrlsEnabled(true);
+ break;
+ case STATUS_WORKING:
+ mFloater->setCtrlsEnabled(false);
+ break;
+ case STATUS_FINISHED:
+ mFloater->setCtrlsEnabled(true);
+ break;
+ }
+
+ mStatus = status;
+}
+
+///----------------------------------------------------------------re------------
+/// Class LLFloaterSimpleSnapshot
+///----------------------------------------------------------------------------
+
+LLFloaterSimpleSnapshot::LLFloaterSimpleSnapshot(const LLSD& key)
+ : LLFloaterSnapshotBase(key)
+ , mOwner(NULL)
+ , mContextConeOpacity(0.f)
+{
+ impl = new Impl(this);
+}
+
+LLFloaterSimpleSnapshot::~LLFloaterSimpleSnapshot()
+{
+}
+
+BOOL LLFloaterSimpleSnapshot::postBuild()
+{
+ childSetAction("new_snapshot_btn", ImplBase::onClickNewSnapshot, this);
+ childSetAction("save_btn", boost::bind(&LLFloaterSimpleSnapshot::onSend, this));
+ childSetAction("cancel_btn", boost::bind(&LLFloaterSimpleSnapshot::onCancel, this));
+
+ mThumbnailPlaceholder = getChild<LLUICtrl>("thumbnail_placeholder");
+
+ // create preview window
+ LLRect full_screen_rect = getRootView()->getRect();
+ LLSnapshotLivePreview::Params p;
+ p.rect(full_screen_rect);
+ LLSnapshotLivePreview* previewp = new LLSnapshotLivePreview(p);
+
+ // Do not move LLFloaterSimpleSnapshot floater into gSnapshotFloaterView
+ // since it can be a dependednt floater and does not draw UI
+
+ impl->mPreviewHandle = previewp->getHandle();
+ previewp->setContainer(this);
+ impl->updateControls(this);
+ impl->setAdvanced(true);
+ impl->setSkipReshaping(true);
+
+ previewp->mKeepAspectRatio = FALSE;
+ previewp->setThumbnailPlaceholderRect(getThumbnailPlaceholderRect());
+ previewp->setAllowRenderUI(false);
+ previewp->setThumbnailSubsampled(TRUE);
+
+ return TRUE;
+}
+
+const S32 PREVIEW_OFFSET_Y = 70;
+
+void LLFloaterSimpleSnapshot::draw()
+{
+ if (mOwner)
+ {
+ static LLCachedControl<F32> max_opacity(gSavedSettings, "PickerContextOpacity", 0.4f);
+ drawConeToOwner(mContextConeOpacity, max_opacity, mOwner);
+ }
+
+ LLSnapshotLivePreview* previewp = getPreviewView();
+
+ if (previewp && (previewp->isSnapshotActive() || previewp->getThumbnailLock()))
+ {
+ // don't render snapshot window in snapshot, even if "show ui" is turned on
+ return;
+ }
+
+ LLFloater::draw();
+
+ if (previewp && !isMinimized() && mThumbnailPlaceholder->getVisible())
+ {
+ if(previewp->getThumbnailImage())
+ {
+ bool working = impl->getStatus() == ImplBase::STATUS_WORKING;
+ const S32 thumbnail_w = previewp->getThumbnailWidth();
+ const S32 thumbnail_h = previewp->getThumbnailHeight();
+
+ LLRect local_rect = getLocalRect();
+ S32 offset_x = (local_rect.getWidth() - thumbnail_w) / 2;
+ S32 offset_y = PREVIEW_OFFSET_Y;
+
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ // Apply floater transparency to the texture unless the floater is focused.
+ F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency();
+ LLColor4 color = working ? LLColor4::grey4 : LLColor4::white;
+ gl_draw_scaled_image(offset_x, offset_y,
+ thumbnail_w, thumbnail_h,
+ previewp->getThumbnailImage(), color % alpha);
+ }
+ }
+ impl->updateLayout(this);
+}
+
+void LLFloaterSimpleSnapshot::onOpen(const LLSD& key)
+{
+ LLSnapshotLivePreview* preview = getPreviewView();
+ if (preview)
+ {
+ preview->updateSnapshot(TRUE);
+ }
+ focusFirstItem(FALSE);
+ gSnapshotFloaterView->setEnabled(TRUE);
+ gSnapshotFloaterView->setVisible(TRUE);
+ gSnapshotFloaterView->adjustToFitScreen(this, FALSE);
+
+ impl->updateControls(this);
+ impl->setStatus(ImplBase::STATUS_READY);
+
+ mInventoryId = key["item_id"].asUUID();
+ mTaskId = key["task_id"].asUUID();
+}
+
+void LLFloaterSimpleSnapshot::onCancel()
+{
+ closeFloater();
+}
+
+void LLFloaterSimpleSnapshot::onSend()
+{
+ LLSnapshotLivePreview* previewp = getPreviewView();
+
+ std::string temp_file = gDirUtilp->getTempFilename();
+ if (previewp->createUploadFile(temp_file, THUMBNAIL_SNAPSHOT_DIM_MAX, THUMBNAIL_SNAPSHOT_DIM_MIN))
+ {
+ uploadImageUploadFile(temp_file, mInventoryId, mTaskId);
+ closeFloater();
+ }
+ else
+ {
+ LLSD notif_args;
+ notif_args["REASON"] = LLImage::getLastError().c_str();
+ LLNotificationsUtil::add("CannotUploadTexture", notif_args);
+ }
+}
+
+void LLFloaterSimpleSnapshot::postSave()
+{
+ impl->setStatus(ImplBase::STATUS_WORKING);
+}
+
+// static
+void LLFloaterSimpleSnapshot::uploadThumbnail(const std::string &file_path, const LLUUID &inventory_id, const LLUUID &task_id)
+{
+ // generate a temp texture file for coroutine
+ std::string temp_file = gDirUtilp->getTempFilename();
+ U32 codec = LLImageBase::getCodecFromExtension(gDirUtilp->getExtension(file_path));
+ if (!LLViewerTextureList::createUploadFile(file_path, temp_file, codec, THUMBNAIL_SNAPSHOT_DIM_MAX, THUMBNAIL_SNAPSHOT_DIM_MIN, true))
+ {
+ LLSD notif_args;
+ notif_args["REASON"] = LLImage::getLastError().c_str();
+ LLNotificationsUtil::add("CannotUploadTexture", notif_args);
+ LL_WARNS("Thumbnail") << "Failed to upload thumbnail for " << inventory_id << " " << task_id << ", reason: " << notif_args["REASON"].asString() << LL_ENDL;
+ return;
+ }
+ uploadImageUploadFile(temp_file, inventory_id, task_id);
+}
+
+// static
+void LLFloaterSimpleSnapshot::uploadThumbnail(LLPointer<LLImageRaw> raw_image, const LLUUID& inventory_id, const LLUUID& task_id)
+{
+ std::string temp_file = gDirUtilp->getTempFilename();
+ if (!LLViewerTextureList::createUploadFile(raw_image, temp_file, THUMBNAIL_SNAPSHOT_DIM_MAX, THUMBNAIL_SNAPSHOT_DIM_MIN))
+ {
+ LLSD notif_args;
+ notif_args["REASON"] = LLImage::getLastError().c_str();
+ LLNotificationsUtil::add("CannotUploadTexture", notif_args);
+ LL_WARNS("Thumbnail") << "Failed to upload thumbnail for " << inventory_id << " " << task_id << ", reason: " << notif_args["REASON"].asString() << LL_ENDL;
+ return;
+ }
+ uploadImageUploadFile(temp_file, inventory_id, task_id);
+}
+
+// static
+void LLFloaterSimpleSnapshot::uploadImageUploadFile(const std::string &temp_file, const LLUUID &inventory_id, const LLUUID &task_id)
+{
+ LLSD data;
+
+ if (task_id.notNull())
+ {
+ data["item_id"] = inventory_id;
+ data["task_id"] = task_id;
+ }
+ else if (gInventory.getCategory(inventory_id))
+ {
+ data["category_id"] = inventory_id;
+ }
+ else
+ {
+ data["item_id"] = inventory_id;
+ }
+
+ std::string cap_url = gAgent.getRegionCapability(THUMBNAIL_UPLOAD_CAP);
+ if (cap_url.empty())
+ {
+ LLSD args;
+ args["CAPABILITY"] = THUMBNAIL_UPLOAD_CAP;
+ LLNotificationsUtil::add("RegionCapabilityRequestError", args);
+ LL_WARNS("Thumbnail") << "Failed to upload profile image for item " << inventory_id << " " << task_id << ", no cap found" << LL_ENDL;
+ return;
+ }
+
+ LLCoros::instance().launch("postAgentUserImageCoro",
+ boost::bind(post_thumbnail_image_coro, cap_url, temp_file, data));
+}
+
+void LLFloaterSimpleSnapshot::update()
+{
+ // initializes snapshots when needed
+ LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("simple_snapshot");
+ for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin();
+ iter != inst_list.end(); ++iter)
+ {
+ LLFloaterSimpleSnapshot* floater = dynamic_cast<LLFloaterSimpleSnapshot*>(*iter);
+ if (floater)
+ {
+ floater->impl->updateLivePreview();
+ }
+ }
+}
+
+
+// static
+LLFloaterSimpleSnapshot* LLFloaterSimpleSnapshot::findInstance(const LLSD &key)
+{
+ return LLFloaterReg::findTypedInstance<LLFloaterSimpleSnapshot>("simple_snapshot", key);
+}
+
+// static
+LLFloaterSimpleSnapshot* LLFloaterSimpleSnapshot::getInstance(const LLSD &key)
+{
+ return LLFloaterReg::getTypedInstance<LLFloaterSimpleSnapshot>("simple_snapshot", key);
+}
+
+void LLFloaterSimpleSnapshot::saveTexture()
+{
+ LLSnapshotLivePreview* previewp = getPreviewView();
+ if (!previewp)
+ {
+ llassert(previewp != NULL);
+ return;
+ }
+
+ previewp->saveTexture(TRUE, getInventoryId().asString());
+ closeFloater();
+}
+
+///----------------------------------------------------------------------------
+/// Class LLSimpleOutfitSnapshotFloaterView
+///----------------------------------------------------------------------------
+
+LLSimpleSnapshotFloaterView::LLSimpleSnapshotFloaterView(const Params& p) : LLFloaterView(p)
+{
+}
+
+LLSimpleSnapshotFloaterView::~LLSimpleSnapshotFloaterView()
+{
+}
diff --git a/indra/newview/llfloatersimpleoutfitsnapshot.h b/indra/newview/llfloatersimplesnapshot.h
index cc9a6c5d1e..91a81ee5c3 100644
--- a/indra/newview/llfloatersimpleoutfitsnapshot.h
+++ b/indra/newview/llfloatersimplesnapshot.h
@@ -1,6 +1,6 @@
/**
-* @file llfloatersimpleoutfitsnapshot.h
-* @brief Snapshot preview window for saving as an outfit thumbnail in visual outfit gallery
+* @file llfloatersimplesnapshot.h
+* @brief Snapshot preview window for saving as a thumbnail
*
* $LicenseInfo:firstyear=2022&license=viewerlgpl$
* Second Life Viewer Source Code
@@ -24,26 +24,25 @@
* $/LicenseInfo$
*/
-#ifndef LL_LLFLOATERSIMPLEOUTFITSNAPSHOT_H
-#define LL_LLFLOATERSIMPLEOUTFITSNAPSHOT_H
+#ifndef LL_LLFLOATERSIMPLESNAPSHOT_H
+#define LL_LLFLOATERSIMPLESNAPSHOT_H
#include "llfloater.h"
#include "llfloatersnapshot.h"
-#include "lloutfitgallery.h"
#include "llsnapshotlivepreview.h"
///----------------------------------------------------------------------------
-/// Class LLFloaterSimpleOutfitSnapshot
+/// Class LLFloaterSimpleSnapshot
///----------------------------------------------------------------------------
-class LLFloaterSimpleOutfitSnapshot : public LLFloaterSnapshotBase
+class LLFloaterSimpleSnapshot : public LLFloaterSnapshotBase
{
- LOG_CLASS(LLFloaterSimpleOutfitSnapshot);
+ LOG_CLASS(LLFloaterSimpleSnapshot);
public:
- LLFloaterSimpleOutfitSnapshot(const LLSD& key);
- ~LLFloaterSimpleOutfitSnapshot();
+ LLFloaterSimpleSnapshot(const LLSD& key);
+ ~LLFloaterSimpleSnapshot();
BOOL postBuild();
void onOpen(const LLSD& key);
@@ -51,36 +50,48 @@ public:
static void update();
- static LLFloaterSimpleOutfitSnapshot* getInstance();
- static LLFloaterSimpleOutfitSnapshot* findInstance();
+ static LLFloaterSimpleSnapshot* getInstance(const LLSD &key);
+ static LLFloaterSimpleSnapshot* findInstance(const LLSD &key);
void saveTexture();
const LLRect& getThumbnailPlaceholderRect() { return mThumbnailPlaceholder->getRect(); }
- void setOutfitID(LLUUID id) { mOutfitID = id; }
- LLUUID getOutfitID() { return mOutfitID; }
- void setGallery(LLOutfitGallery* gallery) { mOutfitGallery = gallery; }
+ void setInventoryId(const LLUUID &inventory_id) { mInventoryId = inventory_id; }
+ LLUUID getInventoryId() { return mInventoryId; }
+ void setTaskId(const LLUUID &task_id) { mTaskId = task_id; }
+ void setOwner(LLView *owner_view) { mOwner = owner_view; }
void postSave();
+ static void uploadThumbnail(const std::string &file_path, const LLUUID &inventory_id, const LLUUID &task_id);
+ static void uploadThumbnail(LLPointer<LLImageRaw> raw_image, const LLUUID& inventory_id, const LLUUID& task_id);
class Impl;
friend class Impl;
+ static const S32 THUMBNAIL_SNAPSHOT_DIM_MAX;
+ static const S32 THUMBNAIL_SNAPSHOT_DIM_MIN;
+
private:
void onSend();
void onCancel();
- LLUUID mOutfitID;
- LLOutfitGallery* mOutfitGallery;
+ // uploads upload-ready file
+ static void uploadImageUploadFile(const std::string &temp_file, const LLUUID &inventory_id, const LLUUID &task_id);
+
+ LLUUID mInventoryId;
+ LLUUID mTaskId;
+
+ LLView* mOwner;
+ F32 mContextConeOpacity;
};
///----------------------------------------------------------------------------
-/// Class LLFloaterSimpleOutfitSnapshot::Impl
+/// Class LLFloaterSimpleSnapshot::Impl
///----------------------------------------------------------------------------
-class LLFloaterSimpleOutfitSnapshot::Impl : public LLFloaterSnapshotBase::ImplBase
+class LLFloaterSimpleSnapshot::Impl : public LLFloaterSnapshotBase::ImplBase
{
- LOG_CLASS(LLFloaterSimpleOutfitSnapshot::Impl);
+ LOG_CLASS(LLFloaterSimpleSnapshot::Impl);
public:
Impl(LLFloaterSnapshotBase* floater)
: LLFloaterSnapshotBase::ImplBase(floater)
@@ -108,7 +119,7 @@ private:
/// Class LLSimpleOutfitSnapshotFloaterView
///----------------------------------------------------------------------------
-class LLSimpleOutfitSnapshotFloaterView : public LLFloaterView
+class LLSimpleSnapshotFloaterView : public LLFloaterView
{
public:
struct Params
@@ -117,13 +128,13 @@ public:
};
protected:
- LLSimpleOutfitSnapshotFloaterView(const Params& p);
+ LLSimpleSnapshotFloaterView(const Params& p);
friend class LLUICtrlFactory;
public:
- virtual ~LLSimpleOutfitSnapshotFloaterView();
+ virtual ~LLSimpleSnapshotFloaterView();
};
-extern LLSimpleOutfitSnapshotFloaterView* gSimpleOutfitSnapshotFloaterView;
+extern LLSimpleSnapshotFloaterView* gSimpleOutfitSnapshotFloaterView;
-#endif // LL_LLFLOATERSIMPLEOUTFITSNAPSHOT_H
+#endif // LL_LLFLOATERSIMPLESNAPSHOT_H
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index b6acba6558..5fb4fb9b07 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -925,6 +925,9 @@ void LLFloaterTools::onClose(bool app_quitting)
// hide the advanced object weights floater
LLFloaterReg::hideInstance("object_weights");
+ // hide gltf material editor
+ LLFloaterReg::hideInstance("live_material_editor");
+
// prepare content for next call
mPanelContents->clearContents();
diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp
index bd49405f34..9f277021c8 100644
--- a/indra/newview/llfloatertopobjects.cpp
+++ b/indra/newview/llfloatertopobjects.cpp
@@ -49,6 +49,7 @@
#include "llviewerparcelmgr.h"
#include "llviewerregion.h"
#include "lluictrlfactory.h"
+#include "llviewerobjectlist.h"
#include "llviewerwindow.h"
#include "llfloaterregioninfo.h"
@@ -83,6 +84,8 @@ LLFloaterTopObjects::LLFloaterTopObjects(const LLSD& key)
mCommitCallbackRegistrar.add("TopObjects.GetByOwnerName", boost::bind(&LLFloaterTopObjects::onGetByOwnerName, this));
mCommitCallbackRegistrar.add("TopObjects.GetByParcelName", boost::bind(&LLFloaterTopObjects::onGetByParcelName, this));
mCommitCallbackRegistrar.add("TopObjects.CommitObjectsList",boost::bind(&LLFloaterTopObjects::onCommitObjectsList, this));
+
+ mCommitCallbackRegistrar.add("TopObjects.TeleportToSelected", boost::bind(&LLFloaterTopObjects::teleportToSelectedObject, this));
}
LLFloaterTopObjects::~LLFloaterTopObjects()
@@ -92,10 +95,11 @@ LLFloaterTopObjects::~LLFloaterTopObjects()
// virtual
BOOL LLFloaterTopObjects::postBuild()
{
- LLScrollListCtrl *objects_list = getChild<LLScrollListCtrl>("objects_list");
- getChild<LLUICtrl>("objects_list")->setFocus(TRUE);
- objects_list->setDoubleClickCallback(onDoubleClickObjectsList, this);
- objects_list->setCommitOnSelectionChange(TRUE);
+ mObjectsScrollList = getChild<LLScrollListCtrl>("objects_list");
+ mObjectsScrollList->setFocus(TRUE);
+ mObjectsScrollList->setDoubleClickCallback(onDoubleClickObjectsList, this);
+ mObjectsScrollList->setCommitOnSelectionChange(TRUE);
+ mObjectsScrollList->setCommitCallback(boost::bind(&LLFloaterTopObjects::onSelectionChanged, this));
setDefaultBtn("show_beacon_btn");
@@ -421,6 +425,8 @@ void LLFloaterTopObjects::clearList()
mObjectListData.clear();
mObjectListIDs.clear();
mtotalScore = 0.f;
+
+ onSelectionChanged();
}
@@ -507,3 +513,38 @@ void LLFloaterTopObjects::showBeacon()
std::string tooltip("");
LLTracker::trackLocation(pos_global, name, tooltip, LLTracker::LOCATION_ITEM);
}
+
+void LLFloaterTopObjects::teleportToSelectedObject()
+{
+ std::vector<LLScrollListItem*> selected_items = mObjectsScrollList->getAllSelected();
+ if (selected_items.size() == 1)
+ {
+ LLScrollListItem* first_selected = selected_items.front();
+
+ LLVector3d teleport_location;
+ LLViewerObject *viewer_object = gObjectList.findObject(first_selected->getUUID());
+ if (viewer_object == NULL)
+ {
+ // If we cannot find the object in the viewer list, teleport to the last reported position
+ std::string pos_string = first_selected->getColumn(3)->getValue().asString();
+
+ F32 x, y, z;
+ S32 matched = sscanf(pos_string.c_str(), "<%g,%g,%g>", &x, &y, &z);
+ if (matched != 3) return;
+
+ LLVector3 pos_agent(x, y, z);
+ teleport_location = gAgent.getPosGlobalFromAgent(pos_agent);
+ }
+ else
+ {
+ // If we can find the object in the viewer list, teleport to the known current position
+ teleport_location = viewer_object->getPositionGlobal();
+ }
+ gAgent.teleportViaLocationLookAt(teleport_location);
+ }
+}
+
+void LLFloaterTopObjects::onSelectionChanged()
+{
+ getChildView("teleport_btn")->setEnabled(mObjectsScrollList->getNumSelected() == 1);
+}
diff --git a/indra/newview/llfloatertopobjects.h b/indra/newview/llfloatertopobjects.h
index 3138249c7a..b73401e50d 100644
--- a/indra/newview/llfloatertopobjects.h
+++ b/indra/newview/llfloatertopobjects.h
@@ -30,6 +30,7 @@
#include "llfloater.h"
class LLUICtrl;
+class LLScrollListCtrl;
// Bits for simulator performance query flags
enum LAND_STAT_FLAGS
@@ -75,6 +76,7 @@ private:
void initColumns(LLCtrlListInterface *list);
void onCommitObjectsList();
+ void onSelectionChanged();
static void onDoubleClickObjectsList(void* data);
void onClickShowBeacon();
@@ -90,6 +92,7 @@ private:
void onGetByParcelName();
void showBeacon();
+ void teleportToSelectedObject();
private:
std::string mMethod;
@@ -106,6 +109,7 @@ private:
F32 mtotalScore;
static LLFloaterTopObjects* sInstance;
+ LLScrollListCtrl* mObjectsScrollList;
};
#endif
diff --git a/indra/newview/llfloatertranslationsettings.cpp b/indra/newview/llfloatertranslationsettings.cpp
index 082bb888b1..d29ecbbf95 100644
--- a/indra/newview/llfloatertranslationsettings.cpp
+++ b/indra/newview/llfloatertranslationsettings.cpp
@@ -45,15 +45,9 @@
LLFloaterTranslationSettings::LLFloaterTranslationSettings(const LLSD& key)
: LLFloater(key)
, mMachineTranslationCB(NULL)
-, mLanguageCombo(NULL)
-, mTranslationServiceRadioGroup(NULL)
-, mBingAPIKeyEditor(NULL)
-, mGoogleAPIKeyEditor(NULL)
-, mBingVerifyBtn(NULL)
-, mGoogleVerifyBtn(NULL)
-, mOKBtn(NULL)
-, mBingKeyVerified(false)
+, mAzureKeyVerified(false)
, mGoogleKeyVerified(false)
+, mDeepLKeyVerified(false)
{
}
@@ -63,24 +57,54 @@ BOOL LLFloaterTranslationSettings::postBuild()
mMachineTranslationCB = getChild<LLCheckBoxCtrl>("translate_chat_checkbox");
mLanguageCombo = getChild<LLComboBox>("translate_language_combo");
mTranslationServiceRadioGroup = getChild<LLRadioGroup>("translation_service_rg");
- mBingAPIKeyEditor = getChild<LLLineEditor>("bing_api_key");
+ mAzureAPIEndpointEditor = getChild<LLComboBox>("azure_api_endpoint_combo");
+ mAzureAPIKeyEditor = getChild<LLLineEditor>("azure_api_key");
+ mAzureAPIRegionEditor = getChild<LLLineEditor>("azure_api_region");
mGoogleAPIKeyEditor = getChild<LLLineEditor>("google_api_key");
- mBingVerifyBtn = getChild<LLButton>("verify_bing_api_key_btn");
+ mDeepLAPIDomainCombo = getChild<LLComboBox>("deepl_api_domain_combo");
+ mDeepLAPIKeyEditor = getChild<LLLineEditor>("deepl_api_key");
+ mAzureVerifyBtn = getChild<LLButton>("verify_azure_api_key_btn");
mGoogleVerifyBtn = getChild<LLButton>("verify_google_api_key_btn");
+ mDeepLVerifyBtn = getChild<LLButton>("verify_deepl_api_key_btn");
mOKBtn = getChild<LLButton>("ok_btn");
mMachineTranslationCB->setCommitCallback(boost::bind(&LLFloaterTranslationSettings::updateControlsEnabledState, this));
mTranslationServiceRadioGroup->setCommitCallback(boost::bind(&LLFloaterTranslationSettings::updateControlsEnabledState, this));
mOKBtn->setClickedCallback(boost::bind(&LLFloaterTranslationSettings::onBtnOK, this));
getChild<LLButton>("cancel_btn")->setClickedCallback(boost::bind(&LLFloater::closeFloater, this, false));
- mBingVerifyBtn->setClickedCallback(boost::bind(&LLFloaterTranslationSettings::onBtnBingVerify, this));
+ mAzureVerifyBtn->setClickedCallback(boost::bind(&LLFloaterTranslationSettings::onBtnAzureVerify, this));
mGoogleVerifyBtn->setClickedCallback(boost::bind(&LLFloaterTranslationSettings::onBtnGoogleVerify, this));
+ mDeepLVerifyBtn->setClickedCallback(boost::bind(&LLFloaterTranslationSettings::onBtnDeepLVerify, this));
+
+ mAzureAPIKeyEditor->setFocusReceivedCallback(boost::bind(&LLFloaterTranslationSettings::onEditorFocused, this, _1));
+ mAzureAPIKeyEditor->setKeystrokeCallback(boost::bind(&LLFloaterTranslationSettings::onAzureKeyEdited, this), NULL);
+ mAzureAPIRegionEditor->setFocusReceivedCallback(boost::bind(&LLFloaterTranslationSettings::onEditorFocused, this, _1));
+ mAzureAPIRegionEditor->setKeystrokeCallback(boost::bind(&LLFloaterTranslationSettings::onAzureKeyEdited, this), NULL);
+
+ mAzureAPIEndpointEditor->setFocusLostCallback([this](LLFocusableElement*)
+ {
+ setAzureVerified(false, false, 0);
+ });
+ mAzureAPIEndpointEditor->setCommitCallback([this](LLUICtrl* ctrl, const LLSD& param)
+ {
+ setAzureVerified(false, false, 0);
+ });
- mBingAPIKeyEditor->setFocusReceivedCallback(boost::bind(&LLFloaterTranslationSettings::onEditorFocused, this, _1));
- mBingAPIKeyEditor->setKeystrokeCallback(boost::bind(&LLFloaterTranslationSettings::onBingKeyEdited, this), NULL);
mGoogleAPIKeyEditor->setFocusReceivedCallback(boost::bind(&LLFloaterTranslationSettings::onEditorFocused, this, _1));
mGoogleAPIKeyEditor->setKeystrokeCallback(boost::bind(&LLFloaterTranslationSettings::onGoogleKeyEdited, this), NULL);
+ mDeepLAPIKeyEditor->setFocusReceivedCallback(boost::bind(&LLFloaterTranslationSettings::onEditorFocused, this, _1));
+ mDeepLAPIKeyEditor->setKeystrokeCallback(boost::bind(&LLFloaterTranslationSettings::onDeepLKeyEdited, this), NULL);
+
+ mDeepLAPIDomainCombo->setFocusLostCallback([this](LLFocusableElement*)
+ {
+ setDeepLVerified(false, false, 0);
+ });
+ mDeepLAPIDomainCombo->setCommitCallback([this](LLUICtrl* ctrl, const LLSD& param)
+ {
+ setDeepLVerified(false, false, 0);
+ });
+
center();
return TRUE;
}
@@ -92,17 +116,28 @@ void LLFloaterTranslationSettings::onOpen(const LLSD& key)
mLanguageCombo->setSelectedByValue(gSavedSettings.getString("TranslateLanguage"), TRUE);
mTranslationServiceRadioGroup->setSelectedByValue(gSavedSettings.getString("TranslationService"), TRUE);
- std::string bing_key = gSavedSettings.getString("BingTranslateAPIKey");
- if (!bing_key.empty())
+ LLSD azure_key = gSavedSettings.getLLSD("AzureTranslateAPIKey");
+ if (azure_key.isMap() && !azure_key["id"].asString().empty())
{
- mBingAPIKeyEditor->setText(bing_key);
- mBingAPIKeyEditor->setTentative(FALSE);
- verifyKey(LLTranslate::SERVICE_BING, bing_key, false);
+ mAzureAPIKeyEditor->setText(azure_key["id"].asString());
+ mAzureAPIKeyEditor->setTentative(false);
+ if (azure_key.has("region") && !azure_key["region"].asString().empty())
+ {
+ mAzureAPIRegionEditor->setText(azure_key["region"].asString());
+ mAzureAPIRegionEditor->setTentative(false);
+ }
+ else
+ {
+ mAzureAPIRegionEditor->setTentative(true);
+ }
+ mAzureAPIEndpointEditor->setValue(azure_key["endpoint"]);
+ verifyKey(LLTranslate::SERVICE_AZURE, azure_key, false);
}
else
{
- mBingAPIKeyEditor->setTentative(TRUE);
- mBingKeyVerified = FALSE;
+ mAzureAPIKeyEditor->setTentative(TRUE);
+ mAzureAPIRegionEditor->setTentative(true);
+ mAzureKeyVerified = FALSE;
}
std::string google_key = gSavedSettings.getString("GoogleTranslateAPIKey");
@@ -118,39 +153,74 @@ void LLFloaterTranslationSettings::onOpen(const LLSD& key)
mGoogleKeyVerified = FALSE;
}
+ LLSD deepl_key = gSavedSettings.getLLSD("DeepLTranslateAPIKey");
+ if (deepl_key.isMap() && !deepl_key["id"].asString().empty())
+ {
+ mDeepLAPIKeyEditor->setText(deepl_key["id"].asString());
+ mDeepLAPIKeyEditor->setTentative(false);
+ mDeepLAPIDomainCombo->setValue(deepl_key["domain"]);
+ verifyKey(LLTranslate::SERVICE_DEEPL, deepl_key, false);
+ }
+ else
+ {
+ mDeepLAPIKeyEditor->setTentative(TRUE);
+ mDeepLKeyVerified = FALSE;
+ }
+
updateControlsEnabledState();
}
-void LLFloaterTranslationSettings::setBingVerified(bool ok, bool alert)
+void LLFloaterTranslationSettings::setAzureVerified(bool ok, bool alert, S32 status)
{
if (alert)
{
- showAlert(ok ? "bing_api_key_verified" : "bing_api_key_not_verified");
+ showAlert(ok ? "azure_api_key_verified" : "azure_api_key_not_verified", status);
}
- mBingKeyVerified = ok;
+ mAzureKeyVerified = ok;
updateControlsEnabledState();
}
-void LLFloaterTranslationSettings::setGoogleVerified(bool ok, bool alert)
+void LLFloaterTranslationSettings::setGoogleVerified(bool ok, bool alert, S32 status)
{
if (alert)
{
- showAlert(ok ? "google_api_key_verified" : "google_api_key_not_verified");
+ showAlert(ok ? "google_api_key_verified" : "google_api_key_not_verified", status);
}
mGoogleKeyVerified = ok;
updateControlsEnabledState();
}
+void LLFloaterTranslationSettings::setDeepLVerified(bool ok, bool alert, S32 status)
+{
+ if (alert)
+ {
+ showAlert(ok ? "deepl_api_key_verified" : "deepl_api_key_not_verified", status);
+ }
+
+ mDeepLKeyVerified = ok;
+ updateControlsEnabledState();
+}
+
std::string LLFloaterTranslationSettings::getSelectedService() const
{
return mTranslationServiceRadioGroup->getSelectedValue().asString();
}
-std::string LLFloaterTranslationSettings::getEnteredBingKey() const
+LLSD LLFloaterTranslationSettings::getEnteredAzureKey() const
{
- return mBingAPIKeyEditor->getTentative() ? LLStringUtil::null : mBingAPIKeyEditor->getText();
+ LLSD key;
+ if (!mAzureAPIKeyEditor->getTentative())
+ {
+ key["endpoint"] = mAzureAPIEndpointEditor->getValue();
+ key["id"] = mAzureAPIKeyEditor->getText();
+ if (!mAzureAPIRegionEditor->getTentative())
+ {
+ key["region"] = mAzureAPIRegionEditor->getText();
+ }
+ }
+ return key;
}
std::string LLFloaterTranslationSettings::getEnteredGoogleKey() const
@@ -158,10 +228,26 @@ std::string LLFloaterTranslationSettings::getEnteredGoogleKey() const
return mGoogleAPIKeyEditor->getTentative() ? LLStringUtil::null : mGoogleAPIKeyEditor->getText();
}
-void LLFloaterTranslationSettings::showAlert(const std::string& msg_name) const
+LLSD LLFloaterTranslationSettings::getEnteredDeepLKey() const
+{
+ LLSD key;
+ if (!mDeepLAPIKeyEditor->getTentative())
+ {
+ key["domain"] = mDeepLAPIDomainCombo->getValue();
+ key["id"] = mDeepLAPIKeyEditor->getText();
+ }
+ return key;
+}
+
+void LLFloaterTranslationSettings::showAlert(const std::string& msg_name, S32 status) const
{
+ LLStringUtil::format_map_t string_args;
+ // For now just show an http error code, whole 'reason' string might be added later
+ string_args["[STATUS]"] = llformat("%d", status);
+ std::string message = getString(msg_name, string_args);
+
LLSD args;
- args["MESSAGE"] = getString(msg_name);
+ args["MESSAGE"] = message;
LLNotificationsUtil::add("GenericAlert", args);
}
@@ -170,34 +256,51 @@ void LLFloaterTranslationSettings::updateControlsEnabledState()
// Enable/disable controls based on the checkbox value.
bool on = mMachineTranslationCB->getValue().asBoolean();
std::string service = getSelectedService();
- bool bing_selected = service == "bing";
+ bool azure_selected = service == "azure";
bool google_selected = service == "google";
+ bool deepl_selected = service == "deepl";
mTranslationServiceRadioGroup->setEnabled(on);
mLanguageCombo->setEnabled(on);
- getChild<LLTextBox>("bing_api_key_label")->setEnabled(on);
- mBingAPIKeyEditor->setEnabled(on);
+ // MS Azure
+ getChild<LLTextBox>("azure_api_endoint_label")->setEnabled(on);
+ mAzureAPIEndpointEditor->setEnabled(on && azure_selected);
+ getChild<LLTextBox>("azure_api_key_label")->setEnabled(on);
+ mAzureAPIKeyEditor->setEnabled(on && azure_selected);
+ getChild<LLTextBox>("azure_api_region_label")->setEnabled(on);
+ mAzureAPIRegionEditor->setEnabled(on && azure_selected);
- getChild<LLTextBox>("google_api_key_label")->setEnabled(on);
- mGoogleAPIKeyEditor->setEnabled(on);
+ mAzureVerifyBtn->setEnabled(on && azure_selected &&
+ !mAzureKeyVerified && getEnteredAzureKey().isMap());
- mBingAPIKeyEditor->setEnabled(on && bing_selected);
- mGoogleAPIKeyEditor->setEnabled(on && google_selected);
+ // Google
+ getChild<LLTextBox>("google_api_key_label")->setEnabled(on);
+ mGoogleAPIKeyEditor->setEnabled(on && google_selected);
- mBingVerifyBtn->setEnabled(on && bing_selected &&
- !mBingKeyVerified && !getEnteredBingKey().empty());
mGoogleVerifyBtn->setEnabled(on && google_selected &&
!mGoogleKeyVerified && !getEnteredGoogleKey().empty());
- bool service_verified = (bing_selected && mBingKeyVerified) || (google_selected && mGoogleKeyVerified);
+ // DeepL
+ getChild<LLTextBox>("deepl_api_domain_label")->setEnabled(on);
+ mDeepLAPIDomainCombo->setEnabled(on && deepl_selected);
+ getChild<LLTextBox>("deepl_api_key_label")->setEnabled(on);
+ mDeepLAPIKeyEditor->setEnabled(on && deepl_selected);
+
+ mDeepLVerifyBtn->setEnabled(on && deepl_selected &&
+ !mDeepLKeyVerified && getEnteredDeepLKey().isMap());
+
+ bool service_verified =
+ (azure_selected && mAzureKeyVerified)
+ || (google_selected && mGoogleKeyVerified)
+ || (deepl_selected && mDeepLKeyVerified);
gSavedPerAccountSettings.setBOOL("TranslatingEnabled", service_verified);
mOKBtn->setEnabled(!on || service_verified);
}
/*static*/
-void LLFloaterTranslationSettings::setVerificationStatus(int service, bool ok, bool alert)
+void LLFloaterTranslationSettings::setVerificationStatus(int service, bool ok, bool alert, S32 status)
{
LLFloaterTranslationSettings* floater =
LLFloaterReg::getTypedInstance<LLFloaterTranslationSettings>("prefs_translation");
@@ -210,20 +313,23 @@ void LLFloaterTranslationSettings::setVerificationStatus(int service, bool ok, b
switch (service)
{
- case LLTranslate::SERVICE_BING:
- floater->setBingVerified(ok, alert);
+ case LLTranslate::SERVICE_AZURE:
+ floater->setAzureVerified(ok, alert, status);
break;
case LLTranslate::SERVICE_GOOGLE:
- floater->setGoogleVerified(ok, alert);
+ floater->setGoogleVerified(ok, alert, status);
+ break;
+ case LLTranslate::SERVICE_DEEPL:
+ floater->setDeepLVerified(ok, alert, status);
break;
}
}
-void LLFloaterTranslationSettings::verifyKey(int service, const std::string& key, bool alert)
+void LLFloaterTranslationSettings::verifyKey(int service, const LLSD& key, bool alert)
{
LLTranslate::verifyKey(static_cast<LLTranslate::EService>(service), key,
- boost::bind(&LLFloaterTranslationSettings::setVerificationStatus, _1, _2, alert));
+ boost::bind(&LLFloaterTranslationSettings::setVerificationStatus, _1, _2, alert, _3));
}
void LLFloaterTranslationSettings::onEditorFocused(LLFocusableElement* control)
@@ -239,11 +345,13 @@ void LLFloaterTranslationSettings::onEditorFocused(LLFocusableElement* control)
}
}
-void LLFloaterTranslationSettings::onBingKeyEdited()
+void LLFloaterTranslationSettings::onAzureKeyEdited()
{
- if (mBingAPIKeyEditor->isDirty())
+ if (mAzureAPIKeyEditor->isDirty()
+ || mAzureAPIRegionEditor->isDirty())
{
- setBingVerified(false, false);
+ // todo: verify mAzureAPIEndpointEditor url
+ setAzureVerified(false, false, 0);
}
}
@@ -251,16 +359,24 @@ void LLFloaterTranslationSettings::onGoogleKeyEdited()
{
if (mGoogleAPIKeyEditor->isDirty())
{
- setGoogleVerified(false, false);
+ setGoogleVerified(false, false, 0);
}
}
-void LLFloaterTranslationSettings::onBtnBingVerify()
+void LLFloaterTranslationSettings::onDeepLKeyEdited()
{
- std::string key = getEnteredBingKey();
- if (!key.empty())
+ if (mDeepLAPIKeyEditor->isDirty())
+ {
+ setDeepLVerified(false, false, 0);
+ }
+}
+
+void LLFloaterTranslationSettings::onBtnAzureVerify()
+{
+ LLSD key = getEnteredAzureKey();
+ if (key.isMap())
{
- verifyKey(LLTranslate::SERVICE_BING, key);
+ verifyKey(LLTranslate::SERVICE_AZURE, key);
}
}
@@ -269,26 +385,40 @@ void LLFloaterTranslationSettings::onBtnGoogleVerify()
std::string key = getEnteredGoogleKey();
if (!key.empty())
{
- verifyKey(LLTranslate::SERVICE_GOOGLE, key);
+ verifyKey(LLTranslate::SERVICE_GOOGLE, LLSD(key));
}
}
+
+void LLFloaterTranslationSettings::onBtnDeepLVerify()
+{
+ LLSD key = getEnteredDeepLKey();
+ if (key.isMap())
+ {
+ verifyKey(LLTranslate::SERVICE_DEEPL, key);
+ }
+}
+
void LLFloaterTranslationSettings::onClose(bool app_quitting)
{
std::string service = gSavedSettings.getString("TranslationService");
- bool bing_selected = service == "bing";
+ bool azure_selected = service == "azure";
bool google_selected = service == "google";
+ bool deepl_selected = service == "deepl";
- bool service_verified = (bing_selected && mBingKeyVerified) || (google_selected && mGoogleKeyVerified);
- gSavedPerAccountSettings.setBOOL("TranslatingEnabled", service_verified);
-
+ bool service_verified =
+ (azure_selected && mAzureKeyVerified)
+ || (google_selected && mGoogleKeyVerified)
+ || (deepl_selected && mDeepLKeyVerified);
+ gSavedPerAccountSettings.setBOOL("TranslatingEnabled", service_verified);
}
void LLFloaterTranslationSettings::onBtnOK()
{
gSavedSettings.setBOOL("TranslateChat", mMachineTranslationCB->getValue().asBoolean());
gSavedSettings.setString("TranslateLanguage", mLanguageCombo->getSelectedValue().asString());
gSavedSettings.setString("TranslationService", getSelectedService());
- gSavedSettings.setString("BingTranslateAPIKey", getEnteredBingKey());
+ gSavedSettings.setLLSD("AzureTranslateAPIKey", getEnteredAzureKey());
gSavedSettings.setString("GoogleTranslateAPIKey", getEnteredGoogleKey());
+ gSavedSettings.setLLSD("DeepLTranslateAPIKey", getEnteredDeepLKey());
closeFloater(false);
}
diff --git a/indra/newview/llfloatertranslationsettings.h b/indra/newview/llfloatertranslationsettings.h
index 2a15eacded..eff0803fdd 100644
--- a/indra/newview/llfloatertranslationsettings.h
+++ b/indra/newview/llfloatertranslationsettings.h
@@ -42,38 +42,48 @@ public:
/*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
- void setBingVerified(bool ok, bool alert);
- void setGoogleVerified(bool ok, bool alert);
+ void setAzureVerified(bool ok, bool alert, S32 status);
+ void setGoogleVerified(bool ok, bool alert, S32 status);
+ void setDeepLVerified(bool ok, bool alert, S32 status);
void onClose(bool app_quitting);
private:
std::string getSelectedService() const;
- std::string getEnteredBingKey() const;
+ LLSD getEnteredAzureKey() const;
std::string getEnteredGoogleKey() const;
- void showAlert(const std::string& msg_name) const;
+ LLSD getEnteredDeepLKey() const;
+ void showAlert(const std::string& msg_name, S32 status) const;
void updateControlsEnabledState();
- void verifyKey(int service, const std::string& key, bool alert = true);
+ void verifyKey(int service, const LLSD& key, bool alert = true);
void onEditorFocused(LLFocusableElement* control);
- void onBingKeyEdited();
+ void onAzureKeyEdited();
void onGoogleKeyEdited();
- void onBtnBingVerify();
+ void onDeepLKeyEdited();
+ void onBtnAzureVerify();
void onBtnGoogleVerify();
+ void onBtnDeepLVerify();
void onBtnOK();
- static void setVerificationStatus(int service, bool alert, bool ok);
+ static void setVerificationStatus(int service, bool alert, bool ok, S32 status);
LLCheckBoxCtrl* mMachineTranslationCB;
LLComboBox* mLanguageCombo;
- LLLineEditor* mBingAPIKeyEditor;
+ LLComboBox* mAzureAPIEndpointEditor;
+ LLLineEditor* mAzureAPIKeyEditor;
+ LLLineEditor* mAzureAPIRegionEditor;
LLLineEditor* mGoogleAPIKeyEditor;
+ LLComboBox* mDeepLAPIDomainCombo;
+ LLLineEditor* mDeepLAPIKeyEditor;
LLRadioGroup* mTranslationServiceRadioGroup;
- LLButton* mBingVerifyBtn;
+ LLButton* mAzureVerifyBtn;
LLButton* mGoogleVerifyBtn;
+ LLButton* mDeepLVerifyBtn;
LLButton* mOKBtn;
- bool mBingKeyVerified;
+ bool mAzureKeyVerified;
bool mGoogleKeyVerified;
+ bool mDeepLKeyVerified;
};
#endif // LL_LLFLOATERTRANSLATIONSETTINGS_H
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index 704abd269f..8f3ec8af05 100755
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -124,8 +124,10 @@ public:
// requires trusted browser to trigger
LLWorldMapHandler() : LLCommandHandler("worldmap", UNTRUSTED_CLICK_ONLY ) { }
- bool handle(const LLSD& params, const LLSD& query_map,
- LLMediaCtrl* web)
+ bool handle(const LLSD& params,
+ const LLSD& query_map,
+ const std::string& grid,
+ LLMediaCtrl* web)
{
if (!LLUI::getInstance()->mSettingGroups["config"]->getBOOL("EnableWorldMap"))
{
@@ -163,7 +165,10 @@ public:
{
}
- bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
+ bool handle(const LLSD& params,
+ const LLSD& query_map,
+ const std::string& grid,
+ LLMediaCtrl* web)
{
if (!LLUI::getInstance()->mSettingGroups["config"]->getBOOL("EnableWorldMap"))
{
diff --git a/indra/newview/llfolderviewmodelinventory.h b/indra/newview/llfolderviewmodelinventory.h
index de28091c32..1649b2eed7 100644
--- a/indra/newview/llfolderviewmodelinventory.h
+++ b/indra/newview/llfolderviewmodelinventory.h
@@ -39,12 +39,14 @@ class LLFolderViewModelItemInventory
public:
LLFolderViewModelItemInventory(class LLFolderViewModelInventory& root_view_model);
virtual const LLUUID& getUUID() const = 0;
+ virtual const LLUUID& getThumbnailUUID() const = 0;
virtual time_t getCreationDate() const = 0; // UTC seconds
virtual void setCreationDate(time_t creation_date_utc) = 0;
virtual PermissionMask getPermissionMask() const = 0;
virtual LLFolderType::EType getPreferredType() const = 0;
virtual void showProperties(void) = 0;
virtual BOOL isItemInTrash( void) const { return FALSE; } // TODO: make into pure virtual.
+ virtual bool isItemInOutfits() const { return false; }
virtual BOOL isAgentInventory() const { return FALSE; }
virtual BOOL isUpToDate() const = 0;
virtual void addChild(LLFolderViewModelItem* child);
diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp
index e395da7f1e..ce28915d93 100644
--- a/indra/newview/llfriendcard.cpp
+++ b/indra/newview/llfriendcard.cpp
@@ -478,14 +478,24 @@ void LLFriendCardsManager::ensureFriendsFolderExists()
LL_WARNS() << "Failed to find \"" << cat_name << "\" category descendents in Category Tree." << LL_ENDL;
}
- friends_folder_ID = gInventory.createNewCategory(calling_cards_folder_ID,
- LLFolderType::FT_CALLINGCARD, get_friend_folder_name());
-
- gInventory.createNewCategory(friends_folder_ID,
- LLFolderType::FT_CALLINGCARD, get_friend_all_subfolder_name());
-
- // Now when we have all needed folders we can sync their contents with buddies list.
- syncFriendsFolder();
+ gInventory.createNewCategory(
+ calling_cards_folder_ID,
+ LLFolderType::FT_CALLINGCARD,
+ get_friend_folder_name(),
+ [](const LLUUID &new_category_id)
+ {
+ gInventory.createNewCategory(
+ new_category_id,
+ LLFolderType::FT_CALLINGCARD,
+ get_friend_all_subfolder_name(),
+ [](const LLUUID &new_category_id)
+ {
+ // Now when we have all needed folders we can sync their contents with buddies list.
+ LLFriendCardsManager::getInstance()->syncFriendsFolder();
+ }
+ );
+ }
+ );
}
}
@@ -510,11 +520,16 @@ void LLFriendCardsManager::ensureFriendsAllFolderExists()
LL_WARNS() << "Failed to find \"" << cat_name << "\" category descendents in Category Tree." << LL_ENDL;
}
- friends_all_folder_ID = gInventory.createNewCategory(friends_folder_ID,
- LLFolderType::FT_CALLINGCARD, get_friend_all_subfolder_name());
-
- // Now when we have all needed folders we can sync their contents with buddies list.
- syncFriendsFolder();
+ gInventory.createNewCategory(
+ friends_folder_ID,
+ LLFolderType::FT_CALLINGCARD,
+ get_friend_all_subfolder_name(),
+ [](const LLUUID &new_cat_id)
+ {
+ // Now when we have all needed folders we can sync their contents with buddies list.
+ LLFriendCardsManager::getInstance()->syncFriendsFolder();
+ }
+ );
}
}
diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp
index 098fe89265..1b22b903fc 100644
--- a/indra/newview/llglsandbox.cpp
+++ b/indra/newview/llglsandbox.cpp
@@ -741,6 +741,12 @@ void LLViewerParcelMgr::renderCollisionSegments(U8* segments, BOOL use_pass, LLV
gGL.end();
}
+void LLViewerParcelMgr::resetCollisionTimer()
+{
+ mCollisionTimer.reset();
+ mRenderCollision = TRUE;
+}
+
void draw_line_cube(F32 width, const LLVector3& center)
{
width = 0.5f * width;
diff --git a/indra/newview/llgltfmateriallist.cpp b/indra/newview/llgltfmateriallist.cpp
index 7994515b61..edd0394533 100644
--- a/indra/newview/llgltfmateriallist.cpp
+++ b/indra/newview/llgltfmateriallist.cpp
@@ -160,9 +160,9 @@ public:
// sides - array of S32 indices of texture entries
// gltf_json - array of corresponding Strings of GLTF json for override data
-
LLSD message;
bool success = true;
+#if 0 //deprecated
for(const std::string& llsdRaw : strings)
{
std::istringstream llsdData(llsdRaw);
@@ -198,6 +198,7 @@ public:
applyData(object_override);
}
+#endif
return success;
}
@@ -213,6 +214,7 @@ public:
{
// Parse the data
+#if 0 // DEPRECATED
LL::WorkQueue::ptr_t main_queue = LL::WorkQueue::getInstance("mainloop");
LL::WorkQueue::ptr_t general_queue = LL::WorkQueue::getInstance("General");
@@ -235,24 +237,17 @@ public:
results.reserve(sides.size());
// parse json
- std::unordered_map<S32, std::string>::const_iterator iter = sides.begin();
- std::unordered_map<S32, std::string>::const_iterator end = sides.end();
+ std::unordered_map<S32, LLSD>::const_iterator iter = sides.begin();
+ std::unordered_map<S32, LLSD>::const_iterator end = sides.end();
while (iter != end)
{
- std::string warn_msg, error_msg;
-
ReturnData result;
- bool success = result.mMaterial.fromJSON(iter->second, warn_msg, error_msg);
-
- result.mSuccess = success;
+ result.mMaterial.applyOverrideLLSD(iter->second);
+
+ result.mSuccess = true;
result.mSide = iter->first;
- if (!success)
- {
- LL_WARNS("GLTF") << "failed to parse GLTF override data. errors: " << error_msg << " | warnings: " << warn_msg << LL_ENDL;
- }
-
results.push_back(result);
iter++;
}
@@ -318,6 +313,7 @@ public:
}
});
}
+#endif
}
private:
@@ -330,6 +326,89 @@ namespace
LLGLTFMaterialOverrideDispatchHandler handle_gltf_override_message;
}
+void LLGLTFMaterialList::applyOverrideMessage(LLMessageSystem* msg, const std::string& data_in)
+{
+ std::istringstream str(data_in);
+
+ LLSD data;
+
+ LLSDSerialize::fromNotation(data, str, data_in.length());
+
+ const LLHost& host = msg->getSender();
+
+ LLViewerRegion* region = LLWorld::instance().getRegion(host);
+ llassert(region);
+
+ if (region)
+ {
+ U32 local_id = data.get("id").asInteger();
+ LLUUID id;
+ gObjectList.getUUIDFromLocal(id, local_id, host.getAddress(), host.getPort());
+ LLViewerObject* obj = gObjectList.findObject(id);
+
+ // NOTE: obj may be null if the viewer hasn't heard about the object yet, cache update in any case
+
+ if (obj && gShowObjectUpdates)
+ { // display a cyan blip for override updates when "Show Updates to Objects" enabled
+ LLColor4 color(0.f, 1.f, 1.f, 1.f);
+ gPipeline.addDebugBlip(obj->getPositionAgent(), color);
+ }
+
+ const LLSD& tes = data["te"];
+ const LLSD& od = data["od"];
+
+ constexpr U32 MAX_TES = 45;
+ bool has_te[MAX_TES] = { false };
+
+ if (tes.isArray()) // NOTE: if no "te" array exists, this is a malformed message (null out all overrides will come in as an empty te array)
+ {
+ LLGLTFOverrideCacheEntry cache;
+ cache.mLocalId = local_id;
+ cache.mObjectId = id;
+ cache.mRegionHandle = region->getHandle();
+
+ U32 count = llmin(tes.size(), MAX_TES);
+ for (U32 i = 0; i < count; ++i)
+ {
+ LLGLTFMaterial* mat = new LLGLTFMaterial(); // setTEGLTFMaterialOverride and cache will take ownership
+ mat->applyOverrideLLSD(od[i]);
+
+ S32 te = tes[i].asInteger();
+
+ has_te[te] = true;
+ cache.mSides[te] = od[i];
+ cache.mGLTFMaterial[te] = mat;
+
+ if (obj)
+ {
+ obj->setTEGLTFMaterialOverride(te, mat);
+ if (obj->getTE(te) && obj->getTE(te)->isSelected())
+ {
+ handle_gltf_override_message.doSelectionCallbacks(id, te);
+ }
+ }
+ }
+
+ if (obj)
+ { // null out overrides on TEs that shouldn't have them
+ U32 count = llmin(obj->getNumTEs(), MAX_TES);
+ for (U32 i = 0; i < count; ++i)
+ {
+ LLTextureEntry* te = obj->getTE(i);
+ if (!has_te[i] && te && te->getGLTFMaterialOverride())
+ {
+ obj->setTEGLTFMaterialOverride(i, nullptr);
+ handle_gltf_override_message.doSelectionCallbacks(id, i);
+ }
+ }
+ }
+
+ region->cacheFullUpdateGLTFOverride(cache);
+ }
+
+ }
+}
+
void LLGLTFMaterialList::queueOverrideUpdate(const LLUUID& id, S32 side, LLGLTFMaterial* override_data)
{
#if 0
diff --git a/indra/newview/llgltfmateriallist.h b/indra/newview/llgltfmateriallist.h
index ce8781baba..7317214019 100644
--- a/indra/newview/llgltfmateriallist.h
+++ b/indra/newview/llgltfmateriallist.h
@@ -101,6 +101,9 @@ public:
static void loadCacheOverrides(const LLGLTFOverrideCacheEntry& override);
+ // Apply an override update with the given data
+ void applyOverrideMessage(LLMessageSystem* msg, const std::string& data);
+
private:
friend class LLGLTFMaterialOverrideDispatchHandler;
// save an override update that we got from the simulator for later (for example, if an override arrived for an unknown object)
diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp
index aec6c23e34..043316ccca 100644
--- a/indra/newview/llgroupactions.cpp
+++ b/indra/newview/llgroupactions.cpp
@@ -78,8 +78,10 @@ public:
return true;
}
- bool handle(const LLSD& tokens, const LLSD& query_map,
- LLMediaCtrl* web)
+ bool handle(const LLSD& tokens,
+ const LLSD& query_map,
+ const std::string& grid,
+ LLMediaCtrl* web)
{
if (LLStartUp::getStartupState() < STATE_STARTED)
{
diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp
index 3536b83989..948793681d 100644
--- a/indra/newview/llimprocessing.cpp
+++ b/indra/newview/llimprocessing.cpp
@@ -1631,14 +1631,19 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url)
from_group = message_data["from_group"].asString() == "Y";
}
-
+ EInstantMessage dialog = static_cast<EInstantMessage>(message_data["dialog"].asInteger());
+ LLUUID session_id = message_data["transaction-id"].asUUID();
+ if (session_id.isNull() && dialog == IM_FROM_TASK)
+ {
+ session_id = message_data["asset_id"].asUUID();
+ }
LLIMProcessing::processNewMessage(
message_data["from_agent_id"].asUUID(),
from_group,
message_data["to_agent_id"].asUUID(),
message_data.has("offline") ? static_cast<U8>(message_data["offline"].asInteger()) : IM_OFFLINE,
- static_cast<EInstantMessage>(message_data["dialog"].asInteger()),
- message_data["transaction-id"].asUUID(),
+ dialog,
+ session_id,
static_cast<U32>(message_data["timestamp"].asInteger()),
message_data["from_agent_name"].asString(),
message_data["message"].asString(),
diff --git a/indra/newview/llinspectobject.cpp b/indra/newview/llinspectobject.cpp
index 3d13985f08..491c90c571 100644
--- a/indra/newview/llinspectobject.cpp
+++ b/indra/newview/llinspectobject.cpp
@@ -670,9 +670,7 @@ void LLInspectObject::onClickOpen()
void LLInspectObject::onClickMoreInfo()
{
- LLSD key;
- key["task"] = "task";
- LLFloaterSidePanelContainer::showPanel("inventory", key);
+ LLFloaterReg::showInstance("task_properties");
closeFloater();
}
diff --git a/indra/newview/llinspecttexture.cpp b/indra/newview/llinspecttexture.cpp
new file mode 100644
index 0000000000..da4e3c0949
--- /dev/null
+++ b/indra/newview/llinspecttexture.cpp
@@ -0,0 +1,249 @@
+/**
+ * @file llinspecttexture.cpp
+ *
+ * $LicenseInfo:firstyear=2009&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 "llinspect.h"
+#include "llinspecttexture.h"
+#include "llinventoryfunctions.h"
+#include "llinventorymodel.h"
+#include "lltexturectrl.h"
+#include "lltrans.h"
+#include "llviewertexturelist.h"
+
+
+// ============================================================================
+// Helper functions
+//
+
+LLToolTip* LLInspectTextureUtil::createInventoryToolTip(LLToolTip::Params p)
+{
+ const LLSD& sdTooltip = p.create_params;
+
+ if (sdTooltip.has("thumbnail_id") && sdTooltip["thumbnail_id"].asUUID().notNull())
+ {
+ // go straight for thumbnail regardless of type
+ // TODO: make a tooltip factory?
+ return LLUICtrlFactory::create<LLTextureToolTip>(p);
+ }
+
+ LLInventoryType::EType eInvType = (sdTooltip.has("inv_type")) ? (LLInventoryType::EType)sdTooltip["inv_type"].asInteger() : LLInventoryType::IT_NONE;
+ switch (eInvType)
+ {
+ case LLInventoryType::IT_CATEGORY:
+ {
+ if (sdTooltip.has("item_id"))
+ {
+ const LLUUID idCategory = sdTooltip["item_id"].asUUID();
+ LLViewerInventoryCategory* cat = gInventory.getCategory(idCategory);
+ if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT)
+ {
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
+ // Not LLIsOfAssetType, because we allow links
+ LLIsTextureType f;
+ gInventory.getDirectDescendentsOf(idCategory, cats, items, f);
+
+ // Exactly one texture found => show the texture tooltip
+ if (1 == items.size())
+ {
+ LLViewerInventoryItem* item = items.front();
+ if (item && item->getIsLinkType())
+ {
+ item = item->getLinkedItem();
+ }
+ if (item)
+ {
+ // Note: LLFloaterChangeItemThumbnail will attempt to write this
+ // into folder's thumbnail id when opened
+ p.create_params.getValue()["thumbnail_id"] = item->getAssetUUID();
+ return LLUICtrlFactory::create<LLTextureToolTip>(p);
+ }
+ }
+ }
+ }
+
+ // No or more than one texture found => show default tooltip
+ return LLUICtrlFactory::create<LLToolTip>(p);
+ }
+ default:
+ return LLUICtrlFactory::create<LLToolTip>(p);
+ }
+}
+
+// ============================================================================
+// LLTexturePreviewView helper class
+//
+
+class LLTexturePreviewView : public LLView
+{
+public:
+ LLTexturePreviewView(const LLView::Params& p);
+ ~LLTexturePreviewView();
+
+public:
+ void draw() override;
+
+public:
+ void setImageFromAssetId(const LLUUID& idAsset);
+ void setImageFromItemId(const LLUUID& idItem);
+
+protected:
+ LLPointer<LLViewerFetchedTexture> m_Image;
+ S32 mImageBoostLevel = LLGLTexture::BOOST_NONE;
+ std::string mLoadingText;
+};
+
+
+LLTexturePreviewView::LLTexturePreviewView(const LLView::Params& p)
+ : LLView(p)
+{
+ mLoadingText = LLTrans::getString("texture_loading");
+}
+
+LLTexturePreviewView::~LLTexturePreviewView()
+{
+ if (m_Image)
+ {
+ m_Image->setBoostLevel(mImageBoostLevel);
+ m_Image = nullptr;
+ }
+}
+
+void LLTexturePreviewView::draw()
+{
+ LLView::draw();
+
+ if (m_Image)
+ {
+ LLRect rctClient = getLocalRect();
+
+ if (4 == m_Image->getComponents())
+ {
+ const LLColor4 color(.098f, .098f, .098f);
+ gl_rect_2d(rctClient, color, TRUE);
+ }
+ gl_draw_scaled_image(rctClient.mLeft, rctClient.mBottom, rctClient.getWidth(), rctClient.getHeight(), m_Image);
+
+ bool isLoading = (!m_Image->isFullyLoaded()) && (m_Image->getDiscardLevel() > 0);
+ if (isLoading)
+ LLFontGL::getFontSansSerif()->renderUTF8(mLoadingText, 0, llfloor(rctClient.mLeft + 3), llfloor(rctClient.mTop - 25), LLColor4::white, LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::DROP_SHADOW);
+ m_Image->addTextureStats((isLoading) ? MAX_IMAGE_AREA : (F32)(rctClient.getWidth() * rctClient.getHeight()));
+ }
+}
+
+void LLTexturePreviewView::setImageFromAssetId(const LLUUID& idAsset)
+{
+ m_Image = LLViewerTextureManager::getFetchedTexture(idAsset, FTT_DEFAULT, MIPMAP_TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+ if (m_Image)
+ {
+ mImageBoostLevel = m_Image->getBoostLevel();
+ m_Image->setBoostLevel(LLGLTexture::BOOST_PREVIEW);
+ m_Image->forceToSaveRawImage(0);
+ if ( (!m_Image->isFullyLoaded()) && (!m_Image->hasFetcher()) )
+ {
+ if (m_Image->isInFastCacheList())
+ {
+ m_Image->loadFromFastCache();
+ }
+ gTextureList.forceImmediateUpdate(m_Image);
+ }
+ }
+}
+
+void LLTexturePreviewView::setImageFromItemId(const LLUUID& idItem)
+{
+ const LLViewerInventoryItem* pItem = gInventory.getItem(idItem);
+ setImageFromAssetId( (pItem) ? pItem->getAssetUUID() : LLUUID::null );
+}
+
+// ============================================================================
+// LLTextureToolTip class
+//
+
+LLTextureToolTip::LLTextureToolTip(const LLToolTip::Params& p)
+ : LLToolTip(p)
+ , mPreviewView(nullptr)
+ , mPreviewSize(256)
+{
+ mMaxWidth = llmax(mMaxWidth, mPreviewSize);
+
+ // Currently has to share params with LLToolTip, override values
+ setBackgroundColor(LLColor4::black);
+ setTransparentColor(LLColor4::black);
+ setBorderVisible(true);
+}
+
+LLTextureToolTip::~LLTextureToolTip()
+{
+}
+
+void LLTextureToolTip::initFromParams(const LLToolTip::Params& p)
+{
+ LLToolTip::initFromParams(p);
+
+ // Create and add the preview control
+ LLView::Params p_preview;
+ p_preview.name = "texture_preview";
+ LLRect rctPreview;
+ rctPreview.setOriginAndSize(mPadding, mTextBox->getRect().mTop, mPreviewSize, mPreviewSize);
+ p_preview.rect = rctPreview;
+ mPreviewView = LLUICtrlFactory::create<LLTexturePreviewView>(p_preview);
+ addChild(mPreviewView);
+
+ // Parse the control params
+ const LLSD& sdTextureParams = p.create_params;
+ if (sdTextureParams.has("thumbnail_id"))
+ {
+ mPreviewView->setImageFromAssetId(sdTextureParams["thumbnail_id"].asUUID());
+ }
+ else if (sdTextureParams.has("item_id"))
+ {
+ mPreviewView->setImageFromItemId(sdTextureParams["item_id"].asUUID());
+ }
+
+ // Currently has to share params with LLToolTip, override values manually
+ // Todo: provide from own params instead, may be like object inspector does it
+ LLViewBorder::Params border_params;
+ border_params.border_thickness(LLPANEL_BORDER_WIDTH);
+ border_params.highlight_light_color(LLColor4::white);
+ border_params.highlight_dark_color(LLColor4::white);
+ border_params.shadow_light_color(LLColor4::white);
+ border_params.shadow_dark_color(LLColor4::white);
+ addBorder(border_params);
+ setBorderVisible(true);
+
+ setBackgroundColor(LLColor4::black);
+ setBackgroundVisible(true);
+ setBackgroundOpaque(true);
+ setBackgroundImage(nullptr);
+ setTransparentImage(nullptr);
+
+ mTextBox->setColor(LLColor4::white);
+
+ snapToChildren();
+}
+
+// ============================================================================
diff --git a/indra/llcommon/llerrorthread.h b/indra/newview/llinspecttexture.h
index 474cef3a50..ff0d80b825 100644
--- a/indra/llcommon/llerrorthread.h
+++ b/indra/newview/llinspecttexture.h
@@ -1,46 +1,49 @@
-/**
- * @file llerrorthread.h
- * @brief Specialized thread to handle runtime errors.
+/**
+ * @file llinspecttexture.h
*
- * $LicenseInfo:firstyear=2004&license=viewerlgpl$
+ * $LicenseInfo:firstyear=2009&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$
*/
-#ifndef LL_LLERRORTHREAD_H
-#define LL_LLERRORTHREAD_H
+#pragma once
+
+#include "lltooltip.h"
-#include "llthread.h"
+class LLTexturePreviewView;
-class LL_COMMON_API LLErrorThread : public LLThread
+namespace LLInspectTextureUtil
+{
+ LLToolTip* createInventoryToolTip(LLToolTip::Params p);
+}
+
+class LLTextureToolTip : public LLToolTip
{
public:
- LLErrorThread();
- ~LLErrorThread();
+ LLTextureToolTip(const LLToolTip::Params& p);
+ ~LLTextureToolTip();
- /*virtual*/ void run(void);
- void setUserData(void *user_data);
- void *getUserData() const;
+public:
+ void initFromParams(const LLToolTip::Params& p) override;
protected:
- void* mUserDatap; // User data associated with this thread
+ LLTexturePreviewView* mPreviewView;
+ S32 mPreviewSize;
};
-
-#endif // LL_LLERRORTHREAD_H
diff --git a/indra/newview/llinspecttoast.cpp b/indra/newview/llinspecttoast.cpp
index 68801b0895..6f93a78ca6 100644
--- a/indra/newview/llinspecttoast.cpp
+++ b/indra/newview/llinspecttoast.cpp
@@ -47,6 +47,7 @@ public:
/*virtual*/ void onOpen(const LLSD& notification_id);
/*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask);
+ /*virtual*/ void deleteAllChildren();
/*virtual*/ void removeChild(LLView* child);
private:
void onToastDestroy(LLToast * toast);
@@ -122,6 +123,12 @@ BOOL LLInspectToast::handleToolTip(S32 x, S32 y, MASK mask)
return LLFloater::handleToolTip(x, y, mask);
}
+void LLInspectToast::deleteAllChildren()
+{
+ mPanel = NULL;
+ LLInspect::deleteAllChildren();
+}
+
// virtual
void LLInspectToast::removeChild(LLView* child)
{
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 2665cb1b92..22dd884b91 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -41,7 +41,6 @@
#include "llfloateropenobject.h"
#include "llfloaterreg.h"
#include "llfloatermarketplacelistings.h"
-#include "llfloateroutfitphotopreview.h"
#include "llfloatersidepanelcontainer.h"
#include "llsidepanelinventory.h"
#include "llfloaterworldmap.h"
@@ -90,29 +89,13 @@
void copy_slurl_to_clipboard_callback_inv(const std::string& slurl);
-typedef std::pair<LLUUID, LLUUID> two_uuids_t;
-typedef std::list<two_uuids_t> two_uuids_list_t;
-
const F32 SOUND_GAIN = 1.0f;
-struct LLMoveInv
-{
- LLUUID mObjectID;
- LLUUID mCategoryID;
- two_uuids_list_t mMoveList;
- void (*mCallback)(S32, void*);
- void* mUserData;
-};
-
using namespace LLOldEvents;
// Function declarations
-bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, boost::shared_ptr<LLMoveInv>);
bool confirm_attachment_rez(const LLSD& notification, const LLSD& response);
void teleport_via_landmark(const LLUUID& asset_id);
-static BOOL can_move_to_outfit(LLInventoryItem* inv_item, BOOL move_is_into_current_outfit);
-static bool can_move_to_my_outfits(LLInventoryModel* model, LLInventoryCategory* inv_cat, U32 wear_limit);
-static BOOL can_move_to_landmarks(LLInventoryItem* inv_item);
static bool check_category(LLInventoryModel* model,
const LLUUID& cat_id,
LLInventoryPanel* active_panel,
@@ -138,6 +121,12 @@ bool isMarketplaceSendAction(const std::string& action)
return ("send_to_marketplace" == action);
}
+bool isPanelActive(const std::string& panel_name)
+{
+ LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
+ return (active_panel && (active_panel->getName() == panel_name));
+}
+
// Used by LLFolderBridge as callback for directory fetching recursion
class LLRightClickInventoryFetchDescendentsObserver : public LLInventoryFetchDescendentsObserver
{
@@ -173,6 +162,65 @@ public:
}
};
+class LLPasteIntoFolderCallback: public LLInventoryCallback
+{
+public:
+ LLPasteIntoFolderCallback(LLHandle<LLInventoryPanel>& handle)
+ : mInventoryPanel(handle)
+ {
+ }
+ ~LLPasteIntoFolderCallback()
+ {
+ processItems();
+ }
+
+ void fire(const LLUUID& inv_item)
+ {
+ mChangedIds.push_back(inv_item);
+ }
+
+ void processItems()
+ {
+ LLInventoryPanel* panel = mInventoryPanel.get();
+ bool has_elements = false;
+ for (LLUUID& inv_item : mChangedIds)
+ {
+ LLInventoryItem* item = gInventory.getItem(inv_item);
+ if (item && panel)
+ {
+ LLUUID root_id = panel->getRootFolderID();
+
+ if (inv_item == root_id)
+ {
+ return;
+ }
+
+ LLFolderViewItem* item = panel->getItemByID(inv_item);
+ if (item)
+ {
+ if (!has_elements)
+ {
+ panel->clearSelection();
+ panel->getRootFolder()->clearSelection();
+ panel->getRootFolder()->requestArrange();
+ panel->getRootFolder()->update();
+ has_elements = true;
+ }
+ panel->getRootFolder()->changeSelection(item, TRUE);
+ }
+ }
+ }
+
+ if (has_elements)
+ {
+ panel->getRootFolder()->scrollToShowSelection();
+ }
+ }
+private:
+ LLHandle<LLInventoryPanel> mInventoryPanel;
+ std::vector<LLUUID> mChangedIds;
+};
+
// +=================================================+
// | LLInvFVBridge |
// +=================================================+
@@ -212,54 +260,17 @@ const std::string& LLInvFVBridge::getDisplayName() const
std::string LLInvFVBridge::getSearchableDescription() const
{
- const LLInventoryModel* model = getInventoryModel();
- if (model)
- {
- const LLInventoryItem *item = model->getItem(mUUID);
- if(item)
- {
- std::string desc = item->getDescription();
- LLStringUtil::toUpper(desc);
- return desc;
- }
- }
- return LLStringUtil::null;
+ return get_searchable_description(getInventoryModel(), mUUID);
}
std::string LLInvFVBridge::getSearchableCreatorName() const
{
- const LLInventoryModel* model = getInventoryModel();
- if (model)
- {
- const LLInventoryItem *item = model->getItem(mUUID);
- if(item)
- {
- LLAvatarName av_name;
- if (LLAvatarNameCache::get(item->getCreatorUUID(), &av_name))
- {
- std::string username = av_name.getUserName();
- LLStringUtil::toUpper(username);
- return username;
- }
- }
- }
- return LLStringUtil::null;
+ return get_searchable_creator_name(getInventoryModel(), mUUID);
}
std::string LLInvFVBridge::getSearchableUUIDString() const
{
- const LLInventoryModel* model = getInventoryModel();
- if (model)
- {
- const LLViewerInventoryItem *item = model->getItem(mUUID);
- if(item && (item->getIsFullPerm() || gAgent.isGodlikeWithoutAdminMenuFakery()))
- {
- std::string uuid = item->getAssetUUID().asString();
- LLStringUtil::toUpper(uuid);
- return uuid;
- }
- }
- return LLStringUtil::null;
+ return get_searchable_UUID(getInventoryModel(), mUUID);
}
// Folders have full perms
@@ -327,7 +338,7 @@ BOOL LLInvFVBridge::cutToClipboard()
const LLInventoryObject* obj = gInventory.getObject(mUUID);
if (obj && isItemMovable() && isItemRemovable())
{
- const LLUUID &marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ const LLUUID &marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
const BOOL cut_from_marketplacelistings = gInventory.isObjectDescendentOf(mUUID, marketplacelistings_id);
if (cut_from_marketplacelistings && (LLMarketplaceData::instance().isInActiveFolder(mUUID) ||
@@ -407,6 +418,32 @@ void LLInvFVBridge::showProperties()
}
}
+void LLInvFVBridge::navigateToFolder(bool new_window, bool change_mode)
+{
+ if(new_window)
+ {
+ mInventoryPanel.get()->openSingleViewInventory(mUUID);
+ }
+ else
+ {
+ if(change_mode)
+ {
+ LLInventoryPanel::setSFViewAndOpenFolder(mInventoryPanel.get(), mUUID);
+ }
+ else
+ {
+ LLInventorySingleFolderPanel* panel = dynamic_cast<LLInventorySingleFolderPanel*>(mInventoryPanel.get());
+ if (!panel || !getInventoryModel() || mUUID.isNull())
+ {
+ return;
+ }
+
+ panel->changeFolderRoot(mUUID);
+ }
+
+ }
+}
+
void LLInvFVBridge::removeBatch(std::vector<LLFolderViewModelItem*>& batch)
{
// Deactivate gestures when moving them into Trash
@@ -800,6 +837,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
menuentry_vec_t &disabled_items, U32 flags)
{
const LLInventoryObject *obj = getInventoryObject();
+ bool single_folder_root = (mRoot == NULL);
if (obj)
{
@@ -814,7 +852,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
disabled_items.push_back(std::string("Copy"));
}
- if (isAgentInventory())
+ if (isAgentInventory() && !single_folder_root)
{
items.push_back(std::string("New folder from selected"));
items.push_back(std::string("Subfolder Separator"));
@@ -848,7 +886,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
items.push_back(std::string("Find Links"));
}
- if (!isInboxFolder())
+ if (!isInboxFolder() && !single_folder_root)
{
items.push_back(std::string("Rename"));
if (!isItemRenameable() || ((flags & FIRST_SELECTED_ITEM) == 0))
@@ -856,14 +894,20 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
disabled_items.push_back(std::string("Rename"));
}
}
-
+
+ items.push_back(std::string("thumbnail"));
+ if (isLibraryItem())
+ {
+ disabled_items.push_back(std::string("thumbnail"));
+ }
+
+ LLViewerInventoryItem *inv_item = gInventory.getItem(mUUID);
if (show_asset_id)
{
items.push_back(std::string("Copy Asset UUID"));
bool is_asset_knowable = false;
- LLViewerInventoryItem* inv_item = gInventory.getItem(mUUID);
if (inv_item)
{
is_asset_knowable = LLAssetType::lookupIsAssetIDKnowable(inv_item->getType());
@@ -876,6 +920,8 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
}
}
+ if(!single_folder_root)
+ {
items.push_back(std::string("Cut"));
if (!isItemMovable() || !isItemRemovable())
{
@@ -897,6 +943,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
}
}
}
+ }
}
}
@@ -925,16 +972,12 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
items.push_back(std::string("Paste Separator"));
}
- addDeleteContextMenuOptions(items, disabled_items);
-
- // If multiple items are selected, disable properties (if it exists).
- if ((flags & FIRST_SELECTED_ITEM) == 0)
- {
- disabled_items.push_back(std::string("Properties"));
- }
+ if(!single_folder_root)
+ {
+ addDeleteContextMenuOptions(items, disabled_items);
+ }
- LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
- if (active_panel && (active_panel->getName() != "All Items"))
+ if (!isPanelActive("All Items") && !isPanelActive("comb_single_folder_inv"))
{
items.push_back(std::string("Show in Main Panel"));
}
@@ -1025,7 +1068,7 @@ void LLInvFVBridge::addDeleteContextMenuOptions(menuentry_vec_t &items,
items.push_back(std::string("Delete"));
- if (!isItemRemovable())
+ if (!isItemRemovable() || isPanelActive("Favorite Items"))
{
disabled_items.push_back(std::string("Delete"));
}
@@ -1256,6 +1299,16 @@ BOOL LLInvFVBridge::isLinkedObjectInTrash() const
return FALSE;
}
+bool LLInvFVBridge::isItemInOutfits() const
+{
+ const LLInventoryModel* model = getInventoryModel();
+ if(!model) return false;
+
+ const LLUUID my_outfits_cat = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+
+ return isCOFFolder() || (my_outfits_cat == mUUID) || model->isObjectDescendentOf(mUUID, my_outfits_cat);
+}
+
BOOL LLInvFVBridge::isLinkedObjectMissing() const
{
const LLInventoryObject *obj = getInventoryObject();
@@ -1286,7 +1339,7 @@ BOOL LLInvFVBridge::isCOFFolder() const
// *TODO : Suppress isInboxFolder() once Merchant Outbox is fully deprecated
BOOL LLInvFVBridge::isInboxFolder() const
{
- const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, false);
+ const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX);
if (inbox_id.isNull())
{
@@ -1298,7 +1351,7 @@ BOOL LLInvFVBridge::isInboxFolder() const
BOOL LLInvFVBridge::isMarketplaceListingsFolder() const
{
- const LLUUID folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ const LLUUID folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
if (folder_id.isNull())
{
@@ -1606,7 +1659,7 @@ bool LLInvFVBridge::canListOnMarketplaceNow() const
{
std::string error_msg;
LLInventoryModel* model = getInventoryModel();
- const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
if (marketplacelistings_id.notNull())
{
LLViewerInventoryCategory * master_folder = model->getCategory(marketplacelistings_id);
@@ -1705,6 +1758,12 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)
restoreItem();
return;
}
+ else if ("thumbnail" == action)
+ {
+ LLSD data(mUUID);
+ LLFloaterReg::showInstance("change_item_thumbnail", data);
+ return;
+ }
else if ("copy_uuid" == action)
{
// Single item only
@@ -1759,7 +1818,7 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)
{
LLInventoryItem* itemp = model->getItem(mUUID);
if (!itemp) return;
- const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
// Note: For a single item, if it's not a copy, then it's a move
move_item_to_marketplacelistings(itemp, marketplacelistings_id, ("copy_to_marketplace_listings" == action));
}
@@ -1973,9 +2032,9 @@ std::string LLItemBridge::getLabelSuffix() const
{
// String table is loaded before login screen and inventory items are
// loaded after login, so LLTrans should be ready.
- static std::string NO_COPY = LLTrans::getString("no_copy");
- static std::string NO_MOD = LLTrans::getString("no_modify");
- static std::string NO_XFER = LLTrans::getString("no_transfer");
+ static std::string NO_COPY = LLTrans::getString("no_copy_lbl");
+ static std::string NO_MOD = LLTrans::getString("no_modify_lbl");
+ static std::string NO_XFER = LLTrans::getString("no_transfer_lbl");
static std::string LINK = LLTrans::getString("link");
static std::string BROKEN_LINK = LLTrans::getString("broken_link");
std::string suffix;
@@ -1996,17 +2055,20 @@ std::string LLItemBridge::getLabelSuffix() const
BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID());
if (!copy)
{
+ suffix += " ";
suffix += NO_COPY;
}
BOOL mod = item->getPermissions().allowModifyBy(gAgent.getID());
if (!mod)
{
- suffix += NO_MOD;
+ suffix += suffix.empty() ? " " : ",";
+ suffix += NO_MOD;
}
BOOL xfer = item->getPermissions().allowOperationBy(PERM_TRANSFER,
gAgent.getID());
if (!xfer)
{
+ suffix += suffix.empty() ? " " : ",";
suffix += NO_XFER;
}
}
@@ -2175,6 +2237,21 @@ LLViewerInventoryItem* LLItemBridge::getItem() const
return item;
}
+const LLUUID& LLItemBridge::getThumbnailUUID() const
+{
+ LLViewerInventoryItem* item = NULL;
+ LLInventoryModel* model = getInventoryModel();
+ if(model)
+ {
+ item = (LLViewerInventoryItem*)model->getItem(mUUID);
+ }
+ if (item)
+ {
+ return item->getThumbnailUUID();
+ }
+ return LLUUID::null;
+}
+
BOOL LLItemBridge::isItemPermissive() const
{
LLViewerInventoryItem* item = getItem();
@@ -2258,13 +2335,32 @@ void LLFolderBridge::buildDisplayName() const
std::string LLFolderBridge::getLabelSuffix() const
{
static LLCachedControl<F32> folder_loading_message_delay(gSavedSettings, "FolderLoadingMessageWaitTime", 0.5f);
+ static LLCachedControl<bool> xui_debug(gSavedSettings, "DebugShowXUINames", 0);
if (mIsLoading && mTimeSinceRequestStart.getElapsedTimeF32() >= folder_loading_message_delay())
{
return llformat(" ( %s ) ", LLTrans::getString("LoadingData").c_str());
}
std::string suffix = "";
- if(mShowDescendantsCount)
+ if (xui_debug)
+ {
+ LLInventoryModel::cat_array_t* cats;
+ LLInventoryModel::item_array_t* items;
+ gInventory.getDirectDescendentsOf(getUUID(), cats, items);
+
+ LLViewerInventoryCategory* cat = gInventory.getCategory(getUUID());
+ if (cat)
+ {
+ LLStringUtil::format_map_t args;
+ args["[FOLDER_COUNT]"] = llformat("%d", cats->size());
+ args["[ITEMS_COUNT]"] = llformat("%d", items->size());
+ args["[VERSION]"] = llformat("%d", cat->getVersion());
+ args["[VIEWER_DESCENDANT_COUNT]"] = llformat("%d", cats->size() + items->size());
+ args["[SERVER_DESCENDANT_COUNT]"] = llformat("%d", cat->getDescendentCount());
+ suffix = " " + LLTrans::getString("InventoryFolderDebug", args);
+ }
+ }
+ else if(mShowDescendantsCount)
{
LLInventoryModel::cat_array_t cat_array;
LLInventoryModel::item_array_t item_array;
@@ -2288,6 +2384,16 @@ LLFontGL::StyleFlags LLFolderBridge::getLabelStyle() const
return LLFontGL::NORMAL;
}
+const LLUUID& LLFolderBridge::getThumbnailUUID() const
+{
+ LLViewerInventoryCategory* cat = getCategory();
+ if (cat)
+ {
+ return cat->getThumbnailUUID();
+ }
+ return LLUUID::null;
+}
+
void LLFolderBridge::update()
{
// we know we have children but haven't fetched them (doesn't obey filter)
@@ -2498,7 +2604,8 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
BOOL drop,
std::string& tooltip_msg,
BOOL is_link,
- BOOL user_confirm)
+ BOOL user_confirm,
+ LLPointer<LLInventoryCallback> cb)
{
LLInventoryModel* model = getInventoryModel();
@@ -2515,8 +2622,8 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
if (!filter) return false;
const LLUUID &cat_id = inv_cat->getUUID();
- const LLUUID &current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);
- const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ const LLUUID &current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
+ const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
const LLUUID from_folder_uuid = inv_cat->getParentUUID();
const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
@@ -2534,10 +2641,10 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
if (is_agent_inventory)
{
- const LLUUID &trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH, false);
- const LLUUID &landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false);
- const LLUUID &my_outifts_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS, false);
- const LLUUID &lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND, false);
+ const LLUUID &trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ const LLUUID &landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
+ const LLUUID &my_outifts_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+ const LLUUID &lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
const BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id);
const BOOL move_is_into_my_outfits = (mUUID == my_outifts_id) || model->isObjectDescendentOf(mUUID, my_outifts_id);
@@ -2803,7 +2910,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
{
// Category can contains objects,
// create a new folder and populate it with links to original objects
- dropToMyOutfits(inv_cat);
+ dropToMyOutfits(inv_cat, cb);
}
// if target is current outfit folder we use link
else if (move_is_into_current_outfit &&
@@ -2813,14 +2920,16 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
// traverse category and add all contents to currently worn.
BOOL append = true;
LLAppearanceMgr::instance().wearInventoryCategory(inv_cat, false, append);
+ if (cb) cb->fire(inv_cat->getUUID());
}
else if (move_is_into_marketplacelistings)
{
move_folder_to_marketplacelistings(inv_cat, mUUID);
+ if (cb) cb->fire(inv_cat->getUUID());
}
else
{
- if (model->isObjectDescendentOf(cat_id, model->findCategoryUUIDForType(LLFolderType::FT_INBOX, false)))
+ if (model->isObjectDescendentOf(cat_id, model->findCategoryUUIDForType(LLFolderType::FT_INBOX)))
{
set_dad_inbox_object(cat_id);
}
@@ -2832,6 +2941,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
(LLViewerInventoryCategory*)inv_cat,
mUUID,
move_is_into_trash);
+ if (cb) cb->fire(inv_cat->getUUID());
}
if (move_is_from_marketplacelistings)
{
@@ -2850,14 +2960,20 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
LLUUID version_folder_id = LLMarketplaceData::instance().getActiveFolder(from_folder_uuid);
if (version_folder_id.notNull())
{
- LLViewerInventoryCategory* cat = gInventory.getCategory(version_folder_id);
- if (!validate_marketplacelistings(cat,NULL))
+ LLMarketplaceValidator::getInstance()->validateMarketplaceListings(
+ version_folder_id,
+ [version_folder_id](bool result)
{
- LLMarketplaceData::instance().activateListing(version_folder_id,false);
+ if (!result)
+ {
+ LLMarketplaceData::instance().activateListing(version_folder_id, false);
+ }
}
+ );
}
// In all cases, update the listing we moved from so suffix are updated
update_marketplace_category(from_folder_uuid);
+ if (cb) cb->fire(inv_cat->getUUID());
}
}
}
@@ -2871,7 +2987,22 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
}
else
{
- accept = move_inv_category_world_to_agent(cat_id, mUUID, drop, NULL, NULL, filter);
+ // Todo: fix me. moving from task inventory doesn't have a completion callback,
+ // yet making a copy creates new item id so this doesn't work right
+ std::function<void(S32, void*, const LLMoveInv*)> callback = [cb](S32, void*, const LLMoveInv* move_inv) mutable
+ {
+ two_uuids_list_t::const_iterator move_it;
+ for (move_it = move_inv->mMoveList.begin();
+ move_it != move_inv->mMoveList.end();
+ ++move_it)
+ {
+ if (cb)
+ {
+ cb->fire(move_it->second);
+ }
+ }
+ };
+ accept = move_inv_category_world_to_agent(cat_id, mUUID, drop, callback, NULL, filter);
}
}
else if (LLToolDragAndDrop::SOURCE_LIBRARY == source)
@@ -2942,7 +3073,7 @@ void warn_move_inventory(LLViewerObject* object, boost::shared_ptr<LLMoveInv> mo
BOOL move_inv_category_world_to_agent(const LLUUID& object_id,
const LLUUID& category_id,
BOOL drop,
- void (*callback)(S32, void*),
+ std::function<void(S32, void*, const LLMoveInv*)> callback,
void* user_data,
LLInventoryFilter* filter)
{
@@ -3245,6 +3376,12 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
return;
}
+ else if ("thumbnail" == action)
+ {
+ LLSD data(mUUID);
+ LLFloaterReg::showInstance("change_item_thumbnail", data);
+ return;
+ }
else if ("paste" == action)
{
pasteFromClipboard();
@@ -3314,18 +3451,26 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
if (depth_nesting_in_marketplace(mUUID) == 1)
{
LLUUID version_folder_id = LLMarketplaceData::instance().getVersionFolder(mUUID);
- LLViewerInventoryCategory* cat = gInventory.getCategory(version_folder_id);
mMessage = "";
- if (!validate_marketplacelistings(cat,boost::bind(&LLFolderBridge::gatherMessage, this, _1, _2, _3)))
- {
- LLSD subs;
- subs["[ERROR_CODE]"] = mMessage;
- LLNotificationsUtil::add("MerchantListingFailed", subs);
- }
- else
+
+ LLMarketplaceValidator::getInstance()->validateMarketplaceListings(
+ version_folder_id,
+ [this](bool result)
{
- LLMarketplaceData::instance().activateListing(mUUID,true);
- }
+ // todo: might need to ensure bridge/mUUID exists or this will cause crashes
+ if (!result)
+ {
+ LLSD subs;
+ subs["[ERROR_CODE]"] = mMessage;
+ LLNotificationsUtil::add("MerchantListingFailed", subs);
+ }
+ else
+ {
+ LLMarketplaceData::instance().activateListing(mUUID, true);
+ }
+ },
+ boost::bind(&LLFolderBridge::gatherMessage, this, _1, _2, _3)
+ );
}
return;
}
@@ -3333,18 +3478,27 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
{
if (depth_nesting_in_marketplace(mUUID) == 2)
{
- LLInventoryCategory* category = gInventory.getCategory(mUUID);
mMessage = "";
- if (!validate_marketplacelistings(category,boost::bind(&LLFolderBridge::gatherMessage, this, _1, _2, _3),false,2))
- {
- LLSD subs;
- subs["[ERROR_CODE]"] = mMessage;
- LLNotificationsUtil::add("MerchantFolderActivationFailed", subs);
- }
- else
+
+ LLMarketplaceValidator::getInstance()->validateMarketplaceListings(
+ mUUID,
+ [this](bool result)
{
- LLMarketplaceData::instance().setVersionFolder(category->getParentUUID(), mUUID);
- }
+ if (!result)
+ {
+ LLSD subs;
+ subs["[ERROR_CODE]"] = mMessage;
+ LLNotificationsUtil::add("MerchantFolderActivationFailed", subs);
+ }
+ else
+ {
+ LLInventoryCategory* category = gInventory.getCategory(mUUID);
+ LLMarketplaceData::instance().setVersionFolder(category->getParentUUID(), mUUID);
+ }
+ },
+ boost::bind(&LLFolderBridge::gatherMessage, this, _1, _2, _3),
+ false,
+ 2);
}
return;
}
@@ -3367,29 +3521,44 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
}
else if ("marketplace_create_listing" == action)
{
- LLViewerInventoryCategory* cat = gInventory.getCategory(mUUID);
mMessage = "";
- bool validates = validate_marketplacelistings(cat,boost::bind(&LLFolderBridge::gatherMessage, this, _1, _2, _3),false);
- if (!validates)
+
+ // first run vithout fix_hierarchy, second run with fix_hierarchy
+ LLMarketplaceValidator::getInstance()->validateMarketplaceListings(
+ mUUID,
+ [this](bool result)
{
- mMessage = "";
- validates = validate_marketplacelistings(cat,boost::bind(&LLFolderBridge::gatherMessage, this, _1, _2, _3),true);
- if (validates)
+ if (!result)
+ {
+ mMessage = "";
+
+ LLMarketplaceValidator::getInstance()->validateMarketplaceListings(
+ mUUID,
+ [this](bool result)
+ {
+ if (result)
+ {
+ LLNotificationsUtil::add("MerchantForceValidateListing");
+ LLMarketplaceData::instance().createListing(mUUID);
+ }
+ else
+ {
+ LLSD subs;
+ subs["[ERROR_CODE]"] = mMessage;
+ LLNotificationsUtil::add("MerchantListingFailed", subs);
+ }
+ },
+ boost::bind(&LLFolderBridge::gatherMessage, this, _1, _2, _3),
+ true);
+ }
+ else
{
- LLNotificationsUtil::add("MerchantForceValidateListing");
+ LLMarketplaceData::instance().createListing(mUUID);
}
- }
+ },
+ boost::bind(&LLFolderBridge::gatherMessage, this, _1, _2, _3),
+ false);
- if (!validates)
- {
- LLSD subs;
- subs["[ERROR_CODE]"] = mMessage;
- LLNotificationsUtil::add("MerchantListingFailed", subs);
- }
- else
- {
- LLMarketplaceData::instance().createListing(mUUID);
- }
return;
}
else if ("marketplace_disassociate_listing" == action)
@@ -3433,7 +3602,7 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
{
LLInventoryCategory * cat = gInventory.getCategory(mUUID);
if (!cat) return;
- const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
move_folder_to_marketplacelistings(cat, marketplacelistings_id, ("move_to_marketplace_listings" != action), (("copy_or_move_to_marketplace_listings" == action)));
}
}
@@ -3683,7 +3852,7 @@ void LLFolderBridge::pasteFromClipboard()
LLInventoryModel* model = getInventoryModel();
if (model && isClipboardPasteable())
{
- const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
const BOOL paste_into_marketplacelistings = model->isObjectDescendentOf(mUUID, marketplacelistings_id);
BOOL cut_from_marketplacelistings = FALSE;
@@ -3744,11 +3913,11 @@ void LLFolderBridge::perform_pasteFromClipboard()
LLInventoryModel* model = getInventoryModel();
if (model && isClipboardPasteable())
{
- const LLUUID &current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);
- const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
- const LLUUID &favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE, false);
- const LLUUID &my_outifts_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS, false);
- const LLUUID &lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND, false);
+ const LLUUID &current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
+ const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
+ const LLUUID &favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
+ const LLUUID &my_outifts_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+ const LLUUID &lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
const BOOL move_is_into_my_outfits = (mUUID == my_outifts_id) || model->isObjectDescendentOf(mUUID, my_outifts_id);
@@ -3759,6 +3928,13 @@ void LLFolderBridge::perform_pasteFromClipboard()
std::vector<LLUUID> objects;
LLClipboard::instance().pasteFromClipboard(objects);
+
+ LLPointer<LLInventoryCallback> cb = NULL;
+ LLInventoryPanel* panel = mInventoryPanel.get();
+ if (panel->getRootFolder()->isSingleFolderMode() && panel->getRootFolderID() == mUUID)
+ {
+ cb = new LLPasteIntoFolderCallback(mInventoryPanel);
+ }
LLViewerInventoryCategory * dest_folder = getCategory();
if (move_is_into_marketplacelistings)
@@ -3834,7 +4010,7 @@ void LLFolderBridge::perform_pasteFromClipboard()
{
if (!move_is_into_my_outfits && item && can_move_to_outfit(item, move_is_into_current_outfit))
{
- dropToOutfit(item, move_is_into_current_outfit);
+ dropToOutfit(item, move_is_into_current_outfit, cb);
}
else if (move_is_into_my_outfits && LLAssetType::AT_CATEGORY == obj->getType())
{
@@ -3842,7 +4018,7 @@ void LLFolderBridge::perform_pasteFromClipboard()
U32 max_items_to_wear = gSavedSettings.getU32("WearFolderLimit");
if (cat && can_move_to_my_outfits(model, cat, max_items_to_wear))
{
- dropToMyOutfits(cat);
+ dropToMyOutfits(cat, cb);
}
else
{
@@ -3858,7 +4034,7 @@ void LLFolderBridge::perform_pasteFromClipboard()
{
if (item && can_move_to_outfit(item, move_is_into_current_outfit))
{
- dropToOutfit(item, move_is_into_current_outfit);
+ dropToOutfit(item, move_is_into_current_outfit, cb);
}
else
{
@@ -3877,11 +4053,12 @@ void LLFolderBridge::perform_pasteFromClipboard()
{
//changeItemParent() implicity calls dirtyFilter
changeItemParent(model, viitem, parent_id, FALSE);
+ if (cb) cb->fire(item_id);
}
}
else
{
- dropToFavorites(item);
+ dropToFavorites(item, cb);
}
}
}
@@ -3909,6 +4086,7 @@ void LLFolderBridge::perform_pasteFromClipboard()
//changeCategoryParent() implicity calls dirtyFilter
changeCategoryParent(model, vicat, parent_id, FALSE);
}
+ if (cb) cb->fire(item_id);
}
}
else
@@ -3930,6 +4108,7 @@ void LLFolderBridge::perform_pasteFromClipboard()
//changeItemParent() implicity calls dirtyFilter
changeItemParent(model, viitem, parent_id, FALSE);
}
+ if (cb) cb->fire(item_id);
}
}
}
@@ -3950,6 +4129,7 @@ void LLFolderBridge::perform_pasteFromClipboard()
{
copy_inventory_category(model, vicat, parent_id);
}
+ if (cb) cb->fire(item_id);
}
}
else
@@ -3965,11 +4145,13 @@ void LLFolderBridge::perform_pasteFromClipboard()
// Stop pasting into the marketplace as soon as we get an error
break;
}
+ if (cb) cb->fire(item_id);
}
else if (item->getIsLinkType())
{
- link_inventory_object(parent_id, item_id,
- LLPointer<LLInventoryCallback>(NULL));
+ link_inventory_object(parent_id,
+ item_id,
+ cb);
}
else
{
@@ -3979,7 +4161,7 @@ void LLFolderBridge::perform_pasteFromClipboard()
item->getUUID(),
parent_id,
std::string(),
- LLPointer<LLInventoryCallback>(NULL));
+ cb);
}
}
}
@@ -3996,9 +4178,9 @@ void LLFolderBridge::pasteLinkFromClipboard()
LLInventoryModel* model = getInventoryModel();
if(model)
{
- const LLUUID &current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);
- const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
- const LLUUID &my_outifts_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS, false);
+ const LLUUID &current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
+ const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
+ const LLUUID &my_outifts_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
const BOOL move_is_into_my_outfits = (mUUID == my_outifts_id) || model->isObjectDescendentOf(mUUID, my_outifts_id);
@@ -4015,6 +4197,14 @@ void LLFolderBridge::pasteLinkFromClipboard()
std::vector<LLUUID> objects;
LLClipboard::instance().pasteFromClipboard(objects);
+
+ LLPointer<LLInventoryCallback> cb = NULL;
+ LLInventoryPanel* panel = mInventoryPanel.get();
+ if (panel->getRootFolder()->isSingleFolderMode())
+ {
+ cb = new LLPasteIntoFolderCallback(mInventoryPanel);
+ }
+
for (std::vector<LLUUID>::const_iterator iter = objects.begin();
iter != objects.end();
++iter)
@@ -4025,12 +4215,12 @@ void LLFolderBridge::pasteLinkFromClipboard()
LLInventoryItem *item = model->getItem(object_id);
if (item && can_move_to_outfit(item, move_is_into_current_outfit))
{
- dropToOutfit(item, move_is_into_current_outfit);
+ dropToOutfit(item, move_is_into_current_outfit, cb);
}
}
else if (LLConstPointer<LLInventoryObject> obj = model->getObject(object_id))
{
- link_inventory_object(parent_id, obj, LLPointer<LLInventoryCallback>(NULL));
+ link_inventory_object(parent_id, obj, cb);
}
}
// Change mode to paste for next paste
@@ -4068,8 +4258,8 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
const LLUUID &trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
const LLUUID &lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
const LLUUID &favorites = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
- const LLUUID &marketplace_listings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
- const LLUUID &outfits_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS, false);
+ const LLUUID &marketplace_listings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
+ const LLUUID &outfits_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
if (outfits_id == mUUID)
{
@@ -4091,13 +4281,6 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
}
disabled_items.push_back(std::string("New Folder"));
- disabled_items.push_back(std::string("New Script"));
- disabled_items.push_back(std::string("New Note"));
- disabled_items.push_back(std::string("New Settings"));
- disabled_items.push_back(std::string("New Gesture"));
- disabled_items.push_back(std::string("New Material"));
- disabled_items.push_back(std::string("New Clothes"));
- disabled_items.push_back(std::string("New Body Parts"));
disabled_items.push_back(std::string("upload_def"));
}
if (favorites == mUUID)
@@ -4120,12 +4303,6 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
if (getPreferredType() == LLFolderType::FT_MARKETPLACE_STOCK)
{
disabled_items.push_back(std::string("New Folder"));
- disabled_items.push_back(std::string("New Script"));
- disabled_items.push_back(std::string("New Note"));
- disabled_items.push_back(std::string("New Gesture"));
- disabled_items.push_back(std::string("New Material"));
- disabled_items.push_back(std::string("New Clothes"));
- disabled_items.push_back(std::string("New Body Parts"));
disabled_items.push_back(std::string("upload_def"));
}
if (marketplace_listings_id == mUUID)
@@ -4135,14 +4312,14 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
disabled_items.push_back(std::string("Cut"));
disabled_items.push_back(std::string("Delete"));
}
+
+ if (isPanelActive("Favorite Items"))
+ {
+ disabled_items.push_back(std::string("Delete"));
+ }
if(trash_id == mUUID)
{
- bool is_recent_panel = false;
- LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
- if (active_panel && (active_panel->getName() == "Recent Items"))
- {
- is_recent_panel = true;
- }
+ bool is_recent_panel = isPanelActive("Recent Items");
// This is the trash.
items.push_back(std::string("Empty Trash"));
@@ -4161,6 +4338,8 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
{
disabled_items.push_back(std::string("Empty Trash"));
}
+
+ items.push_back(std::string("thumbnail"));
}
else if(isItemInTrash())
{
@@ -4187,22 +4366,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
}
if (!isMarketplaceListingsFolder())
{
- items.push_back(std::string("New Script"));
- items.push_back(std::string("New Note"));
- items.push_back(std::string("New Gesture"));
- items.push_back(std::string("New Material"));
- items.push_back(std::string("New Clothes"));
- items.push_back(std::string("New Body Parts"));
- items.push_back(std::string("New Settings"));
items.push_back(std::string("upload_def"));
-
- menu_items_added = true;
-
- if (!LLEnvironment::instance().isInventoryEnabled())
- {
- disabled_items.push_back("New Settings");
- }
-
}
if (menu_items_added)
{
@@ -4217,6 +4381,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
if (cat && (cat->getPreferredType() == LLFolderType::FT_OUTFIT))
{
items.push_back(std::string("Rename"));
+ items.push_back(std::string("thumbnail"));
addDeleteContextMenuOptions(items, disabled_items);
// EXT-4030: disallow deletion of currently worn outfit
@@ -4231,6 +4396,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
if (model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT) == mUUID)
{
items.push_back(std::string("Copy outfit list to clipboard"));
+ addOpenFolderMenuOptions(flags, items);
}
//Added by aura to force inventory pull on right-click to display folder options correctly. 07-17-06
@@ -4337,9 +4503,12 @@ void LLFolderBridge::buildContextMenuFolderOptions(U32 flags, menuentry_vec_t&
if(!category) return;
const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
- if (trash_id == mUUID) return;
- if (isItemInTrash()) return;
-
+ if ((trash_id == mUUID) || isItemInTrash())
+ {
+ addOpenFolderMenuOptions(flags, items);
+ return;
+ }
+
if (!isItemRemovable())
{
disabled_items.push_back(std::string("Delete"));
@@ -4352,7 +4521,7 @@ void LLFolderBridge::buildContextMenuFolderOptions(U32 flags, menuentry_vec_t&
const bool is_agent_inventory = isAgentInventory();
// Only enable calling-card related options for non-system folders.
- if (!is_system_folder && is_agent_inventory)
+ if (!is_system_folder && is_agent_inventory && (mRoot != NULL))
{
LLIsType is_callingcard(LLAssetType::AT_CALLINGCARD);
if (mCallingCards || checkFolderForContentsOfType(model, is_callingcard))
@@ -4372,6 +4541,14 @@ void LLFolderBridge::buildContextMenuFolderOptions(U32 flags, menuentry_vec_t&
disabled_items.push_back(std::string("New folder from selected"));
}
+ //skip the rest options in single-folder mode
+ if (mRoot == NULL)
+ {
+ return;
+ }
+
+ addOpenFolderMenuOptions(flags, items);
+
#ifndef LL_RELEASE_FOR_DOWNLOAD
if (LLFolderType::lookupIsProtectedType(type) && is_agent_inventory)
{
@@ -4397,26 +4574,29 @@ void LLFolderBridge::buildContextMenuFolderOptions(U32 flags, menuentry_vec_t&
if (type != LLFolderType::FT_OUTFIT)
{
items.push_back(std::string("Add To Outfit"));
+ if (!LLAppearanceMgr::instance().getCanAddToCOF(mUUID))
+ {
+ disabled_items.push_back(std::string("Add To Outfit"));
+ }
}
items.push_back(std::string("Replace Outfit"));
+ if (!LLAppearanceMgr::instance().getCanReplaceCOF(mUUID))
+ {
+ disabled_items.push_back(std::string("Replace Outfit"));
+ }
}
if (is_agent_inventory)
{
items.push_back(std::string("Folder Wearables Separator"));
+ // Note: If user tries to unwear "My Inventory", it's going to deactivate everything including gestures
+ // Might be safer to disable this for "My Inventory"
items.push_back(std::string("Remove From Outfit"));
- if (!LLAppearanceMgr::getCanRemoveFromCOF(mUUID))
- {
- disabled_items.push_back(std::string("Remove From Outfit"));
- }
- }
- if (!LLAppearanceMgr::instance().getCanReplaceCOF(mUUID))
- {
- disabled_items.push_back(std::string("Replace Outfit"));
- }
- if (!LLAppearanceMgr::instance().getCanAddToCOF(mUUID))
- {
- disabled_items.push_back(std::string("Add To Outfit"));
+ if (type != LLFolderType::FT_ROOT_INVENTORY // Unless COF is empty, whih shouldn't be, warrantied to have worn items
+ && !LLAppearanceMgr::getCanRemoveFromCOF(mUUID)) // expensive from root!
+ {
+ disabled_items.push_back(std::string("Remove From Outfit"));
+ }
}
items.push_back(std::string("Outfit Separator"));
@@ -4449,6 +4629,20 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
menu.arrangeAndClear();
}
+void LLFolderBridge::addOpenFolderMenuOptions(U32 flags, menuentry_vec_t& items)
+{
+ if ((flags & ITEM_IN_MULTI_SELECTION) == 0)
+ {
+ items.push_back(std::string("open_in_new_window"));
+ items.push_back(std::string("Open Folder Separator"));
+ items.push_back(std::string("Copy Separator"));
+ if(isPanelActive("comb_single_folder_inv"))
+ {
+ items.push_back(std::string("open_in_current_window"));
+ }
+ }
+}
+
bool LLFolderBridge::hasChildren() const
{
LLInventoryModel* model = getInventoryModel();
@@ -4465,6 +4659,18 @@ BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop,
{
LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data;
+ static LLPointer<LLInventoryCallback> drop_cb = NULL;
+ LLInventoryPanel* panel = mInventoryPanel.get();
+ LLToolDragAndDrop* drop_tool = LLToolDragAndDrop::getInstance();
+ if (drop
+ && panel->getRootFolder()->isSingleFolderMode()
+ && panel->getRootFolderID() == mUUID
+ && drop_tool->getCargoIndex() == 0)
+ {
+ drop_cb = new LLPasteIntoFolderCallback(mInventoryPanel);
+ }
+
+
//LL_INFOS() << "LLFolderBridge::dragOrDrop()" << LL_ENDL;
BOOL accept = FALSE;
switch(cargo_type)
@@ -4483,7 +4689,7 @@ BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop,
case DAD_MESH:
case DAD_SETTINGS:
case DAD_MATERIAL:
- accept = dragItemIntoFolder(inv_item, drop, tooltip_msg);
+ accept = dragItemIntoFolder(inv_item, drop, tooltip_msg, TRUE, drop_cb);
break;
case DAD_LINK:
// DAD_LINK type might mean one of two asset types: AT_LINK or AT_LINK_FOLDER.
@@ -4494,12 +4700,12 @@ BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop,
LLInventoryCategory* linked_category = gInventory.getCategory(inv_item->getLinkedUUID());
if (linked_category)
{
- accept = dragCategoryIntoFolder((LLInventoryCategory*)linked_category, drop, tooltip_msg, TRUE);
+ accept = dragCategoryIntoFolder((LLInventoryCategory*)linked_category, drop, tooltip_msg, TRUE, TRUE, drop_cb);
}
}
else
{
- accept = dragItemIntoFolder(inv_item, drop, tooltip_msg);
+ accept = dragItemIntoFolder(inv_item, drop, tooltip_msg, TRUE, drop_cb);
}
break;
case DAD_CATEGORY:
@@ -4509,7 +4715,7 @@ BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop,
}
else
{
- accept = dragCategoryIntoFolder((LLInventoryCategory*)cargo_data, drop, tooltip_msg);
+ accept = dragCategoryIntoFolder((LLInventoryCategory*)cargo_data, drop, tooltip_msg, FALSE, TRUE, drop_cb);
}
break;
case DAD_ROOT_CATEGORY:
@@ -4519,6 +4725,11 @@ BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop,
LL_WARNS() << "Unhandled cargo type for drag&drop " << cargo_type << LL_ENDL;
break;
}
+
+ if (!drop || drop_tool->getCargoIndex() + 1 == drop_tool->getCargoCount())
+ {
+ drop_cb = NULL;
+ }
return accept;
}
@@ -4819,138 +5030,56 @@ bool move_task_inventory_callback(const LLSD& notification, const LLSD& response
if (move_inv->mCallback)
{
- move_inv->mCallback(option, move_inv->mUserData);
+ move_inv->mCallback(option, move_inv->mUserData, move_inv.get());
}
move_inv.reset(); //since notification will persist
return false;
}
-// Returns true if the item can be moved to Current Outfit or any outfit folder.
-static BOOL can_move_to_outfit(LLInventoryItem* inv_item, BOOL move_is_into_current_outfit)
+void drop_to_favorites_cb(const LLUUID& id, LLPointer<LLInventoryCallback> cb1, LLPointer<LLInventoryCallback> cb2)
{
- LLInventoryType::EType inv_type = inv_item->getInventoryType();
- if ((inv_type != LLInventoryType::IT_WEARABLE) &&
- (inv_type != LLInventoryType::IT_GESTURE) &&
- (inv_type != LLInventoryType::IT_ATTACHMENT) &&
- (inv_type != LLInventoryType::IT_OBJECT) &&
- (inv_type != LLInventoryType::IT_SNAPSHOT) &&
- (inv_type != LLInventoryType::IT_TEXTURE))
- {
- return FALSE;
- }
-
- U32 flags = inv_item->getFlags();
- if(flags & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS)
- {
- return FALSE;
- }
-
- if((inv_type == LLInventoryType::IT_TEXTURE) || (inv_type == LLInventoryType::IT_SNAPSHOT))
- {
- return !move_is_into_current_outfit;
- }
-
- if (move_is_into_current_outfit && get_is_item_worn(inv_item->getUUID()))
- {
- return FALSE;
- }
-
- return TRUE;
-}
-
-// Returns true if folder's content can be moved to Current Outfit or any outfit folder.
-static bool can_move_to_my_outfits(LLInventoryModel* model, LLInventoryCategory* inv_cat, U32 wear_limit)
-{
- LLInventoryModel::cat_array_t *cats;
- LLInventoryModel::item_array_t *items;
- model->getDirectDescendentsOf(inv_cat->getUUID(), cats, items);
-
- if (items->size() > wear_limit)
- {
- return false;
- }
-
- if (items->size() == 0)
- {
- // Nothing to move(create)
- return false;
- }
-
- if (cats->size() > 0)
- {
- // We do not allow subfolders in outfits of "My Outfits" yet
- return false;
- }
-
- LLInventoryModel::item_array_t::iterator iter = items->begin();
- LLInventoryModel::item_array_t::iterator end = items->end();
-
- while (iter != end)
- {
- LLViewerInventoryItem *item = *iter;
- if (!can_move_to_outfit(item, false))
- {
- return false;
- }
- iter++;
- }
-
- return true;
-}
-
-// Returns TRUE if item is a landmark or a link to a landmark
-// and can be moved to Favorites or Landmarks folder.
-static BOOL can_move_to_landmarks(LLInventoryItem* inv_item)
-{
- // Need to get the linked item to know its type because LLInventoryItem::getType()
- // returns actual type AT_LINK for links, not the asset type of a linked item.
- if (LLAssetType::AT_LINK == inv_item->getType())
- {
- LLInventoryItem* linked_item = gInventory.getItem(inv_item->getLinkedUUID());
- if (linked_item)
- {
- return LLAssetType::AT_LANDMARK == linked_item->getType();
- }
- }
-
- return LLAssetType::AT_LANDMARK == inv_item->getType();
+ cb1->fire(id);
+ cb2->fire(id);
}
-void LLFolderBridge::dropToFavorites(LLInventoryItem* inv_item)
+void LLFolderBridge::dropToFavorites(LLInventoryItem* inv_item, LLPointer<LLInventoryCallback> cb)
{
// use callback to rearrange favorite landmarks after adding
// to have new one placed before target (on which it was dropped). See EXT-4312.
- LLPointer<AddFavoriteLandmarkCallback> cb = new AddFavoriteLandmarkCallback();
+ LLPointer<AddFavoriteLandmarkCallback> cb_fav = new AddFavoriteLandmarkCallback();
LLInventoryPanel* panel = mInventoryPanel.get();
LLFolderViewItem* drag_over_item = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL;
LLFolderViewModelItemInventory* view_model = drag_over_item ? static_cast<LLFolderViewModelItemInventory*>(drag_over_item->getViewModelItem()) : NULL;
if (view_model)
{
- cb.get()->setTargetLandmarkId(view_model->getUUID());
+ cb_fav.get()->setTargetLandmarkId(view_model->getUUID());
}
+ LLPointer <LLInventoryCallback> callback = cb_fav;
+ if (cb)
+ {
+ callback = new LLBoostFuncInventoryCallback(boost::bind(drop_to_favorites_cb, _1, cb, cb_fav));
+ }
+
copy_inventory_item(
gAgent.getID(),
inv_item->getPermissions().getOwner(),
inv_item->getUUID(),
mUUID,
std::string(),
- cb);
+ callback);
}
-void LLFolderBridge::dropToOutfit(LLInventoryItem* inv_item, BOOL move_is_into_current_outfit)
+void LLFolderBridge::dropToOutfit(LLInventoryItem* inv_item, BOOL move_is_into_current_outfit, LLPointer<LLInventoryCallback> cb)
{
if((inv_item->getInventoryType() == LLInventoryType::IT_TEXTURE) || (inv_item->getInventoryType() == LLInventoryType::IT_SNAPSHOT))
{
- const LLUUID &my_outifts_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS, false);
+ const LLUUID &my_outifts_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
if(mUUID != my_outifts_id)
{
- LLFloaterOutfitPhotoPreview* photo_preview = LLFloaterReg::showTypedInstance<LLFloaterOutfitPhotoPreview>("outfit_photo_preview", inv_item->getUUID());
- if(photo_preview)
- {
- photo_preview->setOutfitID(mUUID);
- }
+ // Legacy: prior to thumbnails images in outfits were used for outfit gallery.
+ LLNotificationsUtil::add("ThumbnailOutfitPhoto");
}
return;
}
@@ -4967,21 +5096,22 @@ void LLFolderBridge::dropToOutfit(LLInventoryItem* inv_item, BOOL move_is_into_c
}
}
-void LLFolderBridge::dropToMyOutfits(LLInventoryCategory* inv_cat)
+void LLFolderBridge::dropToMyOutfits(LLInventoryCategory* inv_cat, LLPointer<LLInventoryCallback> cb)
{
// make a folder in the My Outfits directory.
const LLUUID dest_id = getInventoryModel()->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
// Note: creation will take time, so passing folder id to callback is slightly unreliable,
// but so is collecting and passing descendants' ids
- inventory_func_type func = boost::bind(&LLFolderBridge::outfitFolderCreatedCallback, this, inv_cat->getUUID(), _1);
+ inventory_func_type func = boost::bind(&LLFolderBridge::outfitFolderCreatedCallback, this, inv_cat->getUUID(), _1, cb);
gInventory.createNewCategory(dest_id,
LLFolderType::FT_OUTFIT,
inv_cat->getName(),
- func);
+ func,
+ inv_cat->getThumbnailUUID());
}
-void LLFolderBridge::outfitFolderCreatedCallback(LLUUID cat_source_id, LLUUID cat_dest_id)
+void LLFolderBridge::outfitFolderCreatedCallback(LLUUID cat_source_id, LLUUID cat_dest_id, LLPointer<LLInventoryCallback> cb)
{
LLInventoryModel::cat_array_t* categories;
LLInventoryModel::item_array_t* items;
@@ -5012,7 +5142,6 @@ void LLFolderBridge::outfitFolderCreatedCallback(LLUUID cat_source_id, LLUUID ca
if (!link_array.empty())
{
- LLPointer<LLInventoryCallback> cb = NULL;
link_inventory_array(cat_dest_id, link_array, cb);
}
}
@@ -5045,7 +5174,8 @@ void LLFolderBridge::callback_dropCategoryIntoFolder(const LLSD& notification, c
BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
BOOL drop,
std::string& tooltip_msg,
- BOOL user_confirm)
+ BOOL user_confirm,
+ LLPointer<LLInventoryCallback> cb)
{
LLInventoryModel* model = getInventoryModel();
@@ -5059,11 +5189,11 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
LLInventoryFilter* filter = getInventoryFilter();
if (!filter) return false;
- const LLUUID &current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false);
- const LLUUID &favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE, false);
- const LLUUID &landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false);
- const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
- const LLUUID &my_outifts_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS, false);
+ const LLUUID &current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
+ const LLUUID &favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
+ const LLUUID &landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
+ const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
+ const LLUUID &my_outifts_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
const LLUUID from_folder_uuid = inv_item->getParentUUID();
const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
@@ -5083,7 +5213,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
LLViewerObject* object = NULL;
if(LLToolDragAndDrop::SOURCE_AGENT == source)
{
- const LLUUID &trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH, false);
+ const LLUUID &trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
const BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id);
const BOOL move_is_outof_current_outfit = LLAppearanceMgr::instance().getIsInCOF(inv_item->getUUID());
@@ -5225,26 +5355,27 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
// (copy the item)
else if (move_is_into_favorites)
{
- dropToFavorites(inv_item);
+ dropToFavorites(inv_item, cb);
}
// CURRENT OUTFIT or OUTFIT folder
// (link the item)
else if (move_is_into_current_outfit || move_is_into_outfit)
{
- dropToOutfit(inv_item, move_is_into_current_outfit);
+ dropToOutfit(inv_item, move_is_into_current_outfit, cb);
}
// MARKETPLACE LISTINGS folder
// Move the item
else if (move_is_into_marketplacelistings)
{
move_item_to_marketplacelistings(inv_item, mUUID);
+ if (cb) cb->fire(inv_item->getUUID());
}
// NORMAL or TRASH folder
// (move the item, restamp if into trash)
else
{
// set up observer to select item once drag and drop from inbox is complete
- if (gInventory.isObjectDescendentOf(inv_item->getUUID(), gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, false)))
+ if (gInventory.isObjectDescendentOf(inv_item->getUUID(), gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX)))
{
set_dad_inbox_object(inv_item->getUUID());
}
@@ -5254,6 +5385,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
(LLViewerInventoryItem*)inv_item,
mUUID,
move_is_into_trash);
+ if (cb) cb->fire(inv_item->getUUID());
}
if (move_is_from_marketplacelistings)
@@ -5262,11 +5394,15 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
LLUUID version_folder_id = LLMarketplaceData::instance().getActiveFolder(from_folder_uuid);
if (version_folder_id.notNull())
{
- LLViewerInventoryCategory* cat = gInventory.getCategory(version_folder_id);
- if (!validate_marketplacelistings(cat,NULL))
+ LLMarketplaceValidator::getInstance()->validateMarketplaceListings(
+ version_folder_id,
+ [version_folder_id](bool result)
{
- LLMarketplaceData::instance().activateListing(version_folder_id,false);
- }
+ if (!result)
+ {
+ LLMarketplaceData::instance().activateListing(version_folder_id, false);
+ }
+ });
}
}
@@ -5334,11 +5470,16 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
if (accept && drop)
{
+ LLUUID item_id = inv_item->getUUID();
boost::shared_ptr<LLMoveInv> move_inv (new LLMoveInv());
move_inv->mObjectID = inv_item->getParentUUID();
- two_uuids_t item_pair(mUUID, inv_item->getUUID());
+ two_uuids_t item_pair(mUUID, item_id);
move_inv->mMoveList.push_back(item_pair);
- move_inv->mCallback = NULL;
+ if (cb)
+ {
+ move_inv->mCallback = [item_id, cb](S32, void*, const LLMoveInv* move_inv) mutable
+ { cb->fire(item_id); };
+ }
move_inv->mUserData = NULL;
if(is_move)
{
@@ -5430,13 +5571,13 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
// (copy the item)
if (move_is_into_favorites)
{
- dropToFavorites(inv_item);
+ dropToFavorites(inv_item, cb);
}
// CURRENT OUTFIT or OUTFIT folder
// (link the item)
else if (move_is_into_current_outfit || move_is_into_outfit)
{
- dropToOutfit(inv_item, move_is_into_current_outfit);
+ dropToOutfit(inv_item, move_is_into_current_outfit, cb);
}
else
{
@@ -5446,7 +5587,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
inv_item->getUUID(),
mUUID,
std::string(),
- LLPointer<LLInventoryCallback>(NULL));
+ cb);
}
}
}
@@ -6001,7 +6142,7 @@ std::string LLCallingCardBridge::getLabelSuffix() const
LLViewerInventoryItem* item = getItem();
if( item && LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()) )
{
- return LLItemBridge::getLabelSuffix() + " (online)";
+ return LLItemBridge::getLabelSuffix() + " online";
}
else
{
@@ -7618,16 +7759,26 @@ class LLObjectBridgeAction: public LLInvFVBridgeAction
public:
virtual void doIt()
{
- /*
- LLFloaterReg::showInstance("properties", mUUID);
- */
- LLInvFVBridgeAction::doIt();
+ attachOrDetach();
}
virtual ~LLObjectBridgeAction(){}
protected:
LLObjectBridgeAction(const LLUUID& id,LLInventoryModel* model) : LLInvFVBridgeAction(id,model) {}
+ void attachOrDetach();
};
+void LLObjectBridgeAction::attachOrDetach()
+{
+ if (get_is_item_worn(mUUID))
+ {
+ LLAppearanceMgr::instance().removeItemFromAvatar(mUUID);
+ }
+ else
+ {
+ LLAppearanceMgr::instance().wearItemOnAvatar(mUUID, true, false); // Don't replace if adding.
+ }
+}
+
class LLLSLTextBridgeAction: public LLInvFVBridgeAction
{
friend class LLInvFVBridgeAction;
@@ -7686,7 +7837,17 @@ void LLWearableBridgeAction::wearOnAvatar()
LLViewerInventoryItem* item = getItem();
if(item)
{
- LLAppearanceMgr::instance().wearItemOnAvatar(item->getUUID(), true, true);
+ if (get_is_item_worn(mUUID))
+ {
+ if(item->getType() != LLAssetType::AT_BODYPART)
+ {
+ LLAppearanceMgr::instance().removeItemFromAvatar(item->getUUID());
+ }
+ }
+ else
+ {
+ LLAppearanceMgr::instance().wearItemOnAvatar(item->getUUID(), true, true);
+ }
}
}
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index d3cd180174..3cbbd68e51 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -28,7 +28,6 @@
#define LL_LLINVENTORYBRIDGE_H
#include "llcallingcard.h"
-#include "llfloaterproperties.h"
#include "llfolderviewmodel.h"
#include "llinventorymodel.h"
#include "llinventoryobserver.h"
@@ -47,9 +46,11 @@ class LLMenuGL;
class LLCallingCardObserver;
class LLViewerJointAttachment;
class LLFolderView;
+struct LLMoveInv;
typedef std::vector<std::string> menuentry_vec_t;
-
+typedef std::pair<LLUUID, LLUUID> two_uuids_t;
+typedef std::list<two_uuids_t> two_uuids_list_t;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLInvFVBridge
//
@@ -84,6 +85,7 @@ public:
// LLInvFVBridge functionality
//--------------------------------------------------------------------
virtual const LLUUID& getUUID() const { return mUUID; }
+ virtual const LLUUID& getThumbnailUUID() const { return LLUUID::null; }
virtual void clearDisplayName() { mDisplayName.clear(); }
virtual void restoreItem() {}
virtual void restoreToWorld() {}
@@ -107,6 +109,7 @@ public:
virtual std::string getLabelSuffix() const { return LLStringUtil::null; }
virtual void openItem() {}
virtual void closeItem() {}
+ virtual void navigateToFolder(bool new_window = false, bool change_mode = false);
virtual void showProperties();
virtual BOOL isItemRenameable() const { return TRUE; }
virtual BOOL isMultiPreviewAllowed() { return TRUE; }
@@ -114,6 +117,7 @@ public:
virtual BOOL isItemRemovable() const;
virtual BOOL isItemMovable() const;
virtual BOOL isItemInTrash() const;
+ virtual bool isItemInOutfits() const;
virtual BOOL isLink() const;
virtual BOOL isLibraryItem() const;
//virtual BOOL removeItem() = 0;
@@ -251,6 +255,7 @@ public:
virtual LLUIImagePtr getIconOverlay() const;
LLViewerInventoryItem* getItem() const;
+ virtual const LLUUID& getThumbnailUUID() const;
protected:
BOOL confirmRemoveItem(const LLSD& notification, const LLSD& response);
@@ -275,8 +280,8 @@ public:
mShowDescendantsCount(false)
{}
- BOOL dragItemIntoFolder(LLInventoryItem* inv_item, BOOL drop, std::string& tooltip_msg, BOOL user_confirm = TRUE);
- BOOL dragCategoryIntoFolder(LLInventoryCategory* inv_category, BOOL drop, std::string& tooltip_msg, BOOL is_link = FALSE, BOOL user_confirm = TRUE);
+ BOOL dragItemIntoFolder(LLInventoryItem* inv_item, BOOL drop, std::string& tooltip_msg, BOOL user_confirm = TRUE, LLPointer<LLInventoryCallback> cb = NULL);
+ BOOL dragCategoryIntoFolder(LLInventoryCategory* inv_category, BOOL drop, std::string& tooltip_msg, BOOL is_link = FALSE, BOOL user_confirm = TRUE, LLPointer<LLInventoryCallback> cb = NULL);
void callback_dropItemIntoFolder(const LLSD& notification, const LLSD& response, LLInventoryItem* inv_item);
void callback_dropCategoryIntoFolder(const LLSD& notification, const LLSD& response, LLInventoryCategory* inv_category);
@@ -296,6 +301,7 @@ public:
static LLUIImagePtr getIcon(LLFolderType::EType preferred_type);
virtual std::string getLabelSuffix() const;
virtual LLFontGL::StyleFlags getLabelStyle() const;
+ virtual const LLUUID& getThumbnailUUID() const;
void setShowDescendantsCount(bool show_count) {mShowDescendantsCount = show_count;}
@@ -335,6 +341,7 @@ public:
protected:
void buildContextMenuOptions(U32 flags, menuentry_vec_t& items, menuentry_vec_t& disabled_items);
void buildContextMenuFolderOptions(U32 flags, menuentry_vec_t& items, menuentry_vec_t& disabled_items);
+ void addOpenFolderMenuOptions(U32 flags, menuentry_vec_t& items);
//--------------------------------------------------------------------
// Menu callbacks
@@ -360,9 +367,9 @@ protected:
void copyOutfitToClipboard();
void determineFolderType();
- void dropToFavorites(LLInventoryItem* inv_item);
- void dropToOutfit(LLInventoryItem* inv_item, BOOL move_is_into_current_outfit);
- void dropToMyOutfits(LLInventoryCategory* inv_cat);
+ void dropToFavorites(LLInventoryItem* inv_item, LLPointer<LLInventoryCallback> cb = NULL);
+ void dropToOutfit(LLInventoryItem* inv_item, BOOL move_is_into_current_outfit, LLPointer<LLInventoryCallback> cb = NULL);
+ void dropToMyOutfits(LLInventoryCategory* inv_cat, LLPointer<LLInventoryCallback> cb = NULL);
//--------------------------------------------------------------------
// Messy hacks for handling folder options
@@ -372,7 +379,7 @@ public:
static void staticFolderOptionsMenu();
protected:
- void outfitFolderCreatedCallback(LLUUID cat_source_id, LLUUID cat_dest_id);
+ void outfitFolderCreatedCallback(LLUUID cat_source_id, LLUUID cat_dest_id, LLPointer<LLInventoryCallback> cb);
void callback_pasteFromClipboard(const LLSD& notification, const LLSD& response);
void perform_pasteFromClipboard();
void gatherMessage(std::string& message, S32 depth, LLError::ELevel log_level);
@@ -752,7 +759,7 @@ void rez_attachment(LLViewerInventoryItem* item,
BOOL move_inv_category_world_to_agent(const LLUUID& object_id,
const LLUUID& category_id,
BOOL drop,
- void (*callback)(S32, void*) = NULL,
+ std::function<void(S32, void*, const LLMoveInv *)> callback = NULL,
void* user_data = NULL,
LLInventoryFilter* filter = NULL);
@@ -778,4 +785,16 @@ public:
bool canWearSelected(const uuid_vec_t& item_ids) const;
};
+struct LLMoveInv
+{
+ LLUUID mObjectID;
+ LLUUID mCategoryID;
+ two_uuids_list_t mMoveList;
+ std::function<void(S32, void*, const LLMoveInv*)> mCallback;
+ void* mUserData;
+};
+
+void warn_move_inventory(LLViewerObject* object, boost::shared_ptr<LLMoveInv> move_inv);
+bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, boost::shared_ptr<LLMoveInv>);
+
#endif // LL_LLINVENTORYBRIDGE_H
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index 374790b917..7b4283e94d 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -63,6 +63,7 @@ LLInventoryFilter::FilterOps::FilterOps(const Params& p)
mFilterTypes(p.types),
mFilterUUID(p.uuid),
mFilterLinks(p.links),
+ mFilterThumbnails(p.thumbnails),
mSearchVisibility(p.search_visibility)
{
}
@@ -81,7 +82,8 @@ LLInventoryFilter::LLInventoryFilter(const Params& p)
mCurrentGeneration(0),
mFirstRequiredGeneration(0),
mFirstSuccessGeneration(0),
- mSearchType(SEARCHTYPE_NAME)
+ mSearchType(SEARCHTYPE_NAME),
+ mSingleFolderMode(false)
{
// copy mFilterOps into mDefaultFilterOps
markDefault();
@@ -157,6 +159,8 @@ bool LLInventoryFilter::check(const LLFolderViewModelItem* item)
passed = passed && checkAgainstCreator(listener);
passed = passed && checkAgainstSearchVisibility(listener);
+ passed = passed && checkAgainstFilterThumbnails(listener->getUUID());
+
return passed;
}
@@ -194,17 +198,23 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const
// when applying a filter, matching folders get their contents downloaded first
// but make sure we are not interfering with pre-download
if (isNotDefault()
- && LLStartUp::getStartupState() > STATE_WEARABLES_WAIT)
+ && LLStartUp::getStartupState() > STATE_WEARABLES_WAIT
+ && !LLInventoryModelBackgroundFetch::instance().inventoryFetchInProgress())
{
LLViewerInventoryCategory* cat = gInventory.getCategory(folder_id);
- if (!cat || (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN))
+ if ((!cat && folder_id.notNull()) || (cat && cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN))
{
// At the moment background fetch only cares about VERSION_UNKNOWN,
// so do not check isCategoryComplete that compares descendant count
- LLInventoryModelBackgroundFetch::instance().start(folder_id);
+ LLInventoryModelBackgroundFetch::instance().start(folder_id, false);
}
}
+ if (!checkAgainstFilterThumbnails(folder_id))
+ {
+ return false;
+ }
+
// Marketplace folder filtering
const U32 filterTypes = mFilterOps.mFilterTypes;
const U32 marketplace_filter = FILTERTYPE_MARKETPLACE_ACTIVE | FILTERTYPE_MARKETPLACE_INACTIVE |
@@ -565,6 +575,19 @@ bool LLInventoryFilter::checkAgainstFilterLinks(const LLFolderViewModelItemInven
return TRUE;
}
+bool LLInventoryFilter::checkAgainstFilterThumbnails(const LLUUID& object_id) const
+{
+ const LLInventoryObject *object = gInventory.getObject(object_id);
+ if (!object) return true;
+
+ const bool is_thumbnail = object->getThumbnailUUID().notNull();
+ if (is_thumbnail && (mFilterOps.mFilterThumbnails == FILTER_EXCLUDE_THUMBNAILS))
+ return false;
+ if (!is_thumbnail && (mFilterOps.mFilterThumbnails == FILTER_ONLY_THUMBNAILS))
+ return false;
+ return true;
+}
+
bool LLInventoryFilter::checkAgainstCreator(const LLFolderViewModelItemInventory* listener) const
{
if (!listener) return TRUE;
@@ -595,6 +618,9 @@ bool LLInventoryFilter::checkAgainstSearchVisibility(const LLFolderViewModelItem
if (is_link && ((mFilterOps.mSearchVisibility & VISIBILITY_LINKS) == 0))
return FALSE;
+ if (listener->isItemInOutfits() && ((mFilterOps.mSearchVisibility & VISIBILITY_OUTFITS) == 0))
+ return FALSE;
+
if (listener->isItemInTrash() && ((mFilterOps.mSearchVisibility & VISIBILITY_TRASH) == 0))
return FALSE;
@@ -733,6 +759,32 @@ void LLInventoryFilter::setFilterSettingsTypes(U64 types)
mFilterOps.mFilterTypes |= FILTERTYPE_SETTINGS;
}
+void LLInventoryFilter::setFilterThumbnails(U64 filter_thumbnails)
+{
+ if (mFilterOps.mFilterThumbnails != filter_thumbnails)
+ {
+ if (mFilterOps.mFilterThumbnails == FILTER_EXCLUDE_THUMBNAILS
+ && filter_thumbnails == FILTER_ONLY_THUMBNAILS)
+ {
+ setModified(FILTER_RESTART);
+ }
+ else if (mFilterOps.mFilterThumbnails == FILTER_ONLY_THUMBNAILS
+ && filter_thumbnails == FILTER_EXCLUDE_THUMBNAILS)
+ {
+ setModified(FILTER_RESTART);
+ }
+ else if (mFilterOps.mFilterThumbnails == FILTER_INCLUDE_THUMBNAILS)
+ {
+ setModified(FILTER_MORE_RESTRICTIVE);
+ }
+ else
+ {
+ setModified(FILTER_LESS_RESTRICTIVE);
+ }
+ }
+ mFilterOps.mFilterThumbnails = filter_thumbnails;
+}
+
void LLInventoryFilter::setFilterEmptySystemFolders()
{
mFilterOps.mFilterTypes |= FILTERTYPE_EMPTYFOLDERS;
@@ -791,6 +843,24 @@ void LLInventoryFilter::toggleSearchVisibilityLinks()
}
}
+void LLInventoryFilter::toggleSearchVisibilityOutfits()
+{
+ bool hide_outfits = mFilterOps.mSearchVisibility & VISIBILITY_OUTFITS;
+ if (hide_outfits)
+ {
+ mFilterOps.mSearchVisibility &= ~VISIBILITY_OUTFITS;
+ }
+ else
+ {
+ mFilterOps.mSearchVisibility |= VISIBILITY_OUTFITS;
+ }
+
+ if (hasFilterString())
+ {
+ setModified(hide_outfits ? FILTER_MORE_RESTRICTIVE : FILTER_LESS_RESTRICTIVE);
+ }
+}
+
void LLInventoryFilter::toggleSearchVisibilityTrash()
{
bool hide_trash = mFilterOps.mSearchVisibility & VISIBILITY_TRASH;
@@ -1515,6 +1585,11 @@ U64 LLInventoryFilter::getSearchVisibilityTypes() const
return mFilterOps.mSearchVisibility;
}
+U64 LLInventoryFilter::getFilterThumbnails() const
+{
+ return mFilterOps.mFilterThumbnails;
+}
+
bool LLInventoryFilter::hasFilterString() const
{
return mFilterSubString.size() > 0;
@@ -1592,9 +1667,9 @@ void LLInventoryFilter::setDefaultEmptyLookupMessage(const std::string& message)
mDefaultEmptyLookupMessage = message;
}
-std::string LLInventoryFilter::getEmptyLookupMessage() const
+std::string LLInventoryFilter::getEmptyLookupMessage(bool is_empty_folder) const
{
- if (isDefault() && !mDefaultEmptyLookupMessage.empty())
+ if ((isDefault() || is_empty_folder) && !mDefaultEmptyLookupMessage.empty())
{
return LLTrans::getString(mDefaultEmptyLookupMessage);
}
@@ -1617,7 +1692,7 @@ bool LLInventoryFilter::areDateLimitsSet()
bool LLInventoryFilter::showAllResults() const
{
- return hasFilterString();
+ return hasFilterString() && !mSingleFolderMode;
}
diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h
index 384de3e889..ada1d0f4b4 100644
--- a/indra/newview/llinventoryfilter.h
+++ b/indra/newview/llinventoryfilter.h
@@ -75,6 +75,13 @@ public:
FILTERLINK_ONLY_LINKS // only show links
};
+ enum EFilterThumbnail
+ {
+ FILTER_INCLUDE_THUMBNAILS,
+ FILTER_EXCLUDE_THUMBNAILS,
+ FILTER_ONLY_THUMBNAILS
+ };
+
enum ESortOrderType
{
SO_NAME = 0, // Sort inventory by name
@@ -104,7 +111,8 @@ public:
VISIBILITY_NONE = 0,
VISIBILITY_TRASH = 0x1 << 0,
VISIBILITY_LIBRARY = 0x1 << 1,
- VISIBILITY_LINKS = 0x1 << 2
+ VISIBILITY_LINKS = 0x1 << 2,
+ VISIBILITY_OUTFITS = 0x1 << 3
};
struct FilterOps
@@ -139,12 +147,14 @@ public:
Optional<EFolderShow> show_folder_state;
Optional<PermissionMask> permissions;
Optional<EFilterCreatorType> creator_type;
+ Optional<EFilterThumbnail> thumbnails;
Params()
: types("filter_types", FILTERTYPE_OBJECT),
object_types("object_types", 0xffffFFFFffffFFFFULL),
wearable_types("wearable_types", 0xffffFFFFffffFFFFULL),
settings_types("settings_types", 0xffffFFFFffffFFFFULL),
+ thumbnails("thumbnails", FILTER_INCLUDE_THUMBNAILS),
category_types("category_types", 0xffffFFFFffffFFFFULL),
links("links", FILTERLINK_INCLUDE_LINKS),
search_visibility("search_visibility", 0xFFFFFFFF),
@@ -165,6 +175,7 @@ public:
U64 mFilterObjectTypes, // For _OBJECT
mFilterWearableTypes,
mFilterSettingsTypes, // for _SETTINGS
+ mFilterThumbnails,
mFilterLinks,
mFilterCategoryTypes; // For _CATEGORY
LLUUID mFilterUUID; // for UUID
@@ -207,6 +218,7 @@ public:
U64 getFilterWearableTypes() const;
U64 getFilterSettingsTypes() const;
U64 getSearchVisibilityTypes() const;
+ U64 getFilterThumbnails() const;
bool isFilterObjectTypesWith(LLInventoryType::EType t) const;
void setFilterObjectTypes(U64 types);
@@ -221,6 +233,7 @@ public:
void setFilterMarketplaceUnassociatedFolders();
void setFilterMarketplaceListingFolders(bool select_only_listing_folders);
void setFilterNoMarketplaceFolder();
+ void setFilterThumbnails(U64 filter_thumbnails);
void updateFilterTypes(U64 types, U64& current_types);
void setSearchType(ESearchType type);
ESearchType getSearchType() { return mSearchType; }
@@ -228,6 +241,7 @@ public:
void toggleSearchVisibilityLinks();
void toggleSearchVisibilityTrash();
+ void toggleSearchVisibilityOutfits();
void toggleSearchVisibilityLibrary();
void setSearchVisibilityTypes(U32 types);
void setSearchVisibilityTypes(const Params& params);
@@ -237,6 +251,8 @@ public:
const std::string& getFilterSubStringOrig() const { return mFilterSubStringOrig; }
bool hasFilterString() const;
+ void setSingleFolderMode(bool is_single_folder) { mSingleFolderMode = is_single_folder; }
+
void setFilterPermissions(PermissionMask perms);
PermissionMask getFilterPermissions() const;
@@ -277,7 +293,7 @@ public:
void setEmptyLookupMessage(const std::string& message);
void setDefaultEmptyLookupMessage(const std::string& message);
- std::string getEmptyLookupMessage() const;
+ std::string getEmptyLookupMessage(bool is_empty_folder = false) const;
// +-------------------------------------------------------------------+
// + Status
@@ -321,6 +337,8 @@ public:
LLInventoryFilter& operator =(const LLInventoryFilter& other);
+ bool checkAgainstFilterThumbnails(const LLUUID& object_id) const;
+
private:
bool areDateLimitsSet();
bool checkAgainstFilterType(const class LLFolderViewModelItemInventory* listener) const;
@@ -359,6 +377,8 @@ private:
std::vector<std::string> mFilterTokens;
std::string mExactToken;
+
+ bool mSingleFolderMode;
};
#endif
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index 67240ac7e7..4aeacae6ed 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -46,13 +46,16 @@
#include "llappearancemgr.h"
#include "llappviewer.h"
#include "llavataractions.h"
+#include "llavatarnamecache.h"
#include "llclipboard.h"
#include "lldirpicker.h"
#include "lldonotdisturbnotificationstorage.h"
+#include "llfloatermarketplacelistings.h"
#include "llfloatersidepanelcontainer.h"
#include "llfocusmgr.h"
#include "llfolderview.h"
#include "llgesturemgr.h"
+#include "llgiveinventory.h"
#include "lliconctrl.h"
#include "llimview.h"
#include "llinventorybridge.h"
@@ -93,6 +96,7 @@
BOOL LLInventoryState::sWearNewClothing = FALSE;
LLUUID LLInventoryState::sWearNewClothingTransactionID;
std::list<LLUUID> LLInventoryAction::sMarketplaceFolders;
+bool LLInventoryAction::sDeleteConfirmationDisplayed = false;
// Helper function : callback to update a folder after inventory action happened in the background
void update_folder_cb(const LLUUID& dest_folder)
@@ -213,8 +217,7 @@ bool contains_nocopy_items(const LLUUID& id)
return false;
}
-// Generates a string containing the path to the item specified by
-// item_id.
+// Generates a string containing the path to the item specified by id.
void append_path(const LLUUID& id, std::string& path)
{
std::string temp;
@@ -234,6 +237,36 @@ void append_path(const LLUUID& id, std::string& path)
path.append(temp);
}
+// Generates a string containing the path name of the object.
+std::string make_path(const LLInventoryObject* object)
+{
+ std::string path;
+ append_path(object->getUUID(), path);
+ return path + "/" + object->getName();
+}
+
+// Generates a string containing the path name of the object specified by id.
+std::string make_inventory_path(const LLUUID& id)
+{
+ if (LLInventoryObject* object = gInventory.getObject(id))
+ return make_path(object);
+ return "";
+}
+
+// Generates a string containing the path name and id of the object.
+std::string make_info(const LLInventoryObject* object)
+{
+ return "'" + make_path(object) + "' (" + object->getUUID().asString() + ")";
+}
+
+// Generates a string containing the path name and id of the object specified by id.
+std::string make_inventory_info(const LLUUID& id)
+{
+ if (LLInventoryObject* object = gInventory.getObject(id))
+ return make_info(object);
+ return "<Inventory object not found!> (" + id.asString() + ")";
+}
+
void update_marketplace_folder_hierarchy(const LLUUID cat_id)
{
// When changing the marketplace status of a folder, the only thing that needs to happen is
@@ -371,7 +404,7 @@ void update_all_marketplace_count(const LLUUID& cat_id)
void update_all_marketplace_count()
{
// Get the marketplace root and launch the recursive exploration
- const LLUUID marketplace_listings_uuid = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ const LLUUID marketplace_listings_uuid = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
if (!marketplace_listings_uuid.isNull())
{
update_all_marketplace_count(marketplace_listings_uuid);
@@ -397,14 +430,36 @@ void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::s
}
void copy_inventory_category(LLInventoryModel* model,
- LLViewerInventoryCategory* cat,
- const LLUUID& parent_id,
- const LLUUID& root_copy_id,
- bool move_no_copy_items )
+ LLViewerInventoryCategory* cat,
+ const LLUUID& parent_id,
+ const LLUUID& root_copy_id,
+ bool move_no_copy_items)
+{
+ // Create the initial folder
+ inventory_func_type func = [model, cat, root_copy_id, move_no_copy_items](const LLUUID& new_id)
+ {
+ copy_inventory_category_content(new_id, model, cat, root_copy_id, move_no_copy_items);
+ };
+ gInventory.createNewCategory(parent_id, LLFolderType::FT_NONE, cat->getName(), func, cat->getThumbnailUUID());
+}
+
+void copy_inventory_category(LLInventoryModel* model,
+ LLViewerInventoryCategory* cat,
+ const LLUUID& parent_id,
+ const LLUUID& root_copy_id,
+ bool move_no_copy_items,
+ inventory_func_type callback)
{
// Create the initial folder
- inventory_func_type func = boost::bind(&copy_inventory_category_content, _1, model, cat, root_copy_id, move_no_copy_items);
- gInventory.createNewCategory(parent_id, LLFolderType::FT_NONE, cat->getName(), func);
+ inventory_func_type func = [model, cat, root_copy_id, move_no_copy_items, callback](const LLUUID &new_id)
+ {
+ copy_inventory_category_content(new_id, model, cat, root_copy_id, move_no_copy_items);
+ if (callback)
+ {
+ callback(new_id);
+ }
+ };
+ gInventory.createNewCategory(parent_id, LLFolderType::FT_NONE, cat->getName(), func, cat->getThumbnailUUID());
}
void copy_inventory_category_content(const LLUUID& new_cat_uuid, LLInventoryModel* model, LLViewerInventoryCategory* cat, const LLUUID& root_copy_id, bool move_no_copy_items)
@@ -529,11 +584,12 @@ BOOL get_is_item_worn(const LLUUID& id)
const LLViewerInventoryItem* item = gInventory.getItem(id);
if (!item)
return FALSE;
-
+
if (item->getIsLinkType() && !gInventory.getItem(item->getLinkedUUID()))
{
return FALSE;
}
+
// Consider the item as worn if it has links in COF.
if (LLAppearanceMgr::instance().isLinkedInCOF(id))
{
@@ -768,18 +824,37 @@ BOOL get_is_category_renameable(const LLInventoryModel* model, const LLUUID& id)
void show_task_item_profile(const LLUUID& item_uuid, const LLUUID& object_id)
{
- LLFloaterSidePanelContainer::showPanel("inventory", LLSD().with("id", item_uuid).with("object", object_id));
+ LLSD params;
+ params["id"] = item_uuid;
+ params["object"] = object_id;
+
+ LLFloaterReg::showInstance("item_properties", params);
}
void show_item_profile(const LLUUID& item_uuid)
{
LLUUID linked_uuid = gInventory.getLinkedItemID(item_uuid);
- LLFloaterSidePanelContainer::showPanel("inventory", LLSD().with("id", linked_uuid));
+ LLFloaterReg::showInstance("item_properties", LLSD().with("id", linked_uuid));
}
void show_item_original(const LLUUID& item_uuid)
{
- LLFloater* floater_inventory = LLFloaterReg::getInstance("inventory");
+ static LLUICachedControl<bool> find_original_new_floater("FindOriginalOpenWindow", false);
+
+ //show in a new single-folder window
+ if(find_original_new_floater)
+ {
+ const LLUUID& linked_item_uuid = gInventory.getLinkedItemID(item_uuid);
+ const LLInventoryObject *obj = gInventory.getObject(linked_item_uuid);
+ if (obj && obj->getParentUUID().notNull())
+ {
+ LLPanelMainInventory::newFolderWindow(obj->getParentUUID(), linked_item_uuid);
+ }
+ }
+ //show in main Inventory
+ else
+ {
+ LLFloater* floater_inventory = LLFloaterReg::getInstance("inventory");
if (!floater_inventory)
{
LL_WARNS() << "Could not find My Inventory floater" << LL_ENDL;
@@ -791,6 +866,10 @@ void show_item_original(const LLUUID& item_uuid)
LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel();
if (main_inventory)
{
+ if(main_inventory->isSingleFolderMode())
+ {
+ main_inventory->toggleViewMode();
+ }
main_inventory->resetAllItemsFilters();
}
reset_inventory_filter();
@@ -799,7 +878,6 @@ void show_item_original(const LLUUID& item_uuid)
{
LLFloaterReg::toggleInstanceOrBringToFront("inventory");
}
- sidepanel_inventory->showInventoryPanel();
const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX);
if (gInventory.isObjectDescendentOf(gInventory.getLinkedItemID(item_uuid), inbox_id))
@@ -819,6 +897,7 @@ void show_item_original(const LLUUID& item_uuid)
}
}
}
+ }
}
@@ -840,22 +919,6 @@ void open_marketplace_listings()
LLFloaterReg::showInstance("marketplace_listings");
}
-// Create a new folder in destFolderId with the same name as the item name and return the uuid of the new folder
-// Note: this is used locally in various situation where we need to wrap an item into a special folder
-LLUUID create_folder_for_item(LLInventoryItem* item, const LLUUID& destFolderId)
-{
- llassert(item);
- llassert(destFolderId.notNull());
-
- LLUUID created_folder_id = gInventory.createNewCategory(destFolderId, LLFolderType::FT_NONE, item->getName());
- gInventory.notifyObservers();
-
- // *TODO : Create different notifications for the various cases
- LLNotificationsUtil::add("OutboxFolderCreated");
-
- return created_folder_id;
-}
-
///----------------------------------------------------------------------------
// Marketplace functions
//
@@ -870,7 +933,7 @@ S32 depth_nesting_in_marketplace(LLUUID cur_uuid)
// Todo: findCategoryUUIDForType is somewhat expensive with large
// flat root folders yet we use depth_nesting_in_marketplace at
// every turn, find a way to correctly cache this id.
- const LLUUID marketplace_listings_uuid = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ const LLUUID marketplace_listings_uuid = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
if (marketplace_listings_uuid.isNull())
{
return -1;
@@ -1342,6 +1405,7 @@ bool can_move_folder_to_marketplace(const LLInventoryCategory* root_folder, LLIn
return accept;
}
+// Can happen asynhroneously!!!
bool move_item_to_marketplacelistings(LLInventoryItem* inv_item, LLUUID dest_folder, bool copy)
{
// Get the marketplace listings depth of the destination folder, exit with error if not under marketplace
@@ -1381,53 +1445,119 @@ bool move_item_to_marketplacelistings(LLInventoryItem* inv_item, LLUUID dest_fol
if (can_move_to_marketplace(inv_item, error_msg, true))
{
// When moving an isolated item, we might need to create the folder structure to support it
+
+ LLUUID item_id = inv_item->getUUID();
+ std::function<void(const LLUUID&)> callback_create_stock = [copy, item_id](const LLUUID& new_cat_id)
+ {
+ if (new_cat_id.isNull())
+ {
+ LL_WARNS() << "Failed to create category" << LL_ENDL;
+ LLSD subs;
+ subs["[ERROR_CODE]"] =
+ LLTrans::getString("Marketplace Error Prefix") + LLTrans::getString("Marketplace Error Not Accepted");
+ LLNotificationsUtil::add("MerchantPasteFailed", subs);
+ return;
+ }
+
+ // Verify we can have this item in that destination category
+ LLViewerInventoryCategory* dest_cat = gInventory.getCategory(new_cat_id);
+ LLViewerInventoryItem * viewer_inv_item = gInventory.getItem(item_id);
+ if (!dest_cat || !viewer_inv_item)
+ {
+ LL_WARNS() << "Move to marketplace: item or folder do not exist" << LL_ENDL;
+
+ LLSD subs;
+ subs["[ERROR_CODE]"] =
+ LLTrans::getString("Marketplace Error Prefix") + LLTrans::getString("Marketplace Error Not Accepted");
+ LLNotificationsUtil::add("MerchantPasteFailed", subs);
+ return;
+ }
+ if (!dest_cat->acceptItem(viewer_inv_item))
+ {
+ LLSD subs;
+ subs["[ERROR_CODE]"] = LLTrans::getString("Marketplace Error Prefix") + LLTrans::getString("Marketplace Error Not Accepted");
+ LLNotificationsUtil::add("MerchantPasteFailed", subs);
+ }
+
+ if (copy)
+ {
+ // Copy the item
+ LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(update_folder_cb, new_cat_id));
+ copy_inventory_item(
+ gAgent.getID(),
+ viewer_inv_item->getPermissions().getOwner(),
+ viewer_inv_item->getUUID(),
+ new_cat_id,
+ std::string(),
+ cb);
+ }
+ else
+ {
+ // Reparent the item
+ gInventory.changeItemParent(viewer_inv_item, new_cat_id, true);
+ }
+ };
+
+ std::function<void(const LLUUID&)> callback_dest_create = [item_id, callback_create_stock](const LLUUID& new_cat_id)
+ {
+ if (new_cat_id.isNull())
+ {
+ LL_WARNS() << "Failed to create category" << LL_ENDL;
+ LLSD subs;
+ subs["[ERROR_CODE]"] =
+ LLTrans::getString("Marketplace Error Prefix") + LLTrans::getString("Marketplace Error Not Accepted");
+ LLNotificationsUtil::add("MerchantPasteFailed", subs);
+ return;
+ }
+
+ LLViewerInventoryCategory* dest_cat = gInventory.getCategory(new_cat_id);
+ LLViewerInventoryItem * viewer_inv_item = gInventory.getItem(item_id);
+ if (!viewer_inv_item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID(), gAgent.getGroupID()) &&
+ (dest_cat->getPreferredType() != LLFolderType::FT_MARKETPLACE_STOCK))
+ {
+ // We need to create a stock folder to move a no copy item
+ gInventory.createNewCategory(new_cat_id, LLFolderType::FT_MARKETPLACE_STOCK, viewer_inv_item->getName(), callback_create_stock);
+ }
+ else
+ {
+ callback_create_stock(new_cat_id);
+ }
+ };
+
if (depth == 0)
{
// We need a listing folder
- dest_folder = gInventory.createNewCategory(dest_folder, LLFolderType::FT_NONE, viewer_inv_item->getName());
- depth++;
+ gInventory.createNewCategory(dest_folder,
+ LLFolderType::FT_NONE,
+ viewer_inv_item->getName(),
+ [callback_dest_create](const LLUUID &new_cat_id)
+ {
+ if (new_cat_id.isNull())
+ {
+ LL_WARNS() << "Failed to create listing folder for marketpace" << LL_ENDL;
+ return;
+ }
+ LLViewerInventoryCategory *dest_cat = gInventory.getCategory(new_cat_id);
+ if (!dest_cat)
+ {
+ LL_WARNS() << "Failed to find freshly created listing folder" << LL_ENDL;
+ return;
+ }
+ // version folder
+ gInventory.createNewCategory(new_cat_id,
+ LLFolderType::FT_NONE,
+ dest_cat->getName(),
+ callback_dest_create);
+ });
}
- if (depth == 1)
+ else if (depth == 1)
{
// We need a version folder
- dest_folder = gInventory.createNewCategory(dest_folder, LLFolderType::FT_NONE, viewer_inv_item->getName());
- depth++;
- }
- LLViewerInventoryCategory* dest_cat = gInventory.getCategory(dest_folder);
- if (!viewer_inv_item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID(), gAgent.getGroupID()) &&
- (dest_cat->getPreferredType() != LLFolderType::FT_MARKETPLACE_STOCK))
- {
- // We need to create a stock folder to move a no copy item
- dest_folder = gInventory.createNewCategory(dest_folder, LLFolderType::FT_MARKETPLACE_STOCK, viewer_inv_item->getName());
- dest_cat = gInventory.getCategory(dest_folder);
- depth++;
- }
-
- // Verify we can have this item in that destination category
- if (!dest_cat->acceptItem(viewer_inv_item))
- {
- LLSD subs;
- subs["[ERROR_CODE]"] = LLTrans::getString("Marketplace Error Prefix") + LLTrans::getString("Marketplace Error Not Accepted");
- LLNotificationsUtil::add("MerchantPasteFailed", subs);
- return false;
- }
-
- if (copy)
- {
- // Copy the item
- LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(update_folder_cb, dest_folder));
- copy_inventory_item(
- gAgent.getID(),
- viewer_inv_item->getPermissions().getOwner(),
- viewer_inv_item->getUUID(),
- dest_folder,
- std::string(),
- cb);
+ gInventory.createNewCategory(dest_folder, LLFolderType::FT_NONE, viewer_inv_item->getName(), callback_dest_create);
}
else
{
- // Reparent the item
- gInventory.changeItemParent(viewer_inv_item, dest_folder, true);
+ callback_dest_create(dest_folder);
}
}
else
@@ -1472,10 +1602,11 @@ bool move_folder_to_marketplacelistings(LLInventoryCategory* inv_cat, const LLUU
}
else
{
+ LL_INFOS("SLM") << "Move category " << make_info(viewer_inv_cat) << " to '" << make_inventory_path(dest_folder) << "'" << LL_ENDL;
// Reparent the folder
gInventory.changeCategoryParent(viewer_inv_cat, dest_folder, false);
// Check the destination folder recursively for no copy items and promote the including folders if any
- validate_marketplacelistings(dest_cat);
+ LLMarketplaceValidator::getInstance()->validateMarketplaceListings(dest_folder);
}
// Update the modified folders
@@ -1500,32 +1631,23 @@ bool sort_alpha(const LLViewerInventoryCategory* cat1, const LLViewerInventoryCa
return cat1->getName().compare(cat2->getName()) < 0;
}
-void dump_trace(std::string& message, S32 depth, LLError::ELevel log_level)
-{
- LL_INFOS() << "validate_marketplacelistings : error = "<< log_level << ", depth = " << depth << ", message = " << message << LL_ENDL;
-}
-
// Make all relevant business logic checks on the marketplace listings starting with the folder as argument.
// This function does no deletion of listings but a mere audit and raises issues to the user (through the
-// optional callback cb). It also returns a boolean, true if things validate, false if issues are raised.
+// optional callback cb).
// The only inventory changes that are done is to move and sort folders containing no-copy items to stock folders.
-bool validate_marketplacelistings(
+// @pending_callbacks - how many callbacks we are waiting for, must be inited before use
+// @result - true if things validate, false if issues are raised, must be inited before use
+typedef boost::function<void(S32 pending_callbacks, bool result)> validation_result_callback_t;
+void validate_marketplacelistings(
LLInventoryCategory* cat,
- validation_callback_t cb,
+ validation_result_callback_t cb_result,
+ LLMarketplaceValidator::validation_msg_callback_t cb_msg,
bool fix_hierarchy,
S32 depth,
- bool notify_observers)
+ bool notify_observers,
+ S32 &pending_callbacks,
+ bool &result)
{
-#if 0
- // Used only for debug
- if (!cb)
- {
- cb = boost::bind(&dump_trace, _1, _2, _3);
- }
-#endif
- // Folder is valid unless issue is raised
- bool result = true;
-
// Get the type and the depth of the folder
LLViewerInventoryCategory * viewer_cat = (LLViewerInventoryCategory *) (cat);
const LLFolderType::EType folder_type = cat->getPreferredType();
@@ -1557,10 +1679,10 @@ bool validate_marketplacelistings(
if (!can_move_folder_to_marketplace(cat, cat, cat, message, 0, fix_hierarchy))
{
result = false;
- if (cb)
+ if (cb_msg)
{
message = indent + cat->getName() + LLTrans::getString("Marketplace Validation Error") + " " + message;
- cb(message,depth,LLError::LEVEL_ERROR);
+ cb_msg(message,depth,LLError::LEVEL_ERROR);
}
}
}
@@ -1570,26 +1692,46 @@ bool validate_marketplacelistings(
{
if (fix_hierarchy)
{
- if (cb)
+ if (cb_msg)
{
std::string message = indent + cat->getName() + LLTrans::getString("Marketplace Validation Warning") + " " + LLTrans::getString("Marketplace Validation Warning Stock");
- cb(message,depth,LLError::LEVEL_WARN);
+ cb_msg(message,depth,LLError::LEVEL_WARN);
}
+
// Nest the stock folder one level deeper in a normal folder and restart from there
+ pending_callbacks++;
LLUUID parent_uuid = cat->getParentUUID();
- LLUUID folder_uuid = gInventory.createNewCategory(parent_uuid, LLFolderType::FT_NONE, cat->getName());
- LLInventoryCategory* new_cat = gInventory.getCategory(folder_uuid);
- gInventory.changeCategoryParent(viewer_cat, folder_uuid, false);
- result &= validate_marketplacelistings(new_cat, cb, fix_hierarchy, depth + 1, notify_observers);
- return result;
+ LLUUID cat_uuid = cat->getUUID();
+ gInventory.createNewCategory(parent_uuid,
+ LLFolderType::FT_NONE,
+ cat->getName(),
+ [cat_uuid, cb_result, cb_msg, fix_hierarchy, depth](const LLUUID &new_cat_id)
+ {
+ if (new_cat_id.isNull())
+ {
+ cb_result(0, false);
+ return;
+ }
+ LLInventoryCategory * move_cat = gInventory.getCategory(cat_uuid);
+ LLViewerInventoryCategory * viewer_cat = (LLViewerInventoryCategory *)(move_cat);
+ LLInventoryCategory * new_cat = gInventory.getCategory(new_cat_id);
+ gInventory.changeCategoryParent(viewer_cat, new_cat_id, false);
+ S32 pending = 0;
+ bool result = true;
+ validate_marketplacelistings(new_cat, cb_result, cb_msg, fix_hierarchy, depth + 1, true, pending, result);
+ cb_result(pending, result);
+ }
+ );
+ result = false;
+ return;
}
else
{
result = false;
- if (cb)
+ if (cb_msg)
{
std::string message = indent + cat->getName() + LLTrans::getString("Marketplace Validation Error") + " " + LLTrans::getString("Marketplace Validation Warning Stock");
- cb(message,depth,LLError::LEVEL_ERROR);
+ cb_msg(message,depth,LLError::LEVEL_ERROR);
}
}
}
@@ -1620,10 +1762,10 @@ bool validate_marketplacelistings(
if (!can_move_to_marketplace(item, error_msg, false))
{
has_bad_items = true;
- if (cb && fix_hierarchy)
+ if (cb_msg && fix_hierarchy)
{
std::string message = indent + viewer_inv_item->getName() + LLTrans::getString("Marketplace Validation Error") + " " + error_msg;
- cb(message,depth,LLError::LEVEL_ERROR);
+ cb_msg(message,depth,LLError::LEVEL_ERROR);
}
continue;
}
@@ -1654,35 +1796,35 @@ bool validate_marketplacelistings(
if (depth == 2)
{
// If this is an empty version folder, warn only (listing won't be delivered by AIS, but only AIS should unlist)
- if (cb)
+ if (cb_msg)
{
std::string message = indent + cat->getName() + LLTrans::getString("Marketplace Validation Error Empty Version");
- cb(message,depth,LLError::LEVEL_WARN);
+ cb_msg(message,depth,LLError::LEVEL_WARN);
}
}
else if ((folder_type == LLFolderType::FT_MARKETPLACE_STOCK) && (depth > 2))
{
// If this is a legit but empty stock folder, warn only (listing must stay searchable when out of stock)
- if (cb)
+ if (cb_msg)
{
std::string message = indent + cat->getName() + LLTrans::getString("Marketplace Validation Error Empty Stock");
- cb(message,depth,LLError::LEVEL_WARN);
+ cb_msg(message,depth,LLError::LEVEL_WARN);
}
}
- else if (cb)
+ else if (cb_msg)
{
// We warn if there's nothing in a regular folder (may be it's an under construction listing)
std::string message = indent + cat->getName() + LLTrans::getString("Marketplace Validation Warning Empty");
- cb(message,depth,LLError::LEVEL_WARN);
+ cb_msg(message,depth,LLError::LEVEL_WARN);
}
}
else
{
// Done with that folder : Print out the folder name unless we already found an error here
- if (cb && result && (depth >= 1))
+ if (cb_msg && result && (depth >= 1))
{
std::string message = indent + cat->getName() + LLTrans::getString("Marketplace Validation Log");
- cb(message,depth,LLError::LEVEL_INFO);
+ cb_msg(message,depth,LLError::LEVEL_INFO);
}
}
}
@@ -1690,10 +1832,10 @@ bool validate_marketplacelistings(
else if ((count == 1) && !has_bad_items && (((unique_key == default_key) && (depth > 1)) || ((folder_type == LLFolderType::FT_MARKETPLACE_STOCK) && (depth > 2) && (cat_array->size() == 0))))
{
// Done with that folder : Print out the folder name unless we already found an error here
- if (cb && result && (depth >= 1))
+ if (cb_msg && result && (depth >= 1))
{
std::string message = indent + cat->getName() + LLTrans::getString("Marketplace Validation Log");
- cb(message,depth,LLError::LEVEL_INFO);
+ cb_msg(message,depth,LLError::LEVEL_INFO);
}
}
else
@@ -1715,11 +1857,12 @@ bool validate_marketplacelistings(
while (items_vector_it != items_vector.end())
{
// Create a new folder
- LLUUID parent_uuid = (depth > 2 ? viewer_cat->getParentUUID() : viewer_cat->getUUID());
+ const LLUUID parent_uuid = (depth > 2 ? viewer_cat->getParentUUID() : viewer_cat->getUUID());
+ const LLUUID origin_uuid = viewer_cat->getUUID();
LLViewerInventoryItem* viewer_inv_item = gInventory.getItem(items_vector_it->second.back());
std::string folder_name = (depth >= 1 ? viewer_cat->getName() : viewer_inv_item->getName());
LLFolderType::EType new_folder_type = (items_vector_it->first == default_key ? LLFolderType::FT_NONE : LLFolderType::FT_MARKETPLACE_STOCK);
- if (cb)
+ if (cb_msg)
{
std::string message = "";
if (new_folder_type == LLFolderType::FT_MARKETPLACE_STOCK)
@@ -1730,30 +1873,71 @@ bool validate_marketplacelistings(
{
message = indent + folder_name + LLTrans::getString("Marketplace Validation Warning Create Version");
}
- cb(message,depth,LLError::LEVEL_WARN);
+ cb_msg(message,depth,LLError::LEVEL_WARN);
}
- LLUUID folder_uuid = gInventory.createNewCategory(parent_uuid, new_folder_type, folder_name);
-
- // Move each item to the new folder
- while (!items_vector_it->second.empty())
+
+ pending_callbacks++;
+ std::vector<LLUUID> uuid_vector = items_vector_it->second; // needs to be a copy for lambda
+ gInventory.createNewCategory(
+ parent_uuid,
+ new_folder_type,
+ folder_name,
+ [uuid_vector, cb_result, cb_msg, depth, parent_uuid, origin_uuid, notify_observers](const LLUUID &new_category_id)
{
- LLViewerInventoryItem* viewer_inv_item = gInventory.getItem(items_vector_it->second.back());
- if (cb)
+ // Move each item to the new folder
+ std::vector<LLUUID>::const_reverse_iterator iter = uuid_vector.rbegin();
+ while (iter != uuid_vector.rend())
{
- std::string message = indent + viewer_inv_item->getName() + LLTrans::getString("Marketplace Validation Warning Move");
- cb(message,depth,LLError::LEVEL_WARN);
+ LLViewerInventoryItem* viewer_inv_item = gInventory.getItem(*iter);
+ if (cb_msg)
+ {
+ std::string indent;
+ for (int i = 1; i < depth; i++)
+ {
+ indent += " ";
+ }
+ std::string message = indent + viewer_inv_item->getName() + LLTrans::getString("Marketplace Validation Warning Move");
+ cb_msg(message, depth, LLError::LEVEL_WARN);
+ }
+ gInventory.changeItemParent(viewer_inv_item, new_category_id, true);
+ iter++;
}
- gInventory.changeItemParent(viewer_inv_item, folder_uuid, true);
- items_vector_it->second.pop_back();
- }
-
- // Next type
- update_marketplace_category(parent_uuid);
- update_marketplace_category(folder_uuid);
- if (notify_observers)
- {
- gInventory.notifyObservers();
+
+ if (origin_uuid != parent_uuid)
+ {
+ // We might have moved last item from a folder, check if it needs to be removed
+ LLViewerInventoryCategory* cat = gInventory.getCategory(origin_uuid);
+ if (cat->getDescendentCount() == 0)
+ {
+ // Remove previous folder if it ends up empty
+ if (cb_msg)
+ {
+ std::string indent;
+ for (int i = 1; i < depth; i++)
+ {
+ indent += " ";
+ }
+ std::string message = indent + cat->getName() + LLTrans::getString("Marketplace Validation Warning Delete");
+ cb_msg(message, depth, LLError::LEVEL_WARN);
+ }
+ gInventory.removeCategory(cat->getUUID());
+ if (notify_observers)
+ {
+ gInventory.notifyObservers();
+ }
+ }
+ }
+
+ // Next type
+ update_marketplace_category(parent_uuid);
+ update_marketplace_category(new_category_id);
+ if (notify_observers)
+ {
+ gInventory.notifyObservers();
+ }
+ cb_result(0, true);
}
+ );
items_vector_it++;
}
}
@@ -1767,11 +1951,11 @@ bool validate_marketplacelistings(
{
LLViewerInventoryCategory * viewer_cat = (LLViewerInventoryCategory *) (*iter);
gInventory.changeCategoryParent(viewer_cat, parent_uuid, false);
- result &= validate_marketplacelistings(viewer_cat, cb, fix_hierarchy, depth, false);
+ validate_marketplacelistings(viewer_cat, cb_result, cb_msg, fix_hierarchy, depth, false, pending_callbacks, result);
}
}
}
- else if (cb)
+ else if (cb_msg)
{
// We are not fixing the hierarchy but reporting problems, report everything we can find
// Print the folder name
@@ -1782,20 +1966,20 @@ bool validate_marketplacelistings(
// Report if a stock folder contains a mix of items
result = false;
std::string message = indent + cat->getName() + LLTrans::getString("Marketplace Validation Error Mixed Stock");
- cb(message,depth,LLError::LEVEL_ERROR);
+ cb_msg(message,depth,LLError::LEVEL_ERROR);
}
else if ((folder_type == LLFolderType::FT_MARKETPLACE_STOCK) && (cat_array->size() != 0))
{
// Report if a stock folder contains subfolders
result = false;
std::string message = indent + cat->getName() + LLTrans::getString("Marketplace Validation Error Subfolder In Stock");
- cb(message,depth,LLError::LEVEL_ERROR);
+ cb_msg(message,depth,LLError::LEVEL_ERROR);
}
else
{
// Simply print the folder name
std::string message = indent + cat->getName() + LLTrans::getString("Marketplace Validation Log");
- cb(message,depth,LLError::LEVEL_INFO);
+ cb_msg(message,depth,LLError::LEVEL_INFO);
}
}
// Scan each item and report if there's a problem
@@ -1810,21 +1994,21 @@ bool validate_marketplacelistings(
// Report items that shouldn't be there to start with
result = false;
std::string message = indent + " " + viewer_inv_item->getName() + LLTrans::getString("Marketplace Validation Error") + " " + error_msg;
- cb(message,depth,LLError::LEVEL_ERROR);
+ cb_msg(message,depth,LLError::LEVEL_ERROR);
}
else if ((!viewer_inv_item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID(), gAgent.getGroupID())) && (folder_type != LLFolderType::FT_MARKETPLACE_STOCK))
{
// Report stock items that are misplaced
result = false;
std::string message = indent + " " + viewer_inv_item->getName() + LLTrans::getString("Marketplace Validation Error Stock Item");
- cb(message,depth,LLError::LEVEL_ERROR);
+ cb_msg(message,depth,LLError::LEVEL_ERROR);
}
else if (depth == 1)
{
// Report items not wrapped in version folder
result = false;
std::string message = indent + " " + viewer_inv_item->getName() + LLTrans::getString("Marketplace Validation Warning Unwrapped Item");
- cb(message,depth,LLError::LEVEL_ERROR);
+ cb_msg(message,depth,LLError::LEVEL_ERROR);
}
}
}
@@ -1833,17 +2017,18 @@ bool validate_marketplacelistings(
if (viewer_cat->getDescendentCount() == 0)
{
// Remove the current folder if it ends up empty
- if (cb)
+ if (cb_msg)
{
std::string message = indent + viewer_cat->getName() + LLTrans::getString("Marketplace Validation Warning Delete");
- cb(message,depth,LLError::LEVEL_WARN);
+ cb_msg(message,depth,LLError::LEVEL_WARN);
}
gInventory.removeCategory(cat->getUUID());
if (notify_observers)
{
gInventory.notifyObservers();
}
- return result && !has_bad_items;
+ result &=!has_bad_items;
+ return;
}
}
@@ -1856,15 +2041,15 @@ bool validate_marketplacelistings(
for (LLInventoryModel::cat_array_t::iterator iter = cat_array_copy.begin(); iter != cat_array_copy.end(); iter++)
{
LLInventoryCategory* category = *iter;
- result &= validate_marketplacelistings(category, cb, fix_hierarchy, depth + 1, false);
+ validate_marketplacelistings(category, cb_result, cb_msg, fix_hierarchy, depth + 1, false, pending_callbacks, result);
}
-
+
update_marketplace_category(cat->getUUID(), true, true);
if (notify_observers)
{
gInventory.notifyObservers();
}
- return result && !has_bad_items;
+ result &= !has_bad_items;
}
void change_item_parent(const LLUUID& item_id, const LLUUID& new_parent_id)
@@ -1964,9 +2149,346 @@ void move_items_to_new_subfolder(const uuid_vec_t& selected_uuids, const std::st
inventory_func_type func = boost::bind(&move_items_to_folder, _1, selected_uuids);
gInventory.createNewCategory(first_item->getParentUUID(), LLFolderType::FT_NONE, folder_name, func);
+}
+
+// Returns true if the item can be moved to Current Outfit or any outfit folder.
+bool can_move_to_outfit(LLInventoryItem* inv_item, BOOL move_is_into_current_outfit)
+{
+ LLInventoryType::EType inv_type = inv_item->getInventoryType();
+ if ((inv_type != LLInventoryType::IT_WEARABLE) &&
+ (inv_type != LLInventoryType::IT_GESTURE) &&
+ (inv_type != LLInventoryType::IT_ATTACHMENT) &&
+ (inv_type != LLInventoryType::IT_OBJECT) &&
+ (inv_type != LLInventoryType::IT_SNAPSHOT) &&
+ (inv_type != LLInventoryType::IT_TEXTURE))
+ {
+ return false;
+ }
+
+ U32 flags = inv_item->getFlags();
+ if(flags & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS)
+ {
+ return false;
+ }
+
+ if((inv_type == LLInventoryType::IT_TEXTURE) || (inv_type == LLInventoryType::IT_SNAPSHOT))
+ {
+ return !move_is_into_current_outfit;
+ }
+
+ if (move_is_into_current_outfit && get_is_item_worn(inv_item->getUUID()))
+ {
+ return false;
+ }
+
+ return true;
+}
+
+// Returns TRUE if item is a landmark or a link to a landmark
+// and can be moved to Favorites or Landmarks folder.
+bool can_move_to_landmarks(LLInventoryItem* inv_item)
+{
+ // Need to get the linked item to know its type because LLInventoryItem::getType()
+ // returns actual type AT_LINK for links, not the asset type of a linked item.
+ if (LLAssetType::AT_LINK == inv_item->getType())
+ {
+ LLInventoryItem* linked_item = gInventory.getItem(inv_item->getLinkedUUID());
+ if (linked_item)
+ {
+ return LLAssetType::AT_LANDMARK == linked_item->getType();
+ }
+ }
+
+ return LLAssetType::AT_LANDMARK == inv_item->getType();
+}
+
+// Returns true if folder's content can be moved to Current Outfit or any outfit folder.
+bool can_move_to_my_outfits(LLInventoryModel* model, LLInventoryCategory* inv_cat, U32 wear_limit)
+{
+ LLInventoryModel::cat_array_t *cats;
+ LLInventoryModel::item_array_t *items;
+ model->getDirectDescendentsOf(inv_cat->getUUID(), cats, items);
+
+ if (items->size() > wear_limit)
+ {
+ return false;
+ }
+
+ if (items->size() == 0)
+ {
+ // Nothing to move(create)
+ return false;
+ }
+
+ if (cats->size() > 0)
+ {
+ // We do not allow subfolders in outfits of "My Outfits" yet
+ return false;
+ }
+
+ LLInventoryModel::item_array_t::iterator iter = items->begin();
+ LLInventoryModel::item_array_t::iterator end = items->end();
+
+ while (iter != end)
+ {
+ LLViewerInventoryItem *item = *iter;
+ if (!can_move_to_outfit(item, false))
+ {
+ return false;
+ }
+ iter++;
+ }
+
+ return true;
+}
+
+std::string get_localized_folder_name(LLUUID cat_uuid)
+{
+ std::string localized_root_name;
+ const LLViewerInventoryCategory* cat = gInventory.getCategory(cat_uuid);
+ if (cat)
+ {
+ LLFolderType::EType preferred_type = cat->getPreferredType();
+
+ // Translation of Accessories folder in Library inventory folder
+ bool accessories = false;
+ if(cat->getName() == "Accessories")
+ {
+ const LLUUID& parent_folder_id = cat->getParentUUID();
+ accessories = (parent_folder_id == gInventory.getLibraryRootFolderID());
+ }
+
+ //"Accessories" inventory category has folder type FT_NONE. So, this folder
+ //can not be detected as protected with LLFolderType::lookupIsProtectedType
+ localized_root_name.assign(cat->getName());
+ if (accessories || LLFolderType::lookupIsProtectedType(preferred_type))
+ {
+ LLTrans::findString(localized_root_name, std::string("InvFolder ") + cat->getName(), LLSD());
+ }
+ }
+
+ return localized_root_name;
+}
+
+void new_folder_window(const LLUUID& folder_id)
+{
+ LLPanelMainInventory::newFolderWindow(folder_id);
+}
+
+void ungroup_folder_items(const LLUUID& folder_id)
+{
+ LLInventoryCategory* inv_cat = gInventory.getCategory(folder_id);
+ if (!inv_cat || LLFolderType::lookupIsProtectedType(inv_cat->getPreferredType()))
+ {
+ return;
+ }
+ const LLUUID &new_cat_uuid = inv_cat->getParentUUID();
+ LLInventoryModel::cat_array_t* cat_array;
+ LLInventoryModel::item_array_t* item_array;
+ gInventory.getDirectDescendentsOf(inv_cat->getUUID(), cat_array, item_array);
+ LLInventoryModel::cat_array_t cats = *cat_array;
+ LLInventoryModel::item_array_t items = *item_array;
+
+ for (LLInventoryModel::cat_array_t::const_iterator cat_iter = cats.begin(); cat_iter != cats.end(); ++cat_iter)
+ {
+ LLViewerInventoryCategory* cat = *cat_iter;
+ if (cat)
+ {
+ gInventory.changeCategoryParent(cat, new_cat_uuid, false);
+ }
+ }
+ for (LLInventoryModel::item_array_t::const_iterator item_iter = items.begin(); item_iter != items.end(); ++item_iter)
+ {
+ LLViewerInventoryItem* item = *item_iter;
+ if(item)
+ {
+ gInventory.changeItemParent(item, new_cat_uuid, false);
+ }
+ }
+ gInventory.removeCategory(inv_cat->getUUID());
+ gInventory.notifyObservers();
+}
+
+std::string get_searchable_description(LLInventoryModel* model, const LLUUID& item_id)
+{
+ if (model)
+ {
+ const LLInventoryItem *item = model->getItem(item_id);
+ if(item)
+ {
+ std::string desc = item->getDescription();
+ LLStringUtil::toUpper(desc);
+ return desc;
+ }
+ }
+ return LLStringUtil::null;
+}
+
+std::string get_searchable_creator_name(LLInventoryModel* model, const LLUUID& item_id)
+{
+ if (model)
+ {
+ const LLInventoryItem *item = model->getItem(item_id);
+ if(item)
+ {
+ LLAvatarName av_name;
+ if (LLAvatarNameCache::get(item->getCreatorUUID(), &av_name))
+ {
+ std::string username = av_name.getUserName();
+ LLStringUtil::toUpper(username);
+ return username;
+ }
+ }
+ }
+ return LLStringUtil::null;
+}
+
+std::string get_searchable_UUID(LLInventoryModel* model, const LLUUID& item_id)
+{
+ if (model)
+ {
+ const LLViewerInventoryItem *item = model->getItem(item_id);
+ if(item && (item->getIsFullPerm() || gAgent.isGodlikeWithoutAdminMenuFakery()))
+ {
+ std::string uuid = item->getAssetUUID().asString();
+ LLStringUtil::toUpper(uuid);
+ return uuid;
+ }
+ }
+ return LLStringUtil::null;
+}
+
+bool can_share_item(const LLUUID& item_id)
+{
+ bool can_share = false;
+
+ if (gInventory.isObjectDescendentOf(item_id, gInventory.getRootFolderID()))
+ {
+ const LLViewerInventoryItem *item = gInventory.getItem(item_id);
+ if (item)
+ {
+ if (LLInventoryCollectFunctor::itemTransferCommonlyAllowed(item))
+ {
+ can_share = LLGiveInventory::isInventoryGiveAcceptable(item);
+ }
+ }
+ else
+ {
+ can_share = (gInventory.getCategory(item_id) != NULL);
+ }
+
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ if ((item_id == trash_id) || gInventory.isObjectDescendentOf(item_id, trash_id))
+ {
+ can_share = false;
+ }
+ }
+ return can_share;
+}
+///----------------------------------------------------------------------------
+/// LLMarketplaceValidator implementations
+///----------------------------------------------------------------------------
+
+
+LLMarketplaceValidator::LLMarketplaceValidator()
+ : mPendingCallbacks(0)
+ , mValidationInProgress(false)
+{
+}
+
+LLMarketplaceValidator::~LLMarketplaceValidator()
+{
}
+void LLMarketplaceValidator::validateMarketplaceListings(
+ const LLUUID &category_id,
+ LLMarketplaceValidator::validation_done_callback_t cb_done,
+ LLMarketplaceValidator::validation_msg_callback_t cb_msg,
+ bool fix_hierarchy,
+ S32 depth)
+{
+
+ mValidationQueue.emplace(category_id, cb_done, cb_msg, fix_hierarchy, depth);
+ if (!mValidationInProgress)
+ {
+ start();
+ }
+}
+
+void LLMarketplaceValidator::start()
+{
+ if (mValidationQueue.empty())
+ {
+ mValidationInProgress = false;
+ return;
+ }
+ mValidationInProgress = true;
+
+ const ValidationRequest &first = mValidationQueue.front();
+ LLViewerInventoryCategory* cat = gInventory.getCategory(first.mCategoryId);
+ if (!cat)
+ {
+ LL_WARNS() << "Tried to validate a folder that doesn't exist" << LL_ENDL;
+ if (first.mCbDone)
+ {
+ first.mCbDone(false);
+ }
+ mValidationQueue.pop();
+ start();
+ return;
+ }
+
+ validation_result_callback_t result_callback = [](S32 pending, bool result)
+ {
+ LLMarketplaceValidator* validator = LLMarketplaceValidator::getInstance();
+ validator->mPendingCallbacks--; // we just got a callback
+ validator->mPendingCallbacks += pending;
+ validator->mPendingResult &= result;
+ if (validator->mPendingCallbacks <= 0)
+ {
+ llassert(validator->mPendingCallbacks == 0); // shouldn't be below 0
+ const ValidationRequest &first = validator->mValidationQueue.front();
+ if (first.mCbDone)
+ {
+ first.mCbDone(validator->mPendingResult);
+ }
+ validator->mValidationQueue.pop(); // done;
+ validator->start();
+ }
+ };
+
+ mPendingResult = true;
+ mPendingCallbacks = 1; // do '1' in case something decides to callback immediately
+
+ S32 pending_calbacks = 0;
+ bool result = true;
+ validate_marketplacelistings(
+ cat,
+ result_callback,
+ first.mCbMsg,
+ first.mFixHierarchy,
+ first.mDepth,
+ true,
+ pending_calbacks,
+ result);
+
+ result_callback(pending_calbacks, result);
+}
+
+LLMarketplaceValidator::ValidationRequest::ValidationRequest(
+ LLUUID category_id,
+ validation_done_callback_t cb_done,
+ validation_msg_callback_t cb_msg,
+ bool fix_hierarchy,
+ S32 depth)
+: mCategoryId(category_id)
+, mCbDone(cb_done)
+, mCbMsg(cb_msg)
+, mFixHierarchy(fix_hierarchy)
+, mDepth(depth)
+{}
+
///----------------------------------------------------------------------------
/// LLInventoryCollectFunctor implementations
///----------------------------------------------------------------------------
@@ -2150,6 +2672,19 @@ bool LLFindCOFValidItems::operator()(LLInventoryCategory* cat,
}
}
+bool LLFindBrokenLinks::operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item)
+{
+ // only for broken links getType will be a link
+ // otherwise it's supposed to have the type of an item
+ // it is linked too
+ if (item && LLAssetType::lookupIsLinkType(item->getType()))
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
bool LLFindWearables::operator()(LLInventoryCategory* cat,
LLInventoryItem* item)
{
@@ -2215,6 +2750,11 @@ void LLFindWearablesOfType::setType(LLWearableType::EType type)
mWearableType = type;
}
+bool LLIsTextureType::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
+{
+ return item && (item->getType() == LLAssetType::AT_TEXTURE);
+}
+
bool LLFindNonRemovableObjects::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
{
if (item)
@@ -2482,8 +3022,7 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
if ("delete" == action)
{
- static bool sDisplayedAtSession = false;
- const LLUUID &marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ const LLUUID &marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
bool marketplacelistings_item = false;
LLAllDescendentsPassedFilter f;
for (std::set<LLFolderViewItem*>::iterator it = selected_items.begin(); (it != selected_items.end()) && (f.allDescendentsPassedFilter()); ++it)
@@ -2506,10 +3045,10 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
}
else
{
- if (!sDisplayedAtSession) // ask for the confirmation at least once per session
+ if (!sDeleteConfirmationDisplayed) // ask for the confirmation at least once per session
{
LLNotifications::instance().setIgnored("DeleteItems", false);
- sDisplayedAtSession = true;
+ sDeleteConfirmationDisplayed = true;
}
LLSD args;
@@ -2561,7 +3100,7 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
LLMultiPreview* multi_previewp = NULL;
- LLMultiProperties* multi_propertiesp = NULL;
+ LLMultiItemProperties* multi_itempropertiesp = nullptr;
if (("task_open" == action || "open" == action) && selected_items.size() > 1)
{
@@ -2595,10 +3134,9 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
}
else if (("task_properties" == action || "properties" == action) && selected_items.size() > 1)
{
- multi_propertiesp = new LLMultiProperties();
- gFloaterView->addChild(multi_propertiesp);
-
- LLFloater::setFloaterHost(multi_propertiesp);
+ multi_itempropertiesp = new LLMultiItemProperties("item_properties");
+ gFloaterView->addChild(multi_itempropertiesp);
+ LLFloater::setFloaterHost(multi_itempropertiesp);
}
std::set<LLUUID> selected_uuid_set = LLAvatarActions::getInventorySelectedUUIDs();
@@ -2608,7 +3146,7 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
if (action == "wear" || action == "wear_add")
{
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- const LLUUID mp_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ const LLUUID mp_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
std::copy_if(selected_uuid_set.begin(),
selected_uuid_set.end(),
std::back_inserter(ids),
@@ -2723,36 +3261,7 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
{
if (ids.size() == 1)
{
- LLInventoryCategory* inv_cat = gInventory.getCategory(*ids.begin());
- if (!inv_cat || LLFolderType::lookupIsProtectedType(inv_cat->getPreferredType()))
- {
- return;
- }
- const LLUUID &new_cat_uuid = inv_cat->getParentUUID();
- LLInventoryModel::cat_array_t* cat_array;
- LLInventoryModel::item_array_t* item_array;
- gInventory.getDirectDescendentsOf(inv_cat->getUUID(), cat_array, item_array);
- LLInventoryModel::cat_array_t cats = *cat_array;
- LLInventoryModel::item_array_t items = *item_array;
-
- for (LLInventoryModel::cat_array_t::const_iterator cat_iter = cats.begin(); cat_iter != cats.end(); ++cat_iter)
- {
- LLViewerInventoryCategory* cat = *cat_iter;
- if (cat)
- {
- gInventory.changeCategoryParent(cat, new_cat_uuid, false);
- }
- }
- for (LLInventoryModel::item_array_t::const_iterator item_iter = items.begin(); item_iter != items.end(); ++item_iter)
- {
- LLViewerInventoryItem* item = *item_iter;
- if(item)
- {
- gInventory.changeItemParent(item, new_cat_uuid, false);
- }
- }
- gInventory.removeCategory(inv_cat->getUUID());
- gInventory.notifyObservers();
+ ungroup_folder_items(*ids.begin());
}
}
else
@@ -2766,6 +3275,14 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
if(!bridge) continue;
bridge->performAction(model, action);
}
+ if(root->isSingleFolderMode() && selected_items.empty())
+ {
+ LLInvFVBridge* bridge = (LLInvFVBridge*)root->getViewModelItem();
+ if(bridge)
+ {
+ bridge->performAction(model, action);
+ }
+ }
}
// Update the marketplace listings that have been affected by the operation
@@ -2776,9 +3293,9 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
{
multi_previewp->openFloater(LLSD());
}
- else if (multi_propertiesp)
+ else if (multi_itempropertiesp)
{
- multi_propertiesp->openFloater(LLSD());
+ multi_itempropertiesp->openFloater(LLSD());
}
}
@@ -2866,7 +3383,7 @@ void LLInventoryAction::buildMarketplaceFolders(LLFolderView* root)
// target listing *and* the original listing. So we need to keep track of both.
// Note: do not however put the marketplace listings root itself in this list or the whole marketplace data will be rebuilt.
sMarketplaceFolders.clear();
- const LLUUID &marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ const LLUUID &marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
if (marketplacelistings_id.isNull())
{
return;
diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h
index 56ad6f6496..925217dda3 100644
--- a/indra/newview/llinventoryfunctions.h
+++ b/indra/newview/llinventoryfunctions.h
@@ -75,19 +75,28 @@ void update_all_marketplace_count();
void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::string& new_name);
void copy_inventory_category(LLInventoryModel* model, LLViewerInventoryCategory* cat, const LLUUID& parent_id, const LLUUID& root_copy_id = LLUUID::null, bool move_no_copy_items = false);
+void copy_inventory_category(LLInventoryModel* model, LLViewerInventoryCategory* cat, const LLUUID& parent_id, const LLUUID& root_copy_id, bool move_no_copy_items, inventory_func_type callback);
void copy_inventory_category_content(const LLUUID& new_cat_uuid, LLInventoryModel* model, LLViewerInventoryCategory* cat, const LLUUID& root_copy_id, bool move_no_copy_items);
-// Generates a string containing the path to the item specified by item_id.
+// Generates a string containing the path to the object specified by id (not including the object name).
void append_path(const LLUUID& id, std::string& path);
-typedef boost::function<void(std::string& validation_message, S32 depth, LLError::ELevel log_level)> validation_callback_t;
+// Generates a string containing the path name of the object.
+std::string make_path(const LLInventoryObject* object);
+// Generates a string containing the path name of the object specified by id.
+std::string make_inventory_path(const LLUUID& id);
+
+// Generates a string containing the path name and id of the object.
+std::string make_info(const LLInventoryObject* object);
+// Generates a string containing the path name and id of the object specified by id.
+std::string make_inventory_info(const LLUUID& id);
bool can_move_item_to_marketplace(const LLInventoryCategory* root_folder, LLInventoryCategory* dest_folder, LLInventoryItem* inv_item, std::string& tooltip_msg, S32 bundle_size = 1, bool from_paste = false);
bool can_move_folder_to_marketplace(const LLInventoryCategory* root_folder, LLInventoryCategory* dest_folder, LLInventoryCategory* inv_cat, std::string& tooltip_msg, S32 bundle_size = 1, bool check_items = true, bool from_paste = false);
bool move_item_to_marketplacelistings(LLInventoryItem* inv_item, LLUUID dest_folder, bool copy = false);
bool move_folder_to_marketplacelistings(LLInventoryCategory* inv_cat, const LLUUID& dest_folder, bool copy = false, bool move_no_copy_items = false);
-bool validate_marketplacelistings(LLInventoryCategory* inv_cat, validation_callback_t cb = NULL, bool fix_hierarchy = true, S32 depth = -1, bool notify_observers = true);
+
S32 depth_nesting_in_marketplace(LLUUID cur_uuid);
LLUUID nested_parent_id(LLUUID cur_uuid, S32 depth);
S32 compute_stock_count(LLUUID cat_uuid, bool force_count = false);
@@ -98,10 +107,65 @@ void move_items_to_folder(const LLUUID& new_cat_uuid, const uuid_vec_t& selected
bool is_only_cats_selected(const uuid_vec_t& selected_uuids);
bool is_only_items_selected(const uuid_vec_t& selected_uuids);
+bool can_move_to_outfit(LLInventoryItem* inv_item, BOOL move_is_into_current_outfit);
+bool can_move_to_landmarks(LLInventoryItem* inv_item);
+bool can_move_to_my_outfits(LLInventoryModel* model, LLInventoryCategory* inv_cat, U32 wear_limit);
+std::string get_localized_folder_name(LLUUID cat_uuid);
+void new_folder_window(const LLUUID& folder_id);
+void ungroup_folder_items(const LLUUID& folder_id);
+std::string get_searchable_description(LLInventoryModel* model, const LLUUID& item_id);
+std::string get_searchable_creator_name(LLInventoryModel* model, const LLUUID& item_id);
+std::string get_searchable_UUID(LLInventoryModel* model, const LLUUID& item_id);
+bool can_share_item(const LLUUID& item_id);
+
/** Miscellaneous global functions
** **
*******************************************************************************/
+class LLMarketplaceValidator: public LLSingleton<LLMarketplaceValidator>
+{
+ LLSINGLETON(LLMarketplaceValidator);
+ ~LLMarketplaceValidator();
+ LOG_CLASS(LLMarketplaceValidator);
+public:
+
+ typedef boost::function<void(std::string& validation_message, S32 depth, LLError::ELevel log_level)> validation_msg_callback_t;
+ typedef boost::function<void(bool result)> validation_done_callback_t;
+
+ void validateMarketplaceListings(
+ const LLUUID &category_id,
+ validation_done_callback_t cb_done = NULL,
+ validation_msg_callback_t cb_msg = NULL,
+ bool fix_hierarchy = true,
+ S32 depth = -1);
+
+private:
+ void start();
+
+ class ValidationRequest
+ {
+ public:
+ ValidationRequest(
+ LLUUID category_id,
+ validation_done_callback_t cb_done,
+ validation_msg_callback_t cb_msg,
+ bool fix_hierarchy,
+ S32 depth);
+ LLUUID mCategoryId;
+ validation_done_callback_t mCbDone;
+ validation_msg_callback_t mCbMsg;
+ bool mFixHierarchy;
+ S32 mDepth;
+ };
+
+ bool mValidationInProgress;
+ S32 mPendingCallbacks;
+ bool mPendingResult;
+ // todo: might be a good idea to memorize requests by id and
+ // filter out ones that got multiple validation requests
+ std::queue<ValidationRequest> mValidationQueue;
+};
+
/********************************************************************************
** **
** INVENTORY COLLECTOR FUNCTIONS
@@ -318,6 +382,20 @@ public:
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLFindBrokenLinks
+//
+// Collects broken links
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLFindBrokenLinks : public LLInventoryCollectFunctor
+{
+public:
+ LLFindBrokenLinks() {}
+ virtual ~LLFindBrokenLinks() {}
+ virtual bool operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item);
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLFindByMask
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLFindByMask : public LLInventoryCollectFunctor
@@ -415,6 +493,15 @@ private:
LLWearableType::EType mWearableType;
};
+class LLIsTextureType : public LLInventoryCollectFunctor
+{
+public:
+ LLIsTextureType() {}
+ virtual ~LLIsTextureType() {}
+ virtual bool operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item);
+};
+
/** Filter out wearables-links */
class LLFindActualWearablesOfType : public LLFindWearablesOfType
{
@@ -474,7 +561,7 @@ struct LLInventoryAction
static void saveMultipleTextures(const std::vector<std::string>& filenames, std::set<LLFolderViewItem*> selected_items, LLInventoryModel* model);
- static const int sConfirmOnDeleteItemsNumber;
+ static bool sDeleteConfirmationDisplayed;
private:
static void buildMarketplaceFolders(LLFolderView* root);
diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp
new file mode 100644
index 0000000000..4838ba7a47
--- /dev/null
+++ b/indra/newview/llinventorygallery.cpp
@@ -0,0 +1,3824 @@
+/**
+ * @file llinventorygallery.cpp
+ * @brief LLInventoryGallery class implementation
+ *
+ * $LicenseInfo:firstyear=2023&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2023, 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 "llinventorygallery.h"
+#include "llinventorygallerymenu.h"
+
+#include "llclipboard.h"
+#include "llcommonutils.h"
+#include "lliconctrl.h"
+#include "llinventorybridge.h"
+#include "llinventoryfunctions.h"
+#include "llinventoryicon.h"
+#include "llinventorymodel.h"
+#include "llinventorymodelbackgroundfetch.h"
+#include "llthumbnailctrl.h"
+#include "lltextbox.h"
+#include "llviewerfoldertype.h"
+
+#include "llagent.h"
+#include "llappearancemgr.h"
+#include "llenvironment.h"
+#include "llfriendcard.h"
+#include "llgesturemgr.h"
+#include "llmarketplacefunctions.h"
+#include "llnotificationsutil.h"
+#include "lloutfitobserver.h"
+#include "lltrans.h"
+#include "llviewerassettype.h"
+#include "llviewermessage.h"
+#include "llviewerobjectlist.h"
+#include "llvoavatarself.h"
+
+static LLPanelInjector<LLInventoryGallery> t_inventory_gallery("inventory_gallery");
+
+const S32 GALLERY_ITEMS_PER_ROW_MIN = 2;
+
+// Helper dnd functions
+BOOL dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat, BOOL drop, std::string& tooltip_msg, BOOL is_link);
+BOOL dragItemIntoFolder(LLUUID folder_id, LLInventoryItem* inv_item, BOOL drop, std::string& tooltip_msg, BOOL user_confirm);
+void dropToMyOutfits(LLInventoryCategory* inv_cat);
+
+class LLGalleryPanel: public LLPanel
+{
+public:
+
+ BOOL canFocusChildren() const override
+ {
+ // Tell Tab to not focus children
+ return FALSE;
+ }
+
+protected:
+
+ LLGalleryPanel(const LLPanel::Params& params): LLPanel(params)
+ {
+ };
+
+ friend class LLUICtrlFactory;
+};
+
+//-----------------------------
+// LLInventoryGallery
+//-----------------------------
+
+LLInventoryGallery::LLInventoryGallery(const LLInventoryGallery::Params& p)
+ : LLPanel(),
+ mScrollPanel(NULL),
+ mGalleryPanel(NULL),
+ mLastRowPanel(NULL),
+ mGalleryCreated(false),
+ mRowCount(0),
+ mItemsAddedCount(0),
+ mRowPanelHeight(p.row_panel_height),
+ mVerticalGap(p.vertical_gap),
+ mHorizontalGap(p.horizontal_gap),
+ mItemWidth(p.item_width),
+ mItemHeight(p.item_height),
+ mItemHorizontalGap(p.item_horizontal_gap),
+ mItemsInRow(p.items_in_row),
+ mRowPanWidthFactor(p.row_panel_width_factor),
+ mGalleryWidthFactor(p.gallery_width_factor),
+ mIsInitialized(false),
+ mRootDirty(false),
+ mNeedsArrange(false),
+ mSearchType(LLInventoryFilter::SEARCHTYPE_NAME),
+ mSortOrder(LLInventoryFilter::SO_DATE)
+{
+ updateGalleryWidth();
+ mFilter = new LLInventoryFilter();
+ mCategoriesObserver = new LLInventoryCategoriesObserver();
+ mThumbnailsObserver = new LLThumbnailsObserver();
+ gInventory.addObserver(mThumbnailsObserver);
+
+ mGestureObserver = new LLGalleryGestureObserver(this);
+ LLGestureMgr::instance().addObserver(mGestureObserver);
+
+ mUsername = gAgentUsername;
+ LLStringUtil::toUpper(mUsername);
+}
+
+LLInventoryGallery::Params::Params()
+ : row_panel_height("row_panel_height", 180),
+ vertical_gap("vertical_gap", 10),
+ horizontal_gap("horizontal_gap", 10),
+ item_width("item_width", 150),
+ item_height("item_height", 175),
+ item_horizontal_gap("item_horizontal_gap", 16),
+ items_in_row("items_in_row", GALLERY_ITEMS_PER_ROW_MIN),
+ row_panel_width_factor("row_panel_width_factor", 166),
+ gallery_width_factor("gallery_width_factor", 163)
+{
+ addSynonym(row_panel_height, "row_height");
+}
+
+const LLInventoryGallery::Params& LLInventoryGallery::getDefaultParams()
+{
+ return LLUICtrlFactory::getDefaultParams<LLInventoryGallery>();
+}
+
+BOOL LLInventoryGallery::postBuild()
+{
+ mScrollPanel = getChild<LLScrollContainer>("gallery_scroll_panel");
+ LLPanel::Params params = LLPanel::getDefaultParams();
+ mGalleryPanel = LLUICtrlFactory::create<LLPanel>(params);
+ mMessageTextBox = getChild<LLTextBox>("empty_txt");
+ mInventoryGalleryMenu = new LLInventoryGalleryContextMenu(this);
+ mRootGalleryMenu = new LLInventoryGalleryContextMenu(this);
+ mRootGalleryMenu->setRootFolder(true);
+ return TRUE;
+}
+
+LLInventoryGallery::~LLInventoryGallery()
+{
+ if (gEditMenuHandler == this)
+ {
+ gEditMenuHandler = NULL;
+ }
+
+ delete mInventoryGalleryMenu;
+ delete mRootGalleryMenu;
+ delete mFilter;
+
+ gIdleCallbacks.deleteFunction(onIdle, (void*)this);
+
+ while (!mUnusedRowPanels.empty())
+ {
+ LLPanel* panelp = mUnusedRowPanels.back();
+ mUnusedRowPanels.pop_back();
+ panelp->die();
+ }
+ while (!mUnusedItemPanels.empty())
+ {
+ LLPanel* panelp = mUnusedItemPanels.back();
+ mUnusedItemPanels.pop_back();
+ panelp->die();
+ }
+ while (!mHiddenItems.empty())
+ {
+ LLPanel* panelp = mHiddenItems.back();
+ mHiddenItems.pop_back();
+ panelp->die();
+ }
+
+
+ if (gInventory.containsObserver(mCategoriesObserver))
+ {
+ gInventory.removeObserver(mCategoriesObserver);
+ }
+ delete mCategoriesObserver;
+
+ if (gInventory.containsObserver(mThumbnailsObserver))
+ {
+ gInventory.removeObserver(mThumbnailsObserver);
+ }
+ delete mThumbnailsObserver;
+
+ LLGestureMgr::instance().removeObserver(mGestureObserver);
+ delete mGestureObserver;
+}
+
+void LLInventoryGallery::setRootFolder(const LLUUID cat_id)
+{
+ LLViewerInventoryCategory* category = gInventory.getCategory(cat_id);
+ if(!category || (mFolderID == cat_id))
+ {
+ return;
+ }
+ if(mFolderID.notNull())
+ {
+ mBackwardFolders.push_back(mFolderID);
+ }
+
+ gIdleCallbacks.deleteFunction(onIdle, (void*)this);
+
+ for (const LLUUID& id : mSelectedItemIDs)
+ {
+ if (mItemMap[id])
+ {
+ mItemMap[id]->setSelected(FALSE);
+ }
+ }
+
+ mFolderID = cat_id;
+ mItemsToSelect.clear();
+ mSelectedItemIDs.clear();
+ mItemBuildQuery.clear();
+ mNeedsArrange = false;
+ dirtyRootFolder();
+}
+
+void LLInventoryGallery::dirtyRootFolder()
+{
+ if (getVisible())
+ {
+ updateRootFolder();
+ }
+ else
+ {
+ mRootDirty = true;
+ }
+}
+
+void LLInventoryGallery::updateRootFolder()
+{
+ llassert(mFolderID.notNull());
+ if (mIsInitialized && mFolderID.notNull())
+ {
+ S32 count = mItemsAddedCount;
+ for (S32 i = count - 1; i >= 0; i--)
+ {
+ updateRemovedItem(mItems[i]->getUUID());
+ }
+ S32 hidden_count = mHiddenItems.size();
+ for (S32 i = hidden_count - 1; i >= 0; i--)
+ {
+ updateRemovedItem(mHiddenItems[i]->getUUID());
+ }
+ mItemBuildQuery.clear();
+
+ if (gInventory.containsObserver(mCategoriesObserver))
+ {
+ gInventory.removeObserver(mCategoriesObserver);
+ }
+ delete mCategoriesObserver;
+
+ mCategoriesObserver = new LLInventoryCategoriesObserver();
+
+ if (gInventory.containsObserver(mThumbnailsObserver))
+ {
+ gInventory.removeObserver(mThumbnailsObserver);
+ }
+ delete mThumbnailsObserver;
+ mThumbnailsObserver = new LLThumbnailsObserver();
+ gInventory.addObserver(mThumbnailsObserver);
+ }
+ {
+ mRootChangedSignal();
+
+ gInventory.addObserver(mCategoriesObserver);
+
+ // Start observing changes in selected category.
+ mCategoriesObserver->addCategory(mFolderID,
+ boost::bind(&LLInventoryGallery::refreshList, this, mFolderID));
+
+ LLViewerInventoryCategory* category = gInventory.getCategory(mFolderID);
+ //If not all items are fetched now
+ // the observer will refresh the list as soon as the new items
+ // arrive.
+ category->fetch();
+
+ //refreshList(cat_id);
+ LLInventoryModel::cat_array_t* cat_array;
+ LLInventoryModel::item_array_t* item_array;
+
+ gInventory.getDirectDescendentsOf(mFolderID, cat_array, item_array);
+
+ // Creating a vector of newly collected sub-categories UUIDs.
+ for (LLInventoryModel::cat_array_t::const_iterator iter = cat_array->begin();
+ iter != cat_array->end();
+ iter++)
+ {
+ mItemBuildQuery.insert((*iter)->getUUID());
+ }
+
+ for (LLInventoryModel::item_array_t::const_iterator iter = item_array->begin();
+ iter != item_array->end();
+ iter++)
+ {
+ mItemBuildQuery.insert((*iter)->getUUID());
+ }
+ mIsInitialized = true;
+ mRootDirty = false;
+
+ if (mScrollPanel)
+ {
+ mScrollPanel->goToTop();
+ }
+ }
+
+ LLOutfitObserver::instance().addCOFChangedCallback(boost::bind(&LLInventoryGallery::onCOFChanged, this));
+
+ if (!mGalleryCreated)
+ {
+ initGallery();
+ }
+
+ if (!mItemBuildQuery.empty())
+ {
+ gIdleCallbacks.addFunction(onIdle, (void*)this);
+ }
+}
+
+void LLInventoryGallery::initGallery()
+{
+ if (!mGalleryCreated)
+ {
+ uuid_vec_t cats;
+ getCurrentCategories(cats);
+ int n = cats.size();
+ buildGalleryPanel(n);
+ mScrollPanel->addChild(mGalleryPanel);
+ for (int i = 0; i < n; i++)
+ {
+ addToGallery(mItemMap[cats[i]]);
+ }
+ reArrangeRows();
+ mGalleryCreated = true;
+ }
+}
+
+void LLInventoryGallery::draw()
+{
+ LLPanel::draw();
+ if (mGalleryCreated)
+ {
+ if(!updateRowsIfNeeded())
+ {
+ handleModifiedFilter();
+ }
+ }
+}
+
+void LLInventoryGallery::onVisibilityChange(BOOL new_visibility)
+{
+ if (new_visibility)
+ {
+ if (mRootDirty)
+ {
+ updateRootFolder();
+ }
+ else if (mNeedsArrange)
+ {
+ gIdleCallbacks.addFunction(onIdle, (void*)this);
+ }
+ }
+ LLPanel::onVisibilityChange(new_visibility);
+}
+
+bool LLInventoryGallery::updateRowsIfNeeded()
+{
+ S32 scroll_content_width = mScrollPanel ? mScrollPanel->getVisibleContentRect().getWidth() : getRect().getWidth();
+ if(((scroll_content_width - mRowPanelWidth) > mItemWidth)
+ && mRowCount > 1)
+ {
+ reArrangeRows(1);
+ return true;
+ }
+ else if((mRowPanelWidth > (scroll_content_width + mItemHorizontalGap))
+ && mItemsInRow > GALLERY_ITEMS_PER_ROW_MIN)
+ {
+ reArrangeRows(-1);
+ return true;
+ }
+ return false;
+}
+
+bool compareGalleryItem(LLInventoryGalleryItem* item1, LLInventoryGalleryItem* item2, bool sort_by_date, bool sort_folders_by_name)
+{
+ if (item1->getSortGroup() != item2->getSortGroup())
+ {
+ return (item1->getSortGroup() < item2->getSortGroup());
+ }
+
+ if(sort_folders_by_name && (item1->getSortGroup() != LLInventoryGalleryItem::SG_ITEM))
+ {
+ std::string name1 = item1->getItemName();
+ std::string name2 = item2->getItemName();
+
+ return (LLStringUtil::compareDict(name1, name2) < 0);
+ }
+
+ if(((item1->isDefaultImage() && item2->isDefaultImage()) || (!item1->isDefaultImage() && !item2->isDefaultImage())))
+ {
+ if(sort_by_date)
+ {
+ return item1->getCreationDate() > item2->getCreationDate();
+ }
+ else
+ {
+ std::string name1 = item1->getItemName();
+ std::string name2 = item2->getItemName();
+
+ return (LLStringUtil::compareDict(name1, name2) < 0);
+ }
+ }
+ else
+ {
+ return item2->isDefaultImage();
+ }
+}
+
+void LLInventoryGallery::reArrangeRows(S32 row_diff)
+{
+ std::vector<LLInventoryGalleryItem*> buf_items = mItems;
+ for (std::vector<LLInventoryGalleryItem*>::const_reverse_iterator it = buf_items.rbegin(); it != buf_items.rend(); ++it)
+ {
+ removeFromGalleryLast(*it, false);
+ }
+ for (std::vector<LLInventoryGalleryItem*>::const_reverse_iterator it = mHiddenItems.rbegin(); it != mHiddenItems.rend(); ++it)
+ {
+ buf_items.push_back(*it);
+ }
+ mHiddenItems.clear();
+
+ mItemsInRow+= row_diff;
+ updateGalleryWidth();
+
+ bool sort_by_date = (mSortOrder & LLInventoryFilter::SO_DATE);
+ bool sort_folders_by_name = (mSortOrder & LLInventoryFilter::SO_FOLDERS_BY_NAME);
+ std::sort(buf_items.begin(), buf_items.end(), [sort_by_date, sort_folders_by_name](LLInventoryGalleryItem* item1, LLInventoryGalleryItem* item2)
+ {
+ return compareGalleryItem(item1, item2, sort_by_date, sort_folders_by_name);
+ });
+
+ for (std::vector<LLInventoryGalleryItem*>::const_iterator it = buf_items.begin(); it != buf_items.end(); ++it)
+ {
+ (*it)->setHidden(false);
+ applyFilter(*it, mFilterSubString);
+ addToGallery(*it);
+ }
+ mFilter->clearModified();
+ updateMessageVisibility();
+}
+
+void LLInventoryGallery::updateGalleryWidth()
+{
+ mRowPanelWidth = mRowPanWidthFactor * mItemsInRow - mItemHorizontalGap;
+ mGalleryWidth = mGalleryWidthFactor * mItemsInRow - mItemHorizontalGap;
+}
+
+LLPanel* LLInventoryGallery::addLastRow()
+{
+ mRowCount++;
+ int row = 0;
+ int vgap = mVerticalGap * row;
+ LLPanel* result = buildRowPanel(0, row * mRowPanelHeight + vgap);
+ mGalleryPanel->addChild(result);
+ return result;
+}
+
+void LLInventoryGallery::moveRowUp(int row)
+{
+ moveRow(row, mRowCount - 1 - row + 1);
+}
+
+void LLInventoryGallery::moveRowDown(int row)
+{
+ moveRow(row, mRowCount - 1 - row - 1);
+}
+
+void LLInventoryGallery::moveRow(int row, int pos)
+{
+ int vgap = mVerticalGap * pos;
+ moveRowPanel(mRowPanels[row], 0, pos * mRowPanelHeight + vgap);
+}
+
+void LLInventoryGallery::removeLastRow()
+{
+ mRowCount--;
+ mGalleryPanel->removeChild(mLastRowPanel);
+ mUnusedRowPanels.push_back(mLastRowPanel);
+ mRowPanels.pop_back();
+ if (mRowPanels.size() > 0)
+ {
+ // Just removed last row
+ mLastRowPanel = mRowPanels.back();
+ }
+ else
+ {
+ mLastRowPanel = NULL;
+ }
+}
+
+LLPanel* LLInventoryGallery::addToRow(LLPanel* row_stack, LLInventoryGalleryItem* item, int pos, int hgap)
+{
+ LLPanel* lpanel = buildItemPanel(pos * mItemWidth + hgap);
+ lpanel->addChild(item);
+ row_stack->addChild(lpanel);
+ mItemPanels.push_back(lpanel);
+ return lpanel;
+}
+
+void LLInventoryGallery::addToGallery(LLInventoryGalleryItem* item)
+{
+ if(item->isHidden())
+ {
+ mHiddenItems.push_back(item);
+ return;
+ }
+ mItemIndexMap[item] = mItemsAddedCount;
+ mIndexToItemMap[mItemsAddedCount] = item;
+ mItemsAddedCount++;
+ int n = mItemsAddedCount;
+ int row_count = (n % mItemsInRow) == 0 ? n / mItemsInRow : n / mItemsInRow + 1;
+ int n_prev = n - 1;
+ int row_count_prev = (n_prev % mItemsInRow) == 0 ? n_prev / mItemsInRow : n_prev / mItemsInRow + 1;
+
+ bool add_row = row_count != row_count_prev;
+ int pos = 0;
+ if (add_row)
+ {
+ for (int i = 0; i < row_count_prev; i++)
+ {
+ moveRowUp(i);
+ }
+ mLastRowPanel = addLastRow();
+ mRowPanels.push_back(mLastRowPanel);
+ }
+ pos = (n - 1) % mItemsInRow;
+ mItems.push_back(item);
+ addToRow(mLastRowPanel, item, pos, mHorizontalGap * pos);
+ reshapeGalleryPanel(row_count);
+}
+
+
+void LLInventoryGallery::removeFromGalleryLast(LLInventoryGalleryItem* item, bool needs_reshape)
+{
+ if(item->isHidden())
+ {
+ mHiddenItems.pop_back();
+ // Note: item still exists!!!
+ return;
+ }
+ int n_prev = mItemsAddedCount;
+ int n = mItemsAddedCount - 1;
+ int row_count = (n % mItemsInRow) == 0 ? n / mItemsInRow : n / mItemsInRow + 1;
+ int row_count_prev = (n_prev % mItemsInRow) == 0 ? n_prev / mItemsInRow : n_prev / mItemsInRow + 1;
+ mItemsAddedCount--;
+ mIndexToItemMap.erase(mItemsAddedCount);
+
+ bool remove_row = row_count != row_count_prev;
+ removeFromLastRow(mItems[mItemsAddedCount]);
+ mItems.pop_back();
+ if (remove_row)
+ {
+ for (int i = 0; i < row_count_prev - 1; i++)
+ {
+ moveRowDown(i);
+ }
+ removeLastRow();
+ }
+ if (needs_reshape)
+ {
+ reshapeGalleryPanel(row_count);
+ }
+}
+
+
+void LLInventoryGallery::removeFromGalleryMiddle(LLInventoryGalleryItem* item)
+{
+ if(item->isHidden())
+ {
+ mHiddenItems.erase(std::remove(mHiddenItems.begin(), mHiddenItems.end(), item), mHiddenItems.end());
+ // item still exists and needs to be deleted or used!!!
+ return;
+ }
+ int n = mItemIndexMap[item];
+ mItemIndexMap.erase(item);
+ mIndexToItemMap.erase(n);
+ std::vector<LLInventoryGalleryItem*> saved;
+ for (int i = mItemsAddedCount - 1; i > n; i--)
+ {
+ saved.push_back(mItems[i]);
+ removeFromGalleryLast(mItems[i]);
+ }
+ removeFromGalleryLast(mItems[n]);
+ int saved_count = saved.size();
+ for (int i = 0; i < saved_count; i++)
+ {
+ addToGallery(saved.back());
+ saved.pop_back();
+ }
+}
+
+void LLInventoryGallery::removeFromLastRow(LLInventoryGalleryItem* item)
+{
+ mItemPanels.back()->removeChild(item);
+ mLastRowPanel->removeChild(mItemPanels.back());
+ mUnusedItemPanels.push_back(mItemPanels.back());
+ mItemPanels.pop_back();
+}
+
+LLInventoryGalleryItem* LLInventoryGallery::buildGalleryItem(std::string name, LLUUID item_id, LLAssetType::EType type, LLUUID thumbnail_id, LLInventoryType::EType inventory_type, U32 flags, time_t creation_date, bool is_link, bool is_worn)
+{
+ LLInventoryGalleryItem::Params giparams;
+ giparams.visible = true;
+ giparams.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP);
+ giparams.rect(LLRect(0,mItemHeight, mItemWidth, 0));
+ LLInventoryGalleryItem* gitem = LLUICtrlFactory::create<LLInventoryGalleryItem>(giparams);
+ gitem->setItemName(name);
+ gitem->setUUID(item_id);
+ gitem->setGallery(this);
+ gitem->setType(type, inventory_type, flags, is_link);
+ gitem->setThumbnail(thumbnail_id);
+ gitem->setWorn(is_worn);
+ gitem->setCreatorName(get_searchable_creator_name(&gInventory, item_id));
+ gitem->setDescription(get_searchable_description(&gInventory, item_id));
+ gitem->setAssetIDStr(get_searchable_UUID(&gInventory, item_id));
+ gitem->setCreationDate(creation_date);
+ return gitem;
+}
+
+void LLInventoryGallery::buildGalleryPanel(int row_count)
+{
+ LLPanel::Params params;
+ params.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP);
+ params.visible = true;
+ params.use_bounding_rect = false;
+ mGalleryPanel = LLUICtrlFactory::create<LLGalleryPanel>(params);
+ reshapeGalleryPanel(row_count);
+}
+
+void LLInventoryGallery::reshapeGalleryPanel(int row_count)
+{
+ int bottom = 0;
+ int left = 0;
+ int height = row_count * (mRowPanelHeight + mVerticalGap);
+ LLRect rect = LLRect(left, bottom + height, left + mGalleryWidth, bottom);
+ mGalleryPanel->setRect(rect);
+ mGalleryPanel->reshape(mGalleryWidth, height);
+}
+
+LLPanel* LLInventoryGallery::buildItemPanel(int left)
+{
+ int top = 0;
+ LLPanel* lpanel = NULL;
+ if(mUnusedItemPanels.empty())
+ {
+ LLPanel::Params lpparams;
+ lpparams.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP);
+ lpparams.visible = true;
+ lpparams.rect(LLRect(left, top + mItemHeight, left + mItemWidth + mItemHorizontalGap, top));
+ lpparams.use_bounding_rect = false;
+ lpparams.focus_root = false;
+ //lpparams.tab_stop = false;
+ lpanel = LLUICtrlFactory::create<LLPanel>(lpparams);
+ }
+ else
+ {
+ lpanel = mUnusedItemPanels.back();
+ mUnusedItemPanels.pop_back();
+
+ LLRect rect = LLRect(left, top + mItemHeight, left + mItemWidth + mItemHorizontalGap, top);
+ lpanel->setShape(rect, false);
+ }
+ return lpanel;
+}
+
+LLPanel* LLInventoryGallery::buildRowPanel(int left, int bottom)
+{
+ LLPanel* stack = NULL;
+ if(mUnusedRowPanels.empty())
+ {
+ LLPanel::Params sparams;
+ sparams.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP);
+ sparams.use_bounding_rect = false;
+ sparams.visible = true;
+ sparams.focus_root = false;
+ //sparams.tab_stop = false;
+ stack = LLUICtrlFactory::create<LLPanel>(sparams);
+ }
+ else
+ {
+ stack = mUnusedRowPanels.back();
+ mUnusedRowPanels.pop_back();
+ }
+ moveRowPanel(stack, left, bottom);
+ return stack;
+}
+
+void LLInventoryGallery::moveRowPanel(LLPanel* stack, int left, int bottom)
+{
+ LLRect rect = LLRect(left, bottom + mRowPanelHeight, left + mRowPanelWidth, bottom);
+ stack->setRect(rect);
+ stack->reshape(mRowPanelWidth, mRowPanelHeight);
+}
+
+void LLInventoryGallery::setFilterSubString(const std::string& string)
+{
+ mFilterSubString = string;
+ mFilter->setFilterSubString(string);
+
+ //reArrangeRows();
+}
+
+bool LLInventoryGallery::applyFilter(LLInventoryGalleryItem* item, const std::string& filter_substring)
+{
+ if(item)
+ {
+ bool visible = checkAgainstFilters(item, filter_substring);
+ item->setHidden(!visible);
+ return visible;
+ }
+ return false;
+}
+
+bool LLInventoryGallery::checkAgainstFilters(LLInventoryGalleryItem* item, const std::string& filter_substring)
+{
+ if (!item) return false;
+
+ if (item->isFolder() && (mFilter->getShowFolderState() == LLInventoryFilter::SHOW_ALL_FOLDERS))
+ {
+ return true;
+ }
+
+ if(item->isLink() && ((mFilter->getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_LINKS) == 0) && !filter_substring.empty())
+ {
+ return false;
+ }
+
+ bool hidden = false;
+
+ if(mFilter->getFilterCreatorType() == LLInventoryFilter::FILTERCREATOR_SELF)
+ {
+ hidden = (item->getCreatorName() == mUsername) || item->isFolder();
+ }
+ else if(mFilter->getFilterCreatorType() == LLInventoryFilter::FILTERCREATOR_OTHERS)
+ {
+ hidden = (item->getCreatorName() != mUsername) || item->isFolder();
+ }
+ if(hidden)
+ {
+ return false;
+ }
+
+ if(!mFilter->checkAgainstFilterThumbnails(item->getUUID()))
+ {
+ return false;
+ }
+
+ if(!checkAgainstFilterType(item->getUUID()))
+ {
+ return false;
+ }
+
+ std::string desc;
+ switch(mSearchType)
+ {
+ case LLInventoryFilter::SEARCHTYPE_CREATOR:
+ desc = item->getCreatorName();
+ break;
+ case LLInventoryFilter::SEARCHTYPE_DESCRIPTION:
+ desc = item->getDescription();
+ break;
+ case LLInventoryFilter::SEARCHTYPE_UUID:
+ desc = item->getAssetIDStr();
+ break;
+ case LLInventoryFilter::SEARCHTYPE_NAME:
+ default:
+ desc = item->getItemName() + item->getItemNameSuffix();
+ break;
+ }
+
+ LLStringUtil::toUpper(desc);
+
+ std::string cur_filter = filter_substring;
+ LLStringUtil::toUpper(cur_filter);
+
+ hidden = (std::string::npos == desc.find(cur_filter));
+ return !hidden;
+}
+
+void LLInventoryGallery::onIdle(void* userdata)
+{
+ LLInventoryGallery* self = (LLInventoryGallery*)userdata;
+
+ if (!self->mIsInitialized || !self->mGalleryCreated)
+ {
+ self->mNeedsArrange = false;
+ return;
+ }
+
+ bool visible = self->getVisible(); // In visible chain?
+ const F64 MAX_TIME_VISIBLE = 0.020f;
+ const F64 MAX_TIME_HIDDEN = 0.001f; // take it slow
+ const F64 max_time = visible ? MAX_TIME_VISIBLE : MAX_TIME_HIDDEN;
+ F64 curent_time = LLTimer::getTotalSeconds();
+ const F64 end_time = curent_time + max_time;
+
+ while (!self->mItemBuildQuery.empty() && end_time > curent_time)
+ {
+ uuid_set_t::iterator iter = self->mItemBuildQuery.begin();
+ LLUUID item_id = *iter;
+ self->mNeedsArrange |= self->updateAddedItem(item_id);
+ self->mItemBuildQuery.erase(iter);
+ curent_time = LLTimer::getTotalSeconds();
+ }
+
+ if (self->mNeedsArrange && visible)
+ {
+ self->mNeedsArrange = false;
+ self->reArrangeRows();
+ self->updateMessageVisibility();
+ }
+
+ if (!self->mItemsToSelect.empty() && !self->mNeedsArrange)
+ {
+ selection_deque selection_list(self->mItemsToSelect);
+ self->mItemsToSelect.clear();
+ for (LLUUID & item_to_select : selection_list)
+ {
+ self->addItemSelection(item_to_select, true);
+ }
+ }
+
+ if (self->mItemsToSelect.empty() && self->mItemBuildQuery.empty())
+ {
+ gIdleCallbacks.deleteFunction(onIdle, (void*)self);
+ }
+}
+
+void LLInventoryGallery::setSearchType(LLInventoryFilter::ESearchType type)
+{
+ if(mSearchType != type)
+ {
+ mSearchType = type;
+ if(!mFilterSubString.empty())
+ {
+ reArrangeRows();
+ }
+ }
+}
+
+void LLInventoryGallery::getCurrentCategories(uuid_vec_t& vcur)
+{
+ for (gallery_item_map_t::const_iterator iter = mItemMap.begin();
+ iter != mItemMap.end();
+ iter++)
+ {
+ if ((*iter).second != NULL)
+ {
+ vcur.push_back((*iter).first);
+ }
+ }
+}
+
+bool LLInventoryGallery::updateAddedItem(LLUUID item_id)
+{
+ LLInventoryObject* obj = gInventory.getObject(item_id);
+ if (!obj)
+ {
+ LL_WARNS("InventoryGallery") << "Failed to find item: " << item_id << LL_ENDL;
+ return false;
+ }
+
+ std::string name = obj->getName();
+ LLUUID thumbnail_id = obj->getThumbnailUUID();;
+ LLInventoryType::EType inventory_type(LLInventoryType::IT_CATEGORY);
+ U32 misc_flags = 0;
+ bool is_worn = false;
+ LLInventoryItem* inv_item = gInventory.getItem(item_id);
+ if (inv_item)
+ {
+ inventory_type = inv_item->getInventoryType();
+ misc_flags = inv_item->getFlags();
+ if (LLAssetType::AT_GESTURE == obj->getType())
+ {
+ is_worn = LLGestureMgr::instance().isGestureActive(item_id);
+ }
+ else
+ {
+ is_worn = LLAppearanceMgr::instance().isLinkedInCOF(item_id);
+ }
+ }
+ else if (LLAssetType::AT_CATEGORY == obj->getType())
+ {
+ name = get_localized_folder_name(item_id);
+ if(thumbnail_id.isNull())
+ {
+ thumbnail_id = getOutfitImageID(item_id);
+ }
+ }
+
+ bool res = false;
+
+ LLInventoryGalleryItem* item = buildGalleryItem(name, item_id, obj->getType(), thumbnail_id, inventory_type, misc_flags, obj->getCreationDate(), obj->getIsLinkType(), is_worn);
+ mItemMap.insert(LLInventoryGallery::gallery_item_map_t::value_type(item_id, item));
+ if (mGalleryCreated)
+ {
+ res = applyFilter(item, mFilterSubString);
+ addToGallery(item);
+ }
+
+ mThumbnailsObserver->addItem(item_id,
+ boost::bind(&LLInventoryGallery::updateItemThumbnail, this, item_id));
+ return res;
+}
+
+void LLInventoryGallery::updateRemovedItem(LLUUID item_id)
+{
+ gallery_item_map_t::iterator item_iter = mItemMap.find(item_id);
+ if (item_iter != mItemMap.end())
+ {
+ mThumbnailsObserver->removeItem(item_id);
+
+ LLInventoryGalleryItem* item = item_iter->second;
+
+ deselectItem(item_id);
+ mItemMap.erase(item_iter);
+ removeFromGalleryMiddle(item);
+
+ // kill removed item
+ if (item != NULL)
+ {
+ // Todo: instead of deleting, store somewhere to reuse later
+ item->die();
+ }
+ }
+
+ mItemBuildQuery.erase(item_id);
+}
+
+void LLInventoryGallery::updateChangedItemName(LLUUID item_id, std::string name)
+{
+ gallery_item_map_t::iterator iter = mItemMap.find(item_id);
+ if (iter != mItemMap.end())
+ {
+ LLInventoryGalleryItem* item = iter->second;
+ if (item)
+ {
+ item->setItemName(name);
+ }
+ }
+}
+
+void LLInventoryGallery::updateWornItem(LLUUID item_id, bool is_worn)
+{
+ gallery_item_map_t::iterator iter = mItemMap.find(item_id);
+ if (iter != mItemMap.end())
+ {
+ LLInventoryGalleryItem* item = iter->second;
+ if (item)
+ {
+ item->setWorn(is_worn);
+ }
+ }
+}
+
+void LLInventoryGallery::updateItemThumbnail(LLUUID item_id)
+{
+ LLInventoryObject* obj = gInventory.getObject(item_id);
+ if (!obj)
+ {
+ return;
+ }
+ LLUUID thumbnail_id = obj->getThumbnailUUID();
+
+ if ((LLAssetType::AT_CATEGORY == obj->getType()) && thumbnail_id.isNull())
+ {
+ thumbnail_id = getOutfitImageID(item_id);
+ }
+
+ if (mItemMap[item_id])
+ {
+ mItemMap[item_id]->setThumbnail(thumbnail_id);
+
+ bool passes_filter = checkAgainstFilters(mItemMap[item_id], mFilterSubString);
+ if((mItemMap[item_id]->isHidden() && passes_filter)
+ || (!mItemMap[item_id]->isHidden() && !passes_filter))
+ {
+ reArrangeRows();
+ }
+ }
+}
+
+BOOL LLInventoryGallery::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ if (mSelectedItemIDs.size() > 0)
+ {
+ setFocus(true);
+ }
+ mLastInteractedUUID = LLUUID::null;
+
+ // Scroll is going to always return true
+ BOOL res = LLPanel::handleRightMouseDown(x, y, mask);
+
+ if (mLastInteractedUUID.isNull()) // no child were hit
+ {
+ clearSelection();
+ if (mInventoryGalleryMenu && mFolderID.notNull())
+ {
+ uuid_vec_t selected_uuids;
+ selected_uuids.push_back(mFolderID);
+ mRootGalleryMenu->show(this, selected_uuids, x, y);
+ return TRUE;
+ }
+ }
+ return res;
+}
+
+
+BOOL LLInventoryGallery::handleKeyHere(KEY key, MASK mask)
+{
+ BOOL handled = FALSE;
+ switch (key)
+ {
+ case KEY_RETURN:
+ // Open selected items if enter key hit on the inventory panel
+ if (mask == MASK_NONE && mInventoryGalleryMenu && mSelectedItemIDs.size() == 1)
+ {
+ selection_deque::iterator iter = mSelectedItemIDs.begin();
+ LLViewerInventoryCategory* category = gInventory.getCategory(*iter);
+ if (category)
+ {
+ setRootFolder(*iter);
+ handled = TRUE;
+ }
+ else
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(*iter);
+ if (item)
+ {
+ LLInvFVBridgeAction::doAction(item->getType(), *iter, &gInventory);
+ }
+ }
+ }
+ handled = TRUE;
+ break;
+ case KEY_DELETE:
+#if LL_DARWIN
+ case KEY_BACKSPACE:
+#endif
+ // Delete selected items if delete or backspace key hit on the inventory panel
+ // Note: on Mac laptop keyboards, backspace and delete are one and the same
+ if (canDeleteSelection())
+ {
+ deleteSelection();
+ }
+ handled = TRUE;
+ break;
+
+ case KEY_F2:
+ mFilterSubString.clear();
+ if (mInventoryGalleryMenu && mSelectedItemIDs.size() == 1)
+ {
+ mInventoryGalleryMenu->rename(mSelectedItemIDs.front());
+ }
+ handled = TRUE;
+ break;
+
+ case KEY_PAGE_UP:
+ mFilterSubString.clear();
+ if (mScrollPanel)
+ {
+ mScrollPanel->pageUp(30);
+ }
+ handled = TRUE;
+ break;
+
+ case KEY_PAGE_DOWN:
+ mFilterSubString.clear();
+ if (mScrollPanel)
+ {
+ mScrollPanel->pageDown(30);
+ }
+ handled = TRUE;
+ break;
+
+ case KEY_HOME:
+ mFilterSubString.clear();
+ if (mScrollPanel)
+ {
+ mScrollPanel->goToTop();
+ }
+ handled = TRUE;
+ break;
+
+ case KEY_END:
+ mFilterSubString.clear();
+ if (mScrollPanel)
+ {
+ mScrollPanel->goToBottom();
+ }
+ handled = TRUE;
+ break;
+
+ case KEY_LEFT:
+ moveLeft(mask);
+ handled = TRUE;
+ break;
+
+ case KEY_RIGHT:
+ moveRight(mask);
+ handled = TRUE;
+ break;
+
+ case KEY_UP:
+ moveUp(mask);
+ handled = TRUE;
+ break;
+
+ case KEY_DOWN:
+ moveDown(mask);
+ handled = TRUE;
+ break;
+
+ default:
+ break;
+ }
+
+ if (handled)
+ {
+ mInventoryGalleryMenu->hide();
+ }
+
+ return handled;
+}
+
+void LLInventoryGallery::moveUp(MASK mask)
+{
+ mFilterSubString.clear();
+
+ if (mInventoryGalleryMenu && mSelectedItemIDs.size() > 0 && mItemsAddedCount > 1)
+ {
+ LLInventoryGalleryItem* item = mItemMap[mLastInteractedUUID];
+ if (item)
+ {
+ if (mask == MASK_NONE || mask == MASK_CONTROL)
+ {
+ S32 n = mItemIndexMap[item];
+ n -= mItemsInRow;
+ if (n >= 0)
+ {
+ item = mIndexToItemMap[n];
+ LLUUID item_id = item->getUUID();
+ if (mask == MASK_CONTROL)
+ {
+ addItemSelection(item_id, true);
+ }
+ else
+ {
+ changeItemSelection(item_id, true);
+ }
+ item->setFocus(TRUE);
+ claimEditHandler();
+ }
+ }
+ else if (mask == MASK_SHIFT)
+ {
+ S32 n = mItemIndexMap[item];
+ S32 target = llmax(0, n - mItemsInRow);
+ if (target != n)
+ {
+ item = mIndexToItemMap[target];
+ toggleSelectionRangeFromLast(item->getUUID());
+ item->setFocus(TRUE);
+ claimEditHandler();
+ }
+ }
+ }
+ }
+}
+
+void LLInventoryGallery::moveDown(MASK mask)
+{
+ mFilterSubString.clear();
+
+ if (mInventoryGalleryMenu && mSelectedItemIDs.size() > 0 && mItemsAddedCount > 1)
+ {
+ LLInventoryGalleryItem* item = mItemMap[mLastInteractedUUID];
+ if (item)
+ {
+ if (mask == MASK_NONE || mask == MASK_CONTROL)
+ {
+ S32 n = mItemIndexMap[item];
+ n += mItemsInRow;
+ if (n < mItemsAddedCount)
+ {
+ item = mIndexToItemMap[n];
+ LLUUID item_id = item->getUUID();
+ if (mask == MASK_CONTROL)
+ {
+ addItemSelection(item_id, true);
+ }
+ else
+ {
+ changeItemSelection(item_id, true);
+ }
+ item->setFocus(TRUE);
+ claimEditHandler();
+ }
+ }
+ else if (mask == MASK_SHIFT)
+ {
+ S32 n = mItemIndexMap[item];
+ S32 target = llmin(mItemsAddedCount - 1, n + mItemsInRow);
+ if (target != n)
+ {
+ item = mIndexToItemMap[target];
+ toggleSelectionRangeFromLast(item->getUUID());
+ item->setFocus(TRUE);
+ claimEditHandler();
+ }
+ }
+ }
+ }
+}
+
+void LLInventoryGallery::moveLeft(MASK mask)
+{
+ mFilterSubString.clear();
+
+ if (mInventoryGalleryMenu && mSelectedItemIDs.size() > 0 && mItemsAddedCount > 1)
+ {
+ LLInventoryGalleryItem* item = mItemMap[mLastInteractedUUID];
+ if (mask == MASK_SHIFT)
+ {
+ item = mItemMap[mLastInteractedUUID];
+ }
+ if (item)
+ {
+ // Might be better to get item from panel
+ S32 n = mItemIndexMap[item];
+ n--;
+ if (n < 0)
+ {
+ n = mItemsAddedCount - 1;
+ }
+ item = mIndexToItemMap[n];
+ LLUUID item_id = item->getUUID();
+ if (mask == MASK_CONTROL)
+ {
+ addItemSelection(item_id, true);
+ }
+ else if (mask == MASK_SHIFT)
+ {
+ if (item->isSelected())
+ {
+ toggleItemSelection(mLastInteractedUUID, true);
+ }
+ else
+ {
+ toggleItemSelection(item_id, true);
+ }
+ mLastInteractedUUID = item_id;
+ }
+ else
+ {
+ changeItemSelection(item_id, true);
+ }
+ item->setFocus(TRUE);
+ claimEditHandler();
+ }
+ }
+}
+
+void LLInventoryGallery::moveRight(MASK mask)
+{
+ mFilterSubString.clear();
+
+ if (mInventoryGalleryMenu && mSelectedItemIDs.size() > 0 && mItemsAddedCount > 1)
+ {
+ LLInventoryGalleryItem* item = mItemMap[mLastInteractedUUID];
+ if (item)
+ {
+ S32 n = mItemIndexMap[item];
+ n++;
+ if (n == mItemsAddedCount)
+ {
+ n = 0;
+ }
+ item = mIndexToItemMap[n];
+ LLUUID item_id = item->getUUID();
+ if (mask == MASK_CONTROL)
+ {
+ addItemSelection(item_id, true);
+ }
+ else if (mask == MASK_SHIFT)
+ {
+ if (item->isSelected())
+ {
+ toggleItemSelection(mLastInteractedUUID, true);
+ }
+ else
+ {
+ toggleItemSelection(item_id, true);
+ }
+ mLastInteractedUUID = item_id;
+ }
+ else
+ {
+ changeItemSelection(item_id, true);
+ }
+ item->setFocus(TRUE);
+ claimEditHandler();
+ }
+ }
+}
+
+void LLInventoryGallery::toggleSelectionRange(S32 start_idx, S32 end_idx)
+{
+ LLInventoryGalleryItem* item = NULL;
+ if (end_idx > start_idx)
+ {
+ for (S32 i = start_idx; i <= end_idx; i++)
+ {
+ item = mIndexToItemMap[i];
+ LLUUID item_id = item->getUUID();
+ toggleItemSelection(item_id, true);
+ }
+ }
+ else
+ {
+ for (S32 i = start_idx; i >= end_idx; i--)
+ {
+ item = mIndexToItemMap[i];
+ LLUUID item_id = item->getUUID();
+ toggleItemSelection(item_id, true);
+ }
+ }
+}
+
+void LLInventoryGallery::toggleSelectionRangeFromLast(const LLUUID target)
+{
+ if (mLastInteractedUUID == target)
+ {
+ return;
+ }
+ LLInventoryGalleryItem* last_item = mItemMap[mLastInteractedUUID];
+ LLInventoryGalleryItem* next_item = mItemMap[target];
+ if (last_item && next_item)
+ {
+ S32 last_idx = mItemIndexMap[last_item];
+ S32 next_idx = mItemIndexMap[next_item];
+ if (next_item->isSelected())
+ {
+ if (last_idx < next_idx)
+ {
+ toggleSelectionRange(last_idx, next_idx - 1);
+ }
+ else
+ {
+ toggleSelectionRange(last_idx, next_idx + 1);
+ }
+ }
+ else
+ {
+ if (last_idx < next_idx)
+ {
+ toggleSelectionRange(last_idx + 1, next_idx);
+ }
+ else
+ {
+ toggleSelectionRange(last_idx - 1, next_idx);
+ }
+ }
+ }
+ mLastInteractedUUID = next_item->getUUID();
+}
+
+void LLInventoryGallery::onFocusLost()
+{
+ // inventory no longer handles cut/copy/paste/delete
+ if (gEditMenuHandler == this)
+ {
+ gEditMenuHandler = NULL;
+ }
+
+ LLPanel::onFocusLost();
+
+ for (const LLUUID& id : mSelectedItemIDs)
+ {
+ if (mItemMap[id])
+ {
+ mItemMap[id]->setSelected(false);
+ }
+ }
+}
+
+void LLInventoryGallery::onFocusReceived()
+{
+ // inventory now handles cut/copy/paste/delete
+ gEditMenuHandler = this;
+
+ // Tab support, when tabbing into this view, select first item
+ if (mSelectedItemIDs.size() > 0)
+ {
+ LLInventoryGalleryItem* focus_item = NULL;
+ for (const LLUUID& id : mSelectedItemIDs)
+ {
+ if (mItemMap[id])
+ {
+ focus_item = mItemMap[id];
+ focus_item->setSelected(true);
+ }
+ }
+ if (focus_item)
+ {
+ focus_item->setFocus(TRUE);
+ }
+ }
+ else if (mIndexToItemMap.size() > 0 && mItemsToSelect.empty())
+ {
+ // choose any items from visible rect
+ S32 vert_offset = mScrollPanel->getDocPosVertical();
+ S32 panel_size = mVerticalGap + mRowPanelHeight;
+ S32 n = llclamp((S32)(vert_offset / panel_size) * mItemsInRow, 0, (S32)(mIndexToItemMap.size() - 1) );
+
+ LLInventoryGalleryItem* focus_item = mIndexToItemMap[n];
+ changeItemSelection(focus_item->getUUID(), true);
+ focus_item->setFocus(TRUE);
+ }
+
+ LLPanel::onFocusReceived();
+}
+
+void LLInventoryGallery::showContextMenu(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& item_id)
+{
+ if (mInventoryGalleryMenu && item_id.notNull())
+ {
+ if (std::find(mSelectedItemIDs.begin(), mSelectedItemIDs.end(), item_id) == mSelectedItemIDs.end())
+ {
+ changeItemSelection(item_id, false);
+ }
+ uuid_vec_t selected_uuids(mSelectedItemIDs.begin(), mSelectedItemIDs.end());
+ mInventoryGalleryMenu->show(ctrl, selected_uuids, x, y);
+ }
+}
+
+void LLInventoryGallery::changeItemSelection(const LLUUID& item_id, bool scroll_to_selection)
+{
+ for (const LLUUID& id : mSelectedItemIDs)
+ {
+ if (mItemMap[id])
+ {
+ mItemMap[id]->setSelected(FALSE);
+ }
+ }
+ mSelectedItemIDs.clear();
+ mItemsToSelect.clear();
+
+ if ((mItemMap.count(item_id) == 0) || mNeedsArrange)
+ {
+ mItemsToSelect.push_back(item_id);
+ return;
+ }
+ if (mSelectedItemIDs.size() == 1
+ && std::find(mSelectedItemIDs.begin(), mSelectedItemIDs.end(), item_id) != mSelectedItemIDs.end())
+ {
+ // Already selected
+ mLastInteractedUUID = item_id;
+ return;
+ }
+
+ if (mItemMap[item_id])
+ {
+ mItemMap[item_id]->setSelected(TRUE);
+ }
+ mSelectedItemIDs.push_back(item_id);
+ signalSelectionItemID(item_id);
+ mLastInteractedUUID = item_id;
+
+ if (scroll_to_selection)
+ {
+ scrollToShowItem(item_id);
+ }
+}
+
+void LLInventoryGallery::addItemSelection(const LLUUID& item_id, bool scroll_to_selection)
+{
+ if ((mItemMap.count(item_id) == 0) || mNeedsArrange)
+ {
+ mItemsToSelect.push_back(item_id);
+ return;
+ }
+ if (std::find(mSelectedItemIDs.begin(), mSelectedItemIDs.end(), item_id) != mSelectedItemIDs.end())
+ {
+ // Already selected
+ mLastInteractedUUID = item_id;
+ return;
+ }
+
+ if (mItemMap[item_id])
+ {
+ mItemMap[item_id]->setSelected(TRUE);
+ }
+ mSelectedItemIDs.push_back(item_id);
+ signalSelectionItemID(item_id);
+ mLastInteractedUUID = item_id;
+
+ if (scroll_to_selection)
+ {
+ scrollToShowItem(item_id);
+ }
+}
+
+bool LLInventoryGallery::toggleItemSelection(const LLUUID& item_id, bool scroll_to_selection)
+{
+ bool result = false;
+ if ((mItemMap.count(item_id) == 0) || mNeedsArrange)
+ {
+ mItemsToSelect.push_back(item_id);
+ return result;
+ }
+ selection_deque::iterator found = std::find(mSelectedItemIDs.begin(), mSelectedItemIDs.end(), item_id);
+ if (found != mSelectedItemIDs.end())
+ {
+ if (mItemMap[item_id])
+ {
+ mItemMap[item_id]->setSelected(FALSE);
+ }
+ mSelectedItemIDs.erase(found);
+ result = false;
+ }
+ else
+ {
+ if (mItemMap[item_id])
+ {
+ mItemMap[item_id]->setSelected(TRUE);
+ }
+ mSelectedItemIDs.push_back(item_id);
+ signalSelectionItemID(item_id);
+ result = true;
+ }
+ mLastInteractedUUID = item_id;
+
+ if (scroll_to_selection)
+ {
+ scrollToShowItem(item_id);
+ }
+ return result;
+}
+
+void LLInventoryGallery::scrollToShowItem(const LLUUID& item_id)
+{
+ LLInventoryGalleryItem* item = mItemMap[item_id];
+ if(item)
+ {
+ const LLRect visible_content_rect = mScrollPanel->getVisibleContentRect();
+
+ LLRect item_rect;
+ item->localRectToOtherView(item->getLocalRect(), &item_rect, mScrollPanel);
+ LLRect overlap_rect(item_rect);
+ overlap_rect.intersectWith(visible_content_rect);
+
+ //Scroll when the selected item is outside the visible area
+ if (overlap_rect.getHeight() + 5 < item->getRect().getHeight())
+ {
+ LLRect content_rect = mScrollPanel->getContentWindowRect();
+ LLRect constraint_rect;
+ constraint_rect.setOriginAndSize(0, 0, content_rect.getWidth(), content_rect.getHeight());
+
+ LLRect item_doc_rect;
+ item->localRectToOtherView(item->getLocalRect(), &item_doc_rect, mGalleryPanel);
+
+ mScrollPanel->scrollToShowRect( item_doc_rect, constraint_rect );
+ }
+ }
+}
+
+LLInventoryGalleryItem* LLInventoryGallery::getFirstSelectedItem()
+{
+ if (mSelectedItemIDs.size() > 0)
+ {
+ selection_deque::iterator iter = mSelectedItemIDs.begin();
+ return mItemMap[*iter];
+ }
+ return NULL;
+}
+
+void LLInventoryGallery::copy()
+{
+ if (!getVisible() || !getEnabled())
+ {
+ return;
+ }
+
+ LLClipboard::instance().reset();
+
+ for (const LLUUID& id : mSelectedItemIDs)
+ {
+ LLClipboard::instance().addToClipboard(id);
+ }
+ mFilterSubString.clear();
+}
+
+BOOL LLInventoryGallery::canCopy() const
+{
+ if (!getVisible() || !getEnabled() || mSelectedItemIDs.empty())
+ {
+ return FALSE;
+ }
+
+ for (const LLUUID& id : mSelectedItemIDs)
+ {
+ if (!isItemCopyable(id))
+ {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+void LLInventoryGallery::cut()
+{
+ if (!getVisible() || !getEnabled())
+ {
+ return;
+ }
+
+ // clear the inventory clipboard
+ LLClipboard::instance().reset();
+ LLClipboard::instance().setCutMode(true);
+ for (const LLUUID& id : mSelectedItemIDs)
+ {
+ // todo: fade out selected item
+ LLClipboard::instance().addToClipboard(id);
+ }
+
+ mFilterSubString.clear();
+}
+
+BOOL LLInventoryGallery::canCut() const
+{
+ if (!getVisible() || !getEnabled() || mSelectedItemIDs.empty())
+ {
+ return FALSE;
+ }
+
+ for (const LLUUID& id : mSelectedItemIDs)
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(id);
+ if (cat)
+ {
+ if (!get_is_category_removable(&gInventory, id))
+ {
+ return FALSE;
+ }
+ }
+ else if (!get_is_item_removable(&gInventory, id))
+ {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+void LLInventoryGallery::paste()
+{
+ if (!LLClipboard::instance().hasContents())
+ {
+ return;
+ }
+
+ const LLUUID& marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
+ if (mSelectedItemIDs.size() == 1 && gInventory.isObjectDescendentOf(*mSelectedItemIDs.begin(), marketplacelistings_id))
+ {
+ return;
+ }
+
+ bool is_cut_mode = LLClipboard::instance().isCutMode();
+ std::vector<LLUUID> objects;
+ LLClipboard::instance().pasteFromClipboard(objects);
+
+ bool paste_into_root = mSelectedItemIDs.empty();
+ for (LLUUID& dest : mSelectedItemIDs)
+ {
+ LLInventoryObject* obj = gInventory.getObject(dest);
+ if (!obj || (obj->getType() != LLAssetType::AT_CATEGORY))
+ {
+ paste_into_root = true;
+ continue;
+ }
+
+ paste(dest, objects, is_cut_mode, marketplacelistings_id);
+ is_cut_mode = false;
+ }
+
+ if (paste_into_root)
+ {
+ for (const LLUUID& id : mSelectedItemIDs)
+ {
+ if (mItemMap[id])
+ {
+ mItemMap[id]->setSelected(FALSE);
+ }
+ }
+ mSelectedItemIDs.clear();
+
+ paste(mFolderID, objects, is_cut_mode, marketplacelistings_id);
+ }
+
+ LLClipboard::instance().setCutMode(false);
+}
+
+void LLInventoryGallery::paste(const LLUUID& dest,
+ std::vector<LLUUID>& objects,
+ bool is_cut_mode,
+ const LLUUID& marketplacelistings_id)
+{
+ LLHandle<LLPanel> handle = getHandle();
+ std::function <void(const LLUUID)> on_copy_callback = NULL;
+ LLPointer<LLInventoryCallback> cb = NULL;
+ if (dest == mFolderID)
+ {
+ on_copy_callback = [handle](const LLUUID& inv_item)
+ {
+ LLInventoryGallery* panel = (LLInventoryGallery*)handle.get();
+ if (panel)
+ {
+ // Scroll to pasted item and highlight it
+ // Should it only highlight the last one?
+ panel->addItemSelection(inv_item, true);
+ }
+ };
+ cb = new LLBoostFuncInventoryCallback(on_copy_callback);
+ }
+
+ for (std::vector<LLUUID>::const_iterator iter = objects.begin(); iter != objects.end(); ++iter)
+ {
+ const LLUUID& item_id = (*iter);
+ if (gInventory.isObjectDescendentOf(item_id, marketplacelistings_id) && (LLMarketplaceData::instance().isInActiveFolder(item_id) ||
+ LLMarketplaceData::instance().isListedAndActive(item_id)))
+ {
+ return;
+ }
+ LLViewerInventoryCategory* cat = gInventory.getCategory(item_id);
+ if (cat)
+ {
+ if (is_cut_mode)
+ {
+ gInventory.changeCategoryParent(cat, dest, false);
+ if (dest == mFolderID)
+ {
+ // Don't select immediately, wait for item to arrive
+ mItemsToSelect.push_back(item_id);
+ }
+ }
+ else
+ {
+ copy_inventory_category(&gInventory, cat, dest, LLUUID::null, false, on_copy_callback);
+ }
+ }
+ else
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(item_id);
+ if (item)
+ {
+ if (is_cut_mode)
+ {
+ gInventory.changeItemParent(item, dest, false);
+ if (dest == mFolderID)
+ {
+ // Don't select immediately, wait for item to arrive
+ mItemsToSelect.push_back(item_id);
+ }
+ }
+ else
+ {
+ if (item->getIsLinkType())
+ {
+ link_inventory_object(dest, item_id, cb);
+ }
+ else
+ {
+ copy_inventory_item(
+ gAgent.getID(),
+ item->getPermissions().getOwner(),
+ item->getUUID(),
+ dest,
+ std::string(),
+ cb);
+ }
+ }
+ }
+ }
+ }
+
+ LLClipboard::instance().setCutMode(false);
+}
+
+BOOL LLInventoryGallery::canPaste() const
+{
+ // Return FALSE on degenerated cases: empty clipboard, no inventory, no agent
+ if (!LLClipboard::instance().hasContents())
+ {
+ return FALSE;
+ }
+
+ // In cut mode, whatever is on the clipboard is always pastable
+ if (LLClipboard::instance().isCutMode())
+ {
+ return TRUE;
+ }
+
+ // In normal mode, we need to check each element of the clipboard to know if we can paste or not
+ std::vector<LLUUID> objects;
+ LLClipboard::instance().pasteFromClipboard(objects);
+ S32 count = objects.size();
+ for (S32 i = 0; i < count; i++)
+ {
+ const LLUUID& item_id = objects.at(i);
+
+ // Each item must be copyable to be pastable
+ if (!isItemCopyable(item_id))
+ {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+void LLInventoryGallery::onDelete(const LLSD& notification, const LLSD& response, const selection_deque selected_ids)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option == 0)
+ {
+ for (const LLUUID& id : selected_ids)
+ {
+ LLInventoryObject* obj = gInventory.getObject(id);
+ if (!obj)
+ {
+ return;
+ }
+ if (obj->getType() == LLAssetType::AT_CATEGORY)
+ {
+ if (get_is_category_removable(&gInventory, id))
+ {
+ gInventory.removeCategory(id);
+ }
+ }
+ else
+ {
+ if (get_is_item_removable(&gInventory, id))
+ {
+ gInventory.removeItem(id);
+ }
+ }
+ }
+ }
+}
+
+void LLInventoryGallery::deleteSelection()
+{
+ if (!LLInventoryAction::sDeleteConfirmationDisplayed) // ask for the confirmation at least once per session
+ {
+ LLNotifications::instance().setIgnored("DeleteItems", false);
+ LLInventoryAction::sDeleteConfirmationDisplayed = true;
+ }
+
+ LLSD args;
+ args["QUESTION"] = LLTrans::getString("DeleteItem");
+ LLNotificationsUtil::add("DeleteItems", args, LLSD(), boost::bind(&LLInventoryGallery::onDelete, _1, _2, mSelectedItemIDs));
+}
+
+bool LLInventoryGallery::canDeleteSelection()
+{
+ if (mSelectedItemIDs.empty())
+ {
+ return false;
+ }
+
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ if (mFolderID == trash_id || gInventory.isObjectDescendentOf(mFolderID, trash_id))
+ {
+ return false;
+ }
+
+ for (const LLUUID& id : mSelectedItemIDs)
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(id);
+ if (cat)
+ {
+ if (!get_is_category_removable(&gInventory, id))
+ {
+ return false;
+ }
+ }
+ else if (!get_is_item_removable(&gInventory, id))
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+void LLInventoryGallery::pasteAsLink()
+{
+ if (!LLClipboard::instance().hasContents())
+ {
+ return;
+ }
+
+ const LLUUID& current_outfit_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
+ const LLUUID& marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
+ const LLUUID& my_outifts_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+
+ std::vector<LLUUID> objects;
+ LLClipboard::instance().pasteFromClipboard(objects);
+
+ bool paste_into_root = mSelectedItemIDs.empty();
+ for (LLUUID& dest : mSelectedItemIDs)
+ {
+ LLInventoryObject* obj = gInventory.getObject(dest);
+ if (!obj || obj->getType() != LLAssetType::AT_CATEGORY)
+ {
+ paste_into_root = true;
+ continue;
+ }
+
+ pasteAsLink(dest, objects, current_outfit_id, marketplacelistings_id, my_outifts_id);
+ }
+
+ if (paste_into_root)
+ {
+ for (const LLUUID& id : mSelectedItemIDs)
+ {
+ if (mItemMap[id])
+ {
+ mItemMap[id]->setSelected(FALSE);
+ }
+ }
+ mSelectedItemIDs.clear();
+
+ pasteAsLink(mFolderID, objects, current_outfit_id, marketplacelistings_id, my_outifts_id);
+ }
+
+ LLClipboard::instance().setCutMode(false);
+}
+
+void LLInventoryGallery::pasteAsLink(const LLUUID& dest,
+ std::vector<LLUUID>& objects,
+ const LLUUID& current_outfit_id,
+ const LLUUID& marketplacelistings_id,
+ const LLUUID& my_outifts_id)
+{
+ const BOOL move_is_into_current_outfit = (dest == current_outfit_id);
+ const BOOL move_is_into_my_outfits = (dest == my_outifts_id) || gInventory.isObjectDescendentOf(dest, my_outifts_id);
+ const BOOL move_is_into_marketplacelistings = gInventory.isObjectDescendentOf(dest, marketplacelistings_id);
+
+ if (move_is_into_marketplacelistings || move_is_into_current_outfit || move_is_into_my_outfits)
+ {
+ return;
+ }
+
+ LLPointer<LLInventoryCallback> cb = NULL;
+ if (dest == mFolderID)
+ {
+ LLHandle<LLPanel> handle = getHandle();
+ std::function <void(const LLUUID)> on_link_callback = [handle](const LLUUID& inv_item)
+ {
+ LLInventoryGallery* panel = (LLInventoryGallery*)handle.get();
+ if (panel)
+ {
+ // Scroll to pasted item and highlight it
+ // Should it only highlight the last one?
+ panel->addItemSelection(inv_item, true);
+ }
+ };
+ cb = new LLBoostFuncInventoryCallback(on_link_callback);
+ }
+
+ for (std::vector<LLUUID>::const_iterator iter = objects.begin();
+ iter != objects.end();
+ ++iter)
+ {
+ const LLUUID& object_id = (*iter);
+ if (LLConstPointer<LLInventoryObject> link_obj = gInventory.getObject(object_id))
+ {
+ link_inventory_object(dest, link_obj, cb);
+ }
+ }
+}
+
+void LLInventoryGallery::claimEditHandler()
+{
+ gEditMenuHandler = this;
+}
+
+void LLInventoryGallery::resetEditHandler()
+{
+ if (gEditMenuHandler == this)
+ {
+ gEditMenuHandler = NULL;
+ }
+}
+
+bool LLInventoryGallery::isItemCopyable(const LLUUID & item_id)
+{
+ const LLInventoryCategory* cat = gInventory.getCategory(item_id);
+ if (cat)
+ {
+ // Folders are copyable if items in them are, recursively, copyable.
+ // Get the content of the folder
+ LLInventoryModel::cat_array_t* cat_array;
+ LLInventoryModel::item_array_t* item_array;
+ gInventory.getDirectDescendentsOf(item_id, cat_array, item_array);
+
+ // Check the items
+ LLInventoryModel::item_array_t item_array_copy = *item_array;
+ for (LLInventoryModel::item_array_t::iterator iter = item_array_copy.begin(); iter != item_array_copy.end(); iter++)
+ {
+ LLInventoryItem* item = *iter;
+ if (!isItemCopyable(item->getUUID()))
+ {
+ return false;
+ }
+ }
+
+ // Check the folders
+ LLInventoryModel::cat_array_t cat_array_copy = *cat_array;
+ for (LLInventoryModel::cat_array_t::iterator iter = cat_array_copy.begin(); iter != cat_array_copy.end(); iter++)
+ {
+ LLViewerInventoryCategory* category = *iter;
+ if (!isItemCopyable(category->getUUID()))
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ LLViewerInventoryItem* item = gInventory.getItem(item_id);
+ if (item)
+ {
+ // Can't copy worn objects.
+ // Worn objects are tied to their inworld conterparts
+ // Copy of modified worn object will return object with obsolete asset and inventory
+ if (get_is_item_worn(item_id))
+ {
+ return false;
+ }
+
+ static LLCachedControl<bool> inventory_linking(gSavedSettings, "InventoryLinking", true);
+ return (item->getIsLinkType() && inventory_linking)
+ || item->getPermissions().allowCopyBy(gAgent.getID());
+ }
+
+ return false;
+}
+
+void LLInventoryGallery::updateMessageVisibility()
+{
+
+ mMessageTextBox->setVisible(mItems.empty());
+ if(mItems.empty())
+ {
+ mMessageTextBox->setText(hasDescendents(mFolderID) ? LLTrans::getString("InventorySingleFolderEmpty") : LLTrans::getString("InventorySingleFolderNoMatches"));
+ }
+
+ mScrollPanel->setVisible(!mItems.empty());
+}
+
+void LLInventoryGallery::refreshList(const LLUUID& category_id)
+{
+ LLInventoryModel::cat_array_t* cat_array;
+ LLInventoryModel::item_array_t* item_array;
+
+ gInventory.getDirectDescendentsOf(category_id, cat_array, item_array);
+ uuid_vec_t vadded;
+ uuid_vec_t vremoved;
+
+ // Create added and removed items vectors.
+ computeDifference(*cat_array, *item_array, vadded, vremoved);
+
+ // Handle added tabs.
+ for (uuid_vec_t::const_iterator iter = vadded.begin();
+ iter != vadded.end();
+ ++iter)
+ {
+ const LLUUID cat_id = (*iter);
+ updateAddedItem(cat_id);
+ mNeedsArrange = true;
+ }
+
+ // Handle removed tabs.
+ for (uuid_vec_t::const_iterator iter = vremoved.begin(); iter != vremoved.end(); ++iter)
+ {
+ const LLUUID cat_id = (*iter);
+ updateRemovedItem(cat_id);
+ }
+
+ const LLInventoryModel::changed_items_t& changed_items = gInventory.getChangedIDs();
+ for (LLInventoryModel::changed_items_t::const_iterator items_iter = changed_items.begin();
+ items_iter != changed_items.end();
+ ++items_iter)
+ {
+ LLInventoryObject* obj = gInventory.getObject(*items_iter);
+ if(!obj)
+ {
+ return;
+ }
+
+ updateChangedItemName(*items_iter, obj->getName());
+ mNeedsArrange = true;
+ }
+
+ if(mNeedsArrange || !mItemsToSelect.empty())
+ {
+ // Don't scroll to target/arrange immediately
+ // since more updates might be pending
+ gIdleCallbacks.addFunction(onIdle, (void*)this);
+ }
+ updateMessageVisibility();
+}
+
+void LLInventoryGallery::computeDifference(
+ const LLInventoryModel::cat_array_t vcats,
+ const LLInventoryModel::item_array_t vitems,
+ uuid_vec_t& vadded,
+ uuid_vec_t& vremoved)
+{
+ uuid_vec_t vnew;
+ // Creating a vector of newly collected UUIDs.
+ for (LLInventoryModel::cat_array_t::const_iterator iter = vcats.begin();
+ iter != vcats.end();
+ iter++)
+ {
+ vnew.push_back((*iter)->getUUID());
+ }
+ for (LLInventoryModel::item_array_t::const_iterator iter = vitems.begin();
+ iter != vitems.end();
+ iter++)
+ {
+ vnew.push_back((*iter)->getUUID());
+ }
+
+ uuid_vec_t vcur;
+ getCurrentCategories(vcur);
+ std::copy(mItemBuildQuery.begin(), mItemBuildQuery.end(), std::back_inserter(vcur));
+
+ LLCommonUtils::computeDifference(vnew, vcur, vadded, vremoved);
+}
+
+void LLInventoryGallery::onCOFChanged()
+{
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t item_array;
+
+ gInventory.collectDescendents(
+ LLAppearanceMgr::instance().getCOF(),
+ cat_array,
+ item_array,
+ LLInventoryModel::EXCLUDE_TRASH);
+
+ uuid_vec_t vnew;
+ uuid_vec_t vadded;
+ uuid_vec_t vremoved;
+
+ for (LLInventoryModel::item_array_t::const_iterator iter = item_array.begin();
+ iter != item_array.end();
+ ++iter)
+ {
+ vnew.push_back((*iter)->getLinkedUUID());
+ }
+
+ // We need to update only items that were added or removed from COF.
+ LLCommonUtils::computeDifference(vnew, mCOFLinkedItems, vadded, vremoved);
+
+ mCOFLinkedItems = vnew;
+
+ for (uuid_vec_t::const_iterator iter = vadded.begin();
+ iter != vadded.end();
+ ++iter)
+ {
+ updateWornItem(*iter, true);
+ }
+
+ for (uuid_vec_t::const_iterator iter = vremoved.begin(); iter != vremoved.end(); ++iter)
+ {
+ updateWornItem(*iter, false);
+ }
+}
+
+void LLInventoryGallery::onGesturesChanged()
+{
+ uuid_vec_t vnew;
+ uuid_vec_t vadded;
+ uuid_vec_t vremoved;
+
+ const LLGestureMgr::item_map_t& active_gestures = LLGestureMgr::instance().getActiveGestures();
+ for (LLGestureMgr::item_map_t::const_iterator iter = active_gestures.begin();
+ iter != active_gestures.end();
+ ++iter)
+ {
+ vnew.push_back(iter->first);
+ }
+
+ LLCommonUtils::computeDifference(vnew, mActiveGestures, vadded, vremoved);
+
+ mActiveGestures = vnew;
+
+ for (uuid_vec_t::const_iterator iter = vadded.begin();
+ iter != vadded.end();
+ ++iter)
+ {
+ updateWornItem(*iter, true);
+ }
+
+ for (uuid_vec_t::const_iterator iter = vremoved.begin(); iter != vremoved.end(); ++iter)
+ {
+ updateWornItem(*iter, false);
+ }
+}
+
+void LLInventoryGallery::deselectItem(const LLUUID& category_id)
+{
+ // Reset selection if the item is selected.
+ LLInventoryGalleryItem* item = mItemMap[category_id];
+ if (item && item->isSelected())
+ {
+ mItemMap[category_id]->setSelected(FALSE);
+ setFocus(true);
+ // Todo: support multiselect
+ // signalSelectionItemID(LLUUID::null);
+ }
+
+ selection_deque::iterator found = std::find(mSelectedItemIDs.begin(), mSelectedItemIDs.end(), category_id);
+ if (found != mSelectedItemIDs.end())
+ {
+ mSelectedItemIDs.erase(found);
+ }
+}
+
+void LLInventoryGallery::clearSelection()
+{
+ for (const LLUUID& id: mSelectedItemIDs)
+ {
+ if (mItemMap[id])
+ {
+ mItemMap[id]->setSelected(FALSE);
+ }
+ }
+ if (!mSelectedItemIDs.empty())
+ {
+ mSelectedItemIDs.clear();
+ // BUG: wrong, item can be null
+ signalSelectionItemID(LLUUID::null);
+ }
+}
+
+void LLInventoryGallery::signalSelectionItemID(const LLUUID& category_id)
+{
+ mSelectionChangeSignal(category_id);
+}
+
+boost::signals2::connection LLInventoryGallery::setSelectionChangeCallback(selection_change_callback_t cb)
+{
+ return mSelectionChangeSignal.connect(cb);
+}
+
+LLUUID LLInventoryGallery::getFirstSelectedItemID()
+{
+ if (mSelectedItemIDs.size() > 0)
+ {
+ return *mSelectedItemIDs.begin();
+ }
+ return LLUUID::null;
+}
+
+LLUUID LLInventoryGallery::getOutfitImageID(LLUUID outfit_id)
+{
+ LLUUID thumbnail_id;
+ LLViewerInventoryCategory* cat = gInventory.getCategory(outfit_id);
+ if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT)
+ {
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
+ // Not LLIsOfAssetType, because we allow links
+ LLIsTextureType f;
+ gInventory.getDirectDescendentsOf(outfit_id, cats, items, f);
+
+ // Exactly one texture found => show the texture as thumbnail
+ if (1 == items.size())
+ {
+ LLViewerInventoryItem* item = items.front();
+ if (item && item->getIsLinkType())
+ {
+ item = item->getLinkedItem();
+ }
+ if (item)
+ {
+ thumbnail_id = item->getAssetUUID();
+ }
+ }
+ }
+ return thumbnail_id;
+}
+
+boost::signals2::connection LLInventoryGallery::setRootChangedCallback(callback_t cb)
+{
+ return mRootChangedSignal.connect(cb);
+}
+
+void LLInventoryGallery::onForwardFolder()
+{
+ if(isForwardAvailable())
+ {
+ mBackwardFolders.push_back(mFolderID);
+ mFolderID = mForwardFolders.back();
+ mForwardFolders.pop_back();
+ dirtyRootFolder();
+ }
+}
+
+void LLInventoryGallery::onBackwardFolder()
+{
+ if(isBackwardAvailable())
+ {
+ mForwardFolders.push_back(mFolderID);
+ mFolderID = mBackwardFolders.back();
+ mBackwardFolders.pop_back();
+ dirtyRootFolder();
+ }
+}
+
+void LLInventoryGallery::clearNavigationHistory()
+{
+ mForwardFolders.clear();
+ mBackwardFolders.clear();
+}
+
+bool LLInventoryGallery::isBackwardAvailable()
+{
+ return (!mBackwardFolders.empty() && (mFolderID != mBackwardFolders.back()));
+}
+
+bool LLInventoryGallery::isForwardAvailable()
+{
+ return (!mForwardFolders.empty() && (mFolderID != mForwardFolders.back()));
+}
+
+BOOL LLInventoryGallery::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type, void* cargo_data,
+ EAcceptance* accept, std::string& tooltip_msg)
+{
+ // have children handle it first
+ BOOL handled = LLView::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data,
+ accept, tooltip_msg);
+
+ // when drop is not handled by child, it should be handled by the root folder .
+ if (!handled || (*accept == ACCEPT_NO))
+ {
+ handled = baseHandleDragAndDrop(mFolderID, drop, cargo_type, cargo_data, accept, tooltip_msg);
+ }
+
+ return handled;
+}
+
+void LLInventoryGallery::startDrag()
+{
+ std::vector<EDragAndDropType> types;
+ uuid_vec_t ids;
+ LLToolDragAndDrop::ESource src = LLToolDragAndDrop::SOURCE_AGENT;
+ for (LLUUID& selected_id : mSelectedItemIDs)
+ {
+ const LLInventoryItem* item = gInventory.getItem(selected_id);
+ if (item)
+ {
+ if (item->getPermissions().getOwner() == ALEXANDRIA_LINDEN_ID)
+ {
+ src = LLToolDragAndDrop::SOURCE_LIBRARY;
+ }
+
+ EDragAndDropType type = LLViewerAssetType::lookupDragAndDropType(item->getType());
+ types.push_back(type);
+ ids.push_back(selected_id);
+ }
+
+ const LLViewerInventoryCategory* cat = gInventory.getCategory(selected_id);
+ if (cat && gInventory.isObjectDescendentOf(selected_id, gInventory.getRootFolderID())
+ && !LLFolderType::lookupIsProtectedType((cat)->getPreferredType()))
+ {
+ if (cat->getOwnerID() == ALEXANDRIA_LINDEN_ID)
+ {
+ src = LLToolDragAndDrop::SOURCE_LIBRARY;
+ }
+
+ EDragAndDropType type = LLViewerAssetType::lookupDragAndDropType(cat->getType());
+ types.push_back(type);
+ ids.push_back(selected_id);
+ }
+ }
+ LLToolDragAndDrop::getInstance()->beginMultiDrag(types, ids, LLToolDragAndDrop::SOURCE_AGENT);
+}
+
+bool LLInventoryGallery::areViewsInitialized()
+{
+ return mGalleryCreated && mItemBuildQuery.empty();
+}
+
+bool LLInventoryGallery::hasDescendents(const LLUUID& cat_id)
+{
+ LLInventoryModel::cat_array_t* cats;
+ LLInventoryModel::item_array_t* items;
+ gInventory.getDirectDescendentsOf(cat_id, cats, items);
+
+ return (cats->empty() && items->empty());
+}
+
+bool LLInventoryGallery::checkAgainstFilterType(const LLUUID& object_id)
+{
+ const LLInventoryObject *object = gInventory.getObject(object_id);
+ if(!object) return false;
+
+ LLInventoryType::EType object_type = LLInventoryType::IT_CATEGORY;
+ LLInventoryItem* inv_item = gInventory.getItem(object_id);
+ if (inv_item)
+ {
+ object_type = inv_item->getInventoryType();
+ }
+ const U32 filterTypes = mFilter->getFilterTypes();
+
+ if ((filterTypes & LLInventoryFilter::FILTERTYPE_OBJECT) && inv_item)
+ {
+ switch (object_type)
+ {
+ case LLInventoryType::IT_NONE:
+ // If it has no type, pass it, unless it's a link.
+ if (object && object->getIsLinkType())
+ {
+ return false;
+ }
+ break;
+ case LLInventoryType::IT_UNKNOWN:
+ {
+ // Unknows are only shown when we show every type.
+ // Unknows are 255 and won't fit in 64 bits.
+ if (mFilter->getFilterObjectTypes() != 0xffffffffffffffffULL)
+ {
+ return false;
+ }
+ break;
+ }
+ default:
+ if ((1LL << object_type & mFilter->getFilterObjectTypes()) == U64(0))
+ {
+ return false;
+ }
+ break;
+ }
+ }
+
+ if (filterTypes & LLInventoryFilter::FILTERTYPE_DATE)
+ {
+ const U16 HOURS_TO_SECONDS = 3600;
+ time_t earliest = time_corrected() - mFilter->getHoursAgo() * HOURS_TO_SECONDS;
+
+ if (mFilter->getMinDate() > time_min() && mFilter->getMinDate() < earliest)
+ {
+ earliest = mFilter->getMinDate();
+ }
+ else if (!mFilter->getHoursAgo())
+ {
+ earliest = 0;
+ }
+
+ if (LLInventoryFilter::FILTERDATEDIRECTION_NEWER == mFilter->getDateSearchDirection() || mFilter->isSinceLogoff())
+ {
+ if (object->getCreationDate() < earliest ||
+ object->getCreationDate() > mFilter->getMaxDate())
+ return false;
+ }
+ else
+ {
+ if (object->getCreationDate() > earliest ||
+ object->getCreationDate() > mFilter->getMaxDate())
+ return false;
+ }
+ }
+ return true;
+}
+
+bool LLInventoryGallery::hasVisibleItems()
+{
+ return mItemsAddedCount > 0;
+}
+
+void LLInventoryGallery::handleModifiedFilter()
+{
+ if(mFilter->isModified())
+ {
+ reArrangeRows();
+ }
+}
+
+void LLInventoryGallery::setSortOrder(U32 order, bool update)
+{
+ bool dirty = (mSortOrder != order);
+
+ mSortOrder = order;
+ if(update && dirty)
+ {
+ mNeedsArrange = true;
+ gIdleCallbacks.addFunction(onIdle, (void*)this);
+ }
+}
+//-----------------------------
+// LLInventoryGalleryItem
+//-----------------------------
+
+static LLDefaultChildRegistry::Register<LLInventoryGalleryItem> r("inventory_gallery_item");
+
+LLInventoryGalleryItem::LLInventoryGalleryItem(const Params& p)
+ : LLPanel(p),
+ mSelected(false),
+ mDefaultImage(true),
+ mItemName(""),
+ mWornSuffix(""),
+ mPermSuffix(""),
+ mUUID(LLUUID()),
+ mIsFolder(true),
+ mIsLink(false),
+ mHidden(false),
+ mGallery(NULL),
+ mType(LLAssetType::AT_NONE),
+ mSortGroup(SG_ITEM),
+ mCutGeneration(0),
+ mSelectedForCut(false)
+{
+ buildFromFile("panel_inventory_gallery_item.xml");
+}
+
+LLInventoryGalleryItem::~LLInventoryGalleryItem()
+{
+}
+
+BOOL LLInventoryGalleryItem::postBuild()
+{
+ mNameText = getChild<LLTextBox>("item_name");
+ mTextBgPanel = getChild<LLPanel>("text_bg_panel");
+
+ return TRUE;
+}
+
+void LLInventoryGalleryItem::setType(LLAssetType::EType type, LLInventoryType::EType inventory_type, U32 flags, bool is_link)
+{
+ mType = type;
+ mIsFolder = (mType == LLAssetType::AT_CATEGORY);
+ mIsLink = is_link;
+
+ std::string icon_name = LLInventoryIcon::getIconName(mType, inventory_type, flags);
+ if(mIsFolder)
+ {
+ mSortGroup = SG_NORMAL_FOLDER;
+ LLUUID folder_id = mUUID;
+ if(mIsLink)
+ {
+ LLInventoryObject* obj = gInventory.getObject(mUUID);
+ if (obj)
+ {
+ folder_id = obj->getLinkedUUID();
+ }
+ }
+ LLViewerInventoryCategory* cat = gInventory.getCategory(folder_id);
+ if (cat)
+ {
+ LLFolderType::EType preferred_type = cat->getPreferredType();
+ icon_name = LLViewerFolderType::lookupIconName(preferred_type);
+
+ if (preferred_type == LLFolderType::FT_TRASH)
+ {
+ mSortGroup = SG_TRASH_FOLDER;
+ }
+ else if(LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
+ {
+ mSortGroup = SG_SYSTEM_FOLDER;
+ }
+ }
+ }
+ else
+ {
+ const LLInventoryItem *item = gInventory.getItem(mUUID);
+ if(item && (LLAssetType::AT_CALLINGCARD != item->getType()) && !mIsLink)
+ {
+ std::string delim(" --");
+ bool copy = item->getPermissions().allowCopyBy(gAgent.getID());
+ if (!copy)
+ {
+ mPermSuffix += delim;
+ mPermSuffix += LLTrans::getString("no_copy_lbl");
+ }
+ bool mod = item->getPermissions().allowModifyBy(gAgent.getID());
+ if (!mod)
+ {
+ mPermSuffix += mPermSuffix.empty() ? delim : ",";
+ mPermSuffix += LLTrans::getString("no_modify_lbl");
+ }
+ bool xfer = item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID());
+ if (!xfer)
+ {
+ mPermSuffix += mPermSuffix.empty() ? delim : ",";
+ mPermSuffix += LLTrans::getString("no_transfer_lbl");
+ }
+ }
+ }
+
+ getChild<LLIconCtrl>("item_type")->setValue(icon_name);
+ getChild<LLIconCtrl>("link_overlay")->setVisible(is_link);
+}
+
+void LLInventoryGalleryItem::setThumbnail(LLUUID id)
+{
+ mDefaultImage = id.isNull();
+ if(mDefaultImage)
+ {
+ getChild<LLThumbnailCtrl>("preview_thumbnail")->clearTexture();
+ }
+ else
+ {
+ getChild<LLThumbnailCtrl>("preview_thumbnail")->setValue(id);
+ }
+}
+
+void LLInventoryGalleryItem::draw()
+{
+ if (isFadeItem())
+ {
+ // Fade out to indicate it's being cut
+ LLViewDrawContext context(0.5f);
+ LLPanel::draw();
+ }
+ else
+ {
+ LLPanel::draw();
+
+ // Draw border
+ LLUIColor border_color = LLUIColorTable::instance().getColor(mSelected ? "MenuItemHighlightBgColor" : "TextFgTentativeColor", LLColor4::white);
+ LLRect border = getChildView("preview_thumbnail")->getRect();
+ border.mRight = border.mRight + 1;
+ border.mTop = border.mTop + 1;
+ gl_rect_2d(border, border_color.get(), FALSE);
+ }
+}
+
+void LLInventoryGalleryItem::setItemName(std::string name)
+{
+ mItemName = name;
+ updateNameText();
+}
+
+void LLInventoryGalleryItem::setSelected(bool value)
+{
+ mSelected = value;
+ mTextBgPanel->setBackgroundVisible(value);
+
+ if(mSelected)
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(mUUID);
+ if(item && !item->isFinished())
+ {
+ LLInventoryModelBackgroundFetch::instance().start(mUUID, false);
+ }
+ }
+}
+
+BOOL LLInventoryGalleryItem::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ // call changeItemSelection directly, before setFocus
+ // to avoid autoscroll from LLInventoryGallery::onFocusReceived()
+ if (mask == MASK_CONTROL)
+ {
+ mGallery->addItemSelection(mUUID, false);
+ }
+ else if (mask == MASK_SHIFT)
+ {
+ mGallery->toggleSelectionRangeFromLast(mUUID);
+ }
+ else
+ {
+ mGallery->changeItemSelection(mUUID, false);
+ }
+ setFocus(TRUE);
+ mGallery->claimEditHandler();
+
+ gFocusMgr.setMouseCapture(this);
+ S32 screen_x;
+ S32 screen_y;
+ localPointToScreen(x, y, &screen_x, &screen_y );
+ LLToolDragAndDrop::getInstance()->setDragStart(screen_x, screen_y);
+ return TRUE;
+}
+
+BOOL LLInventoryGalleryItem::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ if (!isSelected())
+ {
+ mGallery->changeItemSelection(mUUID, false);
+ }
+ else
+ {
+ // refresh last interacted
+ mGallery->addItemSelection(mUUID, false);
+ }
+ setFocus(TRUE);
+ mGallery->claimEditHandler();
+ mGallery->showContextMenu(this, x, y, mUUID);
+
+ LLUICtrl::handleRightMouseDown(x, y, mask);
+ return TRUE;
+}
+
+BOOL LLInventoryGalleryItem::handleMouseUp(S32 x, S32 y, MASK mask)
+{
+ if(hasMouseCapture())
+ {
+ gFocusMgr.setMouseCapture(NULL);
+ return TRUE;
+ }
+ return LLPanel::handleMouseUp(x, y, mask);
+}
+
+BOOL LLInventoryGalleryItem::handleHover(S32 x, S32 y, MASK mask)
+{
+ if(hasMouseCapture())
+ {
+ S32 screen_x;
+ S32 screen_y;
+ localPointToScreen(x, y, &screen_x, &screen_y );
+
+ if(LLToolDragAndDrop::getInstance()->isOverThreshold(screen_x, screen_y) && mGallery)
+ {
+ mGallery->startDrag();
+ return LLToolDragAndDrop::getInstance()->handleHover(x, y, mask);
+ }
+ }
+ return LLUICtrl::handleHover(x,y,mask);
+}
+
+BOOL LLInventoryGalleryItem::handleDoubleClick(S32 x, S32 y, MASK mask)
+{
+ if (mIsFolder && mGallery)
+ {
+ // setRootFolder can destroy this item.
+ // Delay it until handleDoubleClick processing is complete
+ // or make gallery handle doubleclicks.
+ LLHandle<LLPanel> handle = mGallery->getHandle();
+ LLUUID navigate_to = mUUID;
+ doOnIdleOneTime([handle, navigate_to]()
+ {
+ LLInventoryGallery* gallery = (LLInventoryGallery*)handle.get();
+ if (gallery)
+ {
+ gallery->setRootFolder(navigate_to);
+ }
+ });
+ }
+ else
+ {
+ LLInvFVBridgeAction::doAction(mUUID, &gInventory);
+ }
+
+ return TRUE;
+}
+
+BOOL LLInventoryGalleryItem::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg)
+{
+ if (!mIsFolder)
+ {
+ return FALSE;
+ }
+ return mGallery->baseHandleDragAndDrop(mUUID, drop, cargo_type, cargo_data, accept, tooltip_msg);
+}
+
+BOOL LLInventoryGalleryItem::handleKeyHere(KEY key, MASK mask)
+{
+ if (!mGallery)
+ {
+ return FALSE;
+ }
+
+ BOOL handled = FALSE;
+ switch (key)
+ {
+ case KEY_LEFT:
+ mGallery->moveLeft(mask);
+ handled = true;
+ break;
+
+ case KEY_RIGHT:
+ mGallery->moveRight(mask);
+ handled = true;
+ break;
+
+ case KEY_UP:
+ mGallery->moveUp(mask);
+ handled = true;
+ break;
+
+ case KEY_DOWN:
+ mGallery->moveDown(mask);
+ handled = true;
+ break;
+
+ default:
+ break;
+ }
+ return handled;
+}
+
+void LLInventoryGalleryItem::onFocusLost()
+{
+ // inventory no longer handles cut/copy/paste/delete
+ mGallery->resetEditHandler();
+
+ LLPanel::onFocusLost();
+}
+
+void LLInventoryGalleryItem::onFocusReceived()
+{
+ // inventory now handles cut/copy/paste/delete
+ mGallery->claimEditHandler();
+
+ LLPanel::onFocusReceived();
+}
+
+void LLInventoryGalleryItem::setWorn(bool value)
+{
+ mWorn = value;
+
+ if(mWorn)
+ {
+ mWornSuffix = (mType == LLAssetType::AT_GESTURE) ? LLTrans::getString("active") : LLTrans::getString("worn");
+ }
+ else
+ {
+ mWornSuffix = "";
+ }
+
+ updateNameText();
+}
+
+LLFontGL* LLInventoryGalleryItem::getTextFont()
+{
+ if(mWorn)
+ {
+ return LLFontGL::getFontSansSerifSmallBold();
+ }
+ return mIsLink ? LLFontGL::getFontSansSerifSmallItalic() : LLFontGL::getFontSansSerifSmall();
+}
+
+void LLInventoryGalleryItem::updateNameText()
+{
+ mNameText->setFont(getTextFont());
+ mNameText->setText(mItemName + mPermSuffix + mWornSuffix);
+ mNameText->setToolTip(mItemName + mPermSuffix + mWornSuffix);
+ getChild<LLThumbnailCtrl>("preview_thumbnail")->setToolTip(mItemName + mPermSuffix + mWornSuffix);
+}
+
+bool LLInventoryGalleryItem::isFadeItem()
+{
+ LLClipboard& clipboard = LLClipboard::instance();
+ if (mCutGeneration == clipboard.getGeneration())
+ {
+ return mSelectedForCut;
+ }
+
+ mCutGeneration = clipboard.getGeneration();
+ mSelectedForCut = clipboard.isCutMode() && clipboard.isOnClipboard(mUUID);
+ return mSelectedForCut;
+}
+
+//-----------------------------
+// LLThumbnailsObserver
+//-----------------------------
+
+void LLThumbnailsObserver::changed(U32 mask)
+{
+ std::vector<LLUUID> deleted_ids;
+ for (item_map_t::iterator iter = mItemMap.begin();
+ iter != mItemMap.end();
+ ++iter)
+ {
+ const LLUUID& obj_id = (*iter).first;
+ LLItemData& data = (*iter).second;
+
+ LLInventoryObject* obj = gInventory.getObject(obj_id);
+ if (!obj)
+ {
+ deleted_ids.push_back(obj_id);
+ continue;
+ }
+
+ const LLUUID thumbnail_id = obj->getThumbnailUUID();
+ if (data.mThumbnailID != thumbnail_id)
+ {
+ data.mThumbnailID = thumbnail_id;
+ data.mCallback();
+ }
+ }
+
+ // Remove deleted items from the list
+ for (std::vector<LLUUID>::iterator deleted_id = deleted_ids.begin(); deleted_id != deleted_ids.end(); ++deleted_id)
+ {
+ removeItem(*deleted_id);
+ }
+}
+
+bool LLThumbnailsObserver::addItem(const LLUUID& obj_id, callback_t cb)
+{
+ LLInventoryObject* obj = gInventory.getObject(obj_id);
+ if (obj)
+ {
+ mItemMap.insert(item_map_value_t(obj_id, LLItemData(obj_id, obj->getThumbnailUUID(), cb)));
+ return true;
+ }
+ return false;
+}
+
+void LLThumbnailsObserver::removeItem(const LLUUID& obj_id)
+{
+ mItemMap.erase(obj_id);
+}
+
+//-----------------------------
+// Helper drag&drop functions
+//-----------------------------
+
+BOOL LLInventoryGallery::baseHandleDragAndDrop(LLUUID dest_id, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg)
+{
+ LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data;
+
+ if (drop && LLToolDragAndDrop::getInstance()->getCargoIndex() == 0)
+ {
+ clearSelection();
+ }
+
+ BOOL accepted = FALSE;
+ switch(cargo_type)
+ {
+ case DAD_TEXTURE:
+ case DAD_SOUND:
+ case DAD_CALLINGCARD:
+ case DAD_LANDMARK:
+ case DAD_SCRIPT:
+ case DAD_CLOTHING:
+ case DAD_OBJECT:
+ case DAD_NOTECARD:
+ case DAD_BODYPART:
+ case DAD_ANIMATION:
+ case DAD_GESTURE:
+ case DAD_MESH:
+ case DAD_SETTINGS:
+ accepted = dragItemIntoFolder(dest_id, inv_item, drop, tooltip_msg, true);
+ if (accepted && drop)
+ {
+ // Don't select immediately, wait for item to arrive
+ mItemsToSelect.push_back(inv_item->getUUID());
+ }
+ break;
+ case DAD_LINK:
+ // DAD_LINK type might mean one of two asset types: AT_LINK or AT_LINK_FOLDER.
+ // If we have an item of AT_LINK_FOLDER type we should process the linked
+ // category being dragged or dropped into folder.
+ if (inv_item && LLAssetType::AT_LINK_FOLDER == inv_item->getActualType())
+ {
+ LLInventoryCategory* linked_category = gInventory.getCategory(inv_item->getLinkedUUID());
+ if (linked_category)
+ {
+ accepted = dragCategoryIntoFolder(dest_id, (LLInventoryCategory*)linked_category, drop, tooltip_msg, TRUE);
+ }
+ }
+ else
+ {
+ accepted = dragItemIntoFolder(dest_id, inv_item, drop, tooltip_msg, TRUE);
+ }
+ if (accepted && drop && inv_item)
+ {
+ mItemsToSelect.push_back(inv_item->getUUID());
+ }
+ break;
+ case DAD_CATEGORY:
+ if (LLFriendCardsManager::instance().isAnyFriendCategory(dest_id))
+ {
+ accepted = FALSE;
+ }
+ else
+ {
+ LLInventoryCategory* cat_ptr = (LLInventoryCategory*)cargo_data;
+ accepted = dragCategoryIntoFolder(dest_id, cat_ptr, drop, tooltip_msg, FALSE);
+ if (accepted && drop)
+ {
+ mItemsToSelect.push_back(cat_ptr->getUUID());
+ }
+ }
+ break;
+ case DAD_ROOT_CATEGORY:
+ case DAD_NONE:
+ break;
+ default:
+ LL_WARNS() << "Unhandled cargo type for drag&drop " << cargo_type << LL_ENDL;
+ break;
+ }
+ if (accepted)
+ {
+ *accept = ACCEPT_YES_MULTI;
+ }
+ else
+ {
+ *accept = ACCEPT_NO;
+ }
+ return accepted;
+}
+
+// copy of LLFolderBridge::dragItemIntoFolder
+BOOL dragItemIntoFolder(LLUUID folder_id, LLInventoryItem* inv_item, BOOL drop, std::string& tooltip_msg, BOOL user_confirm)
+{
+ LLViewerInventoryCategory * cat = gInventory.getCategory(folder_id);
+ if (!cat)
+ {
+ return FALSE;
+ }
+ LLInventoryModel* model = &gInventory;
+
+ if (!model || !inv_item) return FALSE;
+
+ // cannot drag into library
+ if((gInventory.getRootFolderID() != folder_id) && !model->isObjectDescendentOf(folder_id, gInventory.getRootFolderID()))
+ {
+ return FALSE;
+ }
+ if (!isAgentAvatarValid()) return FALSE;
+
+ const LLUUID &current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
+ const LLUUID &favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
+ const LLUUID &landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
+ const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
+ const LLUUID &my_outifts_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+
+ const BOOL move_is_into_current_outfit = (folder_id == current_outfit_id);
+ const BOOL move_is_into_favorites = (folder_id == favorites_id);
+ const BOOL move_is_into_my_outfits = (folder_id == my_outifts_id) || model->isObjectDescendentOf(folder_id, my_outifts_id);
+ const BOOL move_is_into_outfit = move_is_into_my_outfits || (cat && cat->getPreferredType()==LLFolderType::FT_OUTFIT);
+ const BOOL move_is_into_landmarks = (folder_id == landmarks_id) || model->isObjectDescendentOf(folder_id, landmarks_id);
+ const BOOL move_is_into_marketplacelistings = model->isObjectDescendentOf(folder_id, marketplacelistings_id);
+ const BOOL move_is_from_marketplacelistings = model->isObjectDescendentOf(inv_item->getUUID(), marketplacelistings_id);
+
+ LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource();
+ BOOL accept = FALSE;
+ LLViewerObject* object = NULL;
+ if(LLToolDragAndDrop::SOURCE_AGENT == source)
+ {
+ const LLUUID &trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
+
+ const BOOL move_is_into_trash = (folder_id == trash_id) || model->isObjectDescendentOf(folder_id, trash_id);
+ const BOOL move_is_outof_current_outfit = LLAppearanceMgr::instance().getIsInCOF(inv_item->getUUID());
+
+ //--------------------------------------------------------------------------------
+ // Determine if item can be moved.
+ //
+
+ BOOL is_movable = TRUE;
+
+ switch (inv_item->getActualType())
+ {
+ case LLAssetType::AT_CATEGORY:
+ is_movable = !LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)inv_item)->getPreferredType());
+ break;
+ default:
+ break;
+ }
+ // Can't explicitly drag things out of the COF.
+ if (move_is_outof_current_outfit)
+ {
+ is_movable = FALSE;
+ }
+ if (move_is_into_trash)
+ {
+ is_movable &= inv_item->getIsLinkType() || !get_is_item_worn(inv_item->getUUID());
+ }
+ if (is_movable)
+ {
+ // Don't allow creating duplicates in the Calling Card/Friends
+ // subfolders, see bug EXT-1599. Check is item direct descendent
+ // of target folder and forbid item's movement if it so.
+ // Note: isItemDirectDescendentOfCategory checks if
+ // passed category is in the Calling Card/Friends folder
+ is_movable &= !LLFriendCardsManager::instance().isObjDirectDescendentOfCategory(inv_item, cat);
+ }
+
+ //
+ //--------------------------------------------------------------------------------
+
+ //--------------------------------------------------------------------------------
+ // Determine if item can be moved & dropped
+ // Note: if user_confirm is false, we already went through those accept logic test and can skip them
+
+ accept = TRUE;
+
+ if (user_confirm && !is_movable)
+ {
+ accept = FALSE;
+ }
+ else if (user_confirm && (folder_id == inv_item->getParentUUID()) && !move_is_into_favorites)
+ {
+ accept = FALSE;
+ }
+ else if (user_confirm && (move_is_into_current_outfit || move_is_into_outfit))
+ {
+ accept = can_move_to_outfit(inv_item, move_is_into_current_outfit);
+ }
+ else if (user_confirm && (move_is_into_favorites || move_is_into_landmarks))
+ {
+ accept = can_move_to_landmarks(inv_item);
+ }
+ else if (user_confirm && move_is_into_marketplacelistings)
+ {
+ //disable dropping in or out of marketplace for now
+ return FALSE;
+
+ /*const LLViewerInventoryCategory * master_folder = model->getFirstDescendantOf(marketplacelistings_id, folder_id);
+ LLViewerInventoryCategory * dest_folder = cat;
+ accept = can_move_item_to_marketplace(master_folder, dest_folder, inv_item, tooltip_msg, LLToolDragAndDrop::instance().getCargoCount() - LLToolDragAndDrop::instance().getCargoIndex());*/
+ }
+
+ // Check that the folder can accept this item based on folder/item type compatibility (e.g. stock folder compatibility)
+ if (user_confirm && accept)
+ {
+ LLViewerInventoryCategory * dest_folder = cat;
+ accept = dest_folder->acceptItem(inv_item);
+ }
+
+ LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
+
+ if (accept && drop)
+ {
+ if (inv_item->getType() == LLAssetType::AT_GESTURE
+ && LLGestureMgr::instance().isGestureActive(inv_item->getUUID()) && move_is_into_trash)
+ {
+ LLGestureMgr::instance().deactivateGesture(inv_item->getUUID());
+ }
+ // If an item is being dragged between windows, unselect everything in the active window
+ // so that we don't follow the selection to its new location (which is very annoying).
+ // RN: a better solution would be to deselect automatically when an item is moved
+ // and then select any item that is dropped only in the panel that it is dropped in
+ if (active_panel)
+ {
+ active_panel->unSelectAll();
+ }
+ // Dropping in or out of marketplace needs (sometimes) confirmation
+ if (user_confirm && (move_is_from_marketplacelistings || move_is_into_marketplacelistings))
+ {
+ //disable dropping in or out of marketplace for now
+ return FALSE;
+ }
+
+ //--------------------------------------------------------------------------------
+ // Destination folder logic
+ //
+
+ // FAVORITES folder
+ // (copy the item)
+ else if (move_is_into_favorites)
+ {
+ copy_inventory_item(
+ gAgent.getID(),
+ inv_item->getPermissions().getOwner(),
+ inv_item->getUUID(),
+ folder_id,
+ std::string(),
+ LLPointer<LLInventoryCallback>(NULL));
+ }
+ // CURRENT OUTFIT or OUTFIT folder
+ // (link the item)
+ else if (move_is_into_current_outfit || move_is_into_outfit)
+ {
+ if (move_is_into_current_outfit)
+ {
+ LLAppearanceMgr::instance().wearItemOnAvatar(inv_item->getUUID(), true, true);
+ }
+ else
+ {
+ LLPointer<LLInventoryCallback> cb = NULL;
+ link_inventory_object(folder_id, LLConstPointer<LLInventoryObject>(inv_item), cb);
+ }
+ }
+ // MARKETPLACE LISTINGS folder
+ // Move the item
+ else if (move_is_into_marketplacelistings)
+ {
+ //move_item_to_marketplacelistings(inv_item, mUUID);
+ return FALSE;
+ }
+ // NORMAL or TRASH folder
+ // (move the item, restamp if into trash)
+ else
+ {
+ // set up observer to select item once drag and drop from inbox is complete
+ if (gInventory.isObjectDescendentOf(inv_item->getUUID(), gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX)))
+ {
+ set_dad_inbox_object(inv_item->getUUID());
+ }
+
+ gInventory.changeItemParent((LLViewerInventoryItem*)inv_item, folder_id, move_is_into_trash);
+ }
+
+ if (move_is_from_marketplacelistings)
+ {
+ // If we move from an active (listed) listing, checks that it's still valid, if not, unlist
+ /*LLUUID version_folder_id = LLMarketplaceData::instance().getActiveFolder(from_folder_uuid);
+ if (version_folder_id.notNull())
+ {
+ LLMarketplaceValidator::getInstance()->validateMarketplaceListings(
+ version_folder_id,
+ [version_folder_id](bool result)
+ {
+ if (!result)
+ {
+ LLMarketplaceData::instance().activateListing(version_folder_id, false);
+ }
+ });
+ }*/
+ return FALSE;
+ }
+
+ //
+ //--------------------------------------------------------------------------------
+ }
+ }
+ else if (LLToolDragAndDrop::SOURCE_WORLD == source)
+ {
+ // Make sure the object exists. If we allowed dragging from
+ // anonymous objects, it would be possible to bypass
+ // permissions.
+ object = gObjectList.findObject(inv_item->getParentUUID());
+ if (!object)
+ {
+ LL_INFOS() << "Object not found for drop." << LL_ENDL;
+ return FALSE;
+ }
+
+ // coming from a task. Need to figure out if the person can
+ // move/copy this item.
+ LLPermissions perm(inv_item->getPermissions());
+ bool is_move = false;
+ if ((perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID())
+ && perm.allowTransferTo(gAgent.getID())))
+ // || gAgent.isGodlike())
+ {
+ accept = TRUE;
+ }
+ else if(object->permYouOwner())
+ {
+ // If the object cannot be copied, but the object the
+ // inventory is owned by the agent, then the item can be
+ // moved from the task to agent inventory.
+ is_move = true;
+ accept = TRUE;
+ }
+
+ // Don't allow placing an original item into Current Outfit or an outfit folder
+ // because they must contain only links to wearable items.
+ if (move_is_into_current_outfit || move_is_into_outfit)
+ {
+ accept = FALSE;
+ }
+ // Don't allow to move a single item to Favorites or Landmarks
+ // if it is not a landmark or a link to a landmark.
+ else if ((move_is_into_favorites || move_is_into_landmarks)
+ && !can_move_to_landmarks(inv_item))
+ {
+ accept = FALSE;
+ }
+ else if (move_is_into_marketplacelistings)
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxNotInInventory");
+ accept = FALSE;
+ }
+
+ if (accept && drop)
+ {
+ boost::shared_ptr<LLMoveInv> move_inv (new LLMoveInv());
+ move_inv->mObjectID = inv_item->getParentUUID();
+ std::pair<LLUUID, LLUUID> item_pair(folder_id, inv_item->getUUID());
+ move_inv->mMoveList.push_back(item_pair);
+ move_inv->mCallback = NULL;
+ move_inv->mUserData = NULL;
+ if(is_move)
+ {
+ warn_move_inventory(object, move_inv);
+ }
+ else
+ {
+ // store dad inventory item to select added one later. See EXT-4347
+ set_dad_inventory_item(inv_item, folder_id);
+
+ LLNotification::Params params("MoveInventoryFromObject");
+ params.functor.function(boost::bind(move_task_inventory_callback, _1, _2, move_inv));
+ LLNotifications::instance().forceResponse(params, 0);
+ }
+ }
+ }
+ else if(LLToolDragAndDrop::SOURCE_NOTECARD == source)
+ {
+ if (move_is_into_marketplacelistings)
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxNotInInventory");
+ accept = FALSE;
+ }
+ else if ((inv_item->getActualType() == LLAssetType::AT_SETTINGS) && !LLEnvironment::instance().isInventoryEnabled())
+ {
+ tooltip_msg = LLTrans::getString("NoEnvironmentSettings");
+ accept = FALSE;
+ }
+ else
+ {
+ // Don't allow placing an original item from a notecard to Current Outfit or an outfit folder
+ // because they must contain only links to wearable items.
+ accept = !(move_is_into_current_outfit || move_is_into_outfit);
+ }
+
+ if (accept && drop)
+ {
+ copy_inventory_from_notecard(folder_id, // Drop to the chosen destination folder
+ LLToolDragAndDrop::getInstance()->getObjectID(),
+ LLToolDragAndDrop::getInstance()->getSourceID(),
+ inv_item);
+ }
+ }
+ else if(LLToolDragAndDrop::SOURCE_LIBRARY == source)
+ {
+ LLViewerInventoryItem* item = (LLViewerInventoryItem*)inv_item;
+ if(item && item->isFinished())
+ {
+ accept = TRUE;
+
+ if (move_is_into_marketplacelistings)
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxNotInInventory");
+ accept = FALSE;
+ }
+ else if (move_is_into_current_outfit || move_is_into_outfit)
+ {
+ accept = can_move_to_outfit(inv_item, move_is_into_current_outfit);
+ }
+ // Don't allow to move a single item to Favorites or Landmarks
+ // if it is not a landmark or a link to a landmark.
+ else if (move_is_into_favorites || move_is_into_landmarks)
+ {
+ accept = can_move_to_landmarks(inv_item);
+ }
+
+ if (accept && drop)
+ {
+ // FAVORITES folder
+ // (copy the item)
+ if (move_is_into_favorites)
+ {
+ copy_inventory_item(
+ gAgent.getID(),
+ inv_item->getPermissions().getOwner(),
+ inv_item->getUUID(),
+ folder_id,
+ std::string(),
+ LLPointer<LLInventoryCallback>(NULL));
+ }
+ // CURRENT OUTFIT or OUTFIT folder
+ // (link the item)
+ else if (move_is_into_current_outfit || move_is_into_outfit)
+ {
+ if (move_is_into_current_outfit)
+ {
+ LLAppearanceMgr::instance().wearItemOnAvatar(inv_item->getUUID(), true, true);
+ }
+ else
+ {
+ LLPointer<LLInventoryCallback> cb = NULL;
+ link_inventory_object(folder_id, LLConstPointer<LLInventoryObject>(inv_item), cb);
+ }
+ }
+ else
+ {
+ copy_inventory_item(
+ gAgent.getID(),
+ inv_item->getPermissions().getOwner(),
+ inv_item->getUUID(),
+ folder_id,
+ std::string(),
+ LLPointer<LLInventoryCallback>(NULL));
+ }
+ }
+ }
+ }
+ else
+ {
+ LL_WARNS() << "unhandled drag source" << LL_ENDL;
+ }
+ return accept;
+}
+
+// copy of LLFolderBridge::dragCategoryIntoFolder
+BOOL dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat,
+ BOOL drop, std::string& tooltip_msg, BOOL is_link)
+{
+ BOOL user_confirm = TRUE;
+ LLInventoryModel* model = &gInventory;
+ LLViewerInventoryCategory * dest_cat = gInventory.getCategory(dest_id);
+ if (!dest_cat)
+ {
+ return FALSE;
+ }
+
+ if (!inv_cat) return FALSE; // shouldn't happen, but in case item is incorrectly parented in which case inv_cat will be NULL
+
+ if (!isAgentAvatarValid()) return FALSE;
+ // cannot drag into library
+ if((gInventory.getRootFolderID() != dest_id) && !model->isObjectDescendentOf(dest_id, gInventory.getRootFolderID()))
+ {
+ return FALSE;
+ }
+
+ const LLUUID &cat_id = inv_cat->getUUID();
+ const LLUUID &current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
+ const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
+ //const LLUUID from_folder_uuid = inv_cat->getParentUUID();
+
+ const BOOL move_is_into_current_outfit = (dest_id == current_outfit_id);
+ const BOOL move_is_into_marketplacelistings = model->isObjectDescendentOf(dest_id, marketplacelistings_id);
+ const BOOL move_is_from_marketplacelistings = model->isObjectDescendentOf(cat_id, marketplacelistings_id);
+
+ // check to make sure source is agent inventory, and is represented there.
+ LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource();
+ const BOOL is_agent_inventory = (model->getCategory(cat_id) != NULL)
+ && (LLToolDragAndDrop::SOURCE_AGENT == source);
+
+ BOOL accept = FALSE;
+
+ if (is_agent_inventory)
+ {
+ const LLUUID &trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ const LLUUID &landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
+ const LLUUID &my_outifts_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+ const LLUUID &lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
+
+ const BOOL move_is_into_trash = (dest_id == trash_id) || model->isObjectDescendentOf(dest_id, trash_id);
+ const BOOL move_is_into_my_outfits = (dest_id == my_outifts_id) || model->isObjectDescendentOf(dest_id, my_outifts_id);
+ const BOOL move_is_into_outfit = move_is_into_my_outfits || (dest_cat && dest_cat->getPreferredType()==LLFolderType::FT_OUTFIT);
+ const BOOL move_is_into_current_outfit = (dest_cat && dest_cat->getPreferredType()==LLFolderType::FT_CURRENT_OUTFIT);
+ const BOOL move_is_into_landmarks = (dest_id == landmarks_id) || model->isObjectDescendentOf(dest_id, landmarks_id);
+ const BOOL move_is_into_lost_and_found = model->isObjectDescendentOf(dest_id, lost_and_found_id);
+
+ //--------------------------------------------------------------------------------
+ // Determine if folder can be moved.
+ //
+
+ BOOL is_movable = TRUE;
+
+ if (is_movable && (marketplacelistings_id == cat_id))
+ {
+ is_movable = FALSE;
+ tooltip_msg = LLTrans::getString("TooltipOutboxCannotMoveRoot");
+ }
+ if (is_movable && move_is_from_marketplacelistings)
+ //&& LLMarketplaceData::instance().getActivationState(cat_id))
+ {
+ // If the incoming folder is listed and active (and is therefore either the listing or the version folder),
+ // then moving is *not* allowed
+ is_movable = FALSE;
+ tooltip_msg = LLTrans::getString("TooltipOutboxDragActive");
+ }
+ if (is_movable && (dest_id == cat_id))
+ {
+ is_movable = FALSE;
+ tooltip_msg = LLTrans::getString("TooltipDragOntoSelf");
+ }
+ if (is_movable && (model->isObjectDescendentOf(dest_id, cat_id)))
+ {
+ is_movable = FALSE;
+ tooltip_msg = LLTrans::getString("TooltipDragOntoOwnChild");
+ }
+ if (is_movable && LLFolderType::lookupIsProtectedType(inv_cat->getPreferredType()))
+ {
+ is_movable = FALSE;
+ // tooltip?
+ }
+
+ U32 max_items_to_wear = gSavedSettings.getU32("WearFolderLimit");
+ if (is_movable && move_is_into_outfit)
+ {
+ if (dest_id == my_outifts_id)
+ {
+ if (source != LLToolDragAndDrop::SOURCE_AGENT || move_is_from_marketplacelistings)
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutfitNotInInventory");
+ is_movable = false;
+ }
+ else if (can_move_to_my_outfits(model, inv_cat, max_items_to_wear))
+ {
+ is_movable = true;
+ }
+ else
+ {
+ tooltip_msg = LLTrans::getString("TooltipCantCreateOutfit");
+ is_movable = false;
+ }
+ }
+ else if(dest_cat && dest_cat->getPreferredType() == LLFolderType::FT_NONE)
+ {
+ is_movable = ((inv_cat->getPreferredType() == LLFolderType::FT_NONE) || (inv_cat->getPreferredType() == LLFolderType::FT_OUTFIT));
+ }
+ else
+ {
+ is_movable = false;
+ }
+ }
+ if(is_movable && move_is_into_current_outfit && is_link)
+ {
+ is_movable = FALSE;
+ }
+ if (is_movable && move_is_into_lost_and_found)
+ {
+ is_movable = FALSE;
+ }
+ if (is_movable && (dest_id == model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE)))
+ {
+ is_movable = FALSE;
+ // tooltip?
+ }
+ if (is_movable && (dest_cat->getPreferredType() == LLFolderType::FT_MARKETPLACE_STOCK))
+ {
+ // One cannot move a folder into a stock folder
+ is_movable = FALSE;
+ // tooltip?
+ }
+
+ LLInventoryModel::cat_array_t descendent_categories;
+ LLInventoryModel::item_array_t descendent_items;
+ if (is_movable)
+ {
+ model->collectDescendents(cat_id, descendent_categories, descendent_items, FALSE);
+ for (S32 i=0; i < descendent_categories.size(); ++i)
+ {
+ LLInventoryCategory* category = descendent_categories[i];
+ if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))
+ {
+ // Can't move "special folders" (e.g. Textures Folder).
+ is_movable = FALSE;
+ break;
+ }
+ }
+ }
+ if (is_movable
+ && move_is_into_current_outfit
+ && descendent_items.size() > max_items_to_wear)
+ {
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
+ LLFindWearablesEx not_worn(/*is_worn=*/ false, /*include_body_parts=*/ false);
+ gInventory.collectDescendentsIf(cat_id,
+ cats,
+ items,
+ LLInventoryModel::EXCLUDE_TRASH,
+ not_worn);
+
+ if (items.size() > max_items_to_wear)
+ {
+ // Can't move 'large' folders into current outfit: MAINT-4086
+ is_movable = FALSE;
+ LLStringUtil::format_map_t args;
+ args["AMOUNT"] = llformat("%d", max_items_to_wear);
+ tooltip_msg = LLTrans::getString("TooltipTooManyWearables",args);
+ }
+ }
+ if (is_movable && move_is_into_trash)
+ {
+ for (S32 i=0; i < descendent_items.size(); ++i)
+ {
+ LLInventoryItem* item = descendent_items[i];
+ if (get_is_item_worn(item->getUUID()))
+ {
+ is_movable = FALSE;
+ break; // It's generally movable, but not into the trash.
+ }
+ }
+ }
+ if (is_movable && move_is_into_landmarks)
+ {
+ for (S32 i=0; i < descendent_items.size(); ++i)
+ {
+ LLViewerInventoryItem* item = descendent_items[i];
+
+ // Don't move anything except landmarks and categories into Landmarks folder.
+ // We use getType() instead of getActua;Type() to allow links to landmarks and folders.
+ if (LLAssetType::AT_LANDMARK != item->getType() && LLAssetType::AT_CATEGORY != item->getType())
+ {
+ is_movable = FALSE;
+ break; // It's generally movable, but not into Landmarks.
+ }
+ }
+ }
+
+ if (is_movable && move_is_into_marketplacelistings)
+ {
+ const LLViewerInventoryCategory * master_folder = model->getFirstDescendantOf(marketplacelistings_id, dest_id);
+ LLViewerInventoryCategory * dest_folder = dest_cat;
+ S32 bundle_size = (drop ? 1 : LLToolDragAndDrop::instance().getCargoCount());
+ is_movable = can_move_folder_to_marketplace(master_folder, dest_folder, inv_cat, tooltip_msg, bundle_size);
+ }
+
+ //
+ //--------------------------------------------------------------------------------
+
+ accept = is_movable;
+
+ if (accept && drop)
+ {
+ // Dropping in or out of marketplace needs (sometimes) confirmation
+ if (user_confirm && (move_is_from_marketplacelistings || move_is_into_marketplacelistings))
+ {
+ //disable dropping in or out of marketplace for now
+ return FALSE;
+ }
+ // Look for any gestures and deactivate them
+ if (move_is_into_trash)
+ {
+ for (S32 i=0; i < descendent_items.size(); i++)
+ {
+ LLInventoryItem* item = descendent_items[i];
+ if (item->getType() == LLAssetType::AT_GESTURE
+ && LLGestureMgr::instance().isGestureActive(item->getUUID()))
+ {
+ LLGestureMgr::instance().deactivateGesture(item->getUUID());
+ }
+ }
+ }
+
+ if (dest_id == my_outifts_id)
+ {
+ // Category can contains objects,
+ // create a new folder and populate it with links to original objects
+ dropToMyOutfits(inv_cat);
+ }
+ // if target is current outfit folder we use link
+ else if (move_is_into_current_outfit &&
+ (inv_cat->getPreferredType() == LLFolderType::FT_NONE ||
+ inv_cat->getPreferredType() == LLFolderType::FT_OUTFIT))
+ {
+ // traverse category and add all contents to currently worn.
+ BOOL append = true;
+ LLAppearanceMgr::instance().wearInventoryCategory(inv_cat, false, append);
+ }
+ else if (move_is_into_marketplacelistings)
+ {
+ //move_folder_to_marketplacelistings(inv_cat, dest_id);
+ }
+ else
+ {
+ if (model->isObjectDescendentOf(cat_id, model->findCategoryUUIDForType(LLFolderType::FT_INBOX)))
+ {
+ set_dad_inbox_object(cat_id);
+ }
+
+ // Reparent the folder and restamp children if it's moving
+ // into trash.
+ gInventory.changeCategoryParent(
+ (LLViewerInventoryCategory*)inv_cat,
+ dest_id,
+ move_is_into_trash);
+ }
+ if (move_is_from_marketplacelistings)
+ {
+ //disable dropping in or out of marketplace for now
+ return FALSE;
+
+ // If we are moving a folder at the listing folder level (i.e. its parent is the marketplace listings folder)
+ /*if (from_folder_uuid == marketplacelistings_id)
+ {
+ // Clear the folder from the marketplace in case it is a listing folder
+ if (LLMarketplaceData::instance().isListed(cat_id))
+ {
+ LLMarketplaceData::instance().clearListing(cat_id);
+ }
+ }
+ else
+ {
+ // If we move from within an active (listed) listing, checks that it's still valid, if not, unlist
+ LLUUID version_folder_id = LLMarketplaceData::instance().getActiveFolder(from_folder_uuid);
+ if (version_folder_id.notNull())
+ {
+ LLMarketplaceValidator::getInstance()->validateMarketplaceListings(
+ version_folder_id,
+ [version_folder_id](bool result)
+ {
+ if (!result)
+ {
+ LLMarketplaceData::instance().activateListing(version_folder_id, false);
+ }
+ }
+ );
+ }
+ // In all cases, update the listing we moved from so suffix are updated
+ update_marketplace_category(from_folder_uuid);
+ }*/
+ }
+ }
+ }
+ else if (LLToolDragAndDrop::SOURCE_WORLD == source)
+ {
+ if (move_is_into_marketplacelistings)
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxNotInInventory");
+ accept = FALSE;
+ }
+ else
+ {
+ accept = move_inv_category_world_to_agent(cat_id, dest_id, drop);
+ }
+ }
+ else if (LLToolDragAndDrop::SOURCE_LIBRARY == source)
+ {
+ if (move_is_into_marketplacelistings)
+ {
+ tooltip_msg = LLTrans::getString("TooltipOutboxNotInInventory");
+ accept = FALSE;
+ }
+ else
+ {
+ // Accept folders that contain complete outfits.
+ accept = move_is_into_current_outfit && LLAppearanceMgr::instance().getCanMakeFolderIntoOutfit(cat_id);
+ }
+
+ if (accept && drop)
+ {
+ LLAppearanceMgr::instance().wearInventoryCategory(inv_cat, true, false);
+ }
+ }
+
+ return accept;
+}
+
+void outfitFolderCreatedCallback(LLUUID cat_source_id, LLUUID cat_dest_id)
+{
+ LLInventoryModel::cat_array_t* categories;
+ LLInventoryModel::item_array_t* items;
+ gInventory.getDirectDescendentsOf(cat_source_id, categories, items);
+
+ LLInventoryObject::const_object_list_t link_array;
+
+
+ LLInventoryModel::item_array_t::iterator iter = items->begin();
+ LLInventoryModel::item_array_t::iterator end = items->end();
+ while (iter!=end)
+ {
+ const LLViewerInventoryItem* item = (*iter);
+ // By this point everything is supposed to be filtered,
+ // but there was a delay to create folder so something could have changed
+ LLInventoryType::EType inv_type = item->getInventoryType();
+ if ((inv_type == LLInventoryType::IT_WEARABLE) ||
+ (inv_type == LLInventoryType::IT_GESTURE) ||
+ (inv_type == LLInventoryType::IT_ATTACHMENT) ||
+ (inv_type == LLInventoryType::IT_OBJECT) ||
+ (inv_type == LLInventoryType::IT_SNAPSHOT) ||
+ (inv_type == LLInventoryType::IT_TEXTURE))
+ {
+ link_array.push_back(LLConstPointer<LLInventoryObject>(item));
+ }
+ iter++;
+ }
+
+ if (!link_array.empty())
+ {
+ LLPointer<LLInventoryCallback> cb = NULL;
+ link_inventory_array(cat_dest_id, link_array, cb);
+ }
+}
+
+void dropToMyOutfits(LLInventoryCategory* inv_cat)
+{
+ // make a folder in the My Outfits directory.
+ const LLUUID dest_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+
+ // Note: creation will take time, so passing folder id to callback is slightly unreliable,
+ // but so is collecting and passing descendants' ids
+ inventory_func_type func = boost::bind(&outfitFolderCreatedCallback, inv_cat->getUUID(), _1);
+ gInventory.createNewCategory(dest_id, LLFolderType::FT_OUTFIT, inv_cat->getName(), func, inv_cat->getThumbnailUUID());
+}
+
diff --git a/indra/newview/llinventorygallery.h b/indra/newview/llinventorygallery.h
new file mode 100644
index 0000000000..9b3f12701f
--- /dev/null
+++ b/indra/newview/llinventorygallery.h
@@ -0,0 +1,419 @@
+/**
+ * @file llinventorygallery.h
+ * @brief LLInventoryGallery class definition
+ *
+ * $LicenseInfo:firstyear=2023&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2023, 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$
+ */
+
+#ifndef LL_LLINVENTORYGALLERY_H
+#define LL_LLINVENTORYGALLERY_H
+
+#include "llgesturemgr.h"
+#include "lllistcontextmenu.h"
+#include "llpanel.h"
+#include "llinventoryfilter.h"
+#include "llinventoryobserver.h"
+#include "llinventorymodel.h"
+
+class LLInventoryCategoriesObserver;
+class LLInventoryGalleryItem;
+class LLScrollContainer;
+class LLTextBox;
+class LLThumbnailsObserver;
+class LLGalleryGestureObserver;
+
+class LLInventoryGalleryContextMenu;
+
+typedef boost::function<void()> callback_t;
+
+class LLInventoryGallery : public LLPanel, public LLEditMenuHandler
+{
+public:
+
+ typedef boost::signals2::signal<void(const LLUUID&)> selection_change_signal_t;
+ typedef boost::function<void(const LLUUID&)> selection_change_callback_t;
+ typedef std::deque<LLUUID> selection_deque;
+
+ struct Params
+ : public LLInitParam::Block<Params, LLPanel::Params>
+ {
+ Optional<S32> row_panel_height;
+ Optional<S32> row_panel_width_factor;
+ Optional<S32> gallery_width_factor;
+ Optional<S32> vertical_gap;
+ Optional<S32> horizontal_gap;
+ Optional<S32> item_width;
+ Optional<S32> item_height;
+ Optional<S32> item_horizontal_gap;
+ Optional<S32> items_in_row;
+
+ Params();
+ };
+
+ static const LLInventoryGallery::Params& getDefaultParams();
+
+ LLInventoryGallery(const LLInventoryGallery::Params& params = getDefaultParams());
+ ~LLInventoryGallery();
+
+ BOOL postBuild() override;
+ void initGallery();
+ void draw() override;
+ void onVisibilityChange(BOOL new_visibility) override;
+ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type,
+ void* cargo_data, EAcceptance* accept, std::string& tooltip_msg) override;
+ void startDrag();
+ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask) override;
+ BOOL handleKeyHere(KEY key, MASK mask) override;
+ void moveUp(MASK mask);
+ void moveDown(MASK mask);
+ void moveLeft(MASK mask);
+ void moveRight(MASK mask);
+ void toggleSelectionRange(S32 start_idx, S32 end_idx);
+ void toggleSelectionRangeFromLast(const LLUUID target);
+
+ void onFocusLost() override;
+ void onFocusReceived() override;
+
+ void setFilterSubString(const std::string& string);
+ std::string getFilterSubString() { return mFilterSubString; }
+ LLInventoryFilter& getFilter() const { return *mFilter; }
+ bool checkAgainstFilterType(const LLUUID& object_id);
+
+ void getCurrentCategories(uuid_vec_t& vcur);
+ bool updateAddedItem(LLUUID item_id); // returns true if added item is visible
+ void updateRemovedItem(LLUUID item_id);
+ void updateChangedItemName(LLUUID item_id, std::string name);
+ void updateItemThumbnail(LLUUID item_id);
+ void updateWornItem(LLUUID item_id, bool is_worn);
+
+ void updateMessageVisibility();
+
+ void setRootFolder(const LLUUID cat_id);
+ void updateRootFolder();
+ LLUUID getRootFolder() { return mFolderID; }
+ bool isRootDirty() { return mRootDirty; }
+ boost::signals2::connection setRootChangedCallback(callback_t cb);
+ void onForwardFolder();
+ void onBackwardFolder();
+ void clearNavigationHistory();
+ bool isBackwardAvailable();
+ bool isForwardAvailable();
+
+ void setNavBackwardList(std::list<LLUUID> backward_list) { mBackwardFolders = backward_list; }
+ void setNavForwardList(std::list<LLUUID> forward_list) { mForwardFolders = forward_list; }
+ std::list<LLUUID> getNavBackwardList() { return mBackwardFolders; }
+ std::list<LLUUID> getNavForwardList() { return mForwardFolders; }
+
+ LLUUID getOutfitImageID(LLUUID outfit_id);
+
+ void refreshList(const LLUUID& category_id);
+ void onCOFChanged();
+ void onGesturesChanged();
+ void computeDifference(const LLInventoryModel::cat_array_t vcats, const LLInventoryModel::item_array_t vitems, uuid_vec_t& vadded, uuid_vec_t& vremoved);
+
+ void deselectItem(const LLUUID& category_id);
+ void clearSelection();
+ void changeItemSelection(const LLUUID& item_id, bool scroll_to_selection = false);
+ void addItemSelection(const LLUUID& item_id, bool scroll_to_selection = false);
+ bool toggleItemSelection(const LLUUID& item_id, bool scroll_to_selection = false);
+ void scrollToShowItem(const LLUUID& item_id);
+ void signalSelectionItemID(const LLUUID& category_id);
+ boost::signals2::connection setSelectionChangeCallback(selection_change_callback_t cb);
+ LLUUID getFirstSelectedItemID();
+
+ void setSearchType(LLInventoryFilter::ESearchType type);
+ LLInventoryFilter::ESearchType getSearchType() { return mSearchType; }
+
+ bool areViewsInitialized();
+ bool hasDescendents(const LLUUID& cat_id);
+ bool hasVisibleItems();
+ void handleModifiedFilter();
+ LLScrollContainer* getScrollableContainer() { return mScrollPanel; }
+ LLInventoryGalleryItem* getFirstSelectedItem();
+
+ // Copy & paste (LLEditMenuHandler)
+ void copy() override;
+ BOOL canCopy() const override;
+
+ void cut() override;
+ BOOL canCut() const override;
+
+ void paste() override;
+ BOOL canPaste() const override;
+
+ // Copy & paste & delete
+ static void onDelete(const LLSD& notification, const LLSD& response, const selection_deque selected_ids);
+ void deleteSelection();
+ bool canDeleteSelection();
+ void pasteAsLink();
+
+ void setSortOrder(U32 order, bool update = false);
+ U32 getSortOrder() { return mSortOrder; };
+
+ void claimEditHandler();
+ void resetEditHandler();
+ static bool isItemCopyable(const LLUUID & item_id);
+
+ BOOL baseHandleDragAndDrop(LLUUID dest_id, BOOL drop, EDragAndDropType cargo_type,
+ void* cargo_data, EAcceptance* accept, std::string& tooltip_msg);
+
+ void showContextMenu(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& item_id);
+
+protected:
+ void paste(const LLUUID& dest,
+ std::vector<LLUUID>& objects,
+ bool is_cut_mode,
+ const LLUUID& marketplacelistings_id);
+ void pasteAsLink(const LLUUID& dest,
+ std::vector<LLUUID>& objects,
+ const LLUUID& current_outfit_id,
+ const LLUUID& marketplacelistings_id,
+ const LLUUID& my_outifts_id);
+
+ bool applyFilter(LLInventoryGalleryItem* item, const std::string& filter_substring);
+ bool checkAgainstFilters(LLInventoryGalleryItem* item, const std::string& filter_substring);
+ static void onIdle(void* userdata);
+ void dirtyRootFolder();
+
+ LLInventoryCategoriesObserver* mCategoriesObserver;
+ LLThumbnailsObserver* mThumbnailsObserver;
+ LLGalleryGestureObserver* mGestureObserver;
+ LLInventoryObserver* mInventoryObserver;
+ selection_deque mSelectedItemIDs;
+ selection_deque mItemsToSelect;
+ LLUUID mLastInteractedUUID;
+ bool mIsInitialized;
+ bool mRootDirty;
+
+ selection_change_signal_t mSelectionChangeSignal;
+ boost::signals2::signal<void()> mRootChangedSignal;
+ LLUUID mFolderID;
+ std::list<LLUUID> mBackwardFolders;
+ std::list<LLUUID> mForwardFolders;
+
+private:
+ void addToGallery(LLInventoryGalleryItem* item);
+ void removeFromGalleryLast(LLInventoryGalleryItem* item, bool needs_reshape = true);
+ void removeFromGalleryMiddle(LLInventoryGalleryItem* item);
+ LLPanel* addLastRow();
+ void removeLastRow();
+ void moveRowUp(int row);
+ void moveRowDown(int row);
+ void moveRow(int row, int pos);
+ LLPanel* addToRow(LLPanel* row_stack, LLInventoryGalleryItem* item, int pos, int hgap);
+ void removeFromLastRow(LLInventoryGalleryItem* item);
+ void reArrangeRows(S32 row_diff = 0);
+ bool updateRowsIfNeeded();
+ void updateGalleryWidth();
+
+ LLInventoryGalleryItem* buildGalleryItem(std::string name, LLUUID item_id, LLAssetType::EType type, LLUUID thumbnail_id, LLInventoryType::EType inventory_type, U32 flags, time_t creation_date, bool is_link, bool is_worn);
+
+ void buildGalleryPanel(int row_count);
+ void reshapeGalleryPanel(int row_count);
+ LLPanel* buildItemPanel(int left);
+ LLPanel* buildRowPanel(int left, int bottom);
+ void moveRowPanel(LLPanel* stack, int left, int bottom);
+
+ std::vector<LLPanel*> mRowPanels;
+ std::vector<LLPanel*> mItemPanels;
+ std::vector<LLPanel*> mUnusedRowPanels;
+ std::vector<LLPanel*> mUnusedItemPanels;
+ std::vector<LLInventoryGalleryItem*> mItems;
+ std::vector<LLInventoryGalleryItem*> mHiddenItems;
+ LLScrollContainer* mScrollPanel;
+ LLPanel* mGalleryPanel;
+ LLPanel* mLastRowPanel;
+ LLTextBox* mMessageTextBox;
+ int mRowCount;
+ int mItemsAddedCount;
+ bool mGalleryCreated;
+ bool mNeedsArrange;
+
+ /* Params */
+ int mRowPanelHeight;
+ int mVerticalGap;
+ int mHorizontalGap;
+ int mItemWidth;
+ int mItemHeight;
+ int mItemHorizontalGap;
+ int mItemsInRow;
+ int mRowPanelWidth;
+ int mGalleryWidth;
+ int mRowPanWidthFactor;
+ int mGalleryWidthFactor;
+
+ LLInventoryGalleryContextMenu* mInventoryGalleryMenu;
+ LLInventoryGalleryContextMenu* mRootGalleryMenu;
+ std::string mFilterSubString;
+ LLInventoryFilter* mFilter;
+ U32 mSortOrder;
+
+ typedef std::map<LLUUID, LLInventoryGalleryItem*> gallery_item_map_t;
+ gallery_item_map_t mItemMap;
+ uuid_vec_t mCOFLinkedItems;
+ uuid_vec_t mActiveGestures;
+ uuid_set_t mItemBuildQuery;
+ std::map<LLInventoryGalleryItem*, S32> mItemIndexMap;
+ std::map<S32, LLInventoryGalleryItem*> mIndexToItemMap;
+
+ LLInventoryFilter::ESearchType mSearchType;
+ std::string mUsername;
+};
+
+class LLInventoryGalleryItem : public LLPanel
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLPanel::Params>
+ {};
+
+ enum EInventorySortGroup
+ {
+ SG_SYSTEM_FOLDER,
+ SG_TRASH_FOLDER,
+ SG_NORMAL_FOLDER,
+ SG_ITEM
+ };
+
+ LLInventoryGalleryItem(const Params& p);
+ virtual ~LLInventoryGalleryItem();
+
+ BOOL postBuild();
+ void draw();
+ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+ BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
+ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
+ BOOL handleHover(S32 x, S32 y, MASK mask);
+ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg);
+ BOOL handleKeyHere(KEY key, MASK mask);
+
+ void onFocusLost();
+ void onFocusReceived();
+
+ LLFontGL* getTextFont();
+
+ void setItemName(std::string name);
+ bool isSelected() { return mSelected; }
+ void setSelected(bool value);
+ void setWorn(bool value);
+ void setUUID(LLUUID id) {mUUID = id;}
+ LLUUID getUUID() { return mUUID;}
+
+ void setAssetIDStr(std::string asset_id) {mAssetIDStr = asset_id;}
+ std::string getAssetIDStr() { return mAssetIDStr;}
+ void setDescription(std::string desc) {mDesc = desc;}
+ std::string getDescription() { return mDesc;}
+ void setCreatorName(std::string name) {mCreatorName = name;}
+ std::string getCreatorName() { return mCreatorName;}
+ void setCreationDate(time_t date) {mCreationDate = date;}
+ time_t getCreationDate() { return mCreationDate;}
+
+ std::string getItemName() {return mItemName;}
+ std::string getItemNameSuffix() {return mPermSuffix + mWornSuffix;}
+ bool isDefaultImage() {return mDefaultImage;}
+
+ bool isHidden() {return mHidden;}
+ void setHidden(bool hidden) {mHidden = hidden;}
+
+ void setType(LLAssetType::EType type, LLInventoryType::EType inventory_type, U32 flags, bool is_link);
+ LLAssetType::EType getAssetType() { return mType; }
+ void setThumbnail(LLUUID id);
+ void setGallery(LLInventoryGallery* gallery) { mGallery = gallery; }
+ bool isFolder() { return mIsFolder; }
+ bool isLink() { return mIsLink; }
+ EInventorySortGroup getSortGroup() { return mSortGroup; }
+
+ void updateNameText();
+
+private:
+ bool isFadeItem();
+
+ LLUUID mUUID;
+ LLTextBox* mNameText;
+ LLPanel* mTextBgPanel;
+ bool mSelected;
+ bool mWorn;
+ bool mDefaultImage;
+ bool mHidden;
+ bool mIsFolder;
+ bool mIsLink;
+ S32 mCutGeneration;
+ bool mSelectedForCut;
+
+ std::string mAssetIDStr;
+ std::string mDesc;
+ std::string mCreatorName;
+ time_t mCreationDate;
+
+ EInventorySortGroup mSortGroup;
+ LLAssetType::EType mType;
+ std::string mItemName;
+ std::string mWornSuffix;
+ std::string mPermSuffix;
+ LLInventoryGallery* mGallery;
+};
+
+class LLThumbnailsObserver : public LLInventoryObserver
+{
+public:
+ LLThumbnailsObserver(){};
+
+ virtual void changed(U32 mask);
+ bool addItem(const LLUUID& obj_id, callback_t cb);
+ void removeItem(const LLUUID& obj_id);
+
+protected:
+
+ struct LLItemData
+ {
+ LLItemData(const LLUUID& obj_id, const LLUUID& thumbnail_id, callback_t cb)
+ : mItemID(obj_id)
+ , mCallback(cb)
+ , mThumbnailID(thumbnail_id)
+ {}
+
+ callback_t mCallback;
+ LLUUID mItemID;
+ LLUUID mThumbnailID;
+ };
+
+ typedef std::map<LLUUID, LLItemData> item_map_t;
+ typedef item_map_t::value_type item_map_value_t;
+ item_map_t mItemMap;
+};
+
+class LLGalleryGestureObserver : public LLGestureManagerObserver
+{
+public:
+ LLGalleryGestureObserver(LLInventoryGallery* gallery) : mGallery(gallery) {}
+ virtual ~LLGalleryGestureObserver() {}
+ virtual void changed() { mGallery->onGesturesChanged(); }
+
+private:
+ LLInventoryGallery* mGallery;
+};
+
+#endif
diff --git a/indra/newview/llinventorygallerymenu.cpp b/indra/newview/llinventorygallerymenu.cpp
new file mode 100644
index 0000000000..5f4b816b99
--- /dev/null
+++ b/indra/newview/llinventorygallerymenu.cpp
@@ -0,0 +1,714 @@
+/**
+ * @file llinventorygallerymenu.cpp
+ *
+ * $LicenseInfo:firstyear=2023&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2023, 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 "llinventorygallery.h"
+#include "llinventorygallerymenu.h"
+
+#include "llagent.h"
+#include "llappearancemgr.h"
+#include "llavataractions.h"
+#include "llclipboard.h"
+#include "llfloaterreg.h"
+#include "llfloatersidepanelcontainer.h"
+#include "llfloaterworldmap.h"
+#include "llinventorybridge.h"
+#include "llinventoryfunctions.h"
+#include "llinventorymodel.h"
+#include "lllandmarkactions.h"
+#include "llmarketplacefunctions.h"
+#include "llmenugl.h"
+#include "llnotificationsutil.h"
+#include "llpreviewtexture.h"
+#include "lltrans.h"
+#include "llviewerfoldertype.h"
+#include "llviewerwindow.h"
+#include "llvoavatarself.h"
+
+LLContextMenu* LLInventoryGalleryContextMenu::createMenu()
+{
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
+
+ registrar.add("Inventory.DoToSelected", boost::bind(&LLInventoryGalleryContextMenu::doToSelected, this, _2));
+ registrar.add("Inventory.FileUploadLocation", boost::bind(&LLInventoryGalleryContextMenu::fileUploadLocation, this, _2));
+ registrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH));
+ registrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND));
+
+ std::set<LLUUID> uuids(mUUIDs.begin(), mUUIDs.end());
+ registrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars, uuids, gFloaterView->getParentFloater(mGallery)));
+
+ enable_registrar.add("Inventory.CanSetUploadLocation", boost::bind(&LLInventoryGalleryContextMenu::canSetUploadLocation, this, _2));
+
+ LLContextMenu* menu = createFromFile("menu_gallery_inventory.xml");
+
+ updateMenuItemsVisibility(menu);
+
+ return menu;
+}
+
+void LLInventoryGalleryContextMenu::doToSelected(const LLSD& userdata)
+{
+ std::string action = userdata.asString();
+ LLInventoryObject* obj = gInventory.getObject(mUUIDs.front());
+ if(!obj) return;
+
+ if ("open_selected_folder" == action)
+ {
+ mGallery->setRootFolder(mUUIDs.front());
+ }
+ else if ("open_in_new_window" == action)
+ {
+ new_folder_window(mUUIDs.front());
+ }
+ else if ("properties" == action)
+ {
+ show_item_profile(mUUIDs.front());
+ }
+ else if ("restore" == action)
+ {
+ for (LLUUID& selected_id : mUUIDs)
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(selected_id);
+ if (cat)
+ {
+ const LLUUID new_parent = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(cat->getType()));
+ // do not restamp children on restore
+ gInventory.changeCategoryParent(cat, new_parent, false);
+ }
+ else
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(selected_id);
+ if (item)
+ {
+ bool is_snapshot = (item->getInventoryType() == LLInventoryType::IT_SNAPSHOT);
+
+ const LLUUID new_parent = gInventory.findCategoryUUIDForType(is_snapshot ? LLFolderType::FT_SNAPSHOT_CATEGORY : LLFolderType::assetTypeToFolderType(item->getType()));
+ // do not restamp children on restore
+ gInventory.changeItemParent(item, new_parent, false);
+ }
+ }
+ }
+ }
+ else if ("copy_uuid" == action)
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(mUUIDs.front());
+ if(item)
+ {
+ LLUUID asset_id = item->getProtectedAssetUUID();
+ std::string buffer;
+ asset_id.toString(buffer);
+
+ gViewerWindow->getWindow()->copyTextToClipboard(utf8str_to_wstring(buffer));
+ }
+ }
+ else if ("purge" == action)
+ {
+ for (LLUUID& selected_id : mUUIDs)
+ {
+ remove_inventory_object(selected_id, NULL);
+ }
+ }
+ else if ("goto" == action)
+ {
+ show_item_original(mUUIDs.front());
+ }
+ else if ("thumbnail" == action)
+ {
+ LLSD data(mUUIDs.front());
+ LLFloaterReg::showInstance("change_item_thumbnail", data);
+ }
+ else if ("cut" == action)
+ {
+ if (mGallery->canCut())
+ {
+ mGallery->cut();
+ }
+ }
+ else if ("paste" == action)
+ {
+ if (mGallery->canPaste())
+ {
+ mGallery->paste();
+ }
+ }
+ else if ("delete" == action)
+ {
+ mGallery->deleteSelection();
+ }
+ else if ("copy" == action)
+ {
+ if (mGallery->canCopy())
+ {
+ mGallery->copy();
+ }
+ }
+ else if ("paste_link" == action)
+ {
+ mGallery->pasteAsLink();
+ }
+ else if ("rename" == action)
+ {
+ rename(mUUIDs.front());
+ }
+ else if ("open" == action || "open_original" == action)
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(mUUIDs.front());
+ if (item)
+ {
+ LLInvFVBridgeAction::doAction(item->getType(), mUUIDs.front(), &gInventory);
+ }
+ }
+ else if ("ungroup_folder_items" == action)
+ {
+ ungroup_folder_items(mUUIDs.front());
+ }
+ else if ("take_off" == action || "detach" == action)
+ {
+ for (LLUUID& selected_id : mUUIDs)
+ {
+ LLAppearanceMgr::instance().removeItemFromAvatar(selected_id);
+ }
+ }
+ else if ("wear_add" == action)
+ {
+ for (LLUUID& selected_id : mUUIDs)
+ {
+ LLAppearanceMgr::instance().wearItemOnAvatar(selected_id, true, false); // Don't replace if adding.
+ }
+ }
+ else if ("wear" == action)
+ {
+ for (LLUUID& selected_id : mUUIDs)
+ {
+ LLAppearanceMgr::instance().wearItemOnAvatar(selected_id, true, true);
+ }
+ }
+ else if ("activate" == action)
+ {
+ for (LLUUID& selected_id : mUUIDs)
+ {
+ LLGestureMgr::instance().activateGesture(selected_id);
+
+ LLViewerInventoryItem* item = gInventory.getItem(selected_id);
+ if (!item) return;
+
+ gInventory.updateItem(item);
+ }
+ gInventory.notifyObservers();
+ }
+ else if ("deactivate" == action)
+ {
+ for (LLUUID& selected_id : mUUIDs)
+ {
+ LLGestureMgr::instance().deactivateGesture(selected_id);
+
+ LLViewerInventoryItem* item = gInventory.getItem(selected_id);
+ if (!item) return;
+
+ gInventory.updateItem(item);
+ }
+ gInventory.notifyObservers();
+ }
+ else if ("replace_links" == action)
+ {
+ LLFloaterReg::showInstance("linkreplace", LLSD(mUUIDs.front()));
+ }
+ else if ("copy_slurl" == action)
+ {
+ boost::function<void(LLLandmark*)> copy_slurl_cb = [](LLLandmark* landmark)
+ {
+ LLVector3d global_pos;
+ landmark->getGlobalPos(global_pos);
+ boost::function<void(std::string& slurl)> copy_slurl_to_clipboard_cb = [](const std::string& slurl)
+ {
+ gViewerWindow->getWindow()->copyTextToClipboard(utf8str_to_wstring(slurl));
+ LLSD args;
+ args["SLURL"] = slurl;
+ LLNotificationsUtil::add("CopySLURL", args);
+ };
+ LLLandmarkActions::getSLURLfromPosGlobal(global_pos, copy_slurl_to_clipboard_cb, true);
+ };
+ LLLandmark* landmark = LLLandmarkActions::getLandmark(mUUIDs.front(), copy_slurl_cb);
+ if (landmark)
+ {
+ copy_slurl_cb(landmark);
+ }
+ }
+ else if ("about" == action)
+ {
+ LLSD key;
+ key["type"] = "landmark";
+ key["id"] = mUUIDs.front();
+ LLFloaterSidePanelContainer::showPanel("places", key);
+ }
+ else if ("show_on_map" == action)
+ {
+ boost::function<void(LLLandmark*)> show_on_map_cb = [](LLLandmark* landmark)
+ {
+ LLVector3d landmark_global_pos;
+ if (landmark->getGlobalPos(landmark_global_pos))
+ {
+ LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance();
+ if (!landmark_global_pos.isExactlyZero() && worldmap_instance)
+ {
+ worldmap_instance->trackLocation(landmark_global_pos);
+ LLFloaterReg::showInstance("world_map", "center");
+ }
+ }
+ };
+ LLLandmark* landmark = LLLandmarkActions::getLandmark(mUUIDs.front(), show_on_map_cb);
+ if(landmark)
+ {
+ show_on_map_cb(landmark);
+ }
+ }
+ else if ("save_as" == action)
+ {
+ LLPreviewTexture* preview_texture = LLFloaterReg::getTypedInstance<LLPreviewTexture>("preview_texture", mUUIDs.front());
+ if (preview_texture)
+ {
+ preview_texture->openToSave();
+ preview_texture->saveAs();
+ }
+ }
+}
+
+void LLInventoryGalleryContextMenu::rename(const LLUUID& item_id)
+{
+ LLInventoryObject* obj = gInventory.getObject(item_id);
+ if (!obj) return;
+
+ LLSD args;
+ args["NAME"] = obj->getName();
+
+ LLSD payload;
+ payload["id"] = mUUIDs.front();
+
+ LLNotificationsUtil::add("RenameItem", args, payload, boost::bind(onRename, _1, _2));
+}
+
+void LLInventoryGalleryContextMenu::onRename(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option != 0) return; // canceled
+
+ std::string new_name = response["new_name"].asString();
+ LLStringUtil::trim(new_name);
+ if (!new_name.empty())
+ {
+ LLUUID id = notification["payload"]["id"].asUUID();
+
+ LLViewerInventoryCategory* cat = gInventory.getCategory(id);
+ if(cat && (cat->getName() != new_name))
+ {
+ LLSD updates;
+ updates["name"] = new_name;
+ update_inventory_category(cat->getUUID(),updates, NULL);
+ return;
+ }
+
+ LLViewerInventoryItem* item = gInventory.getItem(id);
+ if(item && (item->getName() != new_name))
+ {
+ LLSD updates;
+ updates["name"] = new_name;
+ update_inventory_item(item->getUUID(),updates, NULL);
+ }
+ }
+}
+
+void LLInventoryGalleryContextMenu::fileUploadLocation(const LLSD& userdata)
+{
+ const std::string param = userdata.asString();
+ if (param == "model")
+ {
+ gSavedPerAccountSettings.setString("ModelUploadFolder", mUUIDs.front().asString());
+ }
+ else if (param == "texture")
+ {
+ gSavedPerAccountSettings.setString("TextureUploadFolder", mUUIDs.front().asString());
+ }
+ else if (param == "sound")
+ {
+ gSavedPerAccountSettings.setString("SoundUploadFolder", mUUIDs.front().asString());
+ }
+ else if (param == "animation")
+ {
+ gSavedPerAccountSettings.setString("AnimationUploadFolder", mUUIDs.front().asString());
+ }
+}
+
+bool LLInventoryGalleryContextMenu::canSetUploadLocation(const LLSD& userdata)
+{
+ if (mUUIDs.size() != 1)
+ {
+ return false;
+ }
+ LLInventoryCategory* cat = gInventory.getCategory(mUUIDs.front());
+ if (!cat)
+ {
+ return false;
+ }
+ return true;
+}
+
+bool is_inbox_folder(LLUUID item_id)
+{
+ const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX);
+
+ if (inbox_id.isNull())
+ {
+ return false;
+ }
+
+ return gInventory.isObjectDescendentOf(item_id, inbox_id);
+}
+
+void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* menu)
+{
+ LLUUID selected_id = mUUIDs.front();
+ LLInventoryObject* obj = gInventory.getObject(selected_id);
+ if (!obj)
+ {
+ return;
+ }
+
+ std::vector<std::string> items;
+ std::vector<std::string> disabled_items;
+
+ bool is_agent_inventory = gInventory.isObjectDescendentOf(selected_id, gInventory.getRootFolderID());
+ bool is_link = obj->getIsLinkType();
+ bool is_folder = (obj->getType() == LLAssetType::AT_CATEGORY);
+ bool is_cof = LLAppearanceMgr::instance().getIsInCOF(selected_id);
+ bool is_inbox = is_inbox_folder(selected_id);
+ bool is_trash = (selected_id == gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH));
+ bool is_in_trash = gInventory.isObjectDescendentOf(selected_id, gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH));
+ bool is_lost_and_found = (selected_id == gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND));
+ bool is_outfits= (selected_id == gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS));
+ //bool is_favorites= (selected_id == gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE));
+
+ bool is_system_folder = false;
+ LLFolderType::EType folder_type(LLFolderType::FT_NONE);
+ bool has_children = false;
+ bool is_full_perm_item = false;
+ bool is_copyable = false;
+ LLViewerInventoryItem* selected_item = gInventory.getItem(selected_id);
+
+ if(is_folder)
+ {
+ LLInventoryCategory* category = gInventory.getCategory(selected_id);
+ if (category)
+ {
+ folder_type = category->getPreferredType();
+ is_system_folder = LLFolderType::lookupIsProtectedType(folder_type);
+ has_children = (gInventory.categoryHasChildren(selected_id) != LLInventoryModel::CHILDREN_NO);
+ }
+ }
+ else
+ {
+ if (selected_item)
+ {
+ is_full_perm_item = selected_item->getIsFullPerm();
+ is_copyable = selected_item->getPermissions().allowCopyBy(gAgent.getID());
+ }
+ }
+
+ if(!is_link)
+ {
+ items.push_back(std::string("thumbnail"));
+ if (!is_agent_inventory || (is_in_trash && !is_trash))
+ {
+ disabled_items.push_back(std::string("thumbnail"));
+ }
+ }
+
+ if (is_folder)
+ {
+ if(!isRootFolder())
+ {
+ items.push_back(std::string("Copy Separator"));
+
+ items.push_back(std::string("open_in_current_window"));
+ items.push_back(std::string("open_in_new_window"));
+ items.push_back(std::string("Open Folder Separator"));
+ }
+ }
+ else
+ {
+ if (is_agent_inventory && (obj->getType() != LLAssetType::AT_LINK_FOLDER))
+ {
+ items.push_back(std::string("Replace Links"));
+ }
+ if (obj->getType() == LLAssetType::AT_LANDMARK)
+ {
+ items.push_back(std::string("Landmark Separator"));
+ items.push_back(std::string("url_copy"));
+ items.push_back(std::string("About Landmark"));
+ items.push_back(std::string("show_on_map"));
+ }
+ }
+
+ if(is_trash)
+ {
+ items.push_back(std::string("Empty Trash"));
+
+ LLInventoryModel::cat_array_t* cat_array;
+ LLInventoryModel::item_array_t* item_array;
+ gInventory.getDirectDescendentsOf(selected_id, cat_array, item_array);
+ if (0 == cat_array->size() && 0 == item_array->size())
+ {
+ disabled_items.push_back(std::string("Empty Trash"));
+ }
+ }
+ else if(is_in_trash)
+ {
+ if (is_link)
+ {
+ items.push_back(std::string("Find Original"));
+ if (LLAssetType::lookupIsLinkType(obj->getType()))
+ {
+ disabled_items.push_back(std::string("Find Original"));
+ }
+ }
+ items.push_back(std::string("Purge Item"));
+ if (is_folder && !get_is_category_removable(&gInventory, selected_id))
+ {
+ disabled_items.push_back(std::string("Purge Item"));
+ }
+ items.push_back(std::string("Restore Item"));
+ }
+ else
+ {
+ if(can_share_item(selected_id))
+ {
+ items.push_back(std::string("Share"));
+ }
+ if (LLClipboard::instance().hasContents() && is_agent_inventory && !is_cof && !is_inbox_folder(selected_id))
+ {
+ items.push_back(std::string("Paste"));
+
+ static LLCachedControl<bool> inventory_linking(gSavedSettings, "InventoryLinking", true);
+ if (inventory_linking)
+ {
+ items.push_back(std::string("Paste As Link"));
+ }
+ }
+ if (is_folder && is_agent_inventory)
+ {
+ if (!is_cof && (folder_type != LLFolderType::FT_OUTFIT) && !is_outfits && !is_inbox_folder(selected_id))
+ {
+ if (!gInventory.isObjectDescendentOf(selected_id, gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD)) && !isRootFolder())
+ {
+ items.push_back(std::string("New Folder"));
+ }
+ items.push_back(std::string("upload_def"));
+ }
+
+ if(is_outfits && !isRootFolder())
+ {
+ items.push_back(std::string("New Outfit"));
+ }
+
+ items.push_back(std::string("Subfolder Separator"));
+ if (!is_system_folder && !isRootFolder())
+ {
+ if(has_children && (folder_type != LLFolderType::FT_OUTFIT))
+ {
+ items.push_back(std::string("Ungroup folder items"));
+ }
+ items.push_back(std::string("Cut"));
+ items.push_back(std::string("Delete"));
+ if(!get_is_category_removable(&gInventory, selected_id))
+ {
+ disabled_items.push_back(std::string("Delete"));
+ disabled_items.push_back(std::string("Cut"));
+ }
+
+ if(!is_inbox)
+ {
+ items.push_back(std::string("Rename"));
+ }
+ }
+ if(!is_system_folder)
+ {
+ items.push_back(std::string("Copy"));
+ }
+ }
+ else if(!is_folder)
+ {
+ items.push_back(std::string("Properties"));
+ items.push_back(std::string("Copy Asset UUID"));
+ items.push_back(std::string("Copy Separator"));
+
+ bool is_asset_knowable = is_asset_knowable = LLAssetType::lookupIsAssetIDKnowable(obj->getType());
+ if ( !is_asset_knowable // disable menu item for Inventory items with unknown asset. EXT-5308
+ || (! ( is_full_perm_item || gAgent.isGodlike())))
+ {
+ disabled_items.push_back(std::string("Copy Asset UUID"));
+ }
+ if(is_agent_inventory)
+ {
+ items.push_back(std::string("Cut"));
+ if (!is_link || !is_cof || !get_is_item_worn(selected_id))
+ {
+ items.push_back(std::string("Delete"));
+ }
+ if(!get_is_item_removable(&gInventory, selected_id))
+ {
+ disabled_items.push_back(std::string("Delete"));
+ disabled_items.push_back(std::string("Cut"));
+ }
+
+ if (selected_item && (selected_item->getInventoryType() != LLInventoryType::IT_CALLINGCARD) && !is_inbox && selected_item->getPermissions().allowOperationBy(PERM_MODIFY, gAgent.getID()))
+ {
+ items.push_back(std::string("Rename"));
+ }
+ }
+ items.push_back(std::string("Copy"));
+ if (!is_copyable)
+ {
+ disabled_items.push_back(std::string("Copy"));
+ }
+ }
+ if((obj->getType() == LLAssetType::AT_SETTINGS)
+ || ((obj->getType() <= LLAssetType::AT_GESTURE)
+ && obj->getType() != LLAssetType::AT_OBJECT
+ && obj->getType() != LLAssetType::AT_CLOTHING
+ && obj->getType() != LLAssetType::AT_CATEGORY
+ && obj->getType() != LLAssetType::AT_LANDMARK
+ && obj->getType() != LLAssetType::AT_BODYPART))
+ {
+ bool can_open = !LLAssetType::lookupIsLinkType(obj->getType());
+
+ if (can_open)
+ {
+ if (is_link)
+ items.push_back(std::string("Open Original"));
+ else
+ items.push_back(std::string("Open"));
+ }
+ else
+ {
+ disabled_items.push_back(std::string("Open"));
+ disabled_items.push_back(std::string("Open Original"));
+ }
+
+ if(LLAssetType::AT_GESTURE == obj->getType())
+ {
+ items.push_back(std::string("Gesture Separator"));
+ if(!LLGestureMgr::instance().isGestureActive(selected_id))
+ {
+ items.push_back(std::string("Activate"));
+ }
+ else
+ {
+ items.push_back(std::string("Deactivate"));
+ }
+ }
+ }
+ else if(LLAssetType::AT_LANDMARK == obj->getType())
+ {
+ items.push_back(std::string("Landmark Open"));
+ }
+ else if (obj->getType() == LLAssetType::AT_OBJECT || obj->getType() == LLAssetType::AT_CLOTHING || obj->getType() == LLAssetType::AT_BODYPART)
+ {
+ items.push_back(std::string("Wearable And Object Separator"));
+ if(obj->getType() == LLAssetType::AT_CLOTHING)
+ {
+ items.push_back(std::string("Take Off"));
+ }
+ if(get_is_item_worn(selected_id))
+ {
+ if(obj->getType() == LLAssetType::AT_OBJECT)
+ {
+ items.push_back(std::string("Detach From Yourself"));
+ }
+ disabled_items.push_back(std::string("Wearable And Object Wear"));
+ disabled_items.push_back(std::string("Wearable Add"));
+ }
+ else
+ {
+ if(obj->getType() == LLAssetType::AT_OBJECT)
+ {
+ items.push_back(std::string("Wearable Add"));
+ }
+ items.push_back(std::string("Wearable And Object Wear"));
+ disabled_items.push_back(std::string("Take Off"));
+ }
+
+ if (!gAgentAvatarp->canAttachMoreObjects() && (obj->getType() == LLAssetType::AT_OBJECT))
+ {
+ disabled_items.push_back(std::string("Wearable And Object Wear"));
+ disabled_items.push_back(std::string("Wearable Add"));
+ }
+ if (selected_item && (obj->getType() != LLAssetType::AT_OBJECT) && LLWearableType::getInstance()->getAllowMultiwear(selected_item->getWearableType()))
+ {
+ items.push_back(std::string("Wearable Add"));
+ if (!gAgentWearables.canAddWearable(selected_item->getWearableType()))
+ {
+ disabled_items.push_back(std::string("Wearable Add"));
+ }
+ }
+ }
+ if(obj->getType() == LLAssetType::AT_TEXTURE)
+ {
+ items.push_back(std::string("Save As"));
+ bool can_copy = selected_item && selected_item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED);
+ if (!can_copy)
+ {
+ disabled_items.push_back(std::string("Save As"));
+ }
+ }
+ if (is_link)
+ {
+ items.push_back(std::string("Find Original"));
+ if (LLAssetType::lookupIsLinkType(obj->getType()))
+ {
+ disabled_items.push_back(std::string("Find Original"));
+ }
+ }
+ if (is_lost_and_found)
+ {
+ items.push_back(std::string("Empty Lost And Found"));
+
+ LLInventoryModel::cat_array_t* cat_array;
+ LLInventoryModel::item_array_t* item_array;
+ gInventory.getDirectDescendentsOf(selected_id, cat_array, item_array);
+ // Enable Empty menu item only when there is something to act upon.
+ if (0 == cat_array->size() && 0 == item_array->size())
+ {
+ disabled_items.push_back(std::string("Empty Lost And Found"));
+ }
+
+ disabled_items.push_back(std::string("New Folder"));
+ disabled_items.push_back(std::string("upload_def"));
+ }
+ }
+
+ hide_context_entries(*menu, items, disabled_items);
+}
+
diff --git a/indra/newview/llinventorygallerymenu.h b/indra/newview/llinventorygallerymenu.h
new file mode 100644
index 0000000000..7c3545432b
--- /dev/null
+++ b/indra/newview/llinventorygallerymenu.h
@@ -0,0 +1,62 @@
+/**
+ * @file llinventorygallerymenu.h
+ *
+ * $LicenseInfo:firstyear=2023&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2023, 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$
+ */
+
+#ifndef LL_LLINVENTORYGALLERYMENU_H
+#define LL_LLINVENTORYGALLERYMENU_H
+
+#include "lllistcontextmenu.h"
+
+class LLInventoryGalleryContextMenu : public LLListContextMenu
+{
+public:
+ LLInventoryGalleryContextMenu(LLInventoryGallery* gallery)
+ : LLListContextMenu(),
+ mGallery(gallery),
+ mRootFolder(false){}
+ /*virtual*/ LLContextMenu* createMenu();
+
+ bool isRootFolder() { return mRootFolder; }
+ void setRootFolder(bool is_root) { mRootFolder = is_root; }
+ void doToSelected(const LLSD& userdata);
+ void rename(const LLUUID& item_id);
+
+protected:
+ //virtual void buildContextMenu(class LLMenuGL& menu, U32 flags);
+ void updateMenuItemsVisibility(LLContextMenu* menu);
+
+ void fileUploadLocation(const LLSD& userdata);
+ bool canSetUploadLocation(const LLSD& userdata);
+
+ static void onRename(const LLSD& notification, const LLSD& response);
+
+private:
+ bool enableContextMenuItem(const LLSD& userdata);
+ bool checkContextMenuItem(const LLSD& userdata);
+
+ LLInventoryGallery* mGallery;
+ bool mRootFolder;
+};
+
+#endif
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 7ccb8b807d..f7c327c699 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -37,9 +37,11 @@
#include "llappearancemgr.h"
#include "llavatarnamecache.h"
#include "llclipboard.h"
+#include "lldispatcher.h"
#include "llinventorypanel.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
+#include "llinventorymodelbackgroundfetch.h"
#include "llinventoryobserver.h"
#include "llinventorypanel.h"
#include "llfloaterpreviewtrash.h"
@@ -49,6 +51,7 @@
#include "llviewercontrol.h"
#include "llviewernetwork.h"
#include "llpreview.h"
+#include "llviewergenericmessage.h"
#include "llviewermessage.h"
#include "llviewerfoldertype.h"
#include "llviewerwindow.h"
@@ -62,6 +65,7 @@
#include "bufferarray.h"
#include "bufferstream.h"
#include "llcorehttputil.h"
+#include "hbxxh.h"
//#define DIFF_INVENTORY_FILES
#ifdef DIFF_INVENTORY_FILES
@@ -73,9 +77,11 @@
// Increment this if the inventory contents change in a non-backwards-compatible way.
// For viewer 2, the addition of link items makes a pre-viewer-2 cache incorrect.
-const S32 LLInventoryModel::sCurrentInvCacheVersion = 2;
+const S32 LLInventoryModel::sCurrentInvCacheVersion = 3;
BOOL LLInventoryModel::sFirstTimeInViewer2 = TRUE;
+S32 LLInventoryModel::sPendingSystemFolders = 0;
+
///----------------------------------------------------------------------------
/// Local function declarations, constants, enums, and typedefs
///----------------------------------------------------------------------------
@@ -132,6 +138,222 @@ bool LLCanCache::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
return rv;
}
+struct InventoryCallbackInfo
+{
+ InventoryCallbackInfo(U32 callback, const LLUUID& inv_id) :
+ mCallback(callback), mInvID(inv_id) {}
+ U32 mCallback;
+ LLUUID mInvID;
+};
+
+///----------------------------------------------------------------------------
+/// Class LLDispatchClassifiedClickThrough
+///----------------------------------------------------------------------------
+
+class LLDispatchBulkUpdateInventory : public LLDispatchHandler
+{
+public:
+ virtual bool operator()(
+ const LLDispatcher* dispatcher,
+ const std::string& key,
+ const LLUUID& invoice,
+ const sparam_t& strings)
+ {
+ LLSD message;
+
+ // Expect single string parameter in the form of a notation serialized LLSD.
+ sparam_t::const_iterator it = strings.begin();
+ if (it != strings.end()) {
+ const std::string& llsdRaw = *it++;
+ std::istringstream llsdData(llsdRaw);
+ if (!LLSDSerialize::deserialize(message, llsdData, llsdRaw.length()))
+ {
+ LL_WARNS() << "LLDispatchBulkUpdateInventory: Attempted to read parameter data into LLSD but failed:" << llsdRaw << LL_ENDL;
+ }
+ }
+
+ LLInventoryModel::update_map_t update;
+ LLInventoryModel::cat_array_t folders;
+ LLInventoryModel::item_array_t items;
+ std::list<InventoryCallbackInfo> cblist;
+ uuid_vec_t wearable_ids;
+
+ LLSD item_data = message["item_data"];
+ if (item_data.isArray())
+ {
+ for (LLSD::array_iterator itd = item_data.beginArray(); itd != item_data.endArray(); ++itd)
+ {
+ const LLSD &item(*itd);
+
+ // Agent id probably should be in the root of the message
+ LLUUID agent_id = item["agent_id"].asUUID();
+ if (agent_id != gAgent.getID())
+ {
+ LL_WARNS() << "Got a BulkUpdateInventory for the wrong agent." << LL_ENDL;
+ return false;
+ }
+
+ LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem;
+ titem->unpackMessage(item);
+ LL_DEBUGS("Inventory") << "unpacked item '" << titem->getName() << "' in "
+ << titem->getParentUUID() << LL_ENDL;
+ // callback id might be no longer supported
+ U32 callback_id = item["callback_id"].asInteger();
+
+ if (titem->getUUID().notNull())
+ {
+ items.push_back(titem);
+ cblist.push_back(InventoryCallbackInfo(callback_id, titem->getUUID()));
+ if (titem->getInventoryType() == LLInventoryType::IT_WEARABLE)
+ {
+ wearable_ids.push_back(titem->getUUID());
+ }
+
+ // examine update for changes.
+ LLViewerInventoryItem* itemp = gInventory.getItem(titem->getUUID());
+ if (itemp)
+ {
+ if (titem->getParentUUID() == itemp->getParentUUID())
+ {
+ update[titem->getParentUUID()];
+ }
+ else
+ {
+ ++update[titem->getParentUUID()];
+ --update[itemp->getParentUUID()];
+ }
+ }
+ else
+ {
+ LLViewerInventoryCategory* folderp = gInventory.getCategory(titem->getParentUUID());
+ if (folderp)
+ {
+ ++update[titem->getParentUUID()];
+ }
+ }
+ }
+ else
+ {
+ cblist.push_back(InventoryCallbackInfo(callback_id, LLUUID::null));
+ }
+ }
+ }
+
+ LLSD folder_data = message["folder_data"];
+ if (folder_data.isArray())
+ {
+ for (LLSD::array_iterator itd = folder_data.beginArray(); itd != folder_data.endArray(); ++itd)
+ {
+ const LLSD &folder(*itd);
+
+ LLPointer<LLViewerInventoryCategory> tfolder = new LLViewerInventoryCategory(gAgent.getID());
+ tfolder->unpackMessage(folder);
+
+ LL_DEBUGS("Inventory") << "unpacked folder '" << tfolder->getName() << "' ("
+ << tfolder->getUUID() << ") in " << tfolder->getParentUUID()
+ << LL_ENDL;
+
+ // If the folder is a listing or a version folder, all we need to do is update the SLM data
+ int depth_folder = depth_nesting_in_marketplace(tfolder->getUUID());
+ if ((depth_folder == 1) || (depth_folder == 2))
+ {
+ // Trigger an SLM listing update
+ LLUUID listing_uuid = (depth_folder == 1 ? tfolder->getUUID() : tfolder->getParentUUID());
+ S32 listing_id = LLMarketplaceData::instance().getListingID(listing_uuid);
+ LLMarketplaceData::instance().getListing(listing_id);
+ // In that case, there is no item to update so no callback -> we skip the rest of the update
+ }
+ else if (tfolder->getUUID().notNull())
+ {
+ folders.push_back(tfolder);
+ LLViewerInventoryCategory* folderp = gInventory.getCategory(tfolder->getUUID());
+ if (folderp)
+ {
+ if (tfolder->getParentUUID() == folderp->getParentUUID())
+ {
+ update[tfolder->getParentUUID()];
+ }
+ else
+ {
+ ++update[tfolder->getParentUUID()];
+ --update[folderp->getParentUUID()];
+ }
+ }
+ else
+ {
+ // we could not find the folder, so it is probably
+ // new. However, we only want to attempt accounting
+ // for the parent if we can find the parent.
+ folderp = gInventory.getCategory(tfolder->getParentUUID());
+ if (folderp)
+ {
+ ++update[tfolder->getParentUUID()];
+ }
+ }
+ }
+ }
+ }
+
+ gInventory.accountForUpdate(update);
+
+ for (LLInventoryModel::cat_array_t::iterator cit = folders.begin(); cit != folders.end(); ++cit)
+ {
+ gInventory.updateCategory(*cit);
+ }
+ for (LLInventoryModel::item_array_t::iterator iit = items.begin(); iit != items.end(); ++iit)
+ {
+ gInventory.updateItem(*iit);
+ }
+ gInventory.notifyObservers();
+
+ /*
+ Transaction id not included?
+
+ // The incoming inventory could span more than one BulkInventoryUpdate packet,
+ // so record the transaction ID for this purchase, then wear all clothing
+ // that comes in as part of that transaction ID. JC
+ if (LLInventoryState::sWearNewClothing)
+ {
+ LLInventoryState::sWearNewClothingTransactionID = tid;
+ LLInventoryState::sWearNewClothing = FALSE;
+ }
+
+ if (tid.notNull() && tid == LLInventoryState::sWearNewClothingTransactionID)
+ {
+ count = wearable_ids.size();
+ for (i = 0; i < count; ++i)
+ {
+ LLViewerInventoryItem* wearable_item;
+ wearable_item = gInventory.getItem(wearable_ids[i]);
+ LLAppearanceMgr::instance().wearItemOnAvatar(wearable_item->getUUID(), true, true);
+ }
+ }
+ */
+
+ if (LLInventoryState::sWearNewClothing && wearable_ids.size() > 0)
+ {
+ LLInventoryState::sWearNewClothing = FALSE;
+
+ size_t count = wearable_ids.size();
+ for (S32 i = 0; i < count; ++i)
+ {
+ LLViewerInventoryItem* wearable_item;
+ wearable_item = gInventory.getItem(wearable_ids[i]);
+ LLAppearanceMgr::instance().wearItemOnAvatar(wearable_item->getUUID(), true, true);
+ }
+ }
+
+ std::list<InventoryCallbackInfo>::iterator inv_it;
+ for (inv_it = cblist.begin(); inv_it != cblist.end(); ++inv_it)
+ {
+ InventoryCallbackInfo cbinfo = (*inv_it);
+ gInventoryCallbacks.fire(cbinfo.mCallback, cbinfo.mInvID);
+ }
+ return true;
+ }
+};
+static LLDispatchBulkUpdateInventory sBulkUpdateInventory;
+
///----------------------------------------------------------------------------
/// Class LLInventoryValidationInfo
///----------------------------------------------------------------------------
@@ -221,6 +443,7 @@ LLInventoryModel::LLInventoryModel()
mIsNotifyObservers(FALSE),
mModifyMask(LLInventoryObserver::ALL),
mChangedItemIDs(),
+ mBulkFecthCallbackSlot(),
mObservers(),
mHttpRequestFG(NULL),
mHttpRequestBG(NULL),
@@ -250,6 +473,11 @@ void LLInventoryModel::cleanupInventory()
mObservers.erase(iter);
delete observer;
}
+
+ if (mBulkFecthCallbackSlot.connected())
+ {
+ mBulkFecthCallbackSlot.disconnect();
+ }
mObservers.clear();
// Run down HTTP transport
@@ -449,17 +677,41 @@ void LLInventoryModel::getDirectDescendentsOf(const LLUUID& cat_id,
items = get_ptr_in_map(mParentChildItemTree, cat_id);
}
-LLMD5 LLInventoryModel::hashDirectDescendentNames(const LLUUID& cat_id) const
+void LLInventoryModel::getDirectDescendentsOf(const LLUUID& cat_id, cat_array_t& categories, item_array_t& items, LLInventoryCollectFunctor& f) const
+{
+ if (cat_array_t* categoriesp = get_ptr_in_map(mParentChildCategoryTree, cat_id))
+ {
+ for (LLViewerInventoryCategory* pFolder : *categoriesp)
+ {
+ if (f(pFolder, nullptr))
+ {
+ categories.push_back(pFolder);
+ }
+ }
+ }
+
+ if (item_array_t* itemsp = get_ptr_in_map(mParentChildItemTree, cat_id))
+ {
+ for (LLViewerInventoryItem* pItem : *itemsp)
+ {
+ if (f(nullptr, pItem))
+ {
+ items.push_back(pItem);
+ }
+ }
+ }
+}
+
+LLInventoryModel::digest_t LLInventoryModel::hashDirectDescendentNames(const LLUUID& cat_id) const
{
LLInventoryModel::cat_array_t* cat_array;
LLInventoryModel::item_array_t* item_array;
getDirectDescendentsOf(cat_id,cat_array,item_array);
- LLMD5 item_name_hash;
if (!item_array)
{
- item_name_hash.finalize();
- return item_name_hash;
+ return LLUUID::null;
}
+ HBXXH128 item_name_hash;
for (LLInventoryModel::item_array_t::const_iterator iter = item_array->begin();
iter != item_array->end();
iter++)
@@ -469,8 +721,7 @@ LLMD5 LLInventoryModel::hashDirectDescendentNames(const LLUUID& cat_id) const
continue;
item_name_hash.update(item->getName());
}
- item_name_hash.finalize();
- return item_name_hash;
+ return item_name_hash.digest();
}
// SJB: Added version to lock the arrays to catch potential logic bugs
@@ -560,10 +811,77 @@ void LLInventoryModel::consolidateForType(const LLUUID& main_id, LLFolderType::E
}
}
+void LLInventoryModel::ensureCategoryForTypeExists(LLFolderType::EType preferred_type)
+{
+ LLUUID rv = LLUUID::null;
+ LLUUID root_id = gInventory.getRootFolderID();
+ if (LLFolderType::FT_ROOT_INVENTORY == preferred_type)
+ {
+ rv = root_id;
+ }
+ else if (root_id.notNull())
+ {
+ cat_array_t* cats = NULL;
+ cats = get_ptr_in_map(mParentChildCategoryTree, root_id);
+ if (cats)
+ {
+ S32 count = cats->size();
+ for (S32 i = 0; i < count; ++i)
+ {
+ LLViewerInventoryCategory* p_cat = cats->at(i);
+ if (p_cat && p_cat->getPreferredType() == preferred_type)
+ {
+ const LLUUID& folder_id = cats->at(i)->getUUID();
+ if (rv.isNull() || folder_id < rv)
+ {
+ rv = folder_id;
+ }
+ }
+ }
+ }
+ }
+
+ if (rv.isNull() && root_id.notNull())
+ {
+
+ if (isInventoryUsable())
+ {
+ createNewCategory(
+ root_id,
+ preferred_type,
+ LLStringUtil::null,
+ [preferred_type](const LLUUID &new_cat_id)
+ {
+ if (new_cat_id.isNull())
+ {
+ LL_WARNS("Inventory")
+ << "Failed to create folder of type " << preferred_type
+ << LL_ENDL;
+ }
+ else
+ {
+ LL_WARNS("Inventory") << "Created category: " << new_cat_id
+ << " for type: " << preferred_type << LL_ENDL;
+ sPendingSystemFolders--;
+ }
+ }
+ );
+ }
+ else
+ {
+ LL_WARNS("Inventory") << "Can't create requested folder, type " << preferred_type
+ << " because inventory is not usable" << LL_ENDL;
+ }
+ }
+ else
+ {
+ sPendingSystemFolders--;
+ }
+}
+
const LLUUID LLInventoryModel::findCategoryUUIDForTypeInRoot(
LLFolderType::EType preferred_type,
- bool create_folder,
- const LLUUID& root_id)
+ const LLUUID& root_id) const
{
LLUUID rv = LLUUID::null;
if(LLFolderType::FT_ROOT_INVENTORY == preferred_type)
@@ -592,18 +910,17 @@ const LLUUID LLInventoryModel::findCategoryUUIDForTypeInRoot(
}
}
- if(rv.isNull() && create_folder && root_id.notNull())
- {
-
- if (isInventoryUsable())
- {
- return createNewCategory(root_id, preferred_type, LLStringUtil::null);
- }
- else
- {
- LL_WARNS("Inventory") << "Can't create requested folder, type " << preferred_type
- << " because inventory is not usable" << LL_ENDL;
- }
+ if(rv.isNull()
+ && root_id.notNull()
+ && preferred_type != LLFolderType::FT_MARKETPLACE_LISTINGS
+ && preferred_type != LLFolderType::FT_OUTBOX)
+ {
+ // if it does not exists, it should either be added
+ // to createCommonSystemCategories or server should
+ // have set it
+ llassert(!isInventoryUsable());
+ LL_WARNS("Inventory") << "Tried to find folder, type " << preferred_type
+ << " but category does not exist" << LL_ENDL;
}
return rv;
}
@@ -612,12 +929,12 @@ const LLUUID LLInventoryModel::findCategoryUUIDForTypeInRoot(
// specifies 'type' as what it defaults to containing. The category is
// not necessarily only for that type. *NOTE: This will create a new
// inventory category on the fly if one does not exist.
-const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType preferred_type, bool create_folder)
+const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType preferred_type) const
{
- return findCategoryUUIDForTypeInRoot(preferred_type, create_folder, gInventory.getRootFolderID());
+ return findCategoryUUIDForTypeInRoot(preferred_type, gInventory.getRootFolderID());
}
-const LLUUID LLInventoryModel::findUserDefinedCategoryUUIDForType(LLFolderType::EType preferred_type)
+const LLUUID LLInventoryModel::findUserDefinedCategoryUUIDForType(LLFolderType::EType preferred_type) const
{
LLUUID cat_id;
switch (preferred_type)
@@ -653,39 +970,46 @@ const LLUUID LLInventoryModel::findUserDefinedCategoryUUIDForType(LLFolderType::
if (cat_id.isNull() || !getCategory(cat_id))
{
- cat_id = findCategoryUUIDForTypeInRoot(preferred_type, true, getRootFolderID());
+ cat_id = findCategoryUUIDForTypeInRoot(preferred_type, getRootFolderID());
}
return cat_id;
}
-const LLUUID LLInventoryModel::findLibraryCategoryUUIDForType(LLFolderType::EType preferred_type, bool create_folder)
+const LLUUID LLInventoryModel::findLibraryCategoryUUIDForType(LLFolderType::EType preferred_type) const
{
- return findCategoryUUIDForTypeInRoot(preferred_type, create_folder, gInventory.getLibraryRootFolderID());
+ return findCategoryUUIDForTypeInRoot(preferred_type, gInventory.getLibraryRootFolderID());
}
// Convenience function to create a new category. You could call
// updateCategory() with a newly generated UUID category, but this
// version will take care of details like what the name should be
-// based on preferred type. Returns the UUID of the new category.
-LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id,
+// based on preferred type.
+void LLInventoryModel::createNewCategory(const LLUUID& parent_id,
LLFolderType::EType preferred_type,
const std::string& pname,
- inventory_func_type callback)
+ inventory_func_type callback,
+ const LLUUID& thumbnail_id)
{
- LLUUID id;
+ LL_DEBUGS(LOG_INV) << "Create '" << pname << "' in '" << make_inventory_path(parent_id) << "'" << LL_ENDL;
if (!isInventoryUsable())
{
LL_WARNS(LOG_INV) << "Inventory is not usable; can't create requested category of type "
<< preferred_type << LL_ENDL;
- // FIXME failing but still returning an id?
- return id;
+ if (callback)
+ {
+ callback(LLUUID::null);
+ }
+ return;
}
if(LLFolderType::lookup(preferred_type) == LLFolderType::badLookup())
{
LL_DEBUGS(LOG_INV) << "Attempt to create undefined category." << LL_ENDL;
- // FIXME failing but still returning an id?
- return id;
+ if (callback)
+ {
+ callback(LLUUID::null);
+ }
+ return;
}
if (preferred_type != LLFolderType::FT_NONE)
@@ -696,26 +1020,72 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id,
LL_WARNS(LOG_INV) << "Creating new system folder, type " << preferred_type << LL_ENDL;
}
- id.generate();
std::string name = pname;
- if(!pname.empty())
+ if (pname.empty())
{
- name.assign(pname);
+ name.assign(LLViewerFolderType::lookupNewCategoryName(preferred_type));
}
- else
+
+ if (AISAPI::isAvailable())
{
- name.assign(LLViewerFolderType::lookupNewCategoryName(preferred_type));
+ LLSD new_inventory = LLSD::emptyMap();
+ new_inventory["categories"] = LLSD::emptyArray();
+ LLViewerInventoryCategory cat(LLUUID::null, parent_id, preferred_type, name, gAgent.getID());
+ cat.setThumbnailUUID(thumbnail_id);
+ LLSD cat_sd = cat.asAISCreateCatLLSD();
+ new_inventory["categories"].append(cat_sd);
+ AISAPI::CreateInventory(
+ parent_id,
+ new_inventory,
+ [this, callback, parent_id, preferred_type, name] (const LLUUID& new_category)
+ {
+ if (new_category.isNull())
+ {
+ if (callback && !callback.empty())
+ {
+ callback(new_category);
+ }
+ return;
+ }
+
+ // todo: not needed since AIS does the accounting?
+ LLViewerInventoryCategory* folderp = gInventory.getCategory(new_category);
+ if (!folderp)
+ {
+ // Add the category to the internal representation
+ LLPointer<LLViewerInventoryCategory> cat = new LLViewerInventoryCategory(
+ new_category,
+ parent_id,
+ preferred_type,
+ name,
+ gAgent.getID());
+
+ LLInventoryModel::LLCategoryUpdate update(cat->getParentUUID(), 1);
+ accountForUpdate(update);
+
+ cat->setVersion(LLViewerInventoryCategory::VERSION_INITIAL - 1); // accountForUpdate() will icrease version by 1
+ cat->setDescendentCount(0);
+ updateCategory(cat);
+ }
+
+ if (callback && !callback.empty())
+ {
+ callback(new_category);
+ }
+ });
+ return;
}
-
+
LLViewerRegion* viewer_region = gAgent.getRegion();
std::string url;
if ( viewer_region )
url = viewer_region->getCapability("CreateInventoryCategory");
- if (!url.empty() && callback)
+ if (!url.empty())
{
//Let's use the new capability.
-
+ LLUUID id;
+ id.generate();
LLSD request, body;
body["folder_id"] = id;
body["parent_id"] = parent_id;
@@ -728,43 +1098,13 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id,
LL_DEBUGS(LOG_INV) << "Creating category via request: " << ll_pretty_print_sd(request) << LL_ENDL;
LLCoros::instance().launch("LLInventoryModel::createNewCategoryCoro",
boost::bind(&LLInventoryModel::createNewCategoryCoro, this, url, body, callback));
-
- return LLUUID::null;
- }
-
- if (!gMessageSystem)
- {
- return LLUUID::null;
+ return;
}
- // FIXME this UDP code path needs to be removed. Requires
- // reworking many of the callers to use callbacks rather than
- // assuming instant success.
-
- // Add the category to the internal representation
- LLPointer<LLViewerInventoryCategory> cat =
- new LLViewerInventoryCategory(id, parent_id, preferred_type, name, gAgent.getID());
- cat->setVersion(LLViewerInventoryCategory::VERSION_INITIAL - 1); // accountForUpdate() will icrease version by 1
- cat->setDescendentCount(0);
- LLCategoryUpdate update(cat->getParentUUID(), 1);
- accountForUpdate(update);
- updateCategory(cat);
-
- LL_DEBUGS(LOG_INV) << "Creating category via UDP message CreateInventoryFolder, type " << preferred_type << LL_ENDL;
-
- // Create the category on the server. We do this to prevent people
- // from munging their protected folders.
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessage("CreateInventoryFolder");
- msg->nextBlock("AgentData");
- msg->addUUID("AgentID", gAgent.getID());
- msg->addUUID(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlock("FolderData");
- cat->packMessage(msg);
- gAgent.sendReliableMessage();
-
- // return the folder id of the newly created folder
- return id;
+ if (callback)
+ {
+ callback(LLUUID::null); // Notify about failure
+ }
}
void LLInventoryModel::createNewCategoryCoro(std::string url, LLSD postData, inventory_func_type callback)
@@ -788,12 +1128,20 @@ void LLInventoryModel::createNewCategoryCoro(std::string url, LLSD postData, inv
if (!status)
{
LL_WARNS() << "HTTP failure attempting to create category." << LL_ENDL;
+ if (callback)
+ {
+ callback(LLUUID::null);
+ }
return;
}
if (!result.has("folder_id"))
{
LL_WARNS() << "Malformed response contents" << ll_pretty_print_sd(result) << LL_ENDL;
+ if (callback)
+ {
+ callback(LLUUID::null);
+ }
return;
}
@@ -1298,7 +1646,7 @@ void LLInventoryModel::updateCategory(const LLViewerInventoryCategory* cat, U32
mask |= LLInventoryObserver::LABEL;
}
// Under marketplace, category labels are quite complex and need extra upate
- const LLUUID marketplace_id = findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ const LLUUID marketplace_id = findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
if (marketplace_id.notNull() && isObjectDescendentOf(cat->getUUID(), marketplace_id))
{
mask |= LLInventoryObserver::LABEL;
@@ -1351,6 +1699,7 @@ void LLInventoryModel::moveObject(const LLUUID& object_id, const LLUUID& cat_id)
LLPointer<LLViewerInventoryCategory> cat = getCategory(object_id);
if(cat && (cat->getParentUUID() != cat_id))
{
+ LL_DEBUGS(LOG_INV) << "Move category '" << make_path(cat) << "' to '" << make_inventory_path(cat_id) << "'" << LL_ENDL;
cat_array_t* cat_array;
cat_array = getUnlockedCatArray(cat->getParentUUID());
if(cat_array) vector_replace_with_last(*cat_array, cat);
@@ -1363,6 +1712,7 @@ void LLInventoryModel::moveObject(const LLUUID& object_id, const LLUUID& cat_id)
LLPointer<LLViewerInventoryItem> item = getItem(object_id);
if(item && (item->getParentUUID() != cat_id))
{
+ LL_DEBUGS(LOG_INV) << "Move item '" << make_path(item) << "' to '" << make_inventory_path(cat_id) << "'" << LL_ENDL;
item_array_t* item_array;
item_array = getUnlockedItemArray(item->getParentUUID());
if(item_array) vector_replace_with_last(*item_array, item);
@@ -1381,14 +1731,14 @@ void LLInventoryModel::changeItemParent(LLViewerInventoryItem* item,
{
if (item->getParentUUID() == new_parent_id)
{
- LL_DEBUGS(LOG_INV) << "'" << item->getName() << "' (" << item->getUUID()
- << ") is already in folder " << new_parent_id << LL_ENDL;
+ LL_DEBUGS(LOG_INV) << make_info(item) << " is already in folder " << make_inventory_info(new_parent_id) << LL_ENDL;
}
else
{
- LL_INFOS(LOG_INV) << "Moving '" << item->getName() << "' (" << item->getUUID()
- << ") from " << item->getParentUUID() << " to folder "
- << new_parent_id << LL_ENDL;
+ LL_INFOS(LOG_INV) << "Move item " << make_info(item)
+ << " from " << make_inventory_info(item->getParentUUID())
+ << " to " << make_inventory_info(new_parent_id) << LL_ENDL;
+
LLInventoryModel::update_list_t update;
LLInventoryModel::LLCategoryUpdate old_folder(item->getParentUUID(),-1);
update.push_back(old_folder);
@@ -1420,6 +1770,10 @@ void LLInventoryModel::changeCategoryParent(LLViewerInventoryCategory* cat,
return;
}
+ LL_INFOS(LOG_INV) << "Move category " << make_info(cat)
+ << " from " << make_inventory_info(cat->getParentUUID())
+ << " to " << make_inventory_info(new_parent_id) << LL_ENDL;
+
LLInventoryModel::update_list_t update;
LLInventoryModel::LLCategoryUpdate old_folder(cat->getParentUUID(), -1);
update.push_back(old_folder);
@@ -1434,17 +1788,25 @@ void LLInventoryModel::changeCategoryParent(LLViewerInventoryCategory* cat,
notifyObservers();
}
-void LLInventoryModel::onAISUpdateReceived(const std::string& context, const LLSD& update)
+void LLInventoryModel::rebuildBrockenLinks()
{
- LLTimer timer;
- if (gSavedSettings.getBOOL("DebugAvatarAppearanceMessage"))
- {
- dump_sequential_xml(gAgentAvatarp->getFullname() + "_ais_update", update);
- }
+ // make sure we aren't adding expensive Rebuild to anything else.
+ notifyObservers();
- AISUpdate ais_update(update); // parse update llsd into stuff to do.
- ais_update.doUpdate(); // execute the updates in the appropriate order.
- LL_INFOS(LOG_INV) << "elapsed: " << timer.getElapsedTimeF32() << LL_ENDL;
+ for (const broken_links_t::value_type &link_list : mPossiblyBrockenLinks)
+ {
+ for (const LLUUID& link_id : link_list.second)
+ {
+ addChangedMask(LLInventoryObserver::REBUILD , link_id);
+ }
+ }
+ for (const LLUUID& link_id : mLinksRebuildList)
+ {
+ addChangedMask(LLInventoryObserver::REBUILD , link_id);
+ }
+ mPossiblyBrockenLinks.clear();
+ mLinksRebuildList.clear();
+ notifyObservers();
}
// Does not appear to be used currently.
@@ -1750,6 +2112,20 @@ void LLInventoryModel::idleNotifyObservers()
{
// *FIX: Think I want this conditional or moved elsewhere...
handleResponses(true);
+
+ if (mLinksRebuildList.size() > 0)
+ {
+ if (mModifyMask != LLInventoryObserver::NONE || (mChangedItemIDs.size() != 0))
+ {
+ notifyObservers();
+ }
+ for (const LLUUID& link_id : mLinksRebuildList)
+ {
+ addChangedMask(LLInventoryObserver::REBUILD , link_id);
+ }
+ mLinksRebuildList.clear();
+ notifyObservers();
+ }
if (mModifyMask == LLInventoryObserver::NONE && (mChangedItemIDs.size() == 0))
{
@@ -2069,10 +2445,52 @@ void LLInventoryModel::addItem(LLViewerInventoryItem* item)
// The item will show up as a broken link.
if (item->getIsBrokenLink())
{
- LL_INFOS(LOG_INV) << "Adding broken link [ name: " << item->getName()
- << " itemID: " << item->getUUID()
- << " assetID: " << item->getAssetUUID() << " ) parent: " << item->getParentUUID() << LL_ENDL;
+ if (item->getAssetUUID().notNull()
+ && LLInventoryModelBackgroundFetch::getInstance()->folderFetchActive())
+ {
+ // Schedule this link for a recheck as inventory gets loaded
+ // Todo: expand to cover not just an initial fetch
+ mPossiblyBrockenLinks[item->getAssetUUID()].insert(item->getUUID());
+
+ // Do a blank rebuild of links once fetch is done
+ if (!mBulkFecthCallbackSlot.connected())
+ {
+ // Links might take a while to update this way, and there
+ // might be a lot of them. A better option might be to check
+ // links periodically with final check on fetch completion.
+ mBulkFecthCallbackSlot =
+ LLInventoryModelBackgroundFetch::getInstance()->setFetchCompletionCallback(
+ [this]()
+ {
+ // rebuild is just in case, primary purpose is to wipe
+ // the list since we won't be getting anything 'new'
+ // see mLinksRebuildList
+ rebuildBrockenLinks();
+ mBulkFecthCallbackSlot.disconnect();
+ });
+ }
+ LL_DEBUGS(LOG_INV) << "Scheduling a link to be rebuilt later [ name: " << item->getName()
+ << " itemID: " << item->getUUID()
+ << " assetID: " << item->getAssetUUID() << " ) parent: " << item->getParentUUID() << LL_ENDL;
+
+ }
+ else
+ {
+ LL_INFOS(LOG_INV) << "Adding broken link [ name: " << item->getName()
+ << " itemID: " << item->getUUID()
+ << " assetID: " << item->getAssetUUID() << " ) parent: " << item->getParentUUID() << LL_ENDL;
+ }
}
+ if (!mPossiblyBrockenLinks.empty())
+ {
+ // check if we are waiting for this item
+ broken_links_t::iterator iter = mPossiblyBrockenLinks.find(item->getUUID());
+ if (iter != mPossiblyBrockenLinks.end())
+ {
+ mLinksRebuildList.insert(iter->second.begin() , iter->second.end());
+ mPossiblyBrockenLinks.erase(iter);
+ }
+ }
if (item->getIsLinkType())
{
// Add back-link from linked-to UUID.
@@ -2340,6 +2758,10 @@ bool LLInventoryModel::loadSkeleton(
else
{
cached_ids.insert(tcat->getUUID());
+
+ // At the moment download does not provide a thumbnail
+ // uuid, use the one from cache
+ tcat->setThumbnailUUID(cat->getThumbnailUUID());
}
}
@@ -2627,7 +3049,7 @@ void LLInventoryModel::buildParentChildMap()
}
}
- const BOOL COF_exists = (findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, FALSE) != LLUUID::null);
+ const BOOL COF_exists = (findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT) != LLUUID::null);
sFirstTimeInViewer2 = !COF_exists || gAgent.isFirstLogin();
@@ -2790,6 +3212,11 @@ void LLInventoryModel::initHttpRequest()
mHttpHeaders->append(HTTP_OUT_HEADER_ACCEPT, HTTP_CONTENT_LLSD_XML);
mHttpPolicyClass = app_core_http.getPolicy(LLAppCoreHttp::AP_INVENTORY);
}
+
+ if (!gGenericDispatcher.isHandlerPresent("BulkUpdateInventory"))
+ {
+ gGenericDispatcher.addHandler("BulkUpdateInventory", &sBulkUpdateInventory);
+ }
}
void LLInventoryModel::handleResponses(bool foreground)
@@ -2841,15 +3268,18 @@ LLCore::HttpHandle LLInventoryModel::requestPost(bool foreground,
void LLInventoryModel::createCommonSystemCategories()
{
- gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH,true);
- gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE,true);
- gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD,true);
- gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS,true);
- gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, true);
- gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK, true); // folder should exist before user tries to 'landmark this'
- gInventory.findCategoryUUIDForType(LLFolderType::FT_SETTINGS, true);
- gInventory.findCategoryUUIDForType(LLFolderType::FT_MATERIAL, true); // probably should be server created
- gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, true);
+ //amount of System Folder we should wait for
+ sPendingSystemFolders = 9;
+
+ gInventory.ensureCategoryForTypeExists(LLFolderType::FT_TRASH);
+ gInventory.ensureCategoryForTypeExists(LLFolderType::FT_FAVORITE);
+ gInventory.ensureCategoryForTypeExists(LLFolderType::FT_CALLINGCARD);
+ gInventory.ensureCategoryForTypeExists(LLFolderType::FT_MY_OUTFITS);
+ gInventory.ensureCategoryForTypeExists(LLFolderType::FT_CURRENT_OUTFIT);
+ gInventory.ensureCategoryForTypeExists(LLFolderType::FT_LANDMARK); // folder should exist before user tries to 'landmark this'
+ gInventory.ensureCategoryForTypeExists(LLFolderType::FT_SETTINGS);
+ gInventory.ensureCategoryForTypeExists(LLFolderType::FT_MATERIAL); // probably should be server created
+ gInventory.ensureCategoryForTypeExists(LLFolderType::FT_INBOX);
}
struct LLUUIDAndName
@@ -3074,9 +3504,6 @@ void LLInventoryModel::registerCallbacks(LLMessageSystem* msg)
msg->setHandlerFuncFast(_PREHASH_RemoveInventoryItem,
processRemoveInventoryItem,
NULL);
- msg->setHandlerFuncFast(_PREHASH_UpdateInventoryFolder,
- processUpdateInventoryFolder,
- NULL);
msg->setHandlerFuncFast(_PREHASH_RemoveInventoryFolder,
processRemoveInventoryFolder,
NULL);
@@ -3105,6 +3532,10 @@ void LLInventoryModel::processUpdateCreateInventoryItem(LLMessageSystem* msg, vo
msg->getU32Fast(_PREHASH_InventoryData, _PREHASH_CallbackID, callback_id);
gInventoryCallbacks.fire(callback_id, item_id);
+
+ // todo: instead of unpacking message fully,
+ // grab only an item_id, then fetch
+ LLInventoryModelBackgroundFetch::instance().scheduleItemFetch(item_id, true);
}
}
@@ -3220,66 +3651,6 @@ void LLInventoryModel::processRemoveInventoryItem(LLMessageSystem* msg, void**)
}
// static
-void LLInventoryModel::processUpdateInventoryFolder(LLMessageSystem* msg,
- void**)
-{
- LL_DEBUGS(LOG_INV) << "LLInventoryModel::processUpdateInventoryFolder()" << LL_ENDL;
- LLUUID agent_id, folder_id, parent_id;
- //char name[DB_INV_ITEM_NAME_BUF_SIZE];
- msg->getUUIDFast(_PREHASH_FolderData, _PREHASH_AgentID, agent_id);
- if(agent_id != gAgent.getID())
- {
- LL_WARNS(LOG_INV) << "Got an UpdateInventoryFolder for the wrong agent."
- << LL_ENDL;
- return;
- }
- LLPointer<LLViewerInventoryCategory> lastfolder; // hack
- cat_array_t folders;
- update_map_t update;
- S32 count = msg->getNumberOfBlocksFast(_PREHASH_FolderData);
- for(S32 i = 0; i < count; ++i)
- {
- LLPointer<LLViewerInventoryCategory> tfolder = new LLViewerInventoryCategory(gAgent.getID());
- lastfolder = tfolder;
- tfolder->unpackMessage(msg, _PREHASH_FolderData, i);
- // make sure it's not a protected folder
- tfolder->setPreferredType(LLFolderType::FT_NONE);
- folders.push_back(tfolder);
- // examine update for changes.
- LLViewerInventoryCategory* folderp = gInventory.getCategory(tfolder->getUUID());
- if(folderp)
- {
- if(tfolder->getParentUUID() == folderp->getParentUUID())
- {
- update[tfolder->getParentUUID()];
- }
- else
- {
- ++update[tfolder->getParentUUID()];
- --update[folderp->getParentUUID()];
- }
- }
- else
- {
- ++update[tfolder->getParentUUID()];
- }
- }
- gInventory.accountForUpdate(update);
- for (cat_array_t::iterator it = folders.begin(); it != folders.end(); ++it)
- {
- gInventory.updateCategory(*it);
- }
- gInventory.notifyObservers();
-
- // *HACK: Do the 'show' logic for a new item in the inventory.
- LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
- if (active_panel)
- {
- active_panel->setSelection(lastfolder->getUUID(), TAKE_FOCUS_NO);
- }
-}
-
-// static
void LLInventoryModel::removeInventoryFolder(LLUUID agent_id,
LLMessageSystem* msg)
{
@@ -3381,14 +3752,6 @@ void LLInventoryModel::processSaveAssetIntoInventory(LLMessageSystem* msg,
}
}
-struct InventoryCallbackInfo
-{
- InventoryCallbackInfo(U32 callback, const LLUUID& inv_id) :
- mCallback(callback), mInvID(inv_id) {}
- U32 mCallback;
- LLUUID mInvID;
-};
-
// static
void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)
{
@@ -3434,15 +3797,22 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)
LLViewerInventoryCategory* folderp = gInventory.getCategory(tfolder->getUUID());
if(folderp)
{
- if(tfolder->getParentUUID() == folderp->getParentUUID())
- {
- update[tfolder->getParentUUID()];
- }
- else
- {
- ++update[tfolder->getParentUUID()];
- --update[folderp->getParentUUID()];
- }
+ if (folderp->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN)
+ {
+ if (tfolder->getParentUUID() == folderp->getParentUUID())
+ {
+ update[tfolder->getParentUUID()];
+ }
+ else
+ {
+ ++update[tfolder->getParentUUID()];
+ --update[folderp->getParentUUID()];
+ }
+ }
+ else
+ {
+ folderp->fetch();
+ }
}
else
{
@@ -3452,7 +3822,14 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)
folderp = gInventory.getCategory(tfolder->getParentUUID());
if(folderp)
{
- ++update[tfolder->getParentUUID()];
+ if (folderp->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN)
+ {
+ ++update[tfolder->getParentUUID()];
+ }
+ else
+ {
+ folderp->fetch();
+ }
}
}
}
@@ -3498,7 +3875,14 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)
LLViewerInventoryCategory* folderp = gInventory.getCategory(titem->getParentUUID());
if(folderp)
{
- ++update[titem->getParentUUID()];
+ if (folderp->getVersion() != LLViewerInventoryCategory::VERSION_UNKNOWN)
+ {
+ ++update[titem->getParentUUID()];
+ }
+ else
+ {
+ folderp->fetch();
+ }
}
}
}
@@ -3512,10 +3896,20 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)
for (cat_array_t::iterator cit = folders.begin(); cit != folders.end(); ++cit)
{
gInventory.updateCategory(*cit);
+
+ // Temporary workaround: just fetch the item using AIS to get missing fields.
+ // If this works fine we might want to extract ids only from the message
+ // then use AIS as a primary fetcher
+ LLInventoryModelBackgroundFetch::instance().scheduleFolderFetch((*cit)->getUUID(), true /*force, since it has changes*/);
}
for (item_array_t::iterator iit = items.begin(); iit != items.end(); ++iit)
{
gInventory.updateItem(*iit);
+
+ // Temporary workaround: just fetch the item using AIS to get missing fields.
+ // If this works fine we might want to extract ids only from the message
+ // then use AIS as a primary fetcher
+ LLInventoryModelBackgroundFetch::instance().scheduleItemFetch((*iit)->getUUID(), true);
}
gInventory.notifyObservers();
@@ -4340,7 +4734,6 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
}
else if (count_under_root > 1)
{
- LL_WARNS("Inventory") << "Fatal inventory corruption: system folder type has excess copies under root, type " << ft << " count " << count_under_root << LL_ENDL;
validation_info->mDuplicateRequiredSystemFolders.insert(folder_type);
if (!is_automatic
&& folder_type != LLFolderType::FT_SETTINGS
@@ -4352,6 +4745,7 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
// outfits, trash and other non-automatic folders.
validation_info->mFatalSystemDuplicate++;
fatal_errs++;
+ LL_WARNS("Inventory") << "Fatal inventory corruption: system folder type has excess copies under root, type " << ft << " count " << count_under_root << LL_ENDL;
}
else
{
@@ -4360,6 +4754,7 @@ LLPointer<LLInventoryValidationInfo> LLInventoryModel::validate() const
// Exception: FT_SETTINGS is not automatic, but only deserves a warning.
validation_info->mWarnings["non_fatal_system_duplicate_under_root"]++;
warning_count++;
+ LL_WARNS("Inventory") << "System folder type has excess copies under root, type " << ft << " count " << count_under_root << LL_ENDL;
}
}
if (count_elsewhere > 0)
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index af9a020788..69d987cabd 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -39,7 +39,6 @@
#include "llpermissionsflags.h"
#include "llviewerinventory.h"
#include "llstring.h"
-#include "llmd5.h"
#include "httpcommon.h"
#include "httprequest.h"
#include "httpoptions.h"
@@ -227,10 +226,14 @@ private:
//--------------------------------------------------------------------
public:
static BOOL getIsFirstTimeInViewer2();
+ static bool isSysFoldersReady() { return (sPendingSystemFolders == 0); }
+
private:
static BOOL sFirstTimeInViewer2;
const static S32 sCurrentInvCacheVersion; // expected inventory cache version
+ static S32 sPendingSystemFolders;
+
/** Initialization/Setup
** **
*******************************************************************************/
@@ -256,9 +259,11 @@ public:
void getDirectDescendentsOf(const LLUUID& cat_id,
cat_array_t*& categories,
item_array_t*& items) const;
+ void getDirectDescendentsOf(const LLUUID& cat_id, cat_array_t& categories, item_array_t& items, LLInventoryCollectFunctor& f) const;
+ typedef LLUUID digest_t; // To clarify the actual usage of this "UUID"
// Compute a hash of direct descendant names (for detecting child name changes)
- LLMD5 hashDirectDescendentNames(const LLUUID& cat_id) const;
+ digest_t hashDirectDescendentNames(const LLUUID& cat_id) const;
// Starting with the object specified, add its descendants to the
// array provided, but do not add the inventory object specified
@@ -302,24 +307,25 @@ public:
// Find
//--------------------------------------------------------------------
public:
+
+ // Checks if category exists ("My Inventory" only), if it does not, creates it
+ void ensureCategoryForTypeExists(LLFolderType::EType preferred_type);
+
const LLUUID findCategoryUUIDForTypeInRoot(
LLFolderType::EType preferred_type,
- bool create_folder,
- const LLUUID& root_id);
+ const LLUUID& root_id) const;
// Returns the uuid of the category that specifies 'type' as what it
// defaults to containing. The category is not necessarily only for that type.
// NOTE: If create_folder is true, this will create a new inventory category
// on the fly if one does not exist. *NOTE: if find_in_library is true it
// will search in the user's library folder instead of "My Inventory"
- const LLUUID findCategoryUUIDForType(LLFolderType::EType preferred_type,
- bool create_folder = true);
+ const LLUUID findCategoryUUIDForType(LLFolderType::EType preferred_type) const;
// will search in the user's library folder instead of "My Inventory"
- const LLUUID findLibraryCategoryUUIDForType(LLFolderType::EType preferred_type,
- bool create_folder = true);
+ const LLUUID findLibraryCategoryUUIDForType(LLFolderType::EType preferred_type) const;
// Returns user specified category for uploads, returns default id if there are no
// user specified one or it does not exist, creates default category if it is missing.
- const LLUUID findUserDefinedCategoryUUIDForType(LLFolderType::EType preferred_type);
+ const LLUUID findUserDefinedCategoryUUIDForType(LLFolderType::EType preferred_type) const;
// Get whatever special folder this object is a child of, if any.
const LLViewerInventoryCategory *getFirstNondefaultParent(const LLUUID& obj_id) const;
@@ -405,13 +411,15 @@ public:
const LLUUID& new_parent_id,
BOOL restamp);
+ // Marks links from a "possibly" broken list for a rebuild
+ // clears the list
+ void rebuildBrockenLinks();
+ bool hasPosiblyBrockenLinks() const { return mPossiblyBrockenLinks.size() > 0; }
+
//--------------------------------------------------------------------
// Delete
//--------------------------------------------------------------------
public:
-
- // Update model after an AISv3 update received for any operation.
- void onAISUpdateReceived(const std::string& context, const LLSD& update);
// Update model after an item is confirmed as removed from
// server. Works for categories or items.
@@ -475,10 +483,11 @@ public:
public:
// Returns the UUID of the new category. If you want to use the default
// name based on type, pass in a NULL to the 'name' parameter.
- LLUUID createNewCategory(const LLUUID& parent_id,
+ void createNewCategory(const LLUUID& parent_id,
LLFolderType::EType preferred_type,
const std::string& name,
- inventory_func_type callback = NULL);
+ inventory_func_type callback = NULL,
+ const LLUUID& thumbnail_id = LLUUID::null);
protected:
// Internal methods that add inventory and make sure that all of
// the internal data structures are consistent. These methods
@@ -575,6 +584,10 @@ private:
U32 mModifyMaskBacklog;
changed_items_t mChangedItemIDsBacklog;
changed_items_t mAddedItemIDsBacklog;
+ typedef std::map<LLUUID , changed_items_t> broken_links_t;
+ broken_links_t mPossiblyBrockenLinks; // there can be multiple links per item
+ changed_items_t mLinksRebuildList;
+ boost::signals2::connection mBulkFecthCallbackSlot;
//--------------------------------------------------------------------
@@ -661,7 +674,6 @@ public:
static void processUpdateCreateInventoryItem(LLMessageSystem* msg, void**);
static void removeInventoryItem(LLUUID agent_id, LLMessageSystem* msg, const char* msg_label);
static void processRemoveInventoryItem(LLMessageSystem* msg, void**);
- static void processUpdateInventoryFolder(LLMessageSystem* msg, void**);
static void removeInventoryFolder(LLUUID agent_id, LLMessageSystem* msg);
static void processRemoveInventoryFolder(LLMessageSystem* msg, void**);
static void processRemoveInventoryObjects(LLMessageSystem* msg, void**);
diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp
index 4a9b471a47..91adef8047 100644
--- a/indra/newview/llinventorymodelbackgroundfetch.cpp
+++ b/indra/newview/llinventorymodelbackgroundfetch.cpp
@@ -27,11 +27,14 @@
#include "llviewerprecompiledheaders.h"
#include "llinventorymodelbackgroundfetch.h"
+#include "llaisapi.h"
#include "llagent.h"
#include "llappviewer.h"
#include "llcallbacklist.h"
-#include "llinventorypanel.h"
#include "llinventorymodel.h"
+#include "llinventorypanel.h"
+#include "llnotificationsutil.h"
+#include "llstartup.h"
#include "llviewercontrol.h"
#include "llviewerinventory.h"
#include "llviewermessage.h"
@@ -184,12 +187,14 @@ const char * const LOG_INV("Inventory");
///----------------------------------------------------------------------------
LLInventoryModelBackgroundFetch::LLInventoryModelBackgroundFetch():
- mBackgroundFetchActive(FALSE),
+ mBackgroundFetchActive(false),
mFolderFetchActive(false),
mFetchCount(0),
- mAllFoldersFetched(FALSE),
- mRecursiveInventoryFetchStarted(FALSE),
- mRecursiveLibraryFetchStarted(FALSE),
+ mLastFetchCount(0),
+ mFetchFolderCount(0),
+ mAllRecursiveFoldersFetched(false),
+ mRecursiveInventoryFetchStarted(false),
+ mRecursiveLibraryFetchStarted(false),
mMinTimeBetweenFetches(0.3f)
{}
@@ -198,7 +203,12 @@ LLInventoryModelBackgroundFetch::~LLInventoryModelBackgroundFetch()
bool LLInventoryModelBackgroundFetch::isBulkFetchProcessingComplete() const
{
- return mFetchQueue.empty() && mFetchCount <= 0;
+ return mFetchFolderQueue.empty() && mFetchItemQueue.empty() && mFetchCount <= 0;
+}
+
+bool LLInventoryModelBackgroundFetch::isFolderFetchProcessingComplete() const
+{
+ return mFetchFolderQueue.empty() && mFetchFolderCount <= 0;
}
bool LLInventoryModelBackgroundFetch::libraryFetchStarted() const
@@ -233,7 +243,7 @@ bool LLInventoryModelBackgroundFetch::inventoryFetchInProgress() const
bool LLInventoryModelBackgroundFetch::isEverythingFetched() const
{
- return mAllFoldersFetched;
+ return mAllRecursiveFoldersFetched;
}
BOOL LLInventoryModelBackgroundFetch::folderFetchActive() const
@@ -241,17 +251,33 @@ BOOL LLInventoryModelBackgroundFetch::folderFetchActive() const
return mFolderFetchActive;
}
-void LLInventoryModelBackgroundFetch::addRequestAtFront(const LLUUID & id, BOOL recursive, bool is_category)
+void LLInventoryModelBackgroundFetch::addRequestAtFront(const LLUUID & id, bool recursive, bool is_category)
{
- mFetchQueue.push_front(FetchQueueInfo(id, recursive, is_category));
+ EFetchType recursion_type = recursive ? FT_RECURSIVE : FT_DEFAULT;
+ if (is_category)
+ {
+ mFetchFolderQueue.push_front(FetchQueueInfo(id, recursion_type, is_category));
+ }
+ else
+ {
+ mFetchItemQueue.push_front(FetchQueueInfo(id, recursion_type, is_category));
+ }
}
-void LLInventoryModelBackgroundFetch::addRequestAtBack(const LLUUID & id, BOOL recursive, bool is_category)
+void LLInventoryModelBackgroundFetch::addRequestAtBack(const LLUUID & id, bool recursive, bool is_category)
{
- mFetchQueue.push_back(FetchQueueInfo(id, recursive, is_category));
+ EFetchType recursion_type = recursive ? FT_RECURSIVE : FT_DEFAULT;
+ if (is_category)
+ {
+ mFetchFolderQueue.push_back(FetchQueueInfo(id, recursion_type, is_category));
+ }
+ else
+ {
+ mFetchItemQueue.push_back(FetchQueueInfo(id, recursion_type, is_category));
+ }
}
-void LLInventoryModelBackgroundFetch::start(const LLUUID& id, BOOL recursive)
+void LLInventoryModelBackgroundFetch::start(const LLUUID& id, bool recursive)
{
LLViewerInventoryCategory * cat(gInventory.getCategory(id));
@@ -260,31 +286,53 @@ void LLInventoryModelBackgroundFetch::start(const LLUUID& id, BOOL recursive)
// it's a folder, do a bulk fetch
LL_DEBUGS(LOG_INV) << "Start fetching category: " << id << ", recursive: " << recursive << LL_ENDL;
- mBackgroundFetchActive = TRUE;
+ mBackgroundFetchActive = true;
mFolderFetchActive = true;
+ EFetchType recursion_type = recursive ? FT_RECURSIVE : FT_DEFAULT;
if (id.isNull())
{
if (! mRecursiveInventoryFetchStarted)
{
mRecursiveInventoryFetchStarted |= recursive;
- mFetchQueue.push_back(FetchQueueInfo(gInventory.getRootFolderID(), recursive));
+ if (recursive && AISAPI::isAvailable())
+ {
+ // Not only root folder can be massive, but
+ // most system folders will be requested independently
+ // so request root folder and content separately
+ mFetchFolderQueue.push_front(FetchQueueInfo(gInventory.getRootFolderID(), FT_FOLDER_AND_CONTENT));
+ }
+ else
+ {
+ mFetchFolderQueue.push_back(FetchQueueInfo(gInventory.getRootFolderID(), recursion_type));
+ }
gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL);
}
if (! mRecursiveLibraryFetchStarted)
{
mRecursiveLibraryFetchStarted |= recursive;
- mFetchQueue.push_back(FetchQueueInfo(gInventory.getLibraryRootFolderID(), recursive));
+ mFetchFolderQueue.push_back(FetchQueueInfo(gInventory.getLibraryRootFolderID(), recursion_type));
gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL);
}
}
else
{
- // Specific folder requests go to front of queue.
- if (mFetchQueue.empty() || mFetchQueue.front().mUUID != id)
- {
- mFetchQueue.push_front(FetchQueueInfo(id, recursive));
- gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL);
- }
+ if (AISAPI::isAvailable())
+ {
+ if (mFetchFolderQueue.empty() || mFetchFolderQueue.back().mUUID != id)
+ {
+ // On AIS make sure root goes to the top and follow up recursive
+ // fetches, not individual requests
+ mFetchFolderQueue.push_back(FetchQueueInfo(id, recursion_type));
+ gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL);
+ }
+ }
+ else if (mFetchFolderQueue.empty() || mFetchFolderQueue.front().mUUID != id)
+ {
+ // Specific folder requests go to front of queue.
+ mFetchFolderQueue.push_front(FetchQueueInfo(id, recursion_type));
+ gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL);
+ }
+
if (id == gInventory.getLibraryRootFolderID())
{
mRecursiveLibraryFetchStarted |= recursive;
@@ -297,21 +345,41 @@ void LLInventoryModelBackgroundFetch::start(const LLUUID& id, BOOL recursive)
}
else if (LLViewerInventoryItem * itemp = gInventory.getItem(id))
{
- if (! itemp->mIsComplete && (mFetchQueue.empty() || mFetchQueue.front().mUUID != id))
+ if (! itemp->mIsComplete)
{
- mBackgroundFetchActive = TRUE;
-
- mFetchQueue.push_front(FetchQueueInfo(id, false, false));
- gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL);
+ scheduleItemFetch(id);
}
}
}
+void LLInventoryModelBackgroundFetch::scheduleFolderFetch(const LLUUID& cat_id, bool forced)
+{
+ if (mFetchFolderQueue.empty() || mFetchFolderQueue.front().mUUID != cat_id)
+ {
+ mBackgroundFetchActive = true;
+
+ // Specific folder requests go to front of queue.
+ mFetchFolderQueue.push_front(FetchQueueInfo(cat_id, forced ? FT_FORCED : FT_DEFAULT));
+ gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL);
+ }
+}
+
+void LLInventoryModelBackgroundFetch::scheduleItemFetch(const LLUUID& item_id, bool forced)
+{
+ if (mFetchItemQueue.empty() || mFetchItemQueue.front().mUUID != item_id)
+ {
+ mBackgroundFetchActive = true;
+
+ mFetchItemQueue.push_front(FetchQueueInfo(item_id, forced ? FT_FORCED : FT_DEFAULT, false));
+ gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL);
+ }
+}
+
void LLInventoryModelBackgroundFetch::findLostItems()
{
- mBackgroundFetchActive = TRUE;
- mFolderFetchActive = true;
- mFetchQueue.push_back(FetchQueueInfo(LLUUID::null, TRUE));
+ mBackgroundFetchActive = true;
+ mFolderFetchActive = true;
+ mFetchFolderQueue.push_back(FetchQueueInfo(LLUUID::null, FT_RECURSIVE));
gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL);
}
@@ -320,15 +388,28 @@ void LLInventoryModelBackgroundFetch::setAllFoldersFetched()
if (mRecursiveInventoryFetchStarted &&
mRecursiveLibraryFetchStarted)
{
- mAllFoldersFetched = TRUE;
+ mAllRecursiveFoldersFetched = true;
//LL_INFOS(LOG_INV) << "All folders fetched, validating" << LL_ENDL;
//gInventory.validate();
}
+
mFolderFetchActive = false;
- mBackgroundFetchActive = false;
+ if (isBulkFetchProcessingComplete())
+ {
+ mBackgroundFetchActive = false;
+ }
+
+ // For now only informs about initial fetch being done
+ mFoldersFetchedSignal();
+
LL_INFOS(LOG_INV) << "Inventory background fetch completed" << LL_ENDL;
}
+boost::signals2::connection LLInventoryModelBackgroundFetch::setFetchCompletionCallback(folders_fetched_callback_t cb)
+{
+ return mFoldersFetchedSignal.connect(cb);
+}
+
void LLInventoryModelBackgroundFetch::backgroundFetchCB(void *)
{
LLInventoryModelBackgroundFetch::instance().backgroundFetch();
@@ -336,10 +417,17 @@ void LLInventoryModelBackgroundFetch::backgroundFetchCB(void *)
void LLInventoryModelBackgroundFetch::backgroundFetch()
{
- if (mBackgroundFetchActive && gAgent.getRegion() && gAgent.getRegion()->capabilitiesReceived())
+ if (mBackgroundFetchActive)
{
- // If we'll be using the capability, we'll be sending batches and the background thing isn't as important.
- bulkFetch();
+ if (AISAPI::isAvailable())
+ {
+ bulkFetchViaAis();
+ }
+ else if (gAgent.getRegion() && gAgent.getRegion()->capabilitiesReceived())
+ {
+ // If we'll be using the capability, we'll be sending batches and the background thing isn't as important.
+ bulkFetch();
+ }
}
}
@@ -352,9 +440,476 @@ void LLInventoryModelBackgroundFetch::incrFetchCount(S32 fetching)
mFetchCount = 0;
}
}
+void LLInventoryModelBackgroundFetch::incrFetchFolderCount(S32 fetching)
+{
+ incrFetchCount(fetching);
+ mFetchFolderCount += fetching;
+ if (mFetchCount < 0)
+ {
+ LL_WARNS_ONCE(LOG_INV) << "Inventory fetch count fell below zero (0)." << LL_ENDL;
+ mFetchFolderCount = 0;
+ }
+}
+
+void ais_simple_item_callback(const LLUUID& inv_id)
+{
+ LL_DEBUGS(LOG_INV , "AIS3") << "Response for " << inv_id << LL_ENDL;
+ LLInventoryModelBackgroundFetch::instance().incrFetchCount(-1);
+}
+
+void LLInventoryModelBackgroundFetch::onAISContentCalback(
+ const LLUUID& request_id,
+ const uuid_vec_t& content_ids,
+ const LLUUID& response_id,
+ EFetchType fetch_type)
+{
+ // Don't push_front on failure - there is a chance it was fired from inside bulkFetchViaAis
+ incrFetchFolderCount(-1);
+
+ uuid_vec_t::const_iterator folder_iter = content_ids.begin();
+ uuid_vec_t::const_iterator folder_end = content_ids.end();
+ while (folder_iter != folder_end)
+ {
+ std::list<LLUUID>::const_iterator found = std::find(mExpectedFolderIds.begin(), mExpectedFolderIds.end(), *folder_iter);
+ if (found != mExpectedFolderIds.end())
+ {
+ mExpectedFolderIds.erase(found);
+ }
+
+ LLViewerInventoryCategory* cat(gInventory.getCategory(*folder_iter));
+ if (cat)
+ {
+ cat->setFetching(LLViewerInventoryCategory::FETCH_NONE);
+ }
+ if (response_id.isNull())
+ {
+ // Failed to fetch, get it individually
+ mFetchFolderQueue.push_back(FetchQueueInfo(*folder_iter, FT_RECURSIVE));
+ }
+ else
+ {
+ // push descendant back to verify they are fetched fully (ex: didn't encounter depth limit)
+ LLInventoryModel::cat_array_t* categories(NULL);
+ LLInventoryModel::item_array_t* items(NULL);
+ gInventory.getDirectDescendentsOf(*folder_iter, categories, items);
+ if (categories)
+ {
+ for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin();
+ it != categories->end();
+ ++it)
+ {
+ mFetchFolderQueue.push_back(FetchQueueInfo((*it)->getUUID(), FT_RECURSIVE));
+ }
+ }
+ }
+
+ folder_iter++;
+ }
+
+ if (!mFetchFolderQueue.empty())
+ {
+ mBackgroundFetchActive = true;
+ mFolderFetchActive = true;
+ gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL);
+ }
+}
+void LLInventoryModelBackgroundFetch::onAISFolderCalback(const LLUUID &request_id, const LLUUID &response_id, EFetchType fetch_type)
+{
+ // Don't push_front on failure - there is a chance it was fired from inside bulkFetchViaAis
+ incrFetchFolderCount(-1);
+ std::list<LLUUID>::const_iterator found = std::find(mExpectedFolderIds.begin(), mExpectedFolderIds.end(), request_id);
+ if (found != mExpectedFolderIds.end())
+ {
+ mExpectedFolderIds.erase(found);
+ }
+ else
+ {
+ // ais shouldn't respond twice
+ llassert(false);
+ LL_WARNS() << "Unexpected folder response for " << request_id << LL_ENDL;
+ }
+
+ if (request_id.isNull())
+ {
+ // orhans, no other actions needed
+ return;
+ }
+
+ bool request_descendants = false;
+ if (response_id.isNull()) // Failure
+ {
+ LL_DEBUGS(LOG_INV , "AIS3") << "Failure response for folder " << request_id << LL_ENDL;
+ if (fetch_type == FT_RECURSIVE)
+ {
+ // A full recursive request failed.
+ // Try requesting folder and nested content separately
+ mFetchFolderQueue.push_back(FetchQueueInfo(request_id, FT_FOLDER_AND_CONTENT));
+ }
+ else if (fetch_type == FT_FOLDER_AND_CONTENT)
+ {
+ LL_WARNS() << "Failed to download folder: " << request_id << " Requesting known content separately" << LL_ENDL;
+ mFetchFolderQueue.push_back(FetchQueueInfo(request_id, FT_CONTENT_RECURSIVE));
+
+ // set folder's version to prevent viewer from trying to request folder indefinetely
+ LLViewerInventoryCategory* cat(gInventory.getCategory(request_id));
+ if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN)
+ {
+ cat->setVersion(0);
+ }
+ }
+ }
+ else
+ {
+ if (fetch_type == FT_RECURSIVE)
+ {
+ // Got the folder and content, now verify content
+ // Request content even for FT_RECURSIVE in case of changes, failures
+ // or if depth limit gets imlemented.
+ // This shouldn't redownload folders if they already have version
+ request_descendants = true;
+ LL_DEBUGS(LOG_INV, "AIS3") << "Got folder " << request_id << ". Requesting content" << LL_ENDL;
+ }
+ else if (fetch_type == FT_FOLDER_AND_CONTENT)
+ {
+ // readd folder for content request
+ mFetchFolderQueue.push_front(FetchQueueInfo(request_id, FT_CONTENT_RECURSIVE));
+ }
+ else
+ {
+ LL_DEBUGS(LOG_INV, "AIS3") << "Got folder " << request_id << "." << LL_ENDL;
+ }
+
+ }
+
+ if (request_descendants)
+ {
+ LLInventoryModel::cat_array_t* categories(NULL);
+ LLInventoryModel::item_array_t* items(NULL);
+ gInventory.getDirectDescendentsOf(request_id, categories, items);
+ if (categories)
+ {
+ for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin();
+ it != categories->end();
+ ++it)
+ {
+ mFetchFolderQueue.push_back(FetchQueueInfo((*it)->getUUID(), FT_RECURSIVE));
+ }
+ }
+ }
+
+ if (!mFetchFolderQueue.empty())
+ {
+ mBackgroundFetchActive = true;
+ mFolderFetchActive = true;
+ gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL);
+ }
+
+ // done
+ LLViewerInventoryCategory * cat(gInventory.getCategory(request_id));
+ if (cat)
+ {
+ cat->setFetching(LLViewerInventoryCategory::FETCH_NONE);
+ }
+}
static LLTrace::BlockTimerStatHandle FTM_BULK_FETCH("Bulk Fetch");
+void LLInventoryModelBackgroundFetch::bulkFetchViaAis()
+{
+ LL_RECORD_BLOCK_TIME(FTM_BULK_FETCH);
+ //Background fetch is called from gIdleCallbacks in a loop until background fetch is stopped.
+ if (gDisconnected)
+ {
+ return;
+ }
+
+ static LLCachedControl<U32> ais_pool(gSavedSettings, "PoolSizeAIS", 20);
+ // Don't have too many requests at once, AIS throttles
+ // Reserve one request for actions outside of fetch (like renames)
+ const U32 max_concurrent_fetches = llclamp(ais_pool - 1, 1, 50);
+
+ if (mFetchCount >= max_concurrent_fetches)
+ {
+ return;
+ }
+
+ // Don't loop for too long (in case of large, fully loaded inventory)
+ F64 curent_time = LLTimer::getTotalSeconds();
+ const F64 max_time = LLStartUp::getStartupState() > STATE_WEARABLES_WAIT
+ ? 0.006f // 6 ms
+ : 1.f;
+ const F64 end_time = curent_time + max_time;
+ S32 last_fetch_count = mFetchCount;
+
+ while (!mFetchFolderQueue.empty() && mFetchCount < max_concurrent_fetches && curent_time < end_time)
+ {
+ const FetchQueueInfo & fetch_info(mFetchFolderQueue.front());
+ bulkFetchViaAis(fetch_info);
+ mFetchFolderQueue.pop_front();
+ curent_time = LLTimer::getTotalSeconds();
+ }
+
+ // Ideally we shouldn't fetch items if recursive fetch isn't done,
+ // but there is a chance some request will start timeouting and recursive
+ // fetch will get stuck on a signle folder, don't block item fetch in such case
+ while (!mFetchItemQueue.empty() && mFetchCount < max_concurrent_fetches && curent_time < end_time)
+ {
+ const FetchQueueInfo& fetch_info(mFetchItemQueue.front());
+ bulkFetchViaAis(fetch_info);
+ mFetchItemQueue.pop_front();
+ curent_time = LLTimer::getTotalSeconds();
+ }
+
+ if (last_fetch_count != mFetchCount // if anything was added
+ || mLastFetchCount != mFetchCount) // if anything was substracted
+ {
+ LL_DEBUGS(LOG_INV , "AIS3") << "Total active fetches: " << mLastFetchCount << "->" << last_fetch_count << "->" << mFetchCount
+ << ", scheduled folder fetches: " << (S32)mFetchFolderQueue.size()
+ << ", scheduled item fetches: " << (S32)mFetchItemQueue.size()
+ << LL_ENDL;
+ mLastFetchCount = mFetchCount;
+
+ if (!mExpectedFolderIds.empty())
+ {
+ // A folder seem to be stack fetching on QA account, print oldest folder out
+ LL_DEBUGS(LOG_INV , "AIS3") << "Oldest expected folder: ";
+ std::list<LLUUID>::const_iterator iter = mExpectedFolderIds.begin();
+ LL_CONT << *iter;
+ if ((*iter).notNull())
+ {
+ LLViewerInventoryCategory* cat(gInventory.getCategory(*iter));
+ if (cat)
+ {
+ LL_CONT << " Folder name: " << cat->getName() << " Parent: " << cat->getParentUUID();
+ }
+ else
+ {
+ LL_CONT << " This folder doesn't exist";
+ }
+ }
+ else
+ {
+ LL_CONT << " Orphans request";
+ }
+ LL_CONT << LL_ENDL;
+ }
+ }
+
+ if (isFolderFetchProcessingComplete() && mFolderFetchActive)
+ {
+ setAllFoldersFetched();
+ }
+
+ if (isBulkFetchProcessingComplete())
+ {
+ mBackgroundFetchActive = false;
+ }
+}
+
+void LLInventoryModelBackgroundFetch::bulkFetchViaAis(const FetchQueueInfo& fetch_info)
+{
+ if (fetch_info.mIsCategory)
+ {
+ const LLUUID & cat_id(fetch_info.mUUID);
+ if (cat_id.isNull())
+ {
+ incrFetchFolderCount(1);
+ mExpectedFolderIds.push_back(cat_id);
+ // Lost and found
+ // Should it actually be recursive?
+ AISAPI::FetchOrphans([](const LLUUID& response_id)
+ {
+ LLInventoryModelBackgroundFetch::instance().onAISFolderCalback(LLUUID::null,
+ response_id,
+ FT_DEFAULT);
+ });
+ }
+ else
+ {
+ LLViewerInventoryCategory * cat(gInventory.getCategory(cat_id));
+ if (cat)
+ {
+ if (fetch_info.mFetchType == FT_CONTENT_RECURSIVE)
+ {
+ // fetch content only, ignore cat itself
+ uuid_vec_t children;
+ LLInventoryModel::cat_array_t* categories(NULL);
+ LLInventoryModel::item_array_t* items(NULL);
+ gInventory.getDirectDescendentsOf(cat_id, categories, items);
+
+ LLViewerInventoryCategory::EFetchType target_state = LLViewerInventoryCategory::FETCH_RECURSIVE;
+ bool content_done = true;
+
+ // Top limit is 'as many as you can put into url'
+ static LLCachedControl<S32> ais_batch(gSavedSettings, "BatchSizeAIS3", 20);
+ S32 batch_limit = llclamp(ais_batch(), 1, 40);
+
+ for (LLInventoryModel::cat_array_t::iterator it = categories->begin();
+ it != categories->end();
+ ++it)
+ {
+ LLViewerInventoryCategory* child_cat = (*it);
+ if (LLViewerInventoryCategory::VERSION_UNKNOWN != child_cat->getVersion()
+ || child_cat->getFetching() >= target_state)
+ {
+ continue;
+ }
+
+ if (child_cat->getPreferredType() == LLFolderType::FT_MARKETPLACE_LISTINGS)
+ {
+ // special case
+ content_done = false;
+ if (children.empty())
+ {
+ // fetch marketplace alone
+ // Should it actually be fetched as FT_FOLDER_AND_CONTENT?
+ children.push_back(child_cat->getUUID());
+ mExpectedFolderIds.push_back(child_cat->getUUID());
+ child_cat->setFetching(target_state);
+ break;
+ }
+ else
+ {
+ // fetch marketplace alone next run
+ continue;
+ }
+ }
+
+ children.push_back(child_cat->getUUID());
+ mExpectedFolderIds.push_back(child_cat->getUUID());
+ child_cat->setFetching(target_state);
+
+ if (children.size() >= batch_limit)
+ {
+ content_done = false;
+ break;
+ }
+ }
+
+ if (!children.empty())
+ {
+ // increment before call in case of immediate callback
+ incrFetchFolderCount(1);
+
+ EFetchType type = fetch_info.mFetchType;
+ LLUUID cat_id = cat->getUUID(); // need a copy for lambda
+ AISAPI::completion_t cb = [cat_id, children, type](const LLUUID& response_id)
+ {
+ LLInventoryModelBackgroundFetch::instance().onAISContentCalback(cat_id, children, response_id, type);
+ };
+
+ AISAPI::ITEM_TYPE item_type = AISAPI::INVENTORY;
+ if (ALEXANDRIA_LINDEN_ID == cat->getOwnerID())
+ {
+ item_type = AISAPI::LIBRARY;
+ }
+
+ AISAPI::FetchCategorySubset(cat_id, children, item_type, true, cb, 0);
+ }
+
+ if (content_done)
+ {
+ // This will have a bit of overlap with onAISContentCalback,
+ // but something else might have dowloaded folders, so verify
+ // every child that is complete has it's children done as well
+ for (LLInventoryModel::cat_array_t::iterator it = categories->begin();
+ it != categories->end();
+ ++it)
+ {
+ LLViewerInventoryCategory* child_cat = (*it);
+ if (LLViewerInventoryCategory::VERSION_UNKNOWN != child_cat->getVersion())
+ {
+ mFetchFolderQueue.push_back(FetchQueueInfo(child_cat->getUUID(), FT_RECURSIVE));
+ }
+ }
+ }
+ else
+ {
+ // send it back to get the rest
+ mFetchFolderQueue.push_back(FetchQueueInfo(cat_id, FT_CONTENT_RECURSIVE));
+ }
+ }
+ else if (LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion()
+ || fetch_info.mFetchType == FT_FORCED)
+ {
+ LLViewerInventoryCategory::EFetchType target_state =
+ fetch_info.mFetchType > FT_CONTENT_RECURSIVE
+ ? LLViewerInventoryCategory::FETCH_RECURSIVE
+ : LLViewerInventoryCategory::FETCH_NORMAL;
+ // start again if we did a non-recursive fetch before
+ // to get all children in a single request
+ if (cat->getFetching() < target_state)
+ {
+ // increment before call in case of immediate callback
+ incrFetchFolderCount(1);
+ cat->setFetching(target_state);
+ mExpectedFolderIds.push_back(cat_id);
+
+ EFetchType type = fetch_info.mFetchType;
+ LLUUID cat_id = cat->getUUID();
+ AISAPI::completion_t cb = [cat_id , type](const LLUUID& response_id)
+ {
+ LLInventoryModelBackgroundFetch::instance().onAISFolderCalback(cat_id , response_id , type);
+ };
+
+ AISAPI::ITEM_TYPE item_type = AISAPI::INVENTORY;
+ if (ALEXANDRIA_LINDEN_ID == cat->getOwnerID())
+ {
+ item_type = AISAPI::LIBRARY;
+ }
+
+ AISAPI::FetchCategoryChildren(cat_id , item_type , type == FT_RECURSIVE , cb, 0);
+ }
+ }
+ else
+ {
+ // Already fetched, check if anything inside needs fetching
+ if (fetch_info.mFetchType == FT_RECURSIVE
+ || fetch_info.mFetchType == FT_FOLDER_AND_CONTENT)
+ {
+ LLInventoryModel::cat_array_t * categories(NULL);
+ LLInventoryModel::item_array_t * items(NULL);
+ gInventory.getDirectDescendentsOf(cat_id, categories, items);
+ for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin();
+ it != categories->end();
+ ++it)
+ {
+ // not push_front to not cause an infinite loop
+ mFetchFolderQueue.push_back(FetchQueueInfo((*it)->getUUID(), FT_RECURSIVE));
+ }
+ }
+ }
+ } // else try to fetch folder either way?
+ }
+ }
+ else
+ {
+ LLViewerInventoryItem * itemp(gInventory.getItem(fetch_info.mUUID));
+
+ if (itemp)
+ {
+ if (!itemp->isFinished() || fetch_info.mFetchType == FT_FORCED)
+ {
+ mFetchCount++;
+ if (itemp->getPermissions().getOwner() == gAgent.getID())
+ {
+ AISAPI::FetchItem(fetch_info.mUUID, AISAPI::INVENTORY, ais_simple_item_callback);
+ }
+ else
+ {
+ AISAPI::FetchItem(fetch_info.mUUID, AISAPI::LIBRARY, ais_simple_item_callback);
+ }
+ }
+ }
+ else // We don't know it, assume incomplete
+ {
+ // Assume agent's inventory, library wouldn't have gotten here
+ mFetchCount++;
+ AISAPI::FetchItem(fetch_info.mUUID, AISAPI::INVENTORY, ais_simple_item_callback);
+ }
+ }
+}
+
// Bundle up a bunch of requests to send all at once.
void LLInventoryModelBackgroundFetch::bulkFetch()
{
@@ -374,13 +929,6 @@ void LLInventoryModelBackgroundFetch::bulkFetch()
// inventory more quickly.
static const U32 max_batch_size(10);
static const S32 max_concurrent_fetches(12); // Outstanding requests, not connections
- static const F32 new_min_time(0.05f); // *HACK: Clean this up when old code goes away entirely.
-
- mMinTimeBetweenFetches = new_min_time;
- if (mMinTimeBetweenFetches < new_min_time)
- {
- mMinTimeBetweenFetches = new_min_time; // *HACK: See above.
- }
if (mFetchCount)
{
@@ -394,8 +942,7 @@ void LLInventoryModelBackgroundFetch::bulkFetch()
gInventory.notifyObservers();
}
- if ((mFetchCount > max_concurrent_fetches) ||
- (mFetchTimer.getElapsedTimeF32() < mMinTimeBetweenFetches))
+ if (mFetchCount > max_concurrent_fetches)
{
return;
}
@@ -408,99 +955,112 @@ void LLInventoryModelBackgroundFetch::bulkFetch()
// *TODO: Think I'd like to get a shared pointer to this and share it
// among all the folder requests.
uuid_vec_t recursive_cats;
+ uuid_vec_t all_cats; // dupplicate avoidance
LLSD folder_request_body;
LLSD folder_request_body_lib;
LLSD item_request_body;
LLSD item_request_body_lib;
- while (! mFetchQueue.empty()
+ while (! mFetchFolderQueue.empty()
&& (item_count + folder_count) < max_batch_size)
{
- const FetchQueueInfo & fetch_info(mFetchQueue.front());
+ const FetchQueueInfo & fetch_info(mFetchFolderQueue.front());
if (fetch_info.mIsCategory)
{
const LLUUID & cat_id(fetch_info.mUUID);
- if (cat_id.isNull()) //DEV-17797
+ if (cat_id.isNull()) //DEV-17797 Lost and found
{
LLSD folder_sd;
folder_sd["folder_id"] = LLUUID::null.asString();
folder_sd["owner_id"] = gAgent.getID();
folder_sd["sort_order"] = LLSD::Integer(sort_order);
- folder_sd["fetch_folders"] = LLSD::Boolean(FALSE);
- folder_sd["fetch_items"] = LLSD::Boolean(TRUE);
+ folder_sd["fetch_folders"] = LLSD::Boolean(false);
+ folder_sd["fetch_items"] = LLSD::Boolean(true);
folder_request_body["folders"].append(folder_sd);
folder_count++;
}
else
{
- const LLViewerInventoryCategory * cat(gInventory.getCategory(cat_id));
-
- if (cat)
- {
- if (LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion())
- {
- LLSD folder_sd;
- folder_sd["folder_id"] = cat->getUUID();
- folder_sd["owner_id"] = cat->getOwnerID();
- folder_sd["sort_order"] = LLSD::Integer(sort_order);
- folder_sd["fetch_folders"] = LLSD::Boolean(TRUE); //(LLSD::Boolean)sFullFetchStarted;
- folder_sd["fetch_items"] = LLSD::Boolean(TRUE);
-
- if (ALEXANDRIA_LINDEN_ID == cat->getOwnerID())
- {
- folder_request_body_lib["folders"].append(folder_sd);
- }
- else
- {
- folder_request_body["folders"].append(folder_sd);
- }
- folder_count++;
- }
-
- // May already have this folder, but append child folders to list.
- if (fetch_info.mRecursive)
- {
- LLInventoryModel::cat_array_t * categories(NULL);
- LLInventoryModel::item_array_t * items(NULL);
- gInventory.getDirectDescendentsOf(cat->getUUID(), categories, items);
- for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin();
- it != categories->end();
- ++it)
- {
- mFetchQueue.push_back(FetchQueueInfo((*it)->getUUID(), fetch_info.mRecursive));
- }
- }
- }
+ const LLViewerInventoryCategory * cat(gInventory.getCategory(cat_id));
+ if (cat)
+ {
+ if (LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion())
+ {
+ if (std::find(all_cats.begin(), all_cats.end(), cat_id) == all_cats.end())
+ {
+ LLSD folder_sd;
+ folder_sd["folder_id"] = cat->getUUID();
+ folder_sd["owner_id"] = cat->getOwnerID();
+ folder_sd["sort_order"] = LLSD::Integer(sort_order);
+ folder_sd["fetch_folders"] = LLSD::Boolean(TRUE); //(LLSD::Boolean)sFullFetchStarted;
+ folder_sd["fetch_items"] = LLSD::Boolean(TRUE);
+
+ if (ALEXANDRIA_LINDEN_ID == cat->getOwnerID())
+ {
+ folder_request_body_lib["folders"].append(folder_sd);
+ }
+ else
+ {
+ folder_request_body["folders"].append(folder_sd);
+ }
+ folder_count++;
+ }
+ }
+ else
+ {
+ // May already have this folder, but append child folders to list.
+ if (fetch_info.mFetchType >= FT_CONTENT_RECURSIVE)
+ {
+ LLInventoryModel::cat_array_t * categories(NULL);
+ LLInventoryModel::item_array_t * items(NULL);
+ gInventory.getDirectDescendentsOf(cat_id, categories, items);
+ for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin();
+ it != categories->end();
+ ++it)
+ {
+ mFetchFolderQueue.push_back(FetchQueueInfo((*it)->getUUID(), fetch_info.mFetchType));
+ }
+ }
+ }
+ }
}
- if (fetch_info.mRecursive)
+ if (fetch_info.mFetchType >= FT_CONTENT_RECURSIVE)
{
recursive_cats.push_back(cat_id);
}
+ all_cats.push_back(cat_id);
}
- else
- {
- LLViewerInventoryItem * itemp(gInventory.getItem(fetch_info.mUUID));
- if (itemp)
- {
- LLSD item_sd;
- item_sd["owner_id"] = itemp->getPermissions().getOwner();
- item_sd["item_id"] = itemp->getUUID();
- if (itemp->getPermissions().getOwner() == gAgent.getID())
- {
- item_request_body.append(item_sd);
- }
- else
- {
- item_request_body_lib.append(item_sd);
- }
- //itemp->fetchFromServer();
- item_count++;
- }
- }
+ mFetchFolderQueue.pop_front();
+ }
- mFetchQueue.pop_front();
+
+ while (!mFetchItemQueue.empty()
+ && (item_count + folder_count) < max_batch_size)
+ {
+ const FetchQueueInfo & fetch_info(mFetchItemQueue.front());
+
+ LLViewerInventoryItem * itemp(gInventory.getItem(fetch_info.mUUID));
+
+ if (itemp)
+ {
+ LLSD item_sd;
+ item_sd["owner_id"] = itemp->getPermissions().getOwner();
+ item_sd["item_id"] = itemp->getUUID();
+ if (itemp->getPermissions().getOwner() == gAgent.getID())
+ {
+ item_request_body.append(item_sd);
+ }
+ else
+ {
+ item_request_body_lib.append(item_sd);
+ }
+ //itemp->fetchFromServer();
+ item_count++;
+ }
+
+ mFetchItemQueue.pop_front();
}
// Issue HTTP POST requests to fetch folders and items
@@ -571,14 +1131,22 @@ void LLInventoryModelBackgroundFetch::bulkFetch()
bool LLInventoryModelBackgroundFetch::fetchQueueContainsNoDescendentsOf(const LLUUID & cat_id) const
{
- for (fetch_queue_t::const_iterator it = mFetchQueue.begin();
- it != mFetchQueue.end();
+ for (fetch_queue_t::const_iterator it = mFetchFolderQueue.begin();
+ it != mFetchFolderQueue.end();
++it)
{
const LLUUID & fetch_id = (*it).mUUID;
if (gInventory.isObjectDescendentOf(fetch_id, cat_id))
return false;
}
+ for (fetch_queue_t::const_iterator it = mFetchItemQueue.begin();
+ it != mFetchItemQueue.end();
+ ++it)
+ {
+ const LLUUID & fetch_id = (*it).mUUID;
+ if (gInventory.isObjectDescendentOf(fetch_id, cat_id))
+ return false;
+ }
return true;
}
@@ -796,6 +1364,63 @@ void BGFolderHttpHandler::processFailure(LLCore::HttpStatus status, LLCore::Http
<< LLCoreHttpUtil::responseToString(response) << "]" << LL_ENDL;
// Could use a 404 test here to try to detect revoked caps...
+
+ if(status == LLCore::HttpStatus(HTTP_FORBIDDEN))
+ {
+ // Too large, split into two if possible
+ if (gDisconnected || LLApp::isExiting())
+ {
+ return;
+ }
+
+ const std::string url(gAgent.getRegionCapability("FetchInventoryDescendents2"));
+ if (url.empty())
+ {
+ LL_WARNS(LOG_INV) << "Failed to get AIS2 cap" << LL_ENDL;
+ return;
+ }
+
+ S32 size = mRequestSD["folders"].size();
+
+ if (size > 1)
+ {
+ // Can split, assume that this isn't the library
+ LLSD folders;
+ uuid_vec_t recursive_cats;
+ LLSD::array_iterator iter = mRequestSD["folders"].beginArray();
+ LLSD::array_iterator end = mRequestSD["folders"].endArray();
+ while (iter != end)
+ {
+ folders.append(*iter);
+ LLUUID folder_id = iter->get("folder_id").asUUID();
+ if (std::find(mRecursiveCatUUIDs.begin(), mRecursiveCatUUIDs.end(), folder_id) != mRecursiveCatUUIDs.end())
+ {
+ recursive_cats.push_back(folder_id);
+ }
+ if (folders.size() == (S32)(size / 2))
+ {
+ LLSD request_body;
+ request_body["folders"] = folders;
+ LLCore::HttpHandler::ptr_t handler(new BGFolderHttpHandler(request_body, recursive_cats));
+ gInventory.requestPost(false, url, request_body, handler, "Inventory Folder");
+ recursive_cats.clear();
+ folders.clear();
+ }
+ iter++;
+ }
+
+ LLSD request_body;
+ request_body["folders"] = folders;
+ LLCore::HttpHandler::ptr_t handler(new BGFolderHttpHandler(request_body, recursive_cats));
+ gInventory.requestPost(false, url, request_body, handler, "Inventory Folder");
+ return;
+ }
+ else
+ {
+ // Can't split
+ LLNotificationsUtil::add("InventoryLimitReachedAIS");
+ }
+ }
// This was originally the request retry logic for the inventory
// request which tested on HTTP_INTERNAL_ERROR status. This
diff --git a/indra/newview/llinventorymodelbackgroundfetch.h b/indra/newview/llinventorymodelbackgroundfetch.h
index 00d2908c1b..e7be265a3d 100644
--- a/indra/newview/llinventorymodelbackgroundfetch.h
+++ b/indra/newview/llinventorymodelbackgroundfetch.h
@@ -47,9 +47,11 @@ class LLInventoryModelBackgroundFetch : public LLSingleton<LLInventoryModelBackg
~LLInventoryModelBackgroundFetch();
public:
- // Start and stop background breadth-first fetching of inventory contents.
+ // Start background breadth-first fetching of inventory contents.
// This gets triggered when performing a filter-search.
- void start(const LLUUID& cat_id = LLUUID::null, BOOL recursive = TRUE);
+ void start(const LLUUID& cat_id = LLUUID::null, bool recursive = true);
+ void scheduleFolderFetch(const LLUUID& cat_id, bool forced = false);
+ void scheduleItemFetch(const LLUUID& item_id, bool forced = false);
BOOL folderFetchActive() const;
bool isEverythingFetched() const; // completing the fetch once per session should be sufficient
@@ -62,16 +64,47 @@ public:
bool inventoryFetchCompleted() const;
bool inventoryFetchInProgress() const;
- void findLostItems();
- void incrFetchCount(S32 fetching);
+ void findLostItems();
+ void incrFetchCount(S32 fetching);
+ void incrFetchFolderCount(S32 fetching);
bool isBulkFetchProcessingComplete() const;
+ bool isFolderFetchProcessingComplete() const;
void setAllFoldersFetched();
- void addRequestAtFront(const LLUUID & id, BOOL recursive, bool is_category);
- void addRequestAtBack(const LLUUID & id, BOOL recursive, bool is_category);
+ typedef boost::function<void()> folders_fetched_callback_t;
+ boost::signals2::connection setFetchCompletionCallback(folders_fetched_callback_t cb);
+
+ void addRequestAtFront(const LLUUID & id, bool recursive, bool is_category);
+ void addRequestAtBack(const LLUUID & id, bool recursive, bool is_category);
protected:
+
+ typedef enum {
+ FT_DEFAULT = 0,
+ FT_FORCED, // request non-recursively even if already loaded
+ FT_CONTENT_RECURSIVE, // request content recursively
+ FT_FOLDER_AND_CONTENT, // request folder, then content recursively
+ FT_RECURSIVE, // request everything recursively
+ } EFetchType;
+ struct FetchQueueInfo
+ {
+ FetchQueueInfo(const LLUUID& id, EFetchType recursive, bool is_category = true)
+ : mUUID(id),
+ mIsCategory(is_category),
+ mFetchType(recursive)
+ {}
+
+ LLUUID mUUID;
+ bool mIsCategory;
+ EFetchType mFetchType;
+ };
+ typedef std::deque<FetchQueueInfo> fetch_queue_t;
+
+ void onAISContentCalback(const LLUUID& request_id, const uuid_vec_t &content_ids, const LLUUID& response_id, EFetchType fetch_type);
+ void onAISFolderCalback(const LLUUID &request_id, const LLUUID &response_id, EFetchType fetch_type);
+ void bulkFetchViaAis();
+ void bulkFetchViaAis(const FetchQueueInfo& fetch_info);
void bulkFetch();
void backgroundFetch();
@@ -80,31 +113,23 @@ protected:
bool fetchQueueContainsNoDescendentsOf(const LLUUID& cat_id) const;
private:
- BOOL mRecursiveInventoryFetchStarted;
- BOOL mRecursiveLibraryFetchStarted;
- BOOL mAllFoldersFetched;
+ bool mRecursiveInventoryFetchStarted;
+ bool mRecursiveLibraryFetchStarted;
+ bool mAllRecursiveFoldersFetched;
+ typedef boost::signals2::signal<void()> folders_fetched_signal_t;
+ folders_fetched_signal_t mFoldersFetchedSignal;
- BOOL mBackgroundFetchActive;
+ bool mBackgroundFetchActive;
bool mFolderFetchActive;
S32 mFetchCount;
+ S32 mLastFetchCount; // for debug
+ S32 mFetchFolderCount;
LLFrameTimer mFetchTimer;
F32 mMinTimeBetweenFetches;
-
- struct FetchQueueInfo
- {
- FetchQueueInfo(const LLUUID& id, BOOL recursive, bool is_category = true)
- : mUUID(id),
- mIsCategory(is_category),
- mRecursive(recursive)
- {}
-
- LLUUID mUUID;
- bool mIsCategory;
- BOOL mRecursive;
- };
- typedef std::deque<FetchQueueInfo> fetch_queue_t;
- fetch_queue_t mFetchQueue;
+ fetch_queue_t mFetchFolderQueue;
+ fetch_queue_t mFetchItemQueue;
+ std::list<LLUUID> mExpectedFolderIds; // for debug, should this track time?
};
#endif // LL_LLINVENTORYMODELBACKGROUNDFETCH_H
diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp
index 26d7a7a28a..281a8bc789 100644
--- a/indra/newview/llinventoryobserver.cpp
+++ b/indra/newview/llinventoryobserver.cpp
@@ -37,8 +37,10 @@
#include "llagent.h"
#include "llagentwearables.h"
+#include "llaisapi.h"
#include "llfloater.h"
#include "llfocusmgr.h"
+#include "llinventorymodelbackgroundfetch.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
@@ -56,6 +58,7 @@
#include "llsdutil.h"
#include <deque>
+const S32 LLInventoryFetchItemsObserver::MAX_INDIVIDUAL_ITEM_REQUESTS = 7;
const F32 LLInventoryFetchItemsObserver::FETCH_TIMER_EXPIRY = 60.0f;
@@ -149,7 +152,7 @@ LLInventoryFetchItemsObserver::LLInventoryFetchItemsObserver(const uuid_vec_t& i
void LLInventoryFetchItemsObserver::changed(U32 mask)
{
- LL_DEBUGS() << this << " remaining incomplete " << mIncomplete.size()
+ LL_DEBUGS("InventoryFetch") << this << " remaining incomplete " << mIncomplete.size()
<< " complete " << mComplete.size()
<< " wait period " << mFetchingPeriod.getRemainingTimeF32()
<< LL_ENDL;
@@ -158,6 +161,15 @@ void LLInventoryFetchItemsObserver::changed(U32 mask)
// appropriate.
if (!mIncomplete.empty())
{
+ if (!LLInventoryModelBackgroundFetch::getInstance()->isEverythingFetched())
+ {
+ // Folders have a priority over items and they download items as well
+ // Wait untill initial folder fetch is done
+ LL_DEBUGS("InventoryFetch") << "Folder fetch in progress, resetting fetch timer" << LL_ENDL;
+
+ mFetchingPeriod.reset();
+ mFetchingPeriod.setTimerExpirySec(FETCH_TIMER_EXPIRY);
+ }
// Have we exceeded max wait time?
bool timeout_expired = mFetchingPeriod.hasExpired();
@@ -176,7 +188,7 @@ void LLInventoryFetchItemsObserver::changed(U32 mask)
if (timeout_expired)
{
// Just concede that this item hasn't arrived in reasonable time and continue on.
- LL_WARNS() << "Fetcher timed out when fetching inventory item UUID: " << item_id << LL_ENDL;
+ LL_WARNS("InventoryFetch") << "Fetcher timed out when fetching inventory item UUID: " << item_id << LL_ENDL;
it = mIncomplete.erase(it);
}
else
@@ -191,7 +203,7 @@ void LLInventoryFetchItemsObserver::changed(U32 mask)
if (mIncomplete.empty())
{
- LL_DEBUGS() << this << " done at remaining incomplete "
+ LL_DEBUGS("InventoryFetch") << this << " done at remaining incomplete "
<< mIncomplete.size() << " complete " << mComplete.size() << LL_ENDL;
done();
}
@@ -251,29 +263,21 @@ void fetch_items_from_llsd(const LLSD& items_llsd)
void LLInventoryFetchItemsObserver::startFetch()
{
- LLUUID owner_id;
+ bool aisv3 = AISAPI::isAvailable();
+
LLSD items_llsd;
+
+ typedef std::map<LLUUID, uuid_vec_t> requests_by_folders_t;
+ requests_by_folders_t requests;
for (uuid_vec_t::const_iterator it = mIDs.begin(); it < mIDs.end(); ++it)
{
- LLViewerInventoryItem* item = gInventory.getItem(*it);
- if (item)
- {
- if (item->isFinished())
- {
- // It's complete, so put it on the complete container.
- mComplete.push_back(*it);
- continue;
- }
- else
- {
- owner_id = item->getPermissions().getOwner();
- }
- }
- else
- {
- // assume it's agent inventory.
- owner_id = gAgent.getID();
- }
+ LLViewerInventoryItem* item = gInventory.getItem(*it);
+ if (item && item->isFinished())
+ {
+ // It's complete, so put it on the complete container.
+ mComplete.push_back(*it);
+ continue;
+ }
// Ignore categories since they're not items. We
// could also just add this to mComplete but not sure what the
@@ -294,17 +298,98 @@ void LLInventoryFetchItemsObserver::startFetch()
// pack this on the message.
mIncomplete.push_back(*it);
- // Prepare the data to fetch
- LLSD item_entry;
- item_entry["owner_id"] = owner_id;
- item_entry["item_id"] = (*it);
- items_llsd.append(item_entry);
+ if (aisv3)
+ {
+ if (item)
+ {
+ LLUUID parent_id = item->getParentUUID();
+ requests[parent_id].push_back(*it);
+ }
+ else
+ {
+ // Can happen for gestures and calling cards if server notified us before they fetched
+ // Request by id without checking for an item.
+ LLInventoryModelBackgroundFetch::getInstance()->scheduleItemFetch(*it);
+ }
+ }
+ else
+ {
+ // Prepare the data to fetch
+ LLSD item_entry;
+ if (item)
+ {
+ item_entry["owner_id"] = item->getPermissions().getOwner();
+ }
+ else
+ {
+ // assume it's agent inventory.
+ item_entry["owner_id"] = gAgent.getID();
+ }
+ item_entry["item_id"] = (*it);
+ items_llsd.append(item_entry);
+ }
}
mFetchingPeriod.reset();
mFetchingPeriod.setTimerExpirySec(FETCH_TIMER_EXPIRY);
- fetch_items_from_llsd(items_llsd);
+ if (aisv3)
+ {
+ for (requests_by_folders_t::value_type &folder : requests)
+ {
+ if (folder.second.size() > MAX_INDIVIDUAL_ITEM_REQUESTS)
+ {
+ // requesting one by one will take a while
+ // do whole folder
+ LLInventoryModelBackgroundFetch::getInstance()->scheduleFolderFetch(folder.first, true);
+ }
+ else
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(folder.first);
+ if (cat)
+ {
+ if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN)
+ {
+ // start fetching whole folder since it's not ready either way
+ cat->fetch();
+ }
+ else if (cat->getViewerDescendentCount() <= folder.second.size()
+ || cat->getDescendentCount() <= folder.second.size())
+ {
+ // Start fetching whole folder since we need all items
+ LLInventoryModelBackgroundFetch::getInstance()->scheduleFolderFetch(folder.first, true);
+
+ }
+ else
+ {
+ // get items one by one
+ for (LLUUID &item_id : folder.second)
+ {
+ LLInventoryModelBackgroundFetch::getInstance()->scheduleItemFetch(item_id);
+ }
+ }
+ }
+ else
+ {
+ // Isn't supposed to happen? We should have all folders
+ // and if item exists, folder is supposed to exist as well.
+ llassert(false);
+ LL_WARNS("Inventory") << "Missing folder: " << folder.first << " fetching items individually" << LL_ENDL;
+
+ // get items one by one
+ for (LLUUID &item_id : folder.second)
+ {
+ LLInventoryModelBackgroundFetch::getInstance()->scheduleItemFetch(item_id);
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ fetch_items_from_llsd(items_llsd);
+ }
+
}
LLInventoryFetchDescendentsObserver::LLInventoryFetchDescendentsObserver(const LLUUID& cat_id) :
@@ -640,7 +725,7 @@ void LLInventoryCategoriesObserver::changed(U32 mask)
// computed, or (b) a name has changed.
if (!cat_data.mIsNameHashInitialized || (mask & LLInventoryObserver::LABEL))
{
- LLMD5 item_name_hash = gInventory.hashDirectDescendentNames(cat_id);
+ digest_t item_name_hash = gInventory.hashDirectDescendentNames(cat_id);
if (cat_data.mItemNameHash != item_name_hash)
{
cat_data.mIsNameHashInitialized = true;
@@ -649,6 +734,13 @@ void LLInventoryCategoriesObserver::changed(U32 mask)
}
}
+ const LLUUID thumbnail_id = category->getThumbnailUUID();
+ if (cat_data.mThumbnailId != thumbnail_id)
+ {
+ cat_data.mThumbnailId = thumbnail_id;
+ cat_changed = true;
+ }
+
// If anything has changed above, fire the callback.
if (cat_changed)
cat_data.mCallback();
@@ -666,6 +758,7 @@ bool LLInventoryCategoriesObserver::addCategory(const LLUUID& cat_id, callback_t
S32 version = LLViewerInventoryCategory::VERSION_UNKNOWN;
S32 current_num_known_descendents = LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN;
bool can_be_added = true;
+ LLUUID thumbnail_id;
LLViewerInventoryCategory* category = gInventory.getCategory(cat_id);
// If category could not be retrieved it might mean that
@@ -677,6 +770,7 @@ bool LLInventoryCategoriesObserver::addCategory(const LLUUID& cat_id, callback_t
// Inventory category version is used to find out if some changes
// to a category have been made.
version = category->getVersion();
+ thumbnail_id = category->getThumbnailUUID();
LLInventoryModel::cat_array_t* cats;
LLInventoryModel::item_array_t* items;
@@ -701,12 +795,12 @@ bool LLInventoryCategoriesObserver::addCategory(const LLUUID& cat_id, callback_t
{
if(init_name_hash)
{
- LLMD5 item_name_hash = gInventory.hashDirectDescendentNames(cat_id);
- mCategoryMap.insert(category_map_value_t(cat_id,LLCategoryData(cat_id, cb, version, current_num_known_descendents,item_name_hash)));
+ digest_t item_name_hash = gInventory.hashDirectDescendentNames(cat_id);
+ mCategoryMap.insert(category_map_value_t(cat_id,LLCategoryData(cat_id, thumbnail_id, cb, version, current_num_known_descendents,item_name_hash)));
}
else
{
- mCategoryMap.insert(category_map_value_t(cat_id,LLCategoryData(cat_id, cb, version, current_num_known_descendents)));
+ mCategoryMap.insert(category_map_value_t(cat_id,LLCategoryData(cat_id, thumbnail_id, cb, version, current_num_known_descendents)));
}
}
@@ -719,24 +813,25 @@ void LLInventoryCategoriesObserver::removeCategory(const LLUUID& cat_id)
}
LLInventoryCategoriesObserver::LLCategoryData::LLCategoryData(
- const LLUUID& cat_id, callback_t cb, S32 version, S32 num_descendents)
+ const LLUUID& cat_id, const LLUUID& thumbnail_id, callback_t cb, S32 version, S32 num_descendents)
: mCatID(cat_id)
, mCallback(cb)
, mVersion(version)
, mDescendentsCount(num_descendents)
+ , mThumbnailId(thumbnail_id)
, mIsNameHashInitialized(false)
{
- mItemNameHash.finalize();
}
LLInventoryCategoriesObserver::LLCategoryData::LLCategoryData(
- const LLUUID& cat_id, callback_t cb, S32 version, S32 num_descendents, LLMD5 name_hash)
+ const LLUUID& cat_id, const LLUUID& thumbnail_id, callback_t cb, S32 version, S32 num_descendents, const digest_t& name_hash)
: mCatID(cat_id)
, mCallback(cb)
, mVersion(version)
, mDescendentsCount(num_descendents)
+ , mThumbnailId(thumbnail_id)
, mIsNameHashInitialized(true)
, mItemNameHash(name_hash)
{
diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h
index 36d8ee3f59..bec08d2cdf 100644
--- a/indra/newview/llinventoryobserver.h
+++ b/indra/newview/llinventoryobserver.h
@@ -28,7 +28,6 @@
#define LL_LLINVENTORYOBSERVERS_H
#include "lluuid.h"
-#include "llmd5.h"
#include <string>
#include <vector>
@@ -105,6 +104,9 @@ public:
/*virtual*/ void startFetch();
/*virtual*/ void changed(U32 mask);
+
+ // For attempts to group requests if too many items are requested
+ static const S32 MAX_INDIVIDUAL_ITEM_REQUESTS;
private:
LLTimer mFetchingPeriod;
@@ -126,7 +128,7 @@ public:
LLInventoryFetchDescendentsObserver(const LLUUID& cat_id = LLUUID::null);
LLInventoryFetchDescendentsObserver(const uuid_vec_t& cat_ids);
- /*virtual*/ void startFetch();
+ virtual void startFetch();
/*virtual*/ void changed(U32 mask);
protected:
BOOL isCategoryComplete(const LLViewerInventoryCategory* cat) const;
@@ -271,16 +273,18 @@ public:
void removeCategory(const LLUUID& cat_id);
protected:
+ typedef LLUUID digest_t; // To clarify the actual usage of this "UUID"
struct LLCategoryData
{
- LLCategoryData(const LLUUID& cat_id, callback_t cb, S32 version, S32 num_descendents);
- LLCategoryData(const LLUUID& cat_id, callback_t cb, S32 version, S32 num_descendents, LLMD5 name_hash);
+ LLCategoryData(const LLUUID& cat_id, const LLUUID& thumbnail_id, callback_t cb, S32 version, S32 num_descendents);
+ LLCategoryData(const LLUUID& cat_id, const LLUUID& thumbnail_id, callback_t cb, S32 version, S32 num_descendents, const digest_t& name_hash);
callback_t mCallback;
S32 mVersion;
S32 mDescendentsCount;
- LLMD5 mItemNameHash;
+ digest_t mItemNameHash;
bool mIsNameHashInitialized;
LLUUID mCatID;
+ LLUUID mThumbnailId;
};
typedef std::map<LLUUID, LLCategoryData> category_map_t;
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 2c9ed26a39..154d8e2e18 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -40,6 +40,7 @@
#include "llfolderviewitem.h"
#include "llfloaterimcontainer.h"
#include "llimview.h"
+#include "llinspecttexture.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
#include "llinventorymodelbackgroundfetch.h"
@@ -160,13 +161,15 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
mInvFVBridgeBuilder(NULL),
mInventoryViewModel(p.name),
mGroupedItemBridge(new LLFolderViewGroupedItemBridge),
- mFocusSelection(false)
+ mFocusSelection(false),
+ mBuildChildrenViews(true),
+ mRootInited(false)
{
mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER;
if (!sColorSetInitialized)
{
- sDefaultColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE);
+ sDefaultColor = LLUIColorTable::instance().getColor("InventoryItemColor", DEFAULT_WHITE);
sDefaultHighlightColor = LLUIColorTable::instance().getColor("MenuItemHighlightFgColor", DEFAULT_WHITE);
sLibraryColor = LLUIColorTable::instance().getColor("InventoryItemLibraryColor", DEFAULT_WHITE);
sLinkColor = LLUIColorTable::instance().getColor("InventoryItemLinkColor", DEFAULT_WHITE);
@@ -182,6 +185,7 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&LLInventoryPanel::beginIMSession, this));
mCommitCallbackRegistrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars, this));
mCommitCallbackRegistrar.add("Inventory.FileUploadLocation", boost::bind(&LLInventoryPanel::fileUploadLocation, this, _2));
+ mCommitCallbackRegistrar.add("Inventory.OpenNewFolderWindow", boost::bind(&LLInventoryPanel::openSingleViewInventory, this, LLUUID()));
}
LLFolderView * LLInventoryPanel::createFolderRoot(LLUUID root_id )
@@ -248,52 +252,116 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
{
// save off copy of params
mParams = params;
- // Clear up the root view
- // Note: This needs to be done *before* we build the new folder view
- LLUUID root_id = getRootFolderID();
- if (mFolderRoot.get())
- {
- removeItemID(root_id);
- mFolderRoot.get()->destroyView();
- }
- mCommitCallbackRegistrar.pushScope(); // registered as a widget; need to push callback scope ourselves
- {
- // Determine the root folder in case specified, and
- // build the views starting with that folder.
+ initFolderRoot();
+
+ // Initialize base class params.
+ LLPanel::initFromParams(mParams);
+}
+
+LLInventoryPanel::~LLInventoryPanel()
+{
+ U32 sort_order = getFolderViewModel()->getSorter().getSortOrder();
+ if (mSortOrderSetting != INHERIT_SORT_ORDER)
+ {
+ gSavedSettings.setU32(mSortOrderSetting, sort_order);
+ }
+
+ clearFolderRoot();
+}
+
+void LLInventoryPanel::initFolderRoot()
+{
+ // Clear up the root view
+ // Note: This needs to be done *before* we build the new folder view
+ LLUUID root_id = getRootFolderID();
+ if (mFolderRoot.get())
+ {
+ removeItemID(root_id);
+ mFolderRoot.get()->destroyView();
+ }
+
+ mCommitCallbackRegistrar.pushScope(); // registered as a widget; need to push callback scope ourselves
+ {
+ // Determine the root folder in case specified, and
+ // build the views starting with that folder.
LLFolderView* folder_view = createFolderRoot(root_id);
- mFolderRoot = folder_view->getHandle();
-
- addItemID(root_id, mFolderRoot.get());
- }
- mCommitCallbackRegistrar.popScope();
- mFolderRoot.get()->setCallbackRegistrar(&mCommitCallbackRegistrar);
- mFolderRoot.get()->setEnableRegistrar(&mEnableCallbackRegistrar);
-
- // Scroller
- LLRect scroller_view_rect = getRect();
- scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);
- LLScrollContainer::Params scroller_params(mParams.scroll());
- scroller_params.rect(scroller_view_rect);
- mScroller = LLUICtrlFactory::create<LLFolderViewScrollContainer>(scroller_params);
- addChild(mScroller);
- mScroller->addChild(mFolderRoot.get());
- mFolderRoot.get()->setScrollContainer(mScroller);
- mFolderRoot.get()->setFollowsAll();
- mFolderRoot.get()->addChild(mFolderRoot.get()->mStatusTextBox);
-
- // Set up the callbacks from the inventory we're viewing, and then build everything.
- mInventoryObserver = new LLInventoryPanelObserver(this);
- mInventory->addObserver(mInventoryObserver);
-
- mCompletionObserver = new LLInvPanelComplObserver(boost::bind(&LLInventoryPanel::onItemsCompletion, this));
- mInventory->addObserver(mCompletionObserver);
-
- if (mBuildViewsOnInit && mViewsInitialized == VIEWS_UNINITIALIZED)
+ mFolderRoot = folder_view->getHandle();
+ mRootInited = true;
+
+ addItemID(root_id, mFolderRoot.get());
+ }
+ mCommitCallbackRegistrar.popScope();
+ mFolderRoot.get()->setCallbackRegistrar(&mCommitCallbackRegistrar);
+ mFolderRoot.get()->setEnableRegistrar(&mEnableCallbackRegistrar);
+
+ // Scroller
+ LLRect scroller_view_rect = getRect();
+ scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);
+ LLScrollContainer::Params scroller_params(mParams.scroll());
+ scroller_params.rect(scroller_view_rect);
+ mScroller = LLUICtrlFactory::create<LLFolderViewScrollContainer>(scroller_params);
+ addChild(mScroller);
+ mScroller->addChild(mFolderRoot.get());
+ mFolderRoot.get()->setScrollContainer(mScroller);
+ mFolderRoot.get()->setFollowsAll();
+ mFolderRoot.get()->addChild(mFolderRoot.get()->mStatusTextBox);
+
+ if (mSelectionCallback)
{
+ mFolderRoot.get()->setSelectCallback(mSelectionCallback);
+ }
+
+ // Set up the callbacks from the inventory we're viewing, and then build everything.
+ mInventoryObserver = new LLInventoryPanelObserver(this);
+ mInventory->addObserver(mInventoryObserver);
+
+ mCompletionObserver = new LLInvPanelComplObserver(boost::bind(&LLInventoryPanel::onItemsCompletion, this));
+ mInventory->addObserver(mCompletionObserver);
+
+ if (mBuildViewsOnInit)
+ {
+ initializeViewBuilding();
+ }
+
+ if (mSortOrderSetting != INHERIT_SORT_ORDER)
+ {
+ setSortOrder(gSavedSettings.getU32(mSortOrderSetting));
+ }
+ else
+ {
+ setSortOrder(gSavedSettings.getU32(DEFAULT_SORT_ORDER));
+ }
+
+ // hide inbox
+ if (!gSavedSettings.getBOOL("InventoryOutboxMakeVisible"))
+ {
+ getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_INBOX));
+ }
+ // hide marketplace listing box, unless we are a marketplace panel
+ if (!gSavedSettings.getBOOL("InventoryOutboxMakeVisible") && !mParams.use_marketplace_folders)
+ {
+ getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_MARKETPLACE_LISTINGS));
+ }
+
+ // set the filter for the empty folder if the debug setting is on
+ if (gSavedSettings.getBOOL("DebugHideEmptySystemFolders"))
+ {
+ getFilter().setFilterEmptySystemFolders();
+ }
+
+ // keep track of the clipboard state so that we avoid filtering too much
+ mClipboardState = LLClipboard::instance().getGeneration();
+}
+
+void LLInventoryPanel::initializeViewBuilding()
+{
+ if (mViewsInitialized == VIEWS_UNINITIALIZED)
+ {
+ LL_DEBUGS("Inventory") << "Setting views for " << getName() << " to initialize" << LL_ENDL;
// Build view of inventory if we need default full hierarchy and inventory is ready, otherwise do in onIdle.
// Initializing views takes a while so always do it onIdle if viewer already loaded.
- if (mInventory->isInventoryUsable()
+ if (mInventory->isInventoryUsable()
&& LLStartUp::getStartupState() <= STATE_WEARABLES_WAIT)
{
// Usually this happens on login, so we have less time constraits, but too long and we can cause a disconnect
@@ -306,49 +374,6 @@ void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
gIdleCallbacks.addFunction(onIdle, (void*)this);
}
}
-
- if (mSortOrderSetting != INHERIT_SORT_ORDER)
- {
- setSortOrder(gSavedSettings.getU32(mSortOrderSetting));
- }
- else
- {
- setSortOrder(gSavedSettings.getU32(DEFAULT_SORT_ORDER));
- }
-
- // hide inbox
- if (!gSavedSettings.getBOOL("InventoryOutboxMakeVisible"))
- {
- getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_INBOX));
- }
- // hide marketplace listing box, unless we are a marketplace panel
- if (!gSavedSettings.getBOOL("InventoryOutboxMakeVisible") && !mParams.use_marketplace_folders)
- {
- getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() & ~(1ULL << LLFolderType::FT_MARKETPLACE_LISTINGS));
- }
-
- // set the filter for the empty folder if the debug setting is on
- if (gSavedSettings.getBOOL("DebugHideEmptySystemFolders"))
- {
- getFilter().setFilterEmptySystemFolders();
- }
-
- // keep track of the clipboard state so that we avoid filtering too much
- mClipboardState = LLClipboard::instance().getGeneration();
-
- // Initialize base class params.
- LLPanel::initFromParams(mParams);
-}
-
-LLInventoryPanel::~LLInventoryPanel()
-{
- U32 sort_order = getFolderViewModel()->getSorter().getSortOrder();
- if (mSortOrderSetting != INHERIT_SORT_ORDER)
- {
- gSavedSettings.setU32(mSortOrderSetting, sort_order);
- }
-
- clearFolderRoot();
}
/*virtual*/
@@ -356,8 +381,11 @@ void LLInventoryPanel::onVisibilityChange(BOOL new_visibility)
{
if (new_visibility && mViewsInitialized == VIEWS_UNINITIALIZED)
{
- mViewsInitialized = VIEWS_INITIALIZING;
- gIdleCallbacks.addFunction(onIdle, (void*)this);
+ // first call can be from tab initialization
+ if (gFloaterView->getParentFloater(this) != NULL)
+ {
+ initializeViewBuilding();
+ }
}
LLPanel::onVisibilityChange(new_visibility);
}
@@ -743,7 +771,7 @@ LLUUID LLInventoryPanel::getRootFolderID()
LLStringExplicit label(mParams.start_folder.name());
setLabel(label);
- root_id = gInventory.findCategoryUUIDForType(preferred_type, false);
+ root_id = gInventory.findCategoryUUIDForType(preferred_type);
if (root_id.isNull())
{
LL_WARNS() << "Could not find folder of type " << preferred_type << LL_ENDL;
@@ -878,6 +906,7 @@ void LLInventoryPanel::idle(void* user_data)
void LLInventoryPanel::initializeViews(F64 max_time)
{
if (!gInventory.isInventoryUsable()) return;
+ if (!mRootInited) return;
mViewsInitialized = VIEWS_BUILDING;
@@ -905,7 +934,10 @@ void LLInventoryPanel::initializeViews(F64 max_time)
gIdleCallbacks.addFunction(idle, this);
- openStartFolderOrMyInventory();
+ if(mParams.open_first_folder)
+ {
+ openStartFolderOrMyInventory();
+ }
// Special case for new user login
if (gAgent.isFirstLogin())
@@ -937,8 +969,8 @@ LLFolderViewFolder * LLInventoryPanel::createFolderViewFolder(LLInvFVBridge * br
params.tool_tip = params.name;
params.allow_drop = allow_drop;
- params.font_color = (bridge->isLibraryItem() ? sLibraryColor : (bridge->isLink() ? sLinkColor : sDefaultColor));
- params.font_highlight_color = (bridge->isLibraryItem() ? sLibraryColor : (bridge->isLink() ? sLinkColor : sDefaultHighlightColor));
+ params.font_color = (bridge->isLibraryItem() ? sLibraryColor : sDefaultColor);
+ params.font_highlight_color = (bridge->isLibraryItem() ? sLibraryColor : sDefaultHighlightColor);
return LLUICtrlFactory::create<LLFolderViewFolder>(params);
}
@@ -954,8 +986,8 @@ LLFolderViewItem * LLInventoryPanel::createFolderViewItem(LLInvFVBridge * bridge
params.rect = LLRect (0, 0, 0, 0);
params.tool_tip = params.name;
- params.font_color = (bridge->isLibraryItem() ? sLibraryColor : (bridge->isLink() ? sLinkColor : sDefaultColor));
- params.font_highlight_color = (bridge->isLibraryItem() ? sLibraryColor : (bridge->isLink() ? sLinkColor : sDefaultHighlightColor));
+ params.font_color = (bridge->isLibraryItem() ? sLibraryColor : sDefaultColor);
+ params.font_highlight_color = (bridge->isLibraryItem() ? sLibraryColor : sDefaultHighlightColor);
return LLUICtrlFactory::create<LLFolderViewItem>(params);
}
@@ -1011,8 +1043,11 @@ LLFolderViewItem* LLInventoryPanel::buildViewsTree(const LLUUID& id,
LLInventoryObject const* objectp,
LLFolderViewItem *folder_view_item,
LLFolderViewFolder *parent_folder,
- const EBuildModes &mode)
+ const EBuildModes &mode,
+ S32 depth)
{
+ depth++;
+
// Force the creation of an extra root level folder item if required by the inventory panel (default is "false")
bool allow_drop = true;
bool create_root = false;
@@ -1042,7 +1077,7 @@ LLFolderViewItem* LLInventoryPanel::buildViewsTree(const LLUUID& id,
if (objectp->getType() >= LLAssetType::AT_COUNT)
{
// Example: Happens when we add assets of new, not yet supported type to library
- LL_DEBUGS() << "LLInventoryPanel::buildViewsTree called with unknown objectp->mType : "
+ LL_DEBUGS("Inventory") << "LLInventoryPanel::buildViewsTree called with unknown objectp->mType : "
<< ((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID()
<< LL_ENDL;
@@ -1112,7 +1147,8 @@ LLFolderViewItem* LLInventoryPanel::buildViewsTree(const LLUUID& id,
}
}
- bool create_children = folder_view_item && objectp->getType() == LLAssetType::AT_CATEGORY;
+ bool create_children = folder_view_item && objectp->getType() == LLAssetType::AT_CATEGORY
+ && (mBuildChildrenViews || depth == 0);
if (create_children)
{
@@ -1132,12 +1168,15 @@ LLFolderViewItem* LLInventoryPanel::buildViewsTree(const LLUUID& id,
{
create_children = false;
// run it again for the sake of creating children
- mBuildViewsQueue.push_back(id);
+ if (mBuildChildrenViews || depth == 0)
+ {
+ mBuildViewsQueue.push_back(id);
+ }
}
else
{
create_children = true;
- folder_view_item->setChildrenInited(true);
+ folder_view_item->setChildrenInited(mBuildChildrenViews);
}
break;
}
@@ -1145,7 +1184,10 @@ LLFolderViewItem* LLInventoryPanel::buildViewsTree(const LLUUID& id,
{
create_children = false;
// run it to create children, current caller is only interested in current view
- mBuildViewsQueue.push_back(id);
+ if (mBuildChildrenViews || depth == 0)
+ {
+ mBuildViewsQueue.push_back(id);
+ }
break;
}
case BUILD_ONE_FOLDER:
@@ -1175,7 +1217,13 @@ LLFolderViewItem* LLInventoryPanel::buildViewsTree(const LLUUID& id,
LLViewerInventoryItem::item_array_t* items;
mInventory->lockDirectDescendentArrays(id, categories, items);
+ // Make sure panel won't lock in a loop over existing items if
+ // folder is enormous and at least some work gets done
+ const S32 MIN_ITEMS_PER_CALL = 500;
+ const S32 starting_item_count = mItemMap.size();
+
LLFolderViewFolder *parentp = dynamic_cast<LLFolderViewFolder*>(folder_view_item);
+ bool done = true;
if(categories)
{
@@ -1193,11 +1241,28 @@ LLFolderViewItem* LLInventoryPanel::buildViewsTree(const LLUUID& id,
// each time, especially since content is growing, we can just
// iter over copy of mItemMap in some way
LLFolderViewItem* view_itemp = getItemByID(cat->getUUID());
- buildViewsTree(cat->getUUID(), id, cat, view_itemp, parentp, (mode == BUILD_ONE_FOLDER ? BUILD_NO_CHILDREN : mode));
+ buildViewsTree(cat->getUUID(), id, cat, view_itemp, parentp, (mode == BUILD_ONE_FOLDER ? BUILD_NO_CHILDREN : mode), depth);
}
else
{
- buildViewsTree(cat->getUUID(), id, cat, NULL, parentp, (mode == BUILD_ONE_FOLDER ? BUILD_NO_CHILDREN : mode));
+ buildViewsTree(cat->getUUID(), id, cat, NULL, parentp, (mode == BUILD_ONE_FOLDER ? BUILD_NO_CHILDREN : mode), depth);
+ }
+ }
+
+ if (!mBuildChildrenViews
+ && mode == BUILD_TIMELIMIT
+ && MIN_ITEMS_PER_CALL + starting_item_count < mItemMap.size())
+ {
+ // Single folder view, check if we still have time
+ //
+ // Todo: make sure this causes no dupplciates, breaks nothing,
+ // especially filters and arrange
+ F64 curent_time = LLTimer::getTotalSeconds();
+ if (mBuildViewsEndTime < curent_time)
+ {
+ mBuildViewsQueue.push_back(id);
+ done = false;
+ break;
}
}
}
@@ -1217,10 +1282,33 @@ LLFolderViewItem* LLInventoryPanel::buildViewsTree(const LLUUID& id,
// each time, especially since content is growing, we can just
// iter over copy of mItemMap in some way
LLFolderViewItem* view_itemp = getItemByID(item->getUUID());
- buildViewsTree(item->getUUID(), id, item, view_itemp, parentp, mode);
+ buildViewsTree(item->getUUID(), id, item, view_itemp, parentp, mode, depth);
+ }
+
+ if (!mBuildChildrenViews
+ && mode == BUILD_TIMELIMIT
+ && MIN_ITEMS_PER_CALL + starting_item_count < mItemMap.size())
+ {
+ // Single folder view, check if we still have time
+ //
+ // Todo: make sure this causes no dupplciates, breaks nothing,
+ // especially filters and arrange
+ F64 curent_time = LLTimer::getTotalSeconds();
+ if (mBuildViewsEndTime < curent_time)
+ {
+ mBuildViewsQueue.push_back(id);
+ done = false;
+ break;
+ }
}
}
}
+
+ if (!mBuildChildrenViews && done)
+ {
+ // flat list is done initializing folder
+ folder_view_item->setChildrenInited(true);
+ }
mInventory->unlockDirectDescendentArrays(id);
}
@@ -1268,8 +1356,10 @@ BOOL LLInventoryPanel::handleHover(S32 x, S32 y, MASK mask)
{
BOOL handled = LLView::handleHover(x, y, mask);
if(handled)
- {
- ECursorType cursor = getWindow()->getCursor();
+ {
+ // getCursor gets current cursor, setCursor sets next cursor
+ // check that children didn't set own 'next' cursor
+ ECursorType cursor = getWindow()->getNextCursor();
if (LLInventoryModelBackgroundFetch::instance().folderFetchActive() && cursor == UI_CURSOR_ARROW)
{
// replace arrow cursor with arrow and hourglass cursor
@@ -1283,6 +1373,37 @@ BOOL LLInventoryPanel::handleHover(S32 x, S32 y, MASK mask)
return TRUE;
}
+BOOL LLInventoryPanel::handleToolTip(S32 x, S32 y, MASK mask)
+{
+ if (const LLFolderViewItem* hover_item_p = (!mFolderRoot.isDead()) ? mFolderRoot.get()->getHoveredItem() : nullptr)
+ {
+ if (const LLFolderViewModelItemInventory* vm_item_p = static_cast<const LLFolderViewModelItemInventory*>(hover_item_p->getViewModelItem()))
+ {
+ LLSD params;
+ params["inv_type"] = vm_item_p->getInventoryType();
+ params["thumbnail_id"] = vm_item_p->getThumbnailUUID();
+ params["item_id"] = vm_item_p->getUUID();
+
+ // tooltip should only show over folder, but screen
+ // rect includes items under folder as well
+ LLRect actionable_rect = hover_item_p->calcScreenRect();
+ if (hover_item_p->isOpen() && hover_item_p->hasVisibleChildren())
+ {
+ actionable_rect.mBottom = actionable_rect.mTop - hover_item_p->getItemHeight();
+ }
+
+ LLToolTipMgr::instance().show(LLToolTip::Params()
+ .message(hover_item_p->getToolTip())
+ .sticky_rect(actionable_rect)
+ .delay_time(LLView::getTooltipTimeout())
+ .create_callback(boost::bind(&LLInspectTextureUtil::createInventoryToolTip, _1))
+ .create_params(params));
+ return TRUE;
+ }
+ }
+ return LLPanel::handleToolTip(x, y, mask);
+}
+
BOOL LLInventoryPanel::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,
@@ -1378,6 +1499,7 @@ void LLInventoryPanel::setSelectCallback(const boost::function<void (const std::
{
mFolderRoot.get()->setSelectCallback(cb);
}
+ mSelectionCallback = cb;
}
void LLInventoryPanel::clearSelection()
@@ -1424,6 +1546,10 @@ void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& it
{
fv->startRenamingSelectedItem();
}
+ else
+ {
+ LL_DEBUGS("Inventory") << "Failed to start renemr, no items selected" << LL_ENDL;
+ }
}
std::set<LLFolderViewItem*> selected_items = mFolderRoot.get()->getSelectionList();
@@ -1623,6 +1749,11 @@ void LLInventoryPanel::fileUploadLocation(const LLSD& userdata)
}
}
+void LLInventoryPanel::openSingleViewInventory(LLUUID folder_id)
+{
+ LLPanelMainInventory::newFolderWindow(folder_id.isNull() ? LLFolderBridge::sSelf.get()->getUUID() : folder_id);
+}
+
void LLInventoryPanel::purgeSelectedItems()
{
if (!mFolderRoot.get()) return;
@@ -1756,22 +1887,49 @@ LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel(BOOL auto_open)
}
//static
-void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id, BOOL main_panel, BOOL take_keyboard_focus, BOOL reset_filter)
+void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id, BOOL use_main_panel, BOOL take_keyboard_focus, BOOL reset_filter)
{
LLSidepanelInventory* sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
sidepanel_inventory->showInventoryPanel();
bool in_inbox = (gInventory.isObjectDescendentOf(obj_id, gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX)));
- if (!in_inbox && (main_panel || !sidepanel_inventory->getMainInventoryPanel()->isRecentItemsPanelSelected()))
+ if (!in_inbox && (use_main_panel || !sidepanel_inventory->getMainInventoryPanel()->isRecentItemsPanelSelected()))
{
sidepanel_inventory->selectAllItemsPanel();
}
+
+ LLFloater* inventory_floater = LLFloaterSidePanelContainer::getTopmostInventoryFloater();
+ if(!auto_open && inventory_floater && inventory_floater->getVisible())
+ {
+ LLSidepanelInventory *inventory_panel = inventory_floater->findChild<LLSidepanelInventory>("main_panel");
+ LLPanelMainInventory* main_panel = inventory_panel->getMainInventoryPanel();
+ if(main_panel->isSingleFolderMode() && main_panel->isGalleryViewMode())
+ {
+ LL_DEBUGS("Inventory") << "Opening gallery panel for item" << obj_id << LL_ENDL;
+ main_panel->setGallerySelection(obj_id);
+ return;
+ }
+ }
+
+ LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel();
+ if (main_inventory && main_inventory->isSingleFolderMode()
+ && use_main_panel)
+ {
+ const LLInventoryObject *obj = gInventory.getObject(obj_id);
+ if (obj)
+ {
+ LL_DEBUGS("Inventory") << "Opening main inventory panel for item" << obj_id << LL_ENDL;
+ main_inventory->setSingleFolderViewRoot(obj->getParentUUID(), false);
+ main_inventory->setGallerySelection(obj_id);
+ return;
+ }
+ }
LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(auto_open);
if (active_panel)
{
- LL_DEBUGS("Messaging") << "Highlighting" << obj_id << LL_ENDL;
+ LL_DEBUGS("Messaging", "Inventory") << "Highlighting" << obj_id << LL_ENDL;
if (reset_filter)
{
@@ -1790,7 +1948,7 @@ void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const L
inventory_panel->setSelection(obj_id, take_keyboard_focus);
}
}
- else
+ else if (auto_open)
{
LLFloater* floater_inventory = LLFloaterReg::getInstance("inventory");
if (floater_inventory)
@@ -1799,9 +1957,33 @@ void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const L
}
active_panel->setSelection(obj_id, take_keyboard_focus);
}
+ else
+ {
+ // Created items are going to receive proper focus from callbacks
+ active_panel->setSelection(obj_id, take_keyboard_focus);
+ }
}
}
+void LLInventoryPanel::setSFViewAndOpenFolder(const LLInventoryPanel* panel, const LLUUID& folder_id)
+{
+
+ LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
+ for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
+ {
+ LLFloaterSidePanelContainer* inventory_floater = dynamic_cast<LLFloaterSidePanelContainer*>(*iter);
+ LLSidepanelInventory* sidepanel_inventory = inventory_floater->findChild<LLSidepanelInventory>("main_panel");
+
+ LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel();
+ if (main_inventory && panel->hasAncestor(main_inventory) && !main_inventory->isSingleFolderMode())
+ {
+ main_inventory->initSingleFolderRoot(folder_id);
+ main_inventory->toggleViewMode();
+ main_inventory->setSingleFolderViewRoot(folder_id, false);
+ }
+ }
+}
+
void LLInventoryPanel::addHideFolderType(LLFolderType::EType folder_type)
{
getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() & ~(1ULL << folder_type));
@@ -2010,10 +2192,251 @@ LLInventoryRecentItemsPanel::LLInventoryRecentItemsPanel( const Params& params)
mInvFVBridgeBuilder = &RECENT_ITEMS_BUILDER;
}
+static LLDefaultChildRegistry::Register<LLInventorySingleFolderPanel> t_single_folder_inventory_panel("single_folder_inventory_panel");
+
+LLInventorySingleFolderPanel::LLInventorySingleFolderPanel(const Params& params)
+ : LLInventoryPanel(params)
+{
+ mBuildChildrenViews = false;
+ getFilter().setSingleFolderMode(true);
+ getFilter().setEmptyLookupMessage("InventorySingleFolderNoMatches");
+ getFilter().setDefaultEmptyLookupMessage("InventorySingleFolderEmpty");
+
+ mCommitCallbackRegistrar.replace("Inventory.DoToSelected", boost::bind(&LLInventorySingleFolderPanel::doToSelected, this, _2));
+ mCommitCallbackRegistrar.replace("Inventory.DoCreate", boost::bind(&LLInventorySingleFolderPanel::doCreate, this, _2));
+ mCommitCallbackRegistrar.replace("Inventory.Share", boost::bind(&LLInventorySingleFolderPanel::doShare, this));
+}
+
+LLInventorySingleFolderPanel::~LLInventorySingleFolderPanel()
+{
+}
+
+void LLInventorySingleFolderPanel::initFromParams(const Params& p)
+{
+ mFolderID = gInventory.getRootFolderID();
+
+ mParams = p;
+ LLPanel::initFromParams(mParams);
+}
+
+void LLInventorySingleFolderPanel::onFocusReceived()
+{
+ // Tab support, when tabbing into this view, select first item
+ // (ideally needs to account for scroll)
+ bool select_first = mSelectThisID.isNull() && mFolderRoot.get() && mFolderRoot.get()->getSelectedCount() == 0;
+
+ if (select_first)
+ {
+ LLFolderViewFolder::folders_t::const_iterator folders_it = mFolderRoot.get()->getFoldersBegin();
+ LLFolderViewFolder::folders_t::const_iterator folders_end = mFolderRoot.get()->getFoldersEnd();
+
+ for (; folders_it != folders_end; ++folders_it)
+ {
+ const LLFolderViewFolder* folder_view = *folders_it;
+ if (folder_view->getVisible())
+ {
+ const LLFolderViewModelItemInventory* modelp = static_cast<const LLFolderViewModelItemInventory*>(folder_view->getViewModelItem());
+ setSelectionByID(modelp->getUUID(), TRUE);
+ // quick and dirty fix: don't scroll on switching focus
+ // todo: better 'tab' support, one that would work for LLInventoryPanel
+ mFolderRoot.get()->stopAutoScollining();
+ select_first = false;
+ break;
+ }
+ }
+ }
+
+ if (select_first)
+ {
+ LLFolderViewFolder::items_t::const_iterator items_it = mFolderRoot.get()->getItemsBegin();
+ LLFolderViewFolder::items_t::const_iterator items_end = mFolderRoot.get()->getItemsEnd();
+
+ for (; items_it != items_end; ++items_it)
+ {
+ const LLFolderViewItem* item_view = *items_it;
+ if (item_view->getVisible())
+ {
+ const LLFolderViewModelItemInventory* modelp = static_cast<const LLFolderViewModelItemInventory*>(item_view->getViewModelItem());
+ setSelectionByID(modelp->getUUID(), TRUE);
+ mFolderRoot.get()->stopAutoScollining();
+ break;
+ }
+ }
+ }
+ LLInventoryPanel::onFocusReceived();
+}
+
+void LLInventorySingleFolderPanel::initFolderRoot(const LLUUID& start_folder_id)
+{
+ if(mRootInited) return;
+
+ mRootInited = true;
+ if(start_folder_id.notNull())
+ {
+ mFolderID = start_folder_id;
+ }
+
+ mParams.open_first_folder = false;
+ mParams.start_folder.id = mFolderID;
+
+ LLInventoryPanel::initFolderRoot();
+ mFolderRoot.get()->setSingleFolderMode(true);
+}
+
+void LLInventorySingleFolderPanel::changeFolderRoot(const LLUUID& new_id)
+{
+ if (mFolderID != new_id)
+ {
+ if(mFolderID.notNull())
+ {
+ mBackwardFolders.push_back(mFolderID);
+ }
+ mFolderID = new_id;
+ updateSingleFolderRoot();
+ }
+}
+
+void LLInventorySingleFolderPanel::onForwardFolder()
+{
+ if(isForwardAvailable())
+ {
+ mBackwardFolders.push_back(mFolderID);
+ mFolderID = mForwardFolders.back();
+ mForwardFolders.pop_back();
+ updateSingleFolderRoot();
+ }
+}
+
+void LLInventorySingleFolderPanel::onBackwardFolder()
+{
+ if(isBackwardAvailable())
+ {
+ mForwardFolders.push_back(mFolderID);
+ mFolderID = mBackwardFolders.back();
+ mBackwardFolders.pop_back();
+ updateSingleFolderRoot();
+ }
+}
+
+void LLInventorySingleFolderPanel::clearNavigationHistory()
+{
+ mForwardFolders.clear();
+ mBackwardFolders.clear();
+}
+
+bool LLInventorySingleFolderPanel::isBackwardAvailable()
+{
+ return (!mBackwardFolders.empty() && (mFolderID != mBackwardFolders.back()));
+}
+
+bool LLInventorySingleFolderPanel::isForwardAvailable()
+{
+ return (!mForwardFolders.empty() && (mFolderID != mForwardFolders.back()));
+}
+
+boost::signals2::connection LLInventorySingleFolderPanel::setRootChangedCallback(root_changed_callback_t cb)
+{
+ return mRootChangedSignal.connect(cb);
+}
+
+void LLInventorySingleFolderPanel::updateSingleFolderRoot()
+{
+ if (mFolderID != getRootFolderID())
+ {
+ mRootChangedSignal();
+
+ LLUUID root_id = mFolderID;
+ if (mFolderRoot.get())
+ {
+ mItemMap.clear();
+ mFolderRoot.get()->destroyRoot();
+ }
+
+ mCommitCallbackRegistrar.pushScope();
+ {
+ LLFolderView* folder_view = createFolderRoot(root_id);
+ folder_view->setChildrenInited(false);
+ mFolderRoot = folder_view->getHandle();
+ mFolderRoot.get()->setSingleFolderMode(true);
+ addItemID(root_id, mFolderRoot.get());
+
+ LLRect scroller_view_rect = getRect();
+ scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);
+ LLScrollContainer::Params scroller_params(mParams.scroll());
+ scroller_params.rect(scroller_view_rect);
+
+ if (mScroller)
+ {
+ removeChild(mScroller);
+ delete mScroller;
+ mScroller = NULL;
+ }
+ mScroller = LLUICtrlFactory::create<LLFolderViewScrollContainer>(scroller_params);
+ addChild(mScroller);
+ mScroller->addChild(mFolderRoot.get());
+ mFolderRoot.get()->setScrollContainer(mScroller);
+ mFolderRoot.get()->setFollowsAll();
+ mFolderRoot.get()->addChild(mFolderRoot.get()->mStatusTextBox);
+
+ if (!mSelectionCallback.empty())
+ {
+ mFolderRoot.get()->setSelectCallback(mSelectionCallback);
+ }
+ }
+ mCommitCallbackRegistrar.popScope();
+ mFolderRoot.get()->setCallbackRegistrar(&mCommitCallbackRegistrar);
+
+ buildNewViews(mFolderID);
+
+ LLFloater* root_floater = gFloaterView->getParentFloater(this);
+ if(root_floater)
+ {
+ root_floater->setFocus(true);
+ }
+ }
+}
+
+bool LLInventorySingleFolderPanel::hasVisibleItems()
+{
+ return mFolderRoot.get()->hasVisibleChildren();
+}
+
+void LLInventorySingleFolderPanel::doCreate(const LLSD& userdata)
+{
+ std::string type_name = userdata.asString();
+ LLUUID dest_id = LLFolderBridge::sSelf.get()->getUUID();
+ if (("category" == type_name) || ("outfit" == type_name))
+ {
+ changeFolderRoot(dest_id);
+ }
+ reset_inventory_filter();
+ menu_create_inventory_item(this, dest_id, userdata);
+}
+
+void LLInventorySingleFolderPanel::doToSelected(const LLSD& userdata)
+{
+ if (("open_in_current_window" == userdata.asString()))
+ {
+ changeFolderRoot(LLFolderBridge::sSelf.get()->getUUID());
+ return;
+ }
+ LLInventoryPanel::doToSelected(userdata);
+}
+
+void LLInventorySingleFolderPanel::doShare()
+{
+ LLAvatarActions::shareWithAvatars(this);
+}
/************************************************************************/
/* Asset Pre-Filtered Inventory Panel related class */
/************************************************************************/
+LLAssetFilteredInventoryPanel::LLAssetFilteredInventoryPanel(const Params& p)
+ : LLInventoryPanel(p)
+{
+}
+
+
void LLAssetFilteredInventoryPanel::initFromParams(const Params& p)
{
// Init asset types
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index 45e71539d1..b68433bab0 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -107,6 +107,7 @@ public:
Optional<LLFolderView::Params> folder_view;
Optional<LLFolderViewFolder::Params> folder;
Optional<LLFolderViewItem::Params> item;
+ Optional<bool> open_first_folder;
// All item and folder views will be initialized on init if true (default)
// Will initialize on visibility change otherwise.
@@ -126,6 +127,7 @@ public:
show_root_folder("show_root_folder", false),
allow_drop_on_root("allow_drop_on_root", true),
use_marketplace_folders("use_marketplace_folders", false),
+ open_first_folder("open_first_folder", true),
scroll("scroll"),
accepts_drag_and_drop("accepts_drag_and_drop"),
folder_view("folder_view"),
@@ -159,22 +161,23 @@ public:
LLFolderViewModelInventory& getRootViewModel() { return mInventoryViewModel; }
// LLView methods
- /*virtual*/ void onVisibilityChange(BOOL new_visibility);
- void draw();
- /*virtual*/ BOOL handleKeyHere( KEY key, MASK mask );
- BOOL handleHover(S32 x, S32 y, MASK mask);
+ /*virtual*/ void onVisibilityChange(BOOL new_visibility) override;
+ void draw() override;
+ /*virtual*/ BOOL handleKeyHere( KEY key, MASK mask ) override;
+ BOOL handleHover(S32 x, S32 y, MASK mask) override;
/*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,
EAcceptance* accept,
- std::string& tooltip_msg);
+ std::string& tooltip_msg) override;
+ BOOL handleToolTip(S32 x, S32 y, MASK mask) override;
// LLUICtrl methods
- /*virtual*/ void onFocusLost();
- /*virtual*/ void onFocusReceived();
+ /*virtual*/ void onFocusLost() override;
+ /*virtual*/ void onFocusReceived() override;
void onFolderOpening(const LLUUID &id);
// LLBadgeHolder methods
- bool addBadge(LLBadge * badge);
+ bool addBadge(LLBadge * badge) override;
// Call this method to set the selection.
void openAllFolders();
@@ -211,6 +214,7 @@ public:
LLUUID getRootFolderID();
LLScrollContainer* getScrollableContainer() { return mScroller; }
bool getAllowDropOnRoot() { return mParams.allow_drop_on_root; }
+ bool areViewsInitialized() { return mViewsInitialized == VIEWS_INITIALIZED && mFolderRoot.get() && !mFolderRoot.get()->needsArrange(); }
void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
@@ -221,6 +225,7 @@ public:
void doCreate(const LLSD& userdata);
bool beginIMSession();
void fileUploadLocation(const LLSD& userdata);
+ void openSingleViewInventory(LLUUID folder_id = LLUUID());
void purgeSelectedItems();
bool attachObject(const LLSD& userdata);
static void idle(void* user_data);
@@ -241,10 +246,10 @@ public:
static void openInventoryPanelAndSetSelection(BOOL auto_open,
const LLUUID& obj_id,
- BOOL main_panel = FALSE,
+ BOOL use_main_panel = FALSE,
BOOL take_keyboard_focus = TAKE_FOCUS_YES,
BOOL reset_filter = FALSE);
-
+ static void setSFViewAndOpenFolder(const LLInventoryPanel* panel, const LLUUID& folder_id);
void addItemID(const LLUUID& id, LLFolderViewItem* itemp);
void removeItemID(const LLUUID& id);
LLFolderViewItem* getItemByID(const LLUUID& id);
@@ -262,6 +267,10 @@ public:
static void callbackPurgeSelectedItems(const LLSD& notification, const LLSD& response, const std::vector<LLUUID> inventory_selected);
+ void changeFolderRoot(const LLUUID& new_id) {};
+ void initFolderRoot();
+ void initializeViewBuilding();
+
protected:
void openStartFolderOrMyInventory(); // open the first level of inventory
void onItemsCompletion(); // called when selected items are complete
@@ -298,6 +307,9 @@ protected:
*/
const LLInventoryFolderViewModelBuilder* mInvFVBridgeBuilder;
+ bool mBuildChildrenViews; // build root and children
+ bool mRootInited;
+
//--------------------------------------------------------------------
// Sorting
@@ -357,6 +369,8 @@ protected:
virtual LLFolderView * createFolderRoot(LLUUID root_id );
virtual LLFolderViewFolder* createFolderViewFolder(LLInvFVBridge * bridge, bool allow_drop);
virtual LLFolderViewItem* createFolderViewItem(LLInvFVBridge * bridge);
+
+ boost::function<void(const std::deque<LLFolderViewItem*>& items, BOOL user_action)> mSelectionCallback;
private:
// buildViewsTree does not include some checks and is meant
// for recursive use, use buildNewViews() for first call
@@ -365,7 +379,8 @@ private:
LLInventoryObject const* objectp,
LLFolderViewItem *target_view,
LLFolderViewFolder *parent_folder_view,
- const EBuildModes &mode);
+ const EBuildModes &mode,
+ S32 depth = -1);
typedef enum e_views_initialization_state
{
@@ -381,6 +396,57 @@ private:
std::deque<LLUUID> mBuildViewsQueue;
};
+
+class LLInventorySingleFolderPanel : public LLInventoryPanel
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLInventoryPanel::Params>
+ {};
+
+ void initFromParams(const Params& p);
+ void onFocusReceived() override;
+
+ bool isSelectionRemovable() { return false; }
+
+ void initFolderRoot(const LLUUID& start_folder_id = LLUUID::null);
+
+ void changeFolderRoot(const LLUUID& new_id);
+ void onForwardFolder();
+ void onBackwardFolder();
+ void clearNavigationHistory();
+ LLUUID getSingleFolderRoot() { return mFolderID; }
+
+ void doCreate(const LLSD& userdata);
+ void doToSelected(const LLSD& userdata);
+ void doShare();
+
+ bool isBackwardAvailable();
+ bool isForwardAvailable();
+
+ bool hasVisibleItems();
+
+ void setNavBackwardList(std::list<LLUUID> backward_list) { mBackwardFolders = backward_list; }
+ void setNavForwardList(std::list<LLUUID> forward_list) { mForwardFolders = forward_list; }
+ std::list<LLUUID> getNavBackwardList() { return mBackwardFolders; }
+ std::list<LLUUID> getNavForwardList() { return mForwardFolders; }
+
+ typedef boost::function<void()> root_changed_callback_t;
+ boost::signals2::connection setRootChangedCallback(root_changed_callback_t cb);
+
+protected:
+ LLInventorySingleFolderPanel(const Params& params);
+ ~LLInventorySingleFolderPanel();
+ void updateSingleFolderRoot();
+
+ friend class LLUICtrlFactory;
+
+ LLUUID mFolderID;
+ std::list<LLUUID> mBackwardFolders;
+ std::list<LLUUID> mForwardFolders;
+
+ boost::signals2::signal<void()> mRootChangedSignal;
+};
+
/************************************************************************/
/* Asset Pre-Filtered Inventory Panel related class */
/* Exchanges filter's flexibility for speed of generation and */
@@ -400,7 +466,7 @@ public:
void initFromParams(const Params& p);
protected:
- LLAssetFilteredInventoryPanel(const Params& p) : LLInventoryPanel(p) {}
+ LLAssetFilteredInventoryPanel(const Params& p);
friend class LLUICtrlFactory;
public:
~LLAssetFilteredInventoryPanel() {}
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index ba82ff0b0f..07825c1b0c 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -59,7 +59,7 @@
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/local_time_adjustor.hpp>
-const S32 LOG_RECALL_SIZE = 2048;
+const S32 LOG_RECALL_SIZE = 20480;
const std::string LL_IM_TIME("time");
const std::string LL_IM_DATE_TIME("datetime");
diff --git a/indra/newview/llloginhandler.cpp b/indra/newview/llloginhandler.cpp
index 22cedf450e..92e341ce93 100644
--- a/indra/newview/llloginhandler.cpp
+++ b/indra/newview/llloginhandler.cpp
@@ -87,6 +87,7 @@ void LLLoginHandler::parse(const LLSD& queryMap)
bool LLLoginHandler::handle(const LLSD& tokens,
const LLSD& query_map,
+ const std::string& grid,
LLMediaCtrl* web)
{
// do nothing if we are already logged in
diff --git a/indra/newview/llloginhandler.h b/indra/newview/llloginhandler.h
index 1f2eacd094..2579341dbf 100644
--- a/indra/newview/llloginhandler.h
+++ b/indra/newview/llloginhandler.h
@@ -35,7 +35,7 @@ class LLLoginHandler : public LLCommandHandler
public:
// allow from external browsers
LLLoginHandler() : LLCommandHandler("login", UNTRUSTED_ALLOW) { }
- /*virtual*/ bool handle(const LLSD& tokens, const LLSD& query_map, LLMediaCtrl* web);
+ /*virtual*/ bool handle(const LLSD& tokens, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web);
// Fill in our internal fields from a SLURL like
// secondlife:///app/login?first=Bob&last=Dobbs
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index dd8c9b2dde..01496fa7ce 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -87,6 +87,7 @@ LLLoginInstance::LLLoginInstance() :
mLoginModule(new LLLogin()),
mNotifications(NULL),
mLoginState("offline"),
+ mSaveMFA(true),
mAttemptComplete(false),
mTransferRate(0.0f),
mDispatcher("LLLoginInstance", "change")
@@ -449,10 +450,7 @@ void LLLoginInstance::handleLoginFailure(const LLSD& event)
gViewerWindow->setShowProgress(FALSE);
}
- LLSD args(llsd::map( "MESSAGE", LLTrans::getString(response["message_id"]) ));
- LLSD payload;
- LLNotificationsUtil::add("PromptMFAToken", args, payload,
- boost::bind(&LLLoginInstance::handleMFAChallenge, this, _1, _2));
+ showMFAChallange(LLTrans::getString(response["message_id"]));
}
else if( reason_response == "key"
|| reason_response == "presence"
@@ -540,10 +538,7 @@ bool LLLoginInstance::handleTOSResponse(bool accepted, const std::string& key)
{
// SL-18511 this TOS failure happened while we are in the middle of an MFA challenge/response.
// the previously entered token is very likely expired, so prompt again
- LLSD args(llsd::map( "MESSAGE", LLTrans::getString("LoginFailedAuthenticationMFARequired") ));
- LLSD payload;
- LLNotificationsUtil::add("PromptMFAToken", args, payload,
- boost::bind(&LLLoginInstance::handleMFAChallenge, this, _1, _2));
+ showMFAChallange(LLTrans::getString("LoginFailedAuthenticationMFARequired"));
}
else
{
@@ -561,6 +556,22 @@ bool LLLoginInstance::handleTOSResponse(bool accepted, const std::string& key)
return true;
}
+void LLLoginInstance::showMFAChallange(const std::string& message)
+{
+ LLSD args(llsd::map("MESSAGE", message));
+ LLSD payload;
+ if (gSavedSettings.getBOOL("RememberUser"))
+ {
+ LLNotificationsUtil::add("PromptMFATokenWithSave", args, payload,
+ boost::bind(&LLLoginInstance::handleMFAChallenge, this, _1, _2));
+ }
+ else
+ {
+ LLNotificationsUtil::add("PromptMFAToken", args, payload,
+ boost::bind(&LLLoginInstance::handleMFAChallenge, this, _1, _2));
+ }
+}
+
bool LLLoginInstance::handleMFAChallenge(LLSD const & notif, LLSD const & response)
{
bool continue_clicked = response["continue"].asBoolean();
@@ -576,6 +587,7 @@ bool LLLoginInstance::handleMFAChallenge(LLSD const & notif, LLSD const & respon
// Set the request data to true and retry login.
mRequestData["params"]["token"] = token;
+ mSaveMFA = response.has("ignore") ? response["ignore"].asBoolean() : false;
reconnect();
} else {
LL_INFOS("LLLogin") << "PromptMFAToken: no token, attemptComplete" << LL_ENDL;
diff --git a/indra/newview/lllogininstance.h b/indra/newview/lllogininstance.h
index ee3ef0e4b1..2e9aab7c00 100644
--- a/indra/newview/lllogininstance.h
+++ b/indra/newview/lllogininstance.h
@@ -56,6 +56,7 @@ public:
bool authSuccess() { return mAttemptComplete && mLoginState == "online"; }
const std::string& getLoginState() { return mLoginState; }
+ bool saveMFA() const { return mSaveMFA; }
LLSD getResponse(const std::string& key) { return getResponse()[key]; }
LLSD getResponse();
@@ -84,6 +85,7 @@ private:
void syncWithUpdater(ResponsePtr resp, const LLSD& notification, const LLSD& response);
bool handleTOSResponse(bool v, const std::string& key);
+ void showMFAChallange(const std::string& message);
bool handleMFAChallenge(LLSD const & notif, LLSD const & response);
void attemptComplete() { mAttemptComplete = true; } // In the future an event?
@@ -95,6 +97,7 @@ private:
LLSD mRequestData;
LLSD mResponseData;
bool mAttemptComplete;
+ bool mSaveMFA;
F64 mTransferRate;
std::string mSerialNumber;
int mLastExecEvent;
diff --git a/indra/newview/llmarketplacefunctions.cpp b/indra/newview/llmarketplacefunctions.cpp
index 6f3d40bb3a..8784f403cb 100644
--- a/indra/newview/llmarketplacefunctions.cpp
+++ b/indra/newview/llmarketplacefunctions.cpp
@@ -700,10 +700,9 @@ void LLMarketplaceInventoryObserver::onIdleProcessQueue(void *userdata)
// If it's a folder known to the marketplace, let's check it's in proper shape
if (LLMarketplaceData::instance().isListed(*id_it) || LLMarketplaceData::instance().isVersionFolder(*id_it))
{
- LLInventoryCategory* cat = (LLInventoryCategory*)(obj);
// can trigger notifyObservers
// can cause more structural changes
- validate_marketplacelistings(cat);
+ LLMarketplaceValidator::getInstance()->validateMarketplaceListings(obj->getUUID());
}
}
else
@@ -897,7 +896,7 @@ void LLMarketplaceData::setDataFetchedSignal(const status_updated_signal_t::slot
// Get/Post/Put requests to the SLM Server using the SLM API
void LLMarketplaceData::getSLMListings()
{
- const LLUUID marketplaceFolderId = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ const LLUUID marketplaceFolderId = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
setUpdating(marketplaceFolderId, true);
LLCoros::instance().launch("getSLMListings",
@@ -1804,7 +1803,7 @@ bool LLMarketplaceData::isUpdating(const LLUUID& folder_id, S32 depth)
}
else
{
- const LLUUID marketplace_listings_uuid = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ const LLUUID marketplace_listings_uuid = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
std::set<LLUUID>::iterator it = mPendingUpdateSet.find(marketplace_listings_uuid);
if (it != mPendingUpdateSet.end())
{
@@ -1848,8 +1847,7 @@ void LLMarketplaceData::decrementValidationWaiting(const LLUUID& folder_id, S32
if (found->second <= 0)
{
mValidationWaitingList.erase(found);
- LLInventoryCategory *cat = gInventory.getCategory(folder_id);
- validate_marketplacelistings(cat);
+ LLMarketplaceValidator::getInstance()->validateMarketplaceListings(folder_id);
update_marketplace_category(folder_id);
gInventory.notifyObservers();
}
diff --git a/indra/newview/llmaterialeditor.cpp b/indra/newview/llmaterialeditor.cpp
index 609d8ea5d7..be6f8d72e5 100644
--- a/indra/newview/llmaterialeditor.cpp
+++ b/indra/newview/llmaterialeditor.cpp
@@ -37,6 +37,7 @@
#include "llfilesystem.h"
#include "llgltfmateriallist.h"
#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
#include "lllocalgltfmaterials.h"
#include "llnotificationsutil.h"
#include "lltexturectrl.h"
@@ -237,7 +238,9 @@ struct LLSelectedTEGetMatData : public LLSelectedTEFunctor
LLUUID mTexEmissiveId;
LLUUID mTexNormalId;
LLUUID mObjectId;
+ LLViewerObject* mObject = nullptr;
S32 mObjectTE;
+ LLUUID mMaterialId;
LLPointer<LLGLTFMaterial> mMaterial;
LLPointer<LLLocalGLTFMaterial> mLocalMaterial;
};
@@ -259,6 +262,7 @@ bool LLSelectedTEGetMatData::apply(LLViewerObject* objectp, S32 te_index)
return false;
}
LLUUID mat_id = objectp->getRenderMaterialID(te_index);
+ mMaterialId = mat_id;
bool can_use = mIsOverride ? objectp->permModify() : objectp->permCopy();
LLTextureEntry *tep = objectp->getTE(te_index);
// We might want to disable this entirely if at least
@@ -290,6 +294,7 @@ bool LLSelectedTEGetMatData::apply(LLViewerObject* objectp, S32 te_index)
mTexEmissiveId = tex_emissive_id;
mTexNormalId = tex_normal_id;
mObjectTE = te_index;
+ mObject = objectp;
mObjectId = objectp->getID();
mFirst = false;
}
@@ -318,6 +323,8 @@ bool LLSelectedTEGetMatData::apply(LLViewerObject* objectp, S32 te_index)
LLGLTFMaterial *mat = tep->getGLTFMaterial();
LLLocalGLTFMaterial *local_mat = dynamic_cast<LLLocalGLTFMaterial*>(mat);
+ mObject = objectp;
+ mObjectId = objectp->getID();
if (local_mat)
{
mLocalMaterial = local_mat;
@@ -405,9 +412,6 @@ BOOL LLMaterialEditor::postBuild()
if (mIsOverride)
{
- // Material override change success callback
- LLGLTFMaterialList::addSelectionUpdateCallback(&LLMaterialEditor::updateLive);
-
// Live editing needs a recovery mechanism on cancel
mBaseColorTextureCtrl->setOnCancelCallback(boost::bind(&LLMaterialEditor::onCancelCtrl, this, _1, _2, MATERIAL_BASE_COLOR_TEX_DIRTY));
mMetallicTextureCtrl->setOnCancelCallback(boost::bind(&LLMaterialEditor::onCancelCtrl, this, _1, _2, MATERIAL_METALLIC_ROUGHTNESS_TEX_DIRTY));
@@ -535,12 +539,6 @@ void LLMaterialEditor::draw()
{
if (mIsOverride)
{
- bool selection_empty = LLSelectMgr::getInstance()->getSelection()->isEmpty();
- if (selection_empty && mHasSelection)
- {
- mSelectionNeedsUpdate = true;
- }
-
if (mSelectionNeedsUpdate)
{
mSelectionNeedsUpdate = false;
@@ -1190,9 +1188,17 @@ bool LLMaterialEditor::saveIfNeeded()
}
else
{
- //make a new inventory item
+ // Make a new inventory item and set upload permissions
+ LLPermissions local_permissions;
+ local_permissions.init(gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null);
+
+ U32 everyone_perm = LLFloaterPerms::getEveryonePerms("Materials");
+ U32 group_perm = LLFloaterPerms::getGroupPerms("Materials");
+ U32 next_owner_perm = LLFloaterPerms::getNextOwnerPerms("Materials");
+ local_permissions.initMasks(PERM_ALL, PERM_ALL, everyone_perm, group_perm, next_owner_perm);
+
std::string res_desc = buildMaterialDescription();
- createInventoryItem(buffer, mMaterialName, res_desc);
+ createInventoryItem(buffer, mMaterialName, res_desc, local_permissions);
// We do not update floater with uploaded asset yet, so just close it.
closeFloater();
@@ -1286,36 +1292,37 @@ bool LLMaterialEditor::updateInventoryItem(const std::string &buffer, const LLUU
return true;
}
-void LLMaterialEditor::createInventoryItem(const std::string &buffer, const std::string &name, const std::string &desc)
+// Callback intended for when a material is saved from an object and needs to
+// be modified to reflect the new asset/name.
+class LLObjectsMaterialItemCallback : public LLInventoryCallback
{
- // gen a new uuid for this asset
- LLTransactionID tid;
- tid.generate(); // timestamp-based randomization + uniquification
- U32 next_owner_perm = LLFloaterPerms::getNextOwnerPerms("Materials");
- LLUUID parent = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_MATERIAL);
- const U8 subtype = NO_INV_SUBTYPE; // TODO maybe use AT_SETTINGS and LLSettingsType::ST_MATERIAL ?
+public:
+ LLObjectsMaterialItemCallback(const LLPermissions& permissions, const std::string& asset_data, const std::string& new_name)
+ : mPermissions(permissions),
+ mAssetData(asset_data),
+ mNewName(new_name)
+ {
+ }
- create_inventory_item(gAgent.getID(), gAgent.getSessionID(), parent, tid, name, desc,
- LLAssetType::AT_MATERIAL, LLInventoryType::IT_MATERIAL, subtype, next_owner_perm,
- new LLBoostFuncInventoryCallback([output = buffer](LLUUID const& inv_item_id)
+ void fire(const LLUUID& inv_item_id) override
{
LLViewerInventoryItem* item = gInventory.getItem(inv_item_id);
- if (item)
+ if (!item)
{
- // create_inventory_item doesn't allow presetting some permissions, fix it now
- LLPermissions perm = item->getPermissions();
- if (perm.getMaskEveryone() != LLFloaterPerms::getEveryonePerms("Materials")
- || perm.getMaskGroup() != LLFloaterPerms::getGroupPerms("Materials"))
- {
- perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Materials"));
- perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Materials"));
+ return;
+ }
- item->setPermissions(perm);
+ // create_inventory_item/copy_inventory_item don't allow presetting some permissions, fix it now
+ item->setPermissions(mPermissions);
+ item->updateServer(FALSE);
+ gInventory.updateItem(item);
+ gInventory.notifyObservers();
- item->updateServer(FALSE);
- gInventory.updateItem(item);
- gInventory.notifyObservers();
- }
+ if (item->getName() != mNewName)
+ {
+ LLSD updates;
+ updates["name"] = mNewName;
+ update_inventory_item(inv_item_id, updates, NULL);
}
// from reference in LLSettingsVOBase::createInventoryItem()/updateInventoryItem()
@@ -1323,13 +1330,11 @@ void LLMaterialEditor::createInventoryItem(const std::string &buffer, const std:
std::make_shared<LLBufferedAssetUploadInfo>(
inv_item_id,
LLAssetType::AT_MATERIAL,
- output,
+ mAssetData,
[](LLUUID item_id, LLUUID new_asset_id, LLUUID new_item_id, LLSD response)
{
// done callback
- LL_INFOS("Material") << "inventory item uploaded. item: " << item_id << " asset: " << new_asset_id << " new_item_id: " << new_item_id << " response: " << response << LL_ENDL;
- LLSD params = llsd::map("ASSET_ID", new_asset_id);
- LLNotificationsUtil::add("MaterialCreated", params);
+ LL_INFOS("Material") << "inventory item uploaded. item: " << item_id << " new_item_id: " << new_item_id << " response: " << response << LL_ENDL;
},
nullptr // failure callback, floater already closed
);
@@ -1344,8 +1349,25 @@ void LLMaterialEditor::createInventoryItem(const std::string &buffer, const std:
}
LLViewerAssetUpload::EnqueueInventoryUpload(agent_url, uploadInfo);
}
- })
- );
+ }
+private:
+ LLPermissions mPermissions;
+ std::string mAssetData;
+ std::string mNewName;
+};
+
+void LLMaterialEditor::createInventoryItem(const std::string &buffer, const std::string &name, const std::string &desc, const LLPermissions& permissions)
+{
+ // gen a new uuid for this asset
+ LLTransactionID tid;
+ tid.generate(); // timestamp-based randomization + uniquification
+ LLUUID parent = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_MATERIAL);
+ const U8 subtype = NO_INV_SUBTYPE; // TODO maybe use AT_SETTINGS and LLSettingsType::ST_MATERIAL ?
+
+ LLPointer<LLObjectsMaterialItemCallback> cb = new LLObjectsMaterialItemCallback(permissions, buffer, name);
+ create_inventory_item(gAgent.getID(), gAgent.getSessionID(), parent, tid, name, desc,
+ LLAssetType::AT_MATERIAL, LLInventoryType::IT_MATERIAL, subtype, permissions.getMaskNextOwner(),
+ cb);
}
void LLMaterialEditor::finishInventoryUpload(LLUUID itemId, LLUUID newAssetId, LLUUID newItemId)
@@ -1508,7 +1530,7 @@ void LLMaterialEditor::onSaveAsMsgCallback(const LLSD& notification, const LLSD&
}
if (item)
{
- const LLUUID &marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ const LLUUID &marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
LLUUID parent_id = item->getParentUUID();
if (mObjectUUID.notNull() || marketplacelistings_id == parent_id || gInventory.isObjectDescendentOf(item->getUUID(), gInventory.getLibraryRootFolderID()))
{
@@ -1759,22 +1781,6 @@ void LLMaterialEditor::updateLive()
mOverrideInProgress = false;
}
-void LLMaterialEditor::updateLive(const LLUUID &object_id, S32 te)
-{
- if (mOverrideObjectId != object_id
- || mOverrideObjectTE != te)
- {
- // Ignore if waiting for override,
- // if not waiting, mark selection dirty
- mSelectionNeedsUpdate |= !mOverrideInProgress;
- return;
- }
-
- // update for currently displayed object and face
- mSelectionNeedsUpdate = true;
- mOverrideInProgress = false;
-}
-
void LLMaterialEditor::loadLive()
{
LLMaterialEditor* me = (LLMaterialEditor*)LLFloaterReg::getInstance("live_material_editor");
@@ -1794,55 +1800,177 @@ void LLMaterialEditor::loadLive()
}
}
-void LLMaterialEditor::saveObjectsMaterialAs()
+// *NOTE: permissions_out includes user preferences for new item creation (LLFloaterPerms)
+bool can_use_objects_material(LLSelectedTEGetMatData& func, const std::vector<PermissionBit>& ops, LLPermissions& permissions_out, LLViewerInventoryItem*& item_out)
{
- LLSelectedTEGetMatData func(false);
+ if (!LLMaterialEditor::capabilitiesAvailable())
+ {
+ return false;
+ }
+
+ // func.mIsOverride=true is used for the singleton material editor floater
+ // associated with the build floater. This flag also excludes objects from
+ // the selection that do not satisfy PERM_MODIFY.
+ llassert(func.mIsOverride);
LLSelectMgr::getInstance()->getSelection()->applyToTEs(&func, true /*first applicable*/);
- saveMaterialAs(func.mMaterial, func.mLocalMaterial);
-}
-void LLMaterialEditor::savePickedMaterialAs()
-{
- LLPickInfo pick = LLToolPie::getInstance()->getPick();
- if (pick.mPickType != LLPickInfo::PICK_OBJECT || !pick.getObject())
+
+ LLViewerObject* selected_object = func.mObject;
+ if (!selected_object)
{
- return;
+ // LLSelectedTEGetMatData can fail if there are no selected faces
+ // with materials, but we expect at least some object is selected.
+ llassert(LLSelectMgr::getInstance()->getSelection()->getFirstObject());
+ return false;
+ }
+ if (selected_object->isInventoryPending())
+ {
+ return false;
+ }
+ for (PermissionBit op : ops)
+ {
+ if (op == PERM_MODIFY && selected_object->isPermanentEnforced())
+ {
+ return false;
+ }
}
- LLPointer<LLGLTFMaterial> render_material;
- LLPointer<LLLocalGLTFMaterial> local_material;
+ item_out = selected_object->getInventoryItemByAsset(func.mMaterialId);
- LLViewerObject *objectp = pick.getObject();
- LLUUID mat_id = objectp->getRenderMaterialID(pick.mObjectFace);
- if (mat_id.notNull() && objectp->permCopy())
+ LLPermissions item_permissions;
+ if (item_out)
+ {
+ item_permissions.set(item_out->getPermissions());
+ for (PermissionBit op : ops)
+ {
+ if (!gAgent.allowOperation(op, item_permissions, GP_OBJECT_MANIPULATE))
+ {
+ return false;
+ }
+ }
+ // Update flags for new owner
+ if (!item_permissions.setOwnerAndGroup(LLUUID::null, gAgent.getID(), LLUUID::null, true))
+ {
+ llassert(false);
+ return false;
+ }
+ }
+ else
{
- // Try a face user picked first
- // (likely the only method we need, but in such case
- // enable_object_save_gltf_material will need to check this)
- LLTextureEntry *tep = objectp->getTE(pick.mObjectFace);
- LLGLTFMaterial *mat = tep->getGLTFMaterial();
- LLLocalGLTFMaterial *local_mat = dynamic_cast<LLLocalGLTFMaterial*>(mat);
+ item_permissions.init(gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null);
+ }
- if (local_mat)
+ // Use root object for permissions checking
+ LLViewerObject* root_object = selected_object->getRootEdit();
+ LLPermissions* object_permissions_p = LLSelectMgr::getInstance()->findObjectPermissions(root_object);
+ LLPermissions object_permissions;
+ if (object_permissions_p)
+ {
+ object_permissions.set(*object_permissions_p);
+ for (PermissionBit op : ops)
{
- local_material = local_mat;
+ if (!gAgent.allowOperation(op, object_permissions, GP_OBJECT_MANIPULATE))
+ {
+ return false;
+ }
+ }
+ // Update flags for new owner
+ if (!object_permissions.setOwnerAndGroup(LLUUID::null, gAgent.getID(), LLUUID::null, true))
+ {
+ llassert(false);
+ return false;
}
- render_material = tep->getGLTFRenderMaterial();
}
else
{
- // Find an applicable material.
- // Do this before showing message, because
- // message is going to drop selection.
- LLSelectedTEGetMatData func(false);
- LLSelectMgr::getInstance()->getSelection()->applyToTEs(&func, true /*first applicable*/);
- local_material = func.mLocalMaterial;
- render_material = func.mMaterial;
+ object_permissions.init(gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null);
+ }
+
+ LLPermissions floater_perm;
+ floater_perm.init(gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null);
+ floater_perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Materials"));
+ floater_perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Materials"));
+ floater_perm.setMaskNext(LLFloaterPerms::getNextOwnerPerms("Materials"));
+
+ // *NOTE: A close inspection of LLPermissions::accumulate shows that
+ // conflicting UUIDs will be unset. This is acceptable behavior for now.
+ // The server will populate creator info based on the item creation method
+ // used.
+ // *NOTE: As far as I'm aware, there is currently no good way to preserve
+ // creation history when there's no material item present. In that case,
+ // the agent who saved the material will be considered the creator.
+ // -Cosmic,2023-08-07
+ if (item_out)
+ {
+ permissions_out.set(item_permissions);
+ }
+ else
+ {
+ permissions_out.set(object_permissions);
}
+ permissions_out.accumulate(floater_perm);
+
+ return true;
+}
- saveMaterialAs(render_material, local_material);
+bool LLMaterialEditor::canModifyObjectsMaterial()
+{
+ LLSelectedTEGetMatData func(true);
+ LLPermissions permissions;
+ LLViewerInventoryItem* item_out;
+ return can_use_objects_material(func, std::vector({PERM_MODIFY}), permissions, item_out);
}
-void LLMaterialEditor::saveMaterialAs(const LLGLTFMaterial* render_material, const LLLocalGLTFMaterial *local_material)
+bool LLMaterialEditor::canSaveObjectsMaterial()
+{
+ LLSelectedTEGetMatData func(true);
+ LLPermissions permissions;
+ LLViewerInventoryItem* item_out;
+ return can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY}), permissions, item_out);
+}
+
+bool LLMaterialEditor::canClipboardObjectsMaterial()
+{
+ if (LLSelectMgr::getInstance()->getSelection()->getObjectCount() != 1)
+ {
+ return false;
+ }
+
+ struct LLSelectedTEGetNullMat : public LLSelectedTEFunctor
+ {
+ bool apply(LLViewerObject* objectp, S32 te_index)
+ {
+ return objectp->getRenderMaterialID(te_index).isNull();
+ }
+ } null_func;
+
+ if (LLSelectMgr::getInstance()->getSelection()->applyToTEs(&null_func))
+ {
+ return true;
+ }
+
+ LLSelectedTEGetMatData func(true);
+ LLPermissions permissions;
+ LLViewerInventoryItem* item_out;
+ return can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY, PERM_TRANSFER}), permissions, item_out);
+}
+
+void LLMaterialEditor::saveObjectsMaterialAs()
+{
+ LLSelectedTEGetMatData func(true);
+ LLPermissions permissions;
+ LLViewerInventoryItem* item = nullptr;
+ bool allowed = can_use_objects_material(func, std::vector({PERM_COPY, PERM_MODIFY}), permissions, item);
+ if (!allowed)
+ {
+ LL_WARNS("MaterialEditor") << "Failed to save GLTF material from object" << LL_ENDL;
+ return;
+ }
+ const LLUUID item_id = item ? item->getUUID() : LLUUID::null;
+ saveObjectsMaterialAs(func.mMaterial, func.mLocalMaterial, permissions, func.mObjectId, item_id);
+}
+
+
+void LLMaterialEditor::saveObjectsMaterialAs(const LLGLTFMaterial* render_material, const LLLocalGLTFMaterial *local_material, const LLPermissions& permissions, const LLUUID& object_id, const LLUUID& item_id)
{
if (local_material)
{
@@ -1918,26 +2046,98 @@ void LLMaterialEditor::saveMaterialAs(const LLGLTFMaterial* render_material, con
LLSD args;
args["DESC"] = LLTrans::getString("New Material");
- LLNotificationsUtil::add("SaveMaterialAs", args, payload, boost::bind(&LLMaterialEditor::onSaveObjectsMaterialAsMsgCallback, _1, _2));
+ if (local_material)
+ {
+ LLPermissions local_permissions;
+ local_permissions.init(gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null);
+ LLNotificationsUtil::add("SaveMaterialAs", args, payload, boost::bind(&LLMaterialEditor::onSaveObjectsMaterialAsMsgCallback, _1, _2, local_permissions));
+ }
+ else
+ {
+ if (item_id.notNull())
+ {
+ // Copy existing item from object inventory, and create new composite asset on top of it
+ LLNotificationsUtil::add("SaveMaterialAs", args, payload, boost::bind(&LLMaterialEditor::onCopyObjectsMaterialAsMsgCallback, _1, _2, permissions, object_id, item_id));
+ }
+ else
+ {
+ LLNotificationsUtil::add("SaveMaterialAs", args, payload, boost::bind(&LLMaterialEditor::onSaveObjectsMaterialAsMsgCallback, _1, _2, permissions));
+ }
+ }
}
-void LLMaterialEditor::onSaveObjectsMaterialAsMsgCallback(const LLSD& notification, const LLSD& response)
+// static
+void LLMaterialEditor::onCopyObjectsMaterialAsMsgCallback(const LLSD& notification, const LLSD& response, const LLPermissions& permissions, const LLUUID& object_id, const LLUUID& item_id)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- if (0 == option)
+ if (0 != option)
{
- LLSD asset;
- asset["version"] = LLGLTFMaterial::ASSET_VERSION;
- asset["type"] = LLGLTFMaterial::ASSET_TYPE;
- // This is the string serialized from LLGLTFMaterial::asJSON
- asset["data"] = notification["payload"]["data"];
+ return;
+ }
- std::ostringstream str;
- LLSDSerialize::serialize(asset, str, LLSDSerialize::LLSD_BINARY);
+ LLSD asset;
+ asset["version"] = LLGLTFMaterial::ASSET_VERSION;
+ asset["type"] = LLGLTFMaterial::ASSET_TYPE;
+ // This is the string serialized from LLGLTFMaterial::asJSON
+ asset["data"] = notification["payload"]["data"];
- std::string new_name = response["message"].asString();
- createInventoryItem(str.str(), new_name, std::string());
+ std::ostringstream str;
+ LLSDSerialize::serialize(asset, str, LLSDSerialize::LLSD_BINARY);
+
+ LLViewerObject* object = gObjectList.findObject(object_id);
+ if (!object)
+ {
+ return;
+ }
+ const LLInventoryItem* item = object->getInventoryItem(item_id);
+ if (!item)
+ {
+ return;
+ }
+
+ std::string new_name = response["message"].asString();
+ LLInventoryObject::correctInventoryName(new_name);
+ if (new_name.empty())
+ {
+ return;
+ }
+
+ const LLUUID destination_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MATERIAL);
+
+ LLPointer<LLInventoryCallback> cb = new LLObjectsMaterialItemCallback(permissions, str.str(), new_name);
+ // NOTE: This should be an item copy. Saving a material to an inventory should be disabled when the associated material is no-copy.
+ move_or_copy_inventory_from_object(destination_id,
+ object_id,
+ item_id,
+ cb);
+}
+
+// static
+void LLMaterialEditor::onSaveObjectsMaterialAsMsgCallback(const LLSD& notification, const LLSD& response, const LLPermissions& permissions)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (0 != option)
+ {
+ return;
}
+
+ LLSD asset;
+ asset["version"] = LLGLTFMaterial::ASSET_VERSION;
+ asset["type"] = LLGLTFMaterial::ASSET_TYPE;
+ // This is the string serialized from LLGLTFMaterial::asJSON
+ asset["data"] = notification["payload"]["data"];
+
+ std::ostringstream str;
+ LLSDSerialize::serialize(asset, str, LLSDSerialize::LLSD_BINARY);
+
+ std::string new_name = response["message"].asString();
+ LLInventoryObject::correctInventoryName(new_name);
+ if (new_name.empty())
+ {
+ return;
+ }
+
+ createInventoryItem(str.str(), new_name, std::string(), permissions);
}
const void upload_bulk(const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter type);
@@ -2591,7 +2791,7 @@ public:
// something went wrong update selection
LLMaterialEditor::updateLive();
}
- // else we will get updateLive(obj, id) from applied overrides
+ // else we will get updateLive() from panel face
}
bool getResult() { return mSuccess; }
@@ -2710,7 +2910,10 @@ bool LLMaterialEditor::setFromSelection()
if (func.mMaterial.notNull())
{
setFromGLTFMaterial(func.mMaterial);
- setEnableEditing(true);
+ LLViewerObject* selected_object = func.mObject;
+ const LLViewerInventoryItem* item = selected_object->getInventoryItemByAsset(func.mMaterialId);
+ const bool allow_modify = !item || canModify(selected_object, item);
+ setEnableEditing(allow_modify);
}
else
{
diff --git a/indra/newview/llmaterialeditor.h b/indra/newview/llmaterialeditor.h
index 6f674a4170..1c40fcc348 100644
--- a/indra/newview/llmaterialeditor.h
+++ b/indra/newview/llmaterialeditor.h
@@ -38,6 +38,7 @@ class LLGLTFMaterial;
class LLLocalGLTFMaterial;
class LLTextureCtrl;
class LLTextBox;
+class LLViewerInventoryItem;
namespace tinygltf
{
@@ -109,12 +110,14 @@ class LLMaterialEditor : public LLPreview, public LLVOInventoryListener
void onSelectionChanged(); // live overrides selection changes
static void updateLive();
- static void updateLive(const LLUUID &object_id, S32 te);
static void loadLive();
+ static bool canModifyObjectsMaterial();
+ static bool canSaveObjectsMaterial();
+ static bool canClipboardObjectsMaterial();
static void saveObjectsMaterialAs();
- static void savePickedMaterialAs();
- static void onSaveObjectsMaterialAsMsgCallback(const LLSD& notification, const LLSD& response);
+ static void onCopyObjectsMaterialAsMsgCallback(const LLSD& notification, const LLSD& response, const LLPermissions& permissions, const LLUUID& object_id, const LLUUID& item_id);
+ static void onSaveObjectsMaterialAsMsgCallback(const LLSD& notification, const LLSD& response, const LLPermissions& permissions);
static void onLoadComplete(const LLUUID& asset_uuid, LLAssetType::EType type, void* user_data, S32 status, LLExtStat ext_status);
@@ -229,10 +232,10 @@ class LLMaterialEditor : public LLPreview, public LLVOInventoryListener
static bool capabilitiesAvailable();
private:
- static void saveMaterialAs(const LLGLTFMaterial *render_material, const LLLocalGLTFMaterial *local_material);
+ static void saveObjectsMaterialAs(const LLGLTFMaterial *render_material, const LLLocalGLTFMaterial *local_material, const LLPermissions& permissions, const LLUUID& object_id /* = LLUUID::null */, const LLUUID& item /* = LLUUID::null */);
static bool updateInventoryItem(const std::string &buffer, const LLUUID &item_id, const LLUUID &task_id);
- static void createInventoryItem(const std::string &buffer, const std::string &name, const std::string &desc);
+ static void createInventoryItem(const std::string &buffer, const std::string &name, const std::string &desc, const LLPermissions& permissions);
void setFromGLTFMaterial(LLGLTFMaterial* mat);
bool setFromSelection();
diff --git a/indra/newview/llmaterialmgr.h b/indra/newview/llmaterialmgr.h
index f76cc27db1..6e574219ae 100644
--- a/indra/newview/llmaterialmgr.h
+++ b/indra/newview/llmaterialmgr.h
@@ -93,7 +93,11 @@ private:
bool operator==(const TEMaterialPair& b) const { return (materialID == b.materialID) && (te == b.te); }
};
-
+
+ // definitions follow class
+ friend std::hash<TEMaterialPair>;
+ friend size_t hash_value(const TEMaterialPair&) noexcept;
+
friend inline bool operator<(
const LLMaterialMgr::TEMaterialPair& lhs,
const LLMaterialMgr::TEMaterialPair& rhs)
@@ -102,13 +106,6 @@ private:
(lhs.materialID < rhs.materialID);
}
- struct TEMaterialPairHasher
- {
- enum { bucket_size = 8 };
- size_t operator()(const TEMaterialPair& key_value) const { return *((size_t*)key_value.materialID.get()); } // cheesy, but effective
- bool operator()(const TEMaterialPair& left, const TEMaterialPair& right) const { return left < right; }
- };
-
typedef std::set<LLMaterialID> material_queue_t;
typedef std::map<LLUUID, material_queue_t> get_queue_t;
typedef std::pair<const LLUUID, LLMaterialID> pending_material_t;
@@ -116,7 +113,7 @@ private:
typedef std::map<LLMaterialID, get_callback_t*> get_callback_map_t;
- typedef boost::unordered_map<TEMaterialPair, get_callback_te_t*, TEMaterialPairHasher> get_callback_te_map_t;
+ typedef boost::unordered_map<TEMaterialPair, get_callback_te_t*> get_callback_te_map_t;
typedef std::set<LLUUID> getall_queue_t;
typedef std::map<LLUUID, F64> getall_pending_map_t;
typedef std::map<LLUUID, getall_callback_t*> getall_callback_map_t;
@@ -145,5 +142,23 @@ private:
U32 getMaxEntries(const LLViewerRegion* regionp);
};
+// std::hash implementation for TEMaterialPair
+namespace std
+{
+ template<> struct hash<LLMaterialMgr::TEMaterialPair>
+ {
+ inline size_t operator()(const LLMaterialMgr::TEMaterialPair& p) const noexcept
+ {
+ return size_t((p.te + 1) * p.materialID.getDigest64());
+ }
+ };
+}
+
+// For use with boost containers.
+inline size_t hash_value(const LLMaterialMgr::TEMaterialPair& p) noexcept
+{
+ return size_t((p.te + 1) * p.materialID.getDigest64());
+}
+
#endif // LL_LLMATERIALMGR_H
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index 57ac111fdf..01d6469010 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -56,6 +56,7 @@
#include "llviewermessage.h"
#include "llviewerobjectlist.h"
#include "llviewerregion.h"
+#include "llviewerstatsrecorder.h"
#include "llviewertexturelist.h"
#include "llvolume.h"
#include "llvolumemgr.h"
@@ -1861,11 +1862,11 @@ EMeshProcessingResult LLMeshRepoThread::headerReceived(const LLVolumeParams& mes
LLSD header_data;
LLMeshHeader header;
-
- U32 header_size = 0;
+
+ llssize header_size = 0;
if (data_size > 0)
{
- U32 dsize = data_size;
+ llssize dsize = data_size;
char* result_ptr = strip_deprecated_header((char*)data, dsize, &header_size);
data_size = dsize;
@@ -3021,7 +3022,7 @@ S32 LLMeshRepository::getActualMeshLOD(LLMeshHeader& header, S32 lod)
}
//search up to find then ext available higher lod
- for (S32 i = lod+1; i < 4; ++i)
+ for (S32 i = lod+1; i < LLVolumeLODGroup::NUM_LODS; ++i)
{
if (header.mLodSize[i] > 0)
{
@@ -3183,7 +3184,7 @@ void LLMeshHeaderHandler::processFailure(LLCore::HttpStatus status)
// Can't get the header so none of the LODs will be available
LLMutexLock lock(gMeshRepo.mThread->mMutex);
- for (int i(0); i < 4; ++i)
+ for (int i(0); i < LLVolumeLODGroup::NUM_LODS; ++i)
{
gMeshRepo.mThread->mUnavailableQ.push_back(LLMeshRepoThread::LODRequest(mMeshParams, i));
}
@@ -3212,7 +3213,7 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b
// Can't get the header so none of the LODs will be available
LLMutexLock lock(gMeshRepo.mThread->mMutex);
- for (int i(0); i < 4; ++i)
+ for (int i(0); i < LLVolumeLODGroup::NUM_LODS; ++i)
{
gMeshRepo.mThread->mUnavailableQ.push_back(LLMeshRepoThread::LODRequest(mMeshParams, i));
}
@@ -3293,7 +3294,7 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b
// headerReceived() parsed header, but header's data is invalid so none of the LODs will be available
LLMutexLock lock(gMeshRepo.mThread->mMutex);
- for (int i(0); i < 4; ++i)
+ for (int i(0); i < LLVolumeLODGroup::NUM_LODS; ++i)
{
gMeshRepo.mThread->mUnavailableQ.push_back(LLMeshRepoThread::LODRequest(mMeshParams, i));
}
@@ -3654,7 +3655,7 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para
// Manage time-to-load metrics for mesh download operations.
metricsProgress(1);
- if (detail < 0 || detail >= 4)
+ if (detail < 0 || detail >= LLVolumeLODGroup::NUM_LODS)
{
return detail;
}
@@ -3717,7 +3718,7 @@ S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_para
}
//no lower LOD is a available, is a higher lod available?
- for (S32 i = detail+1; i < 4; ++i)
+ for (S32 i = detail+1; i < LLVolumeLODGroup::NUM_LODS; ++i)
{
LLVolume* lod = group->refLOD(i);
if (lod && lod->isMeshAssetLoaded() && lod->getNumVolumeFaces() > 0)
@@ -3918,7 +3919,7 @@ void LLMeshRepository::notifyLoadedMeshes()
//create score map
std::map<LLUUID, F32> score_map;
- for (U32 i = 0; i < 4; ++i)
+ for (U32 i = 0; i < LLVolumeLODGroup::NUM_LODS; ++i)
{
for (mesh_load_map::iterator iter = mLoadingMeshes[i].begin(); iter != mLoadingMeshes[i].end(); ++iter)
{
@@ -4087,6 +4088,8 @@ void LLMeshRepository::notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVol
}
mLoadingMeshes[detail].erase(obj_iter);
+
+ LLViewerStatsRecorder::instance().meshLoaded();
}
}
@@ -4099,10 +4102,11 @@ void LLMeshRepository::notifyMeshUnavailable(const LLVolumeParams& mesh_params,
{
F32 detail = LLVolumeLODGroup::getVolumeScaleFromDetail(lod);
- LLVolume* sys_volume = LLPrimitive::getVolumeManager()->refVolume(mesh_params, detail);
+ LLVolume* sys_volume = LLPrimitive::getVolumeManager()->refVolume(mesh_params, lod);
if (sys_volume)
{
sys_volume->setMeshAssetUnavaliable(true);
+ LLPrimitive::getVolumeManager()->unrefVolume(sys_volume);
}
for (LLVOVolume* vobj : obj_iter->second)
@@ -4480,7 +4484,7 @@ F32 LLMeshRepository::getStreamingCostLegacy(LLUUID mesh_id, F32 radius, S32* by
{
LL_WARNS() << mesh_id << "bytes mismatch " << *bytes << " " << data.getSizeTotal() << LL_ENDL;
}
- if (bytes_visible && (lod >=0) && (lod < 4) && (*bytes_visible != data.getSizeByLOD(lod)))
+ if (bytes_visible && (lod >=0) && (lod < LLVolumeLODGroup::NUM_LODS) && (*bytes_visible != data.getSizeByLOD(lod)))
{
LL_WARNS() << mesh_id << "bytes_visible mismatch " << *bytes_visible << " " << data.getSizeByLOD(lod) << LL_ENDL;
}
@@ -4640,7 +4644,7 @@ bool LLMeshCostData::init(const LLMeshHeader& header)
static LLCachedControl<U32> minimum_size(gSavedSettings, "MeshMinimumByteSize", 16); //make sure nothing is "free"
static LLCachedControl<U32> bytes_per_triangle(gSavedSettings, "MeshBytesPerTriangle", 16);
- for (S32 i=0; i<4; i++)
+ for (S32 i=0; i<LLVolumeLODGroup::NUM_LODS; i++)
{
mEstTrisByLOD[i] = llmax((F32)mSizeByLOD[i] - (F32)metadata_discount, (F32)minimum_size) / (F32)bytes_per_triangle;
}
diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp
index 6ceffd452e..ccae1030f1 100644
--- a/indra/newview/llmodelpreview.cpp
+++ b/indra/newview/llmodelpreview.cpp
@@ -2717,9 +2717,6 @@ void LLModelPreview::clearBuffers()
void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
{
- U32 mesh_count = 0;
-
-
LLModelLoader::model_list* model = NULL;
if (lod < 0 || lod > 4)
@@ -2887,8 +2884,6 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)
vb->unmapBuffer();
mVertexBuffer[lod][mdl].push_back(vb);
-
- ++mesh_count;
}
}
}
diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h
index 2c45014321..14840f1b2e 100644
--- a/indra/newview/llmutelist.h
+++ b/indra/newview/llmutelist.h
@@ -99,6 +99,7 @@ public:
BOOL isMuted(const LLUUID& id, const std::string& name = LLStringUtil::null, U32 flags = 0) const;
// Workaround for username-based mute search, a lot of string conversions so use cautiously
+ // Expects lower case username
BOOL isMuted(const std::string& username, U32 flags = 0) const;
// Alternate (convenience) form for places we don't need to pass the name, but do need flags
diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp
index 92a742466e..de988555c5 100644
--- a/indra/newview/lloutfitgallery.cpp
+++ b/indra/newview/lloutfitgallery.cpp
@@ -36,12 +36,11 @@
#include "llaccordionctrltab.h"
#include "llappearancemgr.h"
-#include "llagentbenefits.h"
#include "llerror.h"
#include "llfilepicker.h"
#include "llfloaterperms.h"
#include "llfloaterreg.h"
-#include "llfloatersimpleoutfitsnapshot.h"
+#include "llfloatersimplesnapshot.h"
#include "llimagedimensionsinfo.h"
#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
@@ -65,7 +64,6 @@ const S32 GALLERY_ITEMS_PER_ROW_MIN = 2;
LLOutfitGallery::LLOutfitGallery(const LLOutfitGallery::Params& p)
: LLOutfitListBase(),
- mTexturesObserver(NULL),
mOutfitsObserver(NULL),
mScrollPanel(NULL),
mGalleryPanel(NULL),
@@ -125,7 +123,6 @@ void LLOutfitGallery::onOpen(const LLSD& info)
LLOutfitListBase::onOpen(info);
if (!mGalleryCreated)
{
- loadPhotos();
uuid_vec_t cats;
getCurrentCategories(cats);
int n = cats.size();
@@ -149,6 +146,264 @@ void LLOutfitGallery::draw()
}
}
+BOOL LLOutfitGallery::handleKeyHere(KEY key, MASK mask)
+{
+ BOOL handled = FALSE;
+ switch (key)
+ {
+ case KEY_RETURN:
+ // Open selected items if enter key hit on the inventory panel
+ if (mask == MASK_NONE && mSelectedOutfitUUID.notNull())
+ {
+ // Or should it wearSelectedOutfit?
+ getSelectedItem()->openOutfitsContent();
+ }
+ handled = TRUE;
+ break;
+ case KEY_DELETE:
+#if LL_DARWIN
+ case KEY_BACKSPACE:
+#endif
+ // Delete selected items if delete or backspace key hit on the inventory panel
+ // Note: on Mac laptop keyboards, backspace and delete are one and the same
+ if (mSelectedOutfitUUID.notNull())
+ {
+ onRemoveOutfit(mSelectedOutfitUUID);
+ }
+ handled = TRUE;
+ break;
+
+ case KEY_F2:
+ LLAppearanceMgr::instance().renameOutfit(mSelectedOutfitUUID);
+ handled = TRUE;
+ break;
+
+ case KEY_PAGE_UP:
+ if (mScrollPanel)
+ {
+ mScrollPanel->pageUp(30);
+ }
+ handled = TRUE;
+ break;
+
+ case KEY_PAGE_DOWN:
+ if (mScrollPanel)
+ {
+ mScrollPanel->pageDown(30);
+ }
+ handled = TRUE;
+ break;
+
+ case KEY_HOME:
+ if (mScrollPanel)
+ {
+ mScrollPanel->goToTop();
+ }
+ handled = TRUE;
+ break;
+
+ case KEY_END:
+ if (mScrollPanel)
+ {
+ mScrollPanel->goToBottom();
+ }
+ handled = TRUE;
+ break;
+
+ case KEY_LEFT:
+ moveLeft();
+ handled = TRUE;
+ break;
+
+ case KEY_RIGHT:
+ moveRight();
+ handled = TRUE;
+ break;
+
+ case KEY_UP:
+ moveUp();
+ handled = TRUE;
+ break;
+
+ case KEY_DOWN:
+ moveDown();
+ handled = TRUE;
+ break;
+
+ default:
+ break;
+ }
+
+ if (handled)
+ {
+ mOutfitGalleryMenu->hide();
+ }
+
+ return handled;
+}
+
+void LLOutfitGallery::moveUp()
+{
+ if (mSelectedOutfitUUID.notNull() && mItemsAddedCount > 1)
+ {
+ LLOutfitGalleryItem* item = getSelectedItem();
+ if (item)
+ {
+ S32 n = mItemIndexMap[item];
+ n -= mItemsInRow;
+ if (n >= 0)
+ {
+ item = mIndexToItemMap[n];
+ LLUUID item_id = item->getUUID();
+ ChangeOutfitSelection(nullptr, item_id);
+ item->setFocus(TRUE);
+
+ scrollToShowItem(mSelectedOutfitUUID);
+ }
+ }
+ }
+}
+
+void LLOutfitGallery::moveDown()
+{
+ if (mSelectedOutfitUUID.notNull() && mItemsAddedCount > 1)
+ {
+ LLOutfitGalleryItem* item = getSelectedItem();
+ if (item)
+ {
+ S32 n = mItemIndexMap[item];
+ n += mItemsInRow;
+ if (n < mItemsAddedCount)
+ {
+ item = mIndexToItemMap[n];
+ LLUUID item_id = item->getUUID();
+ ChangeOutfitSelection(nullptr, item_id);
+ item->setFocus(TRUE);
+
+ scrollToShowItem(mSelectedOutfitUUID);
+ }
+ }
+ }
+}
+
+void LLOutfitGallery::moveLeft()
+{
+ if (mSelectedOutfitUUID.notNull() && mItemsAddedCount > 1)
+ {
+ LLOutfitGalleryItem* item = getSelectedItem();
+ if (item)
+ {
+ // Might be better to get item from panel
+ S32 n = mItemIndexMap[item];
+ n--;
+ if (n < 0)
+ {
+ n = mItemsAddedCount - 1;
+ }
+ item = mIndexToItemMap[n];
+ LLUUID item_id = item->getUUID();
+ ChangeOutfitSelection(nullptr, item_id);
+ item->setFocus(TRUE);
+
+ scrollToShowItem(mSelectedOutfitUUID);
+ }
+ }
+}
+
+void LLOutfitGallery::moveRight()
+{
+ if (mSelectedOutfitUUID.notNull() && mItemsAddedCount > 1)
+ {
+ LLOutfitGalleryItem* item = getSelectedItem();
+ if (item)
+ {
+ S32 n = mItemIndexMap[item];
+ n++;
+ if (n == mItemsAddedCount)
+ {
+ n = 0;
+ }
+ item = mIndexToItemMap[n];
+ LLUUID item_id = item->getUUID();
+ ChangeOutfitSelection(nullptr, item_id);
+ item->setFocus(TRUE);
+
+ scrollToShowItem(mSelectedOutfitUUID);
+ }
+ }
+}
+
+void LLOutfitGallery::onFocusLost()
+{
+ LLOutfitListBase::onFocusLost();
+
+ if (mSelectedOutfitUUID.notNull())
+ {
+ LLOutfitGalleryItem* item = getSelectedItem();
+ if (item)
+ {
+ item->setSelected(false);
+ }
+ }
+}
+
+void LLOutfitGallery::onFocusReceived()
+{
+ LLOutfitListBase::onFocusReceived();
+
+ if (mSelectedOutfitUUID.notNull())
+ {
+ LLOutfitGalleryItem* item = getSelectedItem();
+ if (item)
+ {
+ item->setSelected(true);
+ }
+ }
+}
+
+void LLOutfitGallery::onRemoveOutfit(const LLUUID& outfit_cat_id)
+{
+ LLNotificationsUtil::add("DeleteOutfits", LLSD(), LLSD(), boost::bind(onOutfitsRemovalConfirmation, _1, _2, outfit_cat_id));
+}
+
+void LLOutfitGallery::onOutfitsRemovalConfirmation(const LLSD& notification, const LLSD& response, const LLUUID& outfit_cat_id)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option != 0) return; // canceled
+
+ if (outfit_cat_id.notNull())
+ {
+ gInventory.removeCategory(outfit_cat_id);
+ }
+}
+
+void LLOutfitGallery::scrollToShowItem(const LLUUID& item_id)
+{
+ LLOutfitGalleryItem* item = mOutfitMap[item_id];
+ if (item)
+ {
+ const LLRect visible_content_rect = mScrollPanel->getVisibleContentRect();
+
+ LLRect item_rect;
+ item->localRectToOtherView(item->getLocalRect(), &item_rect, mScrollPanel);
+ LLRect overlap_rect(item_rect);
+ overlap_rect.intersectWith(visible_content_rect);
+
+ //Scroll when the selected item is outside the visible area
+ if (overlap_rect.getHeight() + 5 < item->getRect().getHeight())
+ {
+ LLRect content_rect = mScrollPanel->getContentWindowRect();
+ LLRect constraint_rect;
+ constraint_rect.setOriginAndSize(0, 0, content_rect.getWidth(), content_rect.getHeight());
+
+ LLRect item_doc_rect;
+ item->localRectToOtherView(item->getLocalRect(), &item_doc_rect, mGalleryPanel);
+
+ mScrollPanel->scrollToShowRect(item_doc_rect, constraint_rect);
+ }
+ }
+}
+
void LLOutfitGallery::updateRowsIfNeeded()
{
if(((getRect().getWidth() - mRowPanelWidth) > mItemWidth) && mRowCount > 1)
@@ -269,8 +524,9 @@ void LLOutfitGallery::addToGallery(LLOutfitGalleryItem* item)
mHiddenItems.push_back(item);
return;
}
+ mItemIndexMap[item] = mItemsAddedCount;
+ mIndexToItemMap[mItemsAddedCount] = item;
mItemsAddedCount++;
- mItemIndexMap[item] = mItemsAddedCount - 1;
int n = mItemsAddedCount;
int row_count = (n % mItemsInRow) == 0 ? n / mItemsInRow : n / mItemsInRow + 1;
int n_prev = n - 1;
@@ -306,6 +562,7 @@ void LLOutfitGallery::removeFromGalleryLast(LLOutfitGalleryItem* item)
int row_count = (n % mItemsInRow) == 0 ? n / mItemsInRow : n / mItemsInRow + 1;
int row_count_prev = (n_prev % mItemsInRow) == 0 ? n_prev / mItemsInRow : n_prev / mItemsInRow + 1;
mItemsAddedCount--;
+ mIndexToItemMap.erase(mItemsAddedCount);
bool remove_row = row_count != row_count_prev;
removeFromLastRow(mItems[mItemsAddedCount]);
@@ -331,6 +588,7 @@ void LLOutfitGallery::removeFromGalleryMiddle(LLOutfitGalleryItem* item)
}
int n = mItemIndexMap[item];
mItemIndexMap.erase(item);
+ mIndexToItemMap.erase(n);
std::vector<LLOutfitGalleryItem*> saved;
for (int i = mItemsAddedCount - 1; i > n; i--)
{
@@ -364,9 +622,15 @@ LLOutfitGalleryItem* LLOutfitGallery::buildGalleryItem(std::string name, LLUUID
gitem->setFollowsTop();
gitem->setOutfitName(name);
gitem->setUUID(outfit_id);
+ gitem->setGallery(this);
return gitem;
}
+LLOutfitGalleryItem* LLOutfitGallery::getSelectedItem()
+{
+ return mOutfitMap[mSelectedOutfitUUID];
+}
+
void LLOutfitGallery::buildGalleryPanel(int row_count)
{
LLPanel::Params params;
@@ -440,12 +704,6 @@ void LLOutfitGallery::moveRowPanel(LLPanel* stack, int left, int bottom)
LLOutfitGallery::~LLOutfitGallery()
{
delete mOutfitGalleryMenu;
-
- if (gInventory.containsObserver(mTexturesObserver))
- {
- gInventory.removeObserver(mTexturesObserver);
- }
- delete mTexturesObserver;
if (gInventory.containsObserver(mOutfitsObserver))
{
@@ -617,6 +875,7 @@ void LLOutfitGallery::onChangeOutfitSelection(LLWearableItemsList* list, const L
{
mOutfitMap[category_id]->setSelected(TRUE);
}
+ // mSelectedOutfitUUID will be set in LLOutfitListBase::ChangeOutfitSelection
}
void LLOutfitGallery::wearSelectedOutfit()
@@ -668,7 +927,8 @@ static LLDefaultChildRegistry::Register<LLOutfitGalleryItem> r("outfit_gallery_i
LLOutfitGalleryItem::LLOutfitGalleryItem(const Params& p)
: LLPanel(p),
- mTexturep(NULL),
+ mGallery(nullptr),
+ mTexturep(nullptr),
mSelected(false),
mWorn(false),
mDefaultImage(true),
@@ -743,10 +1003,13 @@ void LLOutfitGalleryItem::setOutfitWorn(bool value)
mWorn = value;
LLStringUtil::format_map_t worn_string_args;
std::string worn_string = getString("worn_string", worn_string_args);
- LLUIColor text_color = LLUIColorTable::instance().getColor(mSelected ? "White" : (mWorn ? "OutfitGalleryItemWorn" : "White"), LLColor4::white);
+ LLUIColor text_color = LLUIColorTable::instance().getColor("White", LLColor4::white);
mOutfitWornText->setReadOnlyColor(text_color.get());
mOutfitNameText->setReadOnlyColor(text_color.get());
+ mOutfitWornText->setFont(value ? LLFontGL::getFontSansSerifBold() : LLFontGL::getFontSansSerifSmall());
+ mOutfitNameText->setFont(value ? LLFontGL::getFontSansSerifBold() : LLFontGL::getFontSansSerifSmall());
mOutfitWornText->setValue(value ? worn_string : "");
+ mOutfitNameText->setText(mOutfitName); // refresh LLTextViewModel to pick up font changes
}
void LLOutfitGalleryItem::setSelected(bool value)
@@ -770,8 +1033,63 @@ BOOL LLOutfitGalleryItem::handleRightMouseDown(S32 x, S32 y, MASK mask)
BOOL LLOutfitGalleryItem::handleDoubleClick(S32 x, S32 y, MASK mask)
{
+ return openOutfitsContent() || LLPanel::handleDoubleClick(x, y, mask);
+}
+
+BOOL LLOutfitGalleryItem::handleKeyHere(KEY key, MASK mask)
+{
+ if (!mGallery)
+ {
+ return FALSE;
+ }
+
+ BOOL handled = FALSE;
+ switch (key)
+ {
+ case KEY_LEFT:
+ mGallery->moveLeft();
+ handled = true;
+ break;
+
+ case KEY_RIGHT:
+ mGallery->moveRight();
+ handled = true;
+ break;
+
+ case KEY_UP:
+ mGallery->moveUp();
+ handled = true;
+ break;
+
+ case KEY_DOWN:
+ mGallery->moveDown();
+ handled = true;
+ break;
+
+ default:
+ break;
+ }
+ return handled;
+}
+
+void LLOutfitGalleryItem::onFocusLost()
+{
+ setSelected(false);
+
+ LLPanel::onFocusLost();
+}
+
+void LLOutfitGalleryItem::onFocusReceived()
+{
+ setSelected(true);
+
+ LLPanel::onFocusReceived();
+}
+
+bool LLOutfitGalleryItem::openOutfitsContent()
+{
LLTabContainer* appearence_tabs = LLPanelOutfitsInventory::findInstance()->getChild<LLTabContainer>("appearance_tabs");
- if (appearence_tabs && (mUUID != LLUUID()))
+ if (appearence_tabs && mUUID.notNull())
{
appearence_tabs->selectTabByName("outfitslist_tab");
LLPanel* panel = appearence_tabs->getCurrentPanel();
@@ -784,12 +1102,11 @@ BOOL LLOutfitGalleryItem::handleDoubleClick(S32 x, S32 y, MASK mask)
outfit_list->setSelectedOutfitByUUID(mUUID);
LLAccordionCtrlTab* tab = accordion->getSelectedTab();
tab->showAndFocusHeader();
- return TRUE;
+ return true;
}
}
}
-
- return LLPanel::handleDoubleClick(x, y, mask);
+ return false;
}
bool LLOutfitGalleryItem::setImageAssetId(LLUUID image_asset_id)
@@ -835,68 +1152,22 @@ LLContextMenu* LLOutfitGalleryContextMenu::createMenu()
boost::bind(&LLAppearanceMgr::takeOffOutfit, &LLAppearanceMgr::instance(), selected_id));
registrar.add("Outfit.Edit", boost::bind(editOutfit));
registrar.add("Outfit.Rename", boost::bind(renameOutfit, selected_id));
- registrar.add("Outfit.Delete", boost::bind(&LLOutfitGalleryContextMenu::onRemoveOutfit, this, selected_id));
+ registrar.add("Outfit.Delete", boost::bind(LLOutfitGallery::onRemoveOutfit, selected_id));
registrar.add("Outfit.Create", boost::bind(&LLOutfitGalleryContextMenu::onCreate, this, _2));
- registrar.add("Outfit.UploadPhoto", boost::bind(&LLOutfitGalleryContextMenu::onUploadPhoto, this, selected_id));
- registrar.add("Outfit.SelectPhoto", boost::bind(&LLOutfitGalleryContextMenu::onSelectPhoto, this, selected_id));
- registrar.add("Outfit.TakeSnapshot", boost::bind(&LLOutfitGalleryContextMenu::onTakeSnapshot, this, selected_id));
- registrar.add("Outfit.RemovePhoto", boost::bind(&LLOutfitGalleryContextMenu::onRemovePhoto, this, selected_id));
+ registrar.add("Outfit.Thumbnail", boost::bind(&LLOutfitGalleryContextMenu::onThumbnail, this, selected_id));
enable_registrar.add("Outfit.OnEnable", boost::bind(&LLOutfitGalleryContextMenu::onEnable, this, _2));
enable_registrar.add("Outfit.OnVisible", boost::bind(&LLOutfitGalleryContextMenu::onVisible, this, _2));
return createFromFile("menu_gallery_outfit_tab.xml");
}
-void LLOutfitGalleryContextMenu::onUploadPhoto(const LLUUID& outfit_cat_id)
-{
- LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mOutfitList);
- if (gallery && outfit_cat_id.notNull())
- {
- gallery->uploadPhoto(outfit_cat_id);
- }
-}
-
-void LLOutfitGalleryContextMenu::onSelectPhoto(const LLUUID& outfit_cat_id)
-{
- LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mOutfitList);
- if (gallery && outfit_cat_id.notNull())
- {
- gallery->onSelectPhoto(outfit_cat_id);
- }
-}
-
-void LLOutfitGalleryContextMenu::onRemovePhoto(const LLUUID& outfit_cat_id)
-{
- LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mOutfitList);
- if (gallery && outfit_cat_id.notNull())
- {
- gallery->checkRemovePhoto(outfit_cat_id);
- gallery->refreshOutfit(outfit_cat_id);
- }
-}
-
-void LLOutfitGalleryContextMenu::onTakeSnapshot(const LLUUID& outfit_cat_id)
+void LLOutfitGalleryContextMenu::onThumbnail(const LLUUID& outfit_cat_id)
{
LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mOutfitList);
if (gallery && outfit_cat_id.notNull())
{
- gallery->onTakeSnapshot(outfit_cat_id);
- }
-}
-
-void LLOutfitGalleryContextMenu::onRemoveOutfit(const LLUUID& outfit_cat_id)
-{
- LLNotificationsUtil::add("DeleteOutfits", LLSD(), LLSD(), boost::bind(&LLOutfitGalleryContextMenu::onOutfitsRemovalConfirmation, this, _1, _2, outfit_cat_id));
-}
-
-void LLOutfitGalleryContextMenu::onOutfitsRemovalConfirmation(const LLSD& notification, const LLSD& response, const LLUUID& outfit_cat_id)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- if (option != 0) return; // canceled
-
- if (outfit_cat_id.notNull())
- {
- gInventory.removeCategory(outfit_cat_id);
+ LLSD data(outfit_cat_id);
+ LLFloaterReg::showInstance("change_item_thumbnail", data);
}
}
@@ -919,16 +1190,6 @@ bool LLOutfitGalleryContextMenu::onEnable(LLSD::String param)
bool LLOutfitGalleryContextMenu::onVisible(LLSD::String param)
{
- mMenuHandle.get()->getChild<LLUICtrl>("upload_photo")->setLabelArg("[UPLOAD_COST]", std::to_string(LLAgentBenefitsMgr::current().getTextureUploadCost()));
- if ("remove_photo" == param)
- {
- LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mOutfitList);
- LLUUID selected_id = mUUIDs.front();
- if (gallery && selected_id.notNull())
- {
- return !gallery->hasDefaultImage(selected_id);
- }
- }
return LLOutfitContextMenu::onVisible(param);
}
@@ -943,56 +1204,12 @@ void LLOutfitGalleryGearMenu::onUpdateItemsVisibility()
bool have_selection = getSelectedOutfitID().notNull();
mMenu->setItemVisible("expand", FALSE);
mMenu->setItemVisible("collapse", FALSE);
- mMenu->setItemVisible("upload_photo", have_selection);
- mMenu->setItemVisible("select_photo", have_selection);
- mMenu->setItemVisible("take_snapshot", have_selection);
- mMenu->setItemVisible("remove_photo", !hasDefaultImage());
+ mMenu->setItemVisible("thumbnail", have_selection);
mMenu->setItemVisible("sepatator3", TRUE);
mMenu->setItemVisible("sort_folders_by_name", TRUE);
LLOutfitListGearMenuBase::onUpdateItemsVisibility();
}
-void LLOutfitGalleryGearMenu::onUploadFoto()
-{
- LLUUID selected_outfit_id = getSelectedOutfitID();
- LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mOutfitList);
- if (gallery && selected_outfit_id.notNull())
- {
- gallery->uploadPhoto(selected_outfit_id);
- }
-}
-
-void LLOutfitGalleryGearMenu::onSelectPhoto()
-{
- LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mOutfitList);
- LLUUID selected_outfit_id = getSelectedOutfitID();
- if (gallery && !selected_outfit_id.isNull())
- {
- gallery->onSelectPhoto(selected_outfit_id);
- }
-}
-
-void LLOutfitGalleryGearMenu::onRemovePhoto()
-{
- LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mOutfitList);
- LLUUID selected_outfit_id = getSelectedOutfitID();
- if (gallery && !selected_outfit_id.isNull())
- {
- gallery->checkRemovePhoto(selected_outfit_id);
- gallery->refreshOutfit(selected_outfit_id);
- }
-}
-
-void LLOutfitGalleryGearMenu::onTakeSnapshot()
-{
- LLOutfitGallery* gallery = dynamic_cast<LLOutfitGallery*>(mOutfitList);
- LLUUID selected_outfit_id = getSelectedOutfitID();
- if (gallery && !selected_outfit_id.isNull())
- {
- gallery->onTakeSnapshot(selected_outfit_id);
- }
-}
-
void LLOutfitGalleryGearMenu::onChangeSortOrder()
{
bool sort_by_name = !gSavedSettings.getBOOL("OutfitGallerySortByName");
@@ -1019,240 +1236,89 @@ void LLOutfitGallery::onTextureSelectionChanged(LLInventoryItem* itemp)
{
}
-void LLOutfitGallery::loadPhotos()
-{
- //Iterate over inventory
- mSnapshotFolderID = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_TEXTURE);
- LLViewerInventoryCategory* textures_category = gInventory.getCategory(mSnapshotFolderID);
- if (!textures_category)
- return;
- if (mTexturesObserver == NULL)
- {
- mTexturesObserver = new LLInventoryCategoriesObserver();
- gInventory.addObserver(mTexturesObserver);
- }
-
- // Start observing changes in "Textures" category.
- mTexturesObserver->addCategory(mSnapshotFolderID,
- boost::bind(&LLOutfitGallery::refreshTextures, this, mSnapshotFolderID));
-
- textures_category->fetch();
-}
-
-void LLOutfitGallery::updateSnapshotFolderObserver()
-{
- if(mSnapshotFolderID != gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_TEXTURE))
- {
- if (gInventory.containsObserver(mTexturesObserver))
- {
- gInventory.removeObserver(mTexturesObserver);
- }
- delete mTexturesObserver;
- mTexturesObserver = NULL;
- loadPhotos();
- }
-}
-
void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)
{
LLViewerInventoryCategory* category = gInventory.getCategory(category_id);
if (category)
{
bool photo_loaded = false;
- LLInventoryModel::cat_array_t sub_cat_array;
- LLInventoryModel::item_array_t outfit_item_array;
- // Collect all sub-categories of a given category.
- gInventory.collectDescendents(
- category->getUUID(),
- sub_cat_array,
- outfit_item_array,
- LLInventoryModel::EXCLUDE_TRASH);
- BOOST_FOREACH(LLViewerInventoryItem* outfit_item, outfit_item_array)
+ LLUUID asset_id = category->getThumbnailUUID();
+ if (asset_id.isNull())
{
- LLViewerInventoryItem* linked_item = outfit_item->getLinkedItem();
- LLUUID asset_id, inv_id;
- std::string item_name;
- if (linked_item != NULL)
+ LLInventoryModel::cat_array_t sub_cat_array;
+ LLInventoryModel::item_array_t outfit_item_array;
+ // Collect all sub-categories of a given category.
+ gInventory.collectDescendents(
+ category->getUUID(),
+ sub_cat_array,
+ outfit_item_array,
+ LLInventoryModel::EXCLUDE_TRASH);
+ BOOST_FOREACH(LLViewerInventoryItem* outfit_item, outfit_item_array)
{
- if (linked_item->getActualType() == LLAssetType::AT_TEXTURE)
+ LLViewerInventoryItem* linked_item = outfit_item->getLinkedItem();
+ LLUUID asset_id, inv_id;
+ std::string item_name;
+ if (linked_item != NULL)
{
- asset_id = linked_item->getAssetUUID();
- inv_id = linked_item->getUUID();
- item_name = linked_item->getName();
+ if (linked_item->getActualType() == LLAssetType::AT_TEXTURE)
+ {
+ asset_id = linked_item->getAssetUUID();
+ inv_id = linked_item->getUUID();
+ item_name = linked_item->getName();
+ }
}
- }
- else if (outfit_item->getActualType() == LLAssetType::AT_TEXTURE)
- {
- asset_id = outfit_item->getAssetUUID();
- inv_id = outfit_item->getUUID();
- item_name = outfit_item->getName();
- }
- if (asset_id.notNull())
- {
- photo_loaded |= mOutfitMap[category_id]->setImageAssetId(asset_id);
- // Rename links
- if (!mOutfitRenamePending.isNull() && mOutfitRenamePending.asString() == item_name)
+ else if (outfit_item->getActualType() == LLAssetType::AT_TEXTURE)
+ {
+ asset_id = outfit_item->getAssetUUID();
+ inv_id = outfit_item->getUUID();
+ item_name = outfit_item->getName();
+ }
+ if (category->getThumbnailUUID().notNull())
+ {
+ asset_id = category->getThumbnailUUID();
+ }
+ if (asset_id.notNull())
{
- LLViewerInventoryCategory *outfit_cat = gInventory.getCategory(mOutfitRenamePending);
- LLStringUtil::format_map_t photo_string_args;
- photo_string_args["OUTFIT_NAME"] = outfit_cat->getName();
- std::string new_name = getString("outfit_photo_string", photo_string_args);
- LLSD updates;
- updates["name"] = new_name;
- update_inventory_item(inv_id, updates, NULL);
- mOutfitRenamePending.setNull();
- LLFloater* appearance_floater = LLFloaterReg::getInstance("appearance");
- if (appearance_floater)
+ photo_loaded |= mOutfitMap[category_id]->setImageAssetId(asset_id);
+ // Rename links
+ if (!mOutfitRenamePending.isNull() && mOutfitRenamePending.asString() == item_name)
+ {
+ LLViewerInventoryCategory *outfit_cat = gInventory.getCategory(mOutfitRenamePending);
+ LLStringUtil::format_map_t photo_string_args;
+ photo_string_args["OUTFIT_NAME"] = outfit_cat->getName();
+ std::string new_name = getString("outfit_photo_string", photo_string_args);
+ LLSD updates;
+ updates["name"] = new_name;
+ update_inventory_item(inv_id, updates, NULL);
+ mOutfitRenamePending.setNull();
+ LLFloater* appearance_floater = LLFloaterReg::getInstance("appearance");
+ if (appearance_floater)
+ {
+ appearance_floater->setFocus(TRUE);
+ }
+ }
+ if (item_name == LLAppearanceMgr::sExpectedTextureName)
{
- appearance_floater->setFocus(TRUE);
+ // Images with "appropriate" name take priority
+ break;
}
}
- if (item_name == LLAppearanceMgr::sExpectedTextureName)
+ if (!photo_loaded)
{
- // Images with "appropriate" name take priority
- break;
+ mOutfitMap[category_id]->setDefaultImage();
}
}
- if (!photo_loaded)
- {
- mOutfitMap[category_id]->setDefaultImage();
- }
- }
- }
-
- if (mGalleryCreated && !LLApp::isExiting())
- {
- reArrangeRows();
- }
-}
-
-// Refresh linked textures from "textures" uploads folder
-void LLOutfitGallery::refreshTextures(const LLUUID& category_id)
-{
- LLInventoryModel::cat_array_t cat_array;
- LLInventoryModel::item_array_t item_array;
-
- // Collect all sub-categories of a given category.
- LLIsType is_texture(LLAssetType::AT_TEXTURE);
- gInventory.collectDescendentsIf(
- category_id,
- cat_array,
- item_array,
- LLInventoryModel::EXCLUDE_TRASH,
- is_texture);
-
- //Find texture which contain pending outfit ID string in name
- LLViewerInventoryItem* photo_upload_item = NULL;
- BOOST_FOREACH(LLViewerInventoryItem* item, item_array)
- {
- std::string name = item->getName();
- if (!mOutfitLinkPending.isNull() && name == mOutfitLinkPending.asString())
- {
- photo_upload_item = item;
- break;
- }
- }
-
- if (photo_upload_item != NULL)
- {
- LLUUID photo_item_id = photo_upload_item->getUUID();
- LLInventoryObject* upload_object = gInventory.getObject(photo_item_id);
- if (!upload_object)
- {
- LL_WARNS() << "LLOutfitGallery::refreshTextures added_object is null!" << LL_ENDL;
}
else
{
- linkPhotoToOutfit(photo_item_id, mOutfitLinkPending);
- mOutfitRenamePending = mOutfitLinkPending;
- mOutfitLinkPending.setNull();
+ mOutfitMap[category_id]->setImageAssetId(asset_id);
}
}
-}
-
-void LLOutfitGallery::uploadPhoto(LLUUID outfit_id)
-{
- outfit_map_t::iterator outfit_it = mOutfitMap.find(outfit_id);
- if (outfit_it == mOutfitMap.end() || outfit_it->first.isNull())
- {
- return;
- }
- LLFilePickerReplyThread::startPicker(boost::bind(&LLOutfitGallery::uploadOutfitImage, this, _1, outfit_id), LLFilePicker::FFLOAD_IMAGE, false);
-}
-
-void LLOutfitGallery::uploadOutfitImage(const std::vector<std::string>& filenames, LLUUID outfit_id)
-{
- std::string filename = filenames[0];
- LLLocalBitmap* unit = new LLLocalBitmap(filename);
- if (unit->getValid())
+
+ if (mGalleryCreated && !LLApp::isExiting())
{
- std::string exten = gDirUtilp->getExtension(filename);
- U32 codec = LLImageBase::getCodecFromExtension(exten);
-
- LLImageDimensionsInfo image_info;
- std::string image_load_error;
- if (!image_info.load(filename, codec))
- {
- image_load_error = image_info.getLastError();
- }
-
- S32 max_width = MAX_OUTFIT_PHOTO_WIDTH;
- S32 max_height = MAX_OUTFIT_PHOTO_HEIGHT;
-
- if ((image_info.getWidth() > max_width) || (image_info.getHeight() > max_height))
- {
- LLStringUtil::format_map_t args;
- args["WIDTH"] = llformat("%d", max_width);
- args["HEIGHT"] = llformat("%d", max_height);
-
- image_load_error = LLTrans::getString("outfit_photo_load_dimensions_error", args);
- }
-
- if (!image_load_error.empty())
- {
- LLSD subst;
- subst["REASON"] = image_load_error;
- LLNotificationsUtil::add("OutfitPhotoLoadError", subst);
- return;
- }
-
- S32 expected_upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost();
- void *nruserdata = NULL;
- nruserdata = (void *)&outfit_id;
-
- LLViewerInventoryCategory *outfit_cat = gInventory.getCategory(outfit_id);
- if (!outfit_cat) return;
- updateSnapshotFolderObserver();
- checkRemovePhoto(outfit_id);
- std::string upload_pending_name = outfit_id.asString();
- std::string upload_pending_desc = "";
- upload_new_resource(filename, // file
- upload_pending_name,
- upload_pending_desc,
- 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
- LLFloaterPerms::getNextOwnerPerms("Uploads"),
- LLFloaterPerms::getGroupPerms("Uploads"),
- LLFloaterPerms::getEveryonePerms("Uploads"),
- upload_pending_name, LLAssetStorage::LLStoreAssetCallback(), expected_upload_cost, nruserdata, false);
- mOutfitLinkPending = outfit_id;
+ reArrangeRows();
}
- delete unit;
-}
-
-void LLOutfitGallery::linkPhotoToOutfit(LLUUID photo_id, LLUUID outfit_id)
-{
- LLPointer<LLInventoryCallback> cb = new LLUpdateGalleryOnPhotoLinked();
- link_inventory_object(outfit_id, photo_id, cb);
-}
-
-bool LLOutfitGallery::checkRemovePhoto(LLUUID outfit_id)
-{
- LLAppearanceMgr::instance().removeOutfitPhoto(outfit_id);
- return true;
-}
-
-void LLUpdateGalleryOnPhotoLinked::fire(const LLUUID& inv_item_id)
-{
}
LLUUID LLOutfitGallery::getPhotoAssetId(const LLUUID& outfit_id)
@@ -1270,150 +1336,3 @@ LLUUID LLOutfitGallery::getDefaultPhoto()
return LLUUID();
}
-void LLOutfitGallery::onTexturePickerCommit(LLTextureCtrl::ETexturePickOp op, LLUUID id)
-{
- LLUUID selected_outfit_id = getSelectedOutfitUUID();
-
- if (selected_outfit_id.isNull())
- {
- return;
- }
-
- LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)mFloaterHandle.get();
-
- if (floaterp && op == LLTextureCtrl::TEXTURE_SELECT)
- {
- LLUUID image_item_id;
- if (id.notNull())
- {
- image_item_id = id;
- }
- else
- {
- image_item_id = floaterp->findItemID(floaterp->getAssetID(), FALSE, TRUE);
- if (image_item_id.isNull())
- {
- LL_WARNS() << "id or image_item_id is NULL!" << LL_ENDL;
- return;
- }
- }
-
- std::string image_load_error;
- S32 max_width = MAX_OUTFIT_PHOTO_WIDTH;
- S32 max_height = MAX_OUTFIT_PHOTO_HEIGHT;
- if (mTextureSelected.isNull() ||
- mTextureSelected->getFullWidth() == 0 ||
- mTextureSelected->getFullHeight() == 0)
- {
- image_load_error = LLTrans::getString("outfit_photo_verify_dimensions_error");
- LL_WARNS() << "Cannot verify selected texture dimensions" << LL_ENDL;
- return;
- }
- S32 width = mTextureSelected->getFullWidth();
- S32 height = mTextureSelected->getFullHeight();
- if ((width > max_width) || (height > max_height))
- {
- LLStringUtil::format_map_t args;
- args["WIDTH"] = llformat("%d", max_width);
- args["HEIGHT"] = llformat("%d", max_height);
-
- image_load_error = LLTrans::getString("outfit_photo_select_dimensions_error", args);
- }
-
- if (!image_load_error.empty())
- {
- LLSD subst;
- subst["REASON"] = image_load_error;
- LLNotificationsUtil::add("OutfitPhotoLoadError", subst);
- return;
- }
-
- checkRemovePhoto(selected_outfit_id);
- linkPhotoToOutfit(image_item_id, selected_outfit_id);
- }
-}
-
-void LLOutfitGallery::onSelectPhoto(LLUUID selected_outfit_id)
-{
- if (selected_outfit_id.notNull())
- {
-
- // show hourglass cursor when loading inventory window
- // because inventory construction is slooow
- getWindow()->setCursor(UI_CURSOR_WAIT);
- LLFloater* floaterp = mFloaterHandle.get();
-
- // Show the dialog
- if (floaterp)
- {
- floaterp->openFloater();
- }
- else
- {
- floaterp = new LLFloaterTexturePicker(
- this,
- getPhotoAssetId(selected_outfit_id),
- getPhotoAssetId(selected_outfit_id),
- getPhotoAssetId(selected_outfit_id),
- FALSE,
- TRUE,
- "SELECT PHOTO",
- PERM_NONE,
- PERM_NONE,
- FALSE,
- NULL);
-
- mFloaterHandle = floaterp->getHandle();
- mTextureSelected = NULL;
-
- LLFloaterTexturePicker* texture_floaterp = dynamic_cast<LLFloaterTexturePicker*>(floaterp);
- if (texture_floaterp)
- {
- texture_floaterp->setTextureSelectedCallback(boost::bind(&LLOutfitGallery::onTextureSelectionChanged, this, _1));
- texture_floaterp->setOnFloaterCommitCallback(boost::bind(&LLOutfitGallery::onTexturePickerCommit, this, _1, _2));
- texture_floaterp->setOnUpdateImageStatsCallback(boost::bind(&LLOutfitGallery::onTexturePickerUpdateImageStats, this, _1));
- texture_floaterp->setLocalTextureEnabled(FALSE);
- texture_floaterp->setBakeTextureEnabled(FALSE);
- texture_floaterp->setCanApply(false, true);
- }
-
- floaterp->openFloater();
- }
- floaterp->setFocus(TRUE);
- }
-}
-
-void LLOutfitGallery::onTakeSnapshot(LLUUID selected_outfit_id)
-{
- LLFloaterReg::toggleInstanceOrBringToFront("simple_outfit_snapshot");
- LLFloaterSimpleOutfitSnapshot* snapshot_floater = LLFloaterSimpleOutfitSnapshot::getInstance();
- if (snapshot_floater)
- {
- snapshot_floater->setOutfitID(selected_outfit_id);
- snapshot_floater->getInstance()->setGallery(this);
- }
-}
-
-void LLOutfitGallery::onBeforeOutfitSnapshotSave()
-{
- LLUUID selected_outfit_id = getSelectedOutfitUUID();
- if (!selected_outfit_id.isNull())
- {
- checkRemovePhoto(selected_outfit_id);
- updateSnapshotFolderObserver();
- }
-}
-
-void LLOutfitGallery::onAfterOutfitSnapshotSave()
-{
- LLUUID selected_outfit_id = getSelectedOutfitUUID();
- if (!selected_outfit_id.isNull())
- {
- mOutfitLinkPending = selected_outfit_id;
- }
-}
-
-void LLOutfitGallery::onTexturePickerUpdateImageStats(LLPointer<LLViewerTexture> texture)
-{
- mTextureSelected = texture;
-}
diff --git a/indra/newview/lloutfitgallery.h b/indra/newview/lloutfitgallery.h
index ce5c090134..9915752962 100644
--- a/indra/newview/lloutfitgallery.h
+++ b/indra/newview/lloutfitgallery.h
@@ -33,7 +33,6 @@
#include "lllayoutstack.h"
#include "lloutfitslist.h"
#include "llpanelappearancetab.h"
-#include "lltexturectrl.h"
#include "llviewertexture.h"
#include <vector>
@@ -44,15 +43,6 @@ class LLOutfitListGearMenuBase;
class LLOutfitGalleryGearMenu;
class LLOutfitGalleryContextMenu;
-class LLUpdateGalleryOnPhotoLinked : public LLInventoryCallback
-{
-public:
- LLUpdateGalleryOnPhotoLinked(){}
- virtual ~LLUpdateGalleryOnPhotoLinked(){}
- /* virtual */ void fire(const LLUUID& inv_item_id);
-private:
-};
-
class LLOutfitGallery : public LLOutfitListBase
{
public:
@@ -83,10 +73,19 @@ public:
/*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& info);
- /*virtual*/ void draw();
-
- void onSelectPhoto(LLUUID selected_outfit_id);
- void onTakeSnapshot(LLUUID selected_outfit_id);
+ /*virtual*/ void draw();
+ /*virtual*/ BOOL handleKeyHere(KEY key, MASK mask);
+ void moveUp();
+ void moveDown();
+ void moveLeft();
+ void moveRight();
+
+ /*virtual*/ void onFocusLost();
+ /*virtual*/ void onFocusReceived();
+
+ static void onRemoveOutfit(const LLUUID& outfit_cat_id);
+ static void onOutfitsRemovalConfirmation(const LLSD& notification, const LLSD& response, const LLUUID& outfit_cat_id);
+ void scrollToShowItem(const LLUUID& item_id);
void wearSelectedOutfit();
@@ -106,14 +105,8 @@ public:
void updateMessageVisibility();
bool hasDefaultImage(const LLUUID& outfit_cat_id);
- void refreshTextures(const LLUUID& category_id);
void refreshOutfit(const LLUUID& category_id);
- void onTexturePickerCommit(LLTextureCtrl::ETexturePickOp op, LLUUID id);
- void onTexturePickerUpdateImageStats(LLPointer<LLViewerTexture> texture);
- void onBeforeOutfitSnapshotSave();
- void onAfterOutfitSnapshotSave();
-
protected:
/*virtual*/ void onHighlightBaseOutfit(LLUUID base_id, LLUUID prev_id);
/*virtual*/ void onSetSelectedOutfitByUUID(const LLUUID& outfit_uuid);
@@ -127,14 +120,8 @@ protected:
void applyFilter(LLOutfitGalleryItem* item, const std::string& filter_substring);
private:
- void loadPhotos();
- void uploadPhoto(LLUUID outfit_id);
- void uploadOutfitImage(const std::vector<std::string>& filenames, LLUUID outfit_id);
- void updateSnapshotFolderObserver();
LLUUID getPhotoAssetId(const LLUUID& outfit_id);
LLUUID getDefaultPhoto();
- void linkPhotoToOutfit(LLUUID outfit_id, LLUUID photo_id);
- bool checkRemovePhoto(LLUUID outfit_id);
void addToGallery(LLOutfitGalleryItem* item);
void removeFromGalleryLast(LLOutfitGalleryItem* item);
void removeFromGalleryMiddle(LLOutfitGalleryItem* item);
@@ -150,6 +137,7 @@ private:
void updateGalleryWidth();
LLOutfitGalleryItem* buildGalleryItem(std::string name, LLUUID outfit_id);
+ LLOutfitGalleryItem* getSelectedItem();
void onTextureSelectionChanged(LLInventoryItem* itemp);
@@ -190,17 +178,15 @@ private:
LLListContextMenu* mOutfitGalleryMenu;
- LLHandle<LLFloater> mFloaterHandle;
-
typedef std::map<LLUUID, LLOutfitGalleryItem*> outfit_map_t;
typedef outfit_map_t::value_type outfit_map_value_t;
outfit_map_t mOutfitMap;
- typedef std::map<LLOutfitGalleryItem*, int> item_num_map_t;
+ typedef std::map<LLOutfitGalleryItem*, S32> item_num_map_t;
typedef item_num_map_t::value_type item_numb_map_value_t;
item_num_map_t mItemIndexMap;
+ std::map<S32, LLOutfitGalleryItem*> mIndexToItemMap;
- LLInventoryCategoriesObserver* mTexturesObserver;
LLInventoryCategoriesObserver* mOutfitsObserver;
};
class LLOutfitGalleryContextMenu : public LLOutfitContextMenu
@@ -211,17 +197,13 @@ public:
LLOutfitGalleryContextMenu(LLOutfitListBase* outfit_list)
: LLOutfitContextMenu(outfit_list),
mOutfitList(outfit_list){}
+
protected:
/* virtual */ LLContextMenu* createMenu();
bool onEnable(LLSD::String param);
bool onVisible(LLSD::String param);
- void onUploadPhoto(const LLUUID& outfit_cat_id);
- void onSelectPhoto(const LLUUID& outfit_cat_id);
- void onRemovePhoto(const LLUUID& outfit_cat_id);
- void onTakeSnapshot(const LLUUID& outfit_cat_id);
+ void onThumbnail(const LLUUID& outfit_cat_id);
void onCreate(const LLSD& data);
- void onRemoveOutfit(const LLUUID& outfit_cat_id);
- void onOutfitsRemovalConfirmation(const LLSD& notification, const LLSD& response, const LLUUID& outfit_cat_id);
private:
LLOutfitListBase* mOutfitList;
};
@@ -236,10 +218,6 @@ public:
protected:
/*virtual*/ void onUpdateItemsVisibility();
private:
- /*virtual*/ void onUploadFoto();
- /*virtual*/ void onSelectPhoto();
- /*virtual*/ void onTakeSnapshot();
- /*virtual*/ void onRemovePhoto();
/*virtual*/ void onChangeSortOrder();
bool hasDefaultImage();
@@ -259,14 +237,21 @@ public:
/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleKeyHere(KEY key, MASK mask);
+ /*virtual*/ void onFocusLost();
+ /*virtual*/ void onFocusReceived();
+
+ bool openOutfitsContent();
+ void setGallery(LLOutfitGallery* gallery) { mGallery = gallery; }
void setDefaultImage();
bool setImageAssetId(LLUUID asset_id);
LLUUID getImageAssetId();
void setOutfitName(std::string name);
void setOutfitWorn(bool value);
void setSelected(bool value);
- void setUUID(LLUUID outfit_id) {mUUID = outfit_id;}
+ void setUUID(const LLUUID &outfit_id) {mUUID = outfit_id;}
+ LLUUID getUUID() const { return mUUID; }
std::string getItemName() {return mOutfitName;}
bool isDefaultImage() {return mDefaultImage;}
@@ -275,6 +260,7 @@ public:
void setHidden(bool hidden) {mHidden = hidden;}
private:
+ LLOutfitGallery* mGallery;
LLPointer<LLViewerFetchedTexture> mTexturep;
LLUUID mUUID;
LLUUID mImageAssetId;
diff --git a/indra/newview/lloutfitobserver.cpp b/indra/newview/lloutfitobserver.cpp
index 5bb69367aa..3ec5bcd9fc 100644
--- a/indra/newview/lloutfitobserver.cpp
+++ b/indra/newview/lloutfitobserver.cpp
@@ -34,7 +34,6 @@
LLOutfitObserver::LLOutfitObserver() :
mCOFLastVersion(LLViewerInventoryCategory::VERSION_UNKNOWN)
{
- mItemNameHash.finalize();
gInventory.addObserver(this);
}
@@ -83,7 +82,7 @@ bool LLOutfitObserver::checkCOF()
return false;
bool cof_changed = false;
- LLMD5 item_name_hash = gInventory.hashDirectDescendentNames(cof);
+ LLUUID item_name_hash = gInventory.hashDirectDescendentNames(cof);
if (item_name_hash != mItemNameHash)
{
cof_changed = true;
diff --git a/indra/newview/lloutfitobserver.h b/indra/newview/lloutfitobserver.h
index 77041db68d..2f136d48e8 100644
--- a/indra/newview/lloutfitobserver.h
+++ b/indra/newview/lloutfitobserver.h
@@ -28,7 +28,6 @@
#define LL_OUTFITOBSERVER_H
#include "llsingleton.h"
-#include "llmd5.h"
/**
* Outfit observer facade that provides simple possibility to subscribe on
@@ -78,7 +77,7 @@ protected:
bool mLastOutfitDirtiness;
- LLMD5 mItemNameHash;
+ LLUUID mItemNameHash;
private:
signal_t mBOFReplaced;
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index 4171fd8822..5c7792b0df 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -35,7 +35,7 @@
#include "llaccordionctrltab.h"
#include "llagentwearables.h"
#include "llappearancemgr.h"
-#include "llagentbenefits.h"
+#include "llfloaterreg.h"
#include "llfloatersidepanelcontainer.h"
#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
@@ -122,9 +122,8 @@ void LLOutfitsList::onOpen(const LLSD& info)
{
if (!mIsInitialized)
{
- const LLUUID cof = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
// Start observing changes in Current Outfit category.
- mCategoriesObserver->addCategory(cof, boost::bind(&LLOutfitsList::onCOFChanged, this));
+ LLOutfitObserver::instance().addCOFChangedCallback(boost::bind(&LLOutfitsList::onCOFChanged, this));
}
LLOutfitListBase::onOpen(info);
@@ -1112,10 +1111,7 @@ LLOutfitListGearMenuBase::LLOutfitListGearMenuBase(LLOutfitListBase* olist)
registrar.add("Gear.WearAdd", boost::bind(&LLOutfitListGearMenuBase::onAdd, this));
- registrar.add("Gear.UploadPhoto", boost::bind(&LLOutfitListGearMenuBase::onUploadFoto, this));
- registrar.add("Gear.SelectPhoto", boost::bind(&LLOutfitListGearMenuBase::onSelectPhoto, this));
- registrar.add("Gear.TakeSnapshot", boost::bind(&LLOutfitListGearMenuBase::onTakeSnapshot, this));
- registrar.add("Gear.RemovePhoto", boost::bind(&LLOutfitListGearMenuBase::onRemovePhoto, this));
+ registrar.add("Gear.Thumbnail", boost::bind(&LLOutfitListGearMenuBase::onThumbnail, this));
registrar.add("Gear.SortByName", boost::bind(&LLOutfitListGearMenuBase::onChangeSortOrder, this));
enable_registrar.add("Gear.OnEnable", boost::bind(&LLOutfitListGearMenuBase::onEnable, this, _2));
@@ -1232,7 +1228,6 @@ bool LLOutfitListGearMenuBase::onEnable(LLSD::String param)
bool LLOutfitListGearMenuBase::onVisible(LLSD::String param)
{
- getMenu()->getChild<LLUICtrl>("upload_photo")->setLabelArg("[UPLOAD_COST]", std::to_string(LLAgentBenefitsMgr::current().getTextureUploadCost()));
const LLUUID& selected_outfit_id = getSelectedOutfitID();
if (selected_outfit_id.isNull()) // no selection or invalid outfit selected
{
@@ -1251,24 +1246,11 @@ bool LLOutfitListGearMenuBase::onVisible(LLSD::String param)
return true;
}
-void LLOutfitListGearMenuBase::onUploadFoto()
+void LLOutfitListGearMenuBase::onThumbnail()
{
-
-}
-
-void LLOutfitListGearMenuBase::onSelectPhoto()
-{
-
-}
-
-void LLOutfitListGearMenuBase::onTakeSnapshot()
-{
-
-}
-
-void LLOutfitListGearMenuBase::onRemovePhoto()
-{
-
+ const LLUUID& selected_outfit_id = getSelectedOutfitID();
+ LLSD data(selected_outfit_id);
+ LLFloaterReg::showInstance("change_item_thumbnail", data);
}
void LLOutfitListGearMenuBase::onChangeSortOrder()
@@ -1288,10 +1270,7 @@ void LLOutfitListGearMenu::onUpdateItemsVisibility()
if (!mMenu) return;
mMenu->setItemVisible("expand", TRUE);
mMenu->setItemVisible("collapse", TRUE);
- mMenu->setItemVisible("upload_photo", FALSE);
- mMenu->setItemVisible("select_photo", FALSE);
- mMenu->setItemVisible("take_snapshot", FALSE);
- mMenu->setItemVisible("remove_photo", FALSE);
+ mMenu->setItemVisible("thumbnail", FALSE); // Never visible?
mMenu->setItemVisible("sepatator3", FALSE);
mMenu->setItemVisible("sort_folders_by_name", FALSE);
LLOutfitListGearMenuBase::onUpdateItemsVisibility();
diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h
index 81be8de94f..66b3165169 100644
--- a/indra/newview/lloutfitslist.h
+++ b/indra/newview/lloutfitslist.h
@@ -163,10 +163,7 @@ public:
protected:
virtual void onUpdateItemsVisibility();
- virtual void onUploadFoto();
- virtual void onSelectPhoto();
- virtual void onTakeSnapshot();
- virtual void onRemovePhoto();
+ virtual void onThumbnail();
virtual void onChangeSortOrder();
const LLUUID& getSelectedOutfitID();
diff --git a/indra/newview/llpaneleditsky.cpp b/indra/newview/llpaneleditsky.cpp
index 761d856aae..839f25761a 100644
--- a/indra/newview/llpaneleditsky.cpp
+++ b/indra/newview/llpaneleditsky.cpp
@@ -217,7 +217,7 @@ void LLPanelSettingsSkyAtmosTab::refresh()
getChild<LLUICtrl>(FIELD_SKY_DENSITY_ICE_LEVEL)->setValue(ice_level);
getChild<LLUICtrl>(FIELD_REFLECTION_PROBE_AMBIANCE)->setValue(rp_ambiance);
- updateGammaLabel();
+ updateGammaLabel(should_auto_adjust);
}
//-------------------------------------------------------------------------
@@ -335,17 +335,19 @@ void LLPanelSettingsSkyAtmosTab::onReflectionProbeAmbianceChanged()
}
-void LLPanelSettingsSkyAtmosTab::updateGammaLabel()
+void LLPanelSettingsSkyAtmosTab::updateGammaLabel(bool auto_adjust)
{
if (!mSkySettings) return;
- F32 ambiance = mSkySettings->getReflectionProbeAmbiance();
+ F32 ambiance = mSkySettings->getReflectionProbeAmbiance(auto_adjust);
if (ambiance != 0.f)
{
childSetValue("scene_gamma_label", getString("hdr_string"));
+ getChild<LLUICtrl>(FIELD_SKY_SCENE_GAMMA)->setToolTip(getString("hdr_tooltip"));
}
else
{
childSetValue("scene_gamma_label", getString("brightness_string"));
+ getChild<LLUICtrl>(FIELD_SKY_SCENE_GAMMA)->setToolTip(std::string());
}
}
diff --git a/indra/newview/llpaneleditsky.h b/indra/newview/llpaneleditsky.h
index 33af667ab7..523cc134a8 100644
--- a/indra/newview/llpaneleditsky.h
+++ b/indra/newview/llpaneleditsky.h
@@ -80,7 +80,7 @@ private:
void onDropletRadiusChanged();
void onIceLevelChanged();
void onReflectionProbeAmbianceChanged();
- void updateGammaLabel();
+ void updateGammaLabel(bool auto_adjust = false);
};
diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp
index 5c209bc4c6..cb69f72288 100644
--- a/indra/newview/llpaneleditwearable.cpp
+++ b/indra/newview/llpaneleditwearable.cpp
@@ -1664,7 +1664,7 @@ class LLMetricSystemHandler : public LLCommandHandler
public:
LLMetricSystemHandler() : LLCommandHandler("metricsystem", UNTRUSTED_CLICK_ONLY) { }
- bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
+ bool handle(const LLSD& params, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web)
{
// change height units TRUE for meters and FALSE for feet
BOOL new_value = (gSavedSettings.getBOOL("HeightUnits") == FALSE) ? TRUE : FALSE;
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index ba379f77d8..cb28fb4770 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -51,6 +51,7 @@
#include "llinventorymodelbackgroundfetch.h"
#include "llfloatermediasettings.h"
#include "llfloaterreg.h"
+#include "llfloatertools.h"
#include "lllineeditor.h"
#include "llmaterialmgr.h"
#include "llmaterialeditor.h"
@@ -77,6 +78,7 @@
#include "llviewerregion.h"
#include "llviewerstats.h"
#include "llvovolume.h"
+#include "llvoinventorylistener.h"
#include "lluictrlfactory.h"
#include "llpluginclassmedia.h"
#include "llviewertexturelist.h"// Update sel manager as to which channel we're editing so it can reflect the correct overlay UI
@@ -328,7 +330,7 @@ BOOL LLPanelFace::postBuild()
pbr_ctrl->setImmediateFilterPermMask(PERM_NONE);
pbr_ctrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER);
pbr_ctrl->setBakeTextureEnabled(false);
- pbr_ctrl->setInventoryPickType(EPickInventoryType::MATERIAL);
+ pbr_ctrl->setInventoryPickType(LLTextureCtrl::PICK_MATERIAL);
}
mTextureCtrl = getChild<LLTextureCtrl>("texture control");
@@ -490,6 +492,15 @@ LLPanelFace::~LLPanelFace()
unloadMedia();
}
+void LLPanelFace::onVisibilityChange(BOOL new_visibility)
+{
+ if (new_visibility)
+ {
+ gAgent.showLatestFeatureNotification("gltf");
+ }
+ LLPanel::onVisibilityChange(new_visibility);
+}
+
void LLPanelFace::draw()
{
updateCopyTexButton();
@@ -504,6 +515,7 @@ void LLPanelFace::draw()
if (sMaterialOverrideSelection.update())
{
setMaterialOverridesFromSelection();
+ LLMaterialEditor::updateLive();
}
}
@@ -520,7 +532,11 @@ void LLPanelFace::sendTexture()
{
id = mTextureCtrl->getImageAssetID();
}
- LLSelectMgr::getInstance()->selectionSetImage(id);
+ if (!LLSelectMgr::getInstance()->selectionSetImage(id))
+ {
+ // need to refresh value in texture ctrl
+ refresh();
+ }
}
}
@@ -987,16 +1003,19 @@ void LLPanelFace::getState()
void LLPanelFace::updateUI(bool force_set_values /*false*/)
{ //set state of UI to match state of texture entry(ies) (calls setEnabled, setValue, etc, but NOT setVisible)
- LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getFirstObject();
+ LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstNode();
+ LLViewerObject* objectp = node ? node->getObject() : NULL;
- if( objectp
+ if (objectp
&& objectp->getPCode() == LL_PCODE_VOLUME
&& objectp->permModify())
{
BOOL editable = objectp->permModify() && !objectp->isPermanentEnforced();
+ BOOL attachment = objectp->isAttachment();
bool has_pbr_material;
- updateUIGLTF(objectp, has_pbr_material, force_set_values);
+ bool has_faces_without_pbr;
+ updateUIGLTF(objectp, has_pbr_material, has_faces_without_pbr, force_set_values);
const bool has_material = !has_pbr_material;
@@ -1017,9 +1036,68 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
}
}
+ // *NOTE: The "identical" variable is currently only used to decide if
+ // the texgen control should be tentative - this is not used by GLTF
+ // materials. -Cosmic;2022-11-09
+ bool identical = true; // true because it is anded below
+ bool identical_diffuse = false;
+ bool identical_norm = false;
+ bool identical_spec = false;
+
+ LLTextureCtrl *texture_ctrl = getChild<LLTextureCtrl>("texture control");
+ LLTextureCtrl *shinytexture_ctrl = getChild<LLTextureCtrl>("shinytexture control");
+ LLTextureCtrl *bumpytexture_ctrl = getChild<LLTextureCtrl>("bumpytexture control");
+
+ LLUUID id;
+ LLUUID normmap_id;
+ LLUUID specmap_id;
+
+ LLSelectedTE::getTexId(id, identical_diffuse);
+ LLSelectedTEMaterial::getNormalID(normmap_id, identical_norm);
+ LLSelectedTEMaterial::getSpecularID(specmap_id, identical_spec);
+
+ static S32 selected_te = -1;
+ static LLUUID prev_obj_id;
+ if ((LLToolFace::getInstance() == LLToolMgr::getInstance()->getCurrentTool()) &&
+ !LLSelectMgr::getInstance()->getSelection()->isMultipleTESelected())
+ {
+ S32 new_selection = -1; // Don't use getLastSelectedTE, it could have been deselected
+ S32 num_tes = llmin((S32)objectp->getNumTEs(), (S32)objectp->getNumFaces());
+ for (S32 te = 0; te < num_tes; ++te)
+ {
+ if (node->isTESelected(te))
+ {
+ new_selection = te;
+ break;
+ }
+ }
+
+ if ((new_selection != selected_te)
+ || (prev_obj_id != objectp->getID()))
+ {
+ bool te_has_media = objectp->getTE(new_selection) && objectp->getTE(new_selection)->hasMedia();
+ bool te_has_pbr = objectp->getRenderMaterialID(new_selection).notNull();
+
+ if (te_has_pbr && !((mComboMatMedia->getCurrentIndex() == MATMEDIA_MEDIA) && te_has_media))
+ {
+ mComboMatMedia->selectNthItem(MATMEDIA_PBR);
+ }
+ else if (te_has_media)
+ {
+ mComboMatMedia->selectNthItem(MATMEDIA_MEDIA);
+ }
+ else if (id.notNull() || normmap_id.notNull() || specmap_id.notNull())
+ {
+ mComboMatMedia->selectNthItem(MATMEDIA_MATERIAL);
+ }
+ selected_te = new_selection;
+ prev_obj_id = objectp->getID();
+ }
+ }
+
mComboMatMedia->setEnabled(editable);
- LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");
+ LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");
if (radio_mat_type->getSelectedIndex() < MATTYPE_DIFFUSE)
{
radio_mat_type->selectNthItem(MATTYPE_DIFFUSE);
@@ -1038,34 +1116,18 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
getChildView("checkbox_sync_settings")->setEnabled(editable);
childSetValue("checkbox_sync_settings", gSavedSettings.getBOOL("SyncMaterialSettings"));
- updateVisibility();
+ updateVisibility(objectp);
- // *NOTE: The "identical" variable is currently only used to decide if
- // the texgen control should be tentative - this is not used by GLTF
- // materials. -Cosmic;2022-11-09
- bool identical = true; // true because it is anded below
- bool identical_diffuse = false;
- bool identical_norm = false;
- bool identical_spec = false;
-
- LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("texture control");
- LLTextureCtrl* shinytexture_ctrl = getChild<LLTextureCtrl>("shinytexture control");
- LLTextureCtrl* bumpytexture_ctrl = getChild<LLTextureCtrl>("bumpytexture control");
-
- LLUUID id;
- LLUUID normmap_id;
- LLUUID specmap_id;
-
// Color swatch
{
getChildView("color label")->setEnabled(editable);
}
- LLColorSwatchCtrl* color_swatch = findChild<LLColorSwatchCtrl>("colorswatch");
+ LLColorSwatchCtrl* color_swatch = findChild<LLColorSwatchCtrl>("colorswatch");
- LLColor4 color = LLColor4::white;
- bool identical_color = false;
+ LLColor4 color = LLColor4::white;
+ bool identical_color = false;
- if(color_swatch)
+ if (color_swatch)
{
LLSelectedTE::getColor(color, identical_color);
LLColor4 prev_color = color_swatch->get();
@@ -1085,9 +1147,6 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
getChild<LLUICtrl>("ColorTrans")->setValue(editable ? transparency : 0);
getChildView("ColorTrans")->setEnabled(editable && has_material);
- // Specular map
- LLSelectedTEMaterial::getSpecularID(specmap_id, identical_spec);
-
U8 shiny = 0;
bool identical_shiny = false;
@@ -1099,7 +1158,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
LLCtrlSelectionInterface* combobox_shininess = childGetSelectionInterface("combobox shininess");
if (combobox_shininess)
- {
+ {
combobox_shininess->selectNthItem((S32)shiny);
}
@@ -1119,8 +1178,8 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
getChild<LLUICtrl>("shinycolorswatch")->setTentative(!identical_spec);
LLColorSwatchCtrl* mShinyColorSwatch = getChild<LLColorSwatchCtrl>("shinycolorswatch");
- if(mShinyColorSwatch)
- {
+ if (mShinyColorSwatch)
+ {
mShinyColorSwatch->setValid(editable);
mShinyColorSwatch->setEnabled( editable );
mShinyColorSwatch->setCanApplyImmediately( editable );
@@ -1138,50 +1197,45 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
bumpy = norm_map_id.isNull() ? bumpy : BUMPY_TEXTURE;
if (combobox_bumpiness)
- {
+ {
combobox_bumpiness->selectNthItem((S32)bumpy);
- }
+ }
else
- {
+ {
LL_WARNS() << "failed childGetSelectionInterface for 'combobox bumpiness'" << LL_ENDL;
- }
+ }
getChildView("combobox bumpiness")->setEnabled(editable);
getChild<LLUICtrl>("combobox bumpiness")->setTentative(!identical_bumpy);
getChildView("label bumpiness")->setEnabled(editable);
- }
+ }
// Texture
{
- LLSelectedTE::getTexId(id,identical_diffuse);
-
- // Normal map
- LLSelectedTEMaterial::getNormalID(normmap_id, identical_norm);
-
mIsAlpha = FALSE;
LLGLenum image_format = GL_RGB;
bool identical_image_format = false;
LLSelectedTE::getImageFormat(image_format, identical_image_format);
- mIsAlpha = FALSE;
- switch (image_format)
- {
- case GL_RGBA:
- case GL_ALPHA:
- {
- mIsAlpha = TRUE;
- }
- break;
-
- case GL_RGB: break;
- default:
- {
- LL_WARNS() << "Unexpected tex format in LLPanelFace...resorting to no alpha" << LL_ENDL;
- }
- break;
+ mIsAlpha = FALSE;
+ switch (image_format)
+ {
+ case GL_RGBA:
+ case GL_ALPHA:
+ {
+ mIsAlpha = TRUE;
}
+ break;
- if(LLViewerMedia::getInstance()->textureHasMedia(id))
+ case GL_RGB: break;
+ default:
+ {
+ LL_WARNS() << "Unexpected tex format in LLPanelFace...resorting to no alpha" << LL_ENDL;
+ }
+ break;
+ }
+
+ if (LLViewerMedia::getInstance()->textureHasMedia(id))
{
getChildView("button align")->setEnabled(editable);
}
@@ -1233,7 +1287,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
}
else if (id.isNull())
{
- // None selected
+ // None selected
texture_ctrl->setTentative(FALSE);
texture_ctrl->setEnabled(FALSE);
texture_ctrl->setImageAssetID(LLUUID::null);
@@ -1246,7 +1300,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
}
else
{
- // Tentative: multiple selected with different textures
+ // Tentative: multiple selected with different textures
texture_ctrl->setTentative(TRUE);
texture_ctrl->setEnabled(editable && !has_pbr_material);
texture_ctrl->setImageAssetID(id);
@@ -1257,7 +1311,18 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
texture_ctrl->setBakeTextureEnabled(TRUE);
}
-
+
+ if (attachment)
+ {
+ // attachments are in world and in inventory,
+ // server doesn't support changing permissions
+ // in such case
+ texture_ctrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
+ }
+ else
+ {
+ texture_ctrl->setImmediateFilterPermMask(PERM_NONE);
+ }
}
if (shinytexture_ctrl)
@@ -1265,6 +1330,15 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
shinytexture_ctrl->setTentative( !identical_spec );
shinytexture_ctrl->setEnabled( editable && !has_pbr_material);
shinytexture_ctrl->setImageAssetID( specmap_id );
+
+ if (attachment)
+ {
+ shinytexture_ctrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
+ }
+ else
+ {
+ shinytexture_ctrl->setImmediateFilterPermMask(PERM_NONE);
+ }
}
if (bumpytexture_ctrl)
@@ -1272,6 +1346,15 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
bumpytexture_ctrl->setTentative( !identical_norm );
bumpytexture_ctrl->setEnabled( editable && !has_pbr_material);
bumpytexture_ctrl->setImageAssetID( normmap_id );
+
+ if (attachment)
+ {
+ bumpytexture_ctrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
+ }
+ else
+ {
+ bumpytexture_ctrl->setImmediateFilterPermMask(PERM_NONE);
+ }
}
}
@@ -1515,15 +1598,14 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
combobox_texgen->selectNthItem(((S32)selected_texgen) >> 1);
}
else
- {
+ {
LL_WARNS() << "failed childGetSelectionInterface for 'combobox texgen'" << LL_ENDL;
- }
+ }
getChildView("combobox texgen")->setEnabled(editable);
getChild<LLUICtrl>("combobox texgen")->setTentative(!identical);
getChildView("tex gen")->setEnabled(editable);
-
- }
+ }
{
U8 fullbright_flag = 0;
@@ -1534,7 +1616,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
getChild<LLUICtrl>("checkbox fullbright")->setValue((S32)(fullbright_flag != 0));
getChildView("checkbox fullbright")->setEnabled(editable && !has_pbr_material);
getChild<LLUICtrl>("checkbox fullbright")->setTentative(!identical_fullbright);
- getChild<LLComboBox>("combobox matmedia")->setEnabledByValue("Materials", !has_pbr_material);
+ mComboMatMedia->setEnabledByValue("Materials", !has_pbr_material);
}
// Repeats per meter
@@ -1553,7 +1635,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
LLComboBox* mComboTexGen = getChild<LLComboBox>("combobox texgen");
if (mComboTexGen)
- {
+ {
S32 index = mComboTexGen ? mComboTexGen->getCurrentIndex() : 0;
bool enabled = editable && (index != 1);
bool identical_repeats = true;
@@ -1649,14 +1731,14 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
if (!mIsAlpha)
{ // ... unless there is no alpha channel in the texture, in which case alpha mode MUST ebe none
alpha_mode = LLMaterial::DIFFUSE_ALPHA_MODE_NONE;
- }
+ }
combobox_alphamode->selectNthItem(alpha_mode);
- }
- else
- {
+ }
+ else
+ {
LL_WARNS() << "failed childGetSelectionInterface for 'combobox alphamode'" << LL_ENDL;
- }
+ }
getChild<LLUICtrl>("maskcutoff")->setValue(material->getAlphaMaskCutoff());
updateAlphaControls();
@@ -1668,15 +1750,15 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
texture_ctrl->setImageAssetID(material->getSpecularID());
if (!material->getSpecularID().isNull() && (shiny == SHINY_TEXTURE))
- {
+ {
material->getSpecularOffset(offset_x,offset_y);
material->getSpecularRepeat(repeat_x,repeat_y);
if (identical_planar_texgen)
- {
+ {
repeat_x *= 2.0f;
repeat_y *= 2.0f;
- }
+ }
rot = material->getSpecularRotation();
getChild<LLUICtrl>("shinyScaleU")->setValue(repeat_x);
@@ -1688,7 +1770,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
getChild<LLUICtrl>("environment")->setValue(material->getEnvironmentIntensity());
updateShinyControls(!material->getSpecularID().isNull(), true);
- }
+ }
// Assert desired colorswatch color to match material AFTER updateShinyControls
// to avoid getting overwritten with the default on some UI state changes.
@@ -1756,14 +1838,14 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
pbr_ctrl->setEnabled(FALSE);
}
LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("texture control");
- if(texture_ctrl)
+ if (texture_ctrl)
{
texture_ctrl->setImageAssetID( LLUUID::null );
texture_ctrl->setEnabled( FALSE ); // this is a LLUICtrl, but we don't want it to have keyboard focus so we add it as a child, not a ctrl.
// texture_ctrl->setValid(FALSE);
}
LLColorSwatchCtrl* mColorSwatch = getChild<LLColorSwatchCtrl>("colorswatch");
- if(mColorSwatch)
+ if (mColorSwatch)
{
mColorSwatch->setEnabled( FALSE );
mColorSwatch->setFallbackImage(LLUI::getUIImage("locked_image.j2c") );
@@ -1798,36 +1880,96 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
}
}
-void LLPanelFace::updateUIGLTF(LLViewerObject* objectp, bool& has_pbr_material, bool force_set_values)
+// One-off listener that updates the build floater UI when the prim inventory updates
+class PBRPickerItemListener : public LLVOInventoryListener
+{
+protected:
+ LLViewerObject* mObjectp;
+ bool mChangePending = true;
+public:
+
+ PBRPickerItemListener(LLViewerObject* object)
+ : mObjectp(object)
+ {
+ registerVOInventoryListener(mObjectp, nullptr);
+ }
+
+ const bool isListeningFor(const LLViewerObject* objectp) const
+ {
+ return mChangePending && (objectp == mObjectp);
+ }
+
+ void inventoryChanged(LLViewerObject* object,
+ LLInventoryObject::object_list_t* inventory,
+ S32 serial_num,
+ void* user_data) override
+ {
+ if (gFloaterTools)
+ {
+ gFloaterTools->dirty();
+ }
+ removeVOInventoryListener();
+ mChangePending = false;
+ }
+
+ ~PBRPickerItemListener()
+ {
+ removeVOInventoryListener();
+ mChangePending = false;
+ }
+};
+
+void LLPanelFace::updateUIGLTF(LLViewerObject* objectp, bool& has_pbr_material, bool& has_faces_without_pbr, bool force_set_values)
{
has_pbr_material = false;
- const bool editable = objectp->permModify() && !objectp->isPermanentEnforced();
bool has_pbr_capabilities = LLMaterialEditor::capabilitiesAvailable();
+ bool identical_pbr = true;
+ const bool settable = has_pbr_capabilities && objectp->permModify() && !objectp->isPermanentEnforced();
+ const bool editable = LLMaterialEditor::canModifyObjectsMaterial();
+ const bool saveable = LLMaterialEditor::canSaveObjectsMaterial();
// pbr material
LLTextureCtrl* pbr_ctrl = findChild<LLTextureCtrl>("pbr_control");
if (pbr_ctrl)
{
LLUUID pbr_id;
- bool identical_pbr;
- LLSelectedTE::getPbrMaterialId(pbr_id, identical_pbr);
-
- has_pbr_material = pbr_id.notNull();
+ LLSelectedTE::getPbrMaterialId(pbr_id, identical_pbr, has_pbr_material, has_faces_without_pbr);
pbr_ctrl->setTentative(identical_pbr ? FALSE : TRUE);
- pbr_ctrl->setEnabled(editable && has_pbr_capabilities);
+ pbr_ctrl->setEnabled(settable);
pbr_ctrl->setImageAssetID(pbr_id);
+
+ if (objectp->isAttachment())
+ {
+ pbr_ctrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER | PERM_MODIFY);
+ }
+ else
+ {
+ pbr_ctrl->setImmediateFilterPermMask(PERM_NONE);
+ }
}
- getChildView("pbr_from_inventory")->setEnabled(editable && has_pbr_capabilities);
- getChildView("edit_selected_pbr")->setEnabled(editable && has_pbr_material && has_pbr_capabilities);
- getChildView("save_selected_pbr")->setEnabled(objectp->permCopy() && has_pbr_material && has_pbr_capabilities);
+ getChildView("pbr_from_inventory")->setEnabled(settable);
+ getChildView("edit_selected_pbr")->setEnabled(editable && !has_faces_without_pbr);
+ getChildView("save_selected_pbr")->setEnabled(saveable && identical_pbr);
+ if (objectp->isInventoryPending())
+ {
+ // Reuse the same listener when possible
+ if (!mInventoryListener || !mInventoryListener->isListeningFor(objectp))
+ {
+ mInventoryListener = std::make_unique<PBRPickerItemListener>(objectp);
+ }
+ }
+ else
+ {
+ mInventoryListener = nullptr;
+ }
const bool show_pbr = mComboMatMedia->getCurrentIndex() == MATMEDIA_PBR && mComboMatMedia->getEnabled();
if (show_pbr)
{
- const bool new_state = has_pbr_capabilities && has_pbr_material;
+ const bool new_state = has_pbr_capabilities && has_pbr_material && !has_faces_without_pbr;
LLUICtrl* gltfCtrlTextureScaleU = getChild<LLUICtrl>("gltfTextureScaleU");
LLUICtrl* gltfCtrlTextureScaleV = getChild<LLUICtrl>("gltfTextureScaleV");
@@ -1847,9 +1989,10 @@ void LLPanelFace::updateUIGLTF(LLViewerObject* objectp, bool& has_pbr_material,
}
}
-void LLPanelFace::updateVisibilityGLTF()
+void LLPanelFace::updateVisibilityGLTF(LLViewerObject* objectp /*= nullptr */)
{
const bool show_pbr = mComboMatMedia->getCurrentIndex() == MATMEDIA_PBR && mComboMatMedia->getEnabled();
+ const bool inventory_pending = objectp && objectp->isInventoryPending();
LLRadioGroup* radio_pbr_type = findChild<LLRadioGroup>("radio_pbr_type");
radio_pbr_type->setVisible(show_pbr);
@@ -1860,8 +2003,9 @@ void LLPanelFace::updateVisibilityGLTF()
getChildView("pbr_control")->setVisible(show_pbr_render_material_id);
getChildView("pbr_from_inventory")->setVisible(show_pbr_render_material_id);
- getChildView("edit_selected_pbr")->setVisible(show_pbr_render_material_id);
- getChildView("save_selected_pbr")->setVisible(show_pbr_render_material_id);
+ getChildView("edit_selected_pbr")->setVisible(show_pbr_render_material_id && !inventory_pending);
+ getChildView("save_selected_pbr")->setVisible(show_pbr_render_material_id && !inventory_pending);
+ getChildView("material_permissions_loading_label")->setVisible(show_pbr_render_material_id && inventory_pending);
getChildView("gltfTextureScaleU")->setVisible(show_pbr);
getChildView("gltfTextureScaleV")->setVisible(show_pbr);
@@ -1875,10 +2019,10 @@ void LLPanelFace::updateCopyTexButton()
LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getFirstObject();
mMenuClipboardTexture->setEnabled(objectp && objectp->getPCode() == LL_PCODE_VOLUME && objectp->permModify()
&& !objectp->isPermanentEnforced() && !objectp->isInventoryPending()
- && (LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 1));
+ && (LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 1)
+ && LLMaterialEditor::canClipboardObjectsMaterial());
std::string tooltip = (objectp && objectp->isInventoryPending()) ? LLTrans::getString("LoadingContents") : getString("paste_options");
mMenuClipboardTexture->setToolTip(tooltip);
-
}
void LLPanelFace::refresh()
@@ -2703,7 +2847,7 @@ void LLPanelFace::onCommitMaterialsMedia(LLUICtrl* ctrl, void* userdata)
self->refreshMedia();
}
-void LLPanelFace::updateVisibility()
+void LLPanelFace::updateVisibility(LLViewerObject* objectp /* = nullptr */)
{
LLRadioGroup* radio_mat_type = findChild<LLRadioGroup>("radio_material_type");
LLRadioGroup* radio_pbr_type = findChild<LLRadioGroup>("radio_pbr_type");
@@ -2794,7 +2938,7 @@ void LLPanelFace::updateVisibility()
getChild<LLSpinCtrl>("rptctrl")->setVisible(show_material || show_media);
// PBR controls
- updateVisibilityGLTF();
+ updateVisibilityGLTF(objectp);
}
// static
@@ -3032,7 +3176,11 @@ void LLPanelFace::onCommitPbr(const LLSD& data)
{
id = pbr_ctrl->getImageAssetID();
}
- LLSelectMgr::getInstance()->selectionSetGLTFMaterial(id);
+ if (!LLSelectMgr::getInstance()->selectionSetGLTFMaterial(id))
+ {
+ // If failed to set material, refresh pbr_ctrl's value
+ refresh();
+ }
}
}
@@ -3056,8 +3204,10 @@ void LLPanelFace::onSelectPbr(const LLSD& data)
{
id = pbr_ctrl->getImageAssetID();
}
- LLSelectMgr::getInstance()->selectionSetGLTFMaterial(id);
- LLSelectedTEMaterial::setMaterialID(this, id);
+ if (!LLSelectMgr::getInstance()->selectionSetGLTFMaterial(id))
+ {
+ refresh();
+ }
}
}
@@ -4042,7 +4192,8 @@ void LLPanelFace::onCopyTexture()
|| objectp->getPCode() != LL_PCODE_VOLUME
|| !objectp->permModify()
|| objectp->isPermanentEnforced()
- || selected_count > 1)
+ || selected_count > 1
+ || !LLMaterialEditor::canClipboardObjectsMaterial())
{
return;
}
@@ -4237,7 +4388,8 @@ void LLPanelFace::onPasteTexture()
|| objectp->getPCode() != LL_PCODE_VOLUME
|| !objectp->permModify()
|| objectp->isPermanentEnforced()
- || selected_count > 1)
+ || selected_count > 1
+ || !LLMaterialEditor::canClipboardObjectsMaterial())
{
// not supposed to happen
LL_WARNS() << "Failed to paste texture due to missing or wrong selection" << LL_ENDL;
@@ -4666,13 +4818,6 @@ void LLPanelFace::updateGLTFTextureTransform(float value, U32 pbr_type, std::fun
edit(&new_transform);
}
});
-
- LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstNode();
- if (node)
- {
- LLViewerObject* object = node->getObject();
- sMaterialOverrideSelection.setObjectUpdatePending(object->getID(), node->getLastSelectedTE());
- }
}
void LLPanelFace::setMaterialOverridesFromSelection()
@@ -4785,17 +4930,22 @@ bool LLPanelFace::Selection::update()
return changed;
}
-void LLPanelFace::Selection::setObjectUpdatePending(const LLUUID &object_id, S32 side)
-{
- mPendingObjectID = object_id;
- mPendingSide = side;
-}
-
void LLPanelFace::Selection::onSelectedObjectUpdated(const LLUUID& object_id, S32 side)
{
- if (object_id == mSelectedObjectID && side == mSelectedSide)
+ if (object_id == mSelectedObjectID)
{
- mChanged = true;
+ if (side == mLastSelectedSide)
+ {
+ mChanged = true;
+ }
+ else if (mLastSelectedSide == -1) // if last selected face was deselected
+ {
+ LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstNode();
+ if (node && node->isTESelected(side))
+ {
+ mChanged = true;
+ }
+ }
}
}
@@ -4808,8 +4958,9 @@ bool LLPanelFace::Selection::compareSelection()
mNeedsSelectionCheck = false;
const S32 old_object_count = mSelectedObjectCount;
+ const S32 old_te_count = mSelectedTECount;
const LLUUID old_object_id = mSelectedObjectID;
- const S32 old_side = mSelectedSide;
+ const S32 old_side = mLastSelectedSide;
LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
LLSelectNode* node = selection->getFirstNode();
@@ -4817,17 +4968,23 @@ bool LLPanelFace::Selection::compareSelection()
{
LLViewerObject* object = node->getObject();
mSelectedObjectCount = selection->getObjectCount();
+ mSelectedTECount = selection->getTECount();
mSelectedObjectID = object->getID();
- mSelectedSide = node->getLastSelectedTE();
+ mLastSelectedSide = node->getLastSelectedTE();
}
else
{
mSelectedObjectCount = 0;
+ mSelectedTECount = 0;
mSelectedObjectID = LLUUID::null;
- mSelectedSide = -1;
+ mLastSelectedSide = -1;
}
- const bool selection_changed = old_object_count != mSelectedObjectCount || old_object_id != mSelectedObjectID || old_side != mSelectedSide;
+ const bool selection_changed =
+ old_object_count != mSelectedObjectCount
+ || old_te_count != mSelectedTECount
+ || old_object_id != mSelectedObjectID
+ || old_side != mLastSelectedSide;
mChanged = mChanged || selection_changed;
return selection_changed;
}
@@ -4946,23 +5103,24 @@ void LLPanelFace::onPbrSelectionChanged(LLInventoryItem* itemp)
LLSaleInfo sale_info;
LLSelectMgr::instance().selectGetSaleInfo(sale_info);
- bool can_copy = itemp->getPermissions().allowCopyBy(gAgentID); // do we have perm to copy this texture?
- bool can_transfer = itemp->getPermissions().allowOperationBy(PERM_TRANSFER, gAgentID); // do we have perm to transfer this texture?
- bool is_object_owner = gAgentID == obj_owner_id; // does object for which we are going to apply texture belong to the agent?
- bool not_for_sale = !sale_info.isForSale(); // is object for which we are going to apply texture not for sale?
+ bool can_copy = itemp->getPermissions().allowCopyBy(gAgentID); // do we have perm to copy this material?
+ bool can_transfer = itemp->getPermissions().allowOperationBy(PERM_TRANSFER, gAgentID); // do we have perm to transfer this material?
+ bool can_modify = itemp->getPermissions().allowOperationBy(PERM_MODIFY, gAgentID); // do we have perm to transfer this material?
+ bool is_object_owner = gAgentID == obj_owner_id; // does object for which we are going to apply material belong to the agent?
+ bool not_for_sale = !sale_info.isForSale(); // is object for which we are going to apply material not for sale?
- if (can_copy && can_transfer)
+ if (can_copy && can_transfer && can_modify)
{
pbr_ctrl->setCanApply(true, true);
return;
}
- // if texture has (no-transfer) attribute it can be applied only for object which we own and is not for sale
+ // if material has (no-transfer) attribute it can be applied only for object which we own and is not for sale
pbr_ctrl->setCanApply(false, can_transfer ? true : is_object_owner && not_for_sale);
if (gSavedSettings.getBOOL("TextureLivePreview"))
{
- LLNotificationsUtil::add("LivePreviewUnavailable");
+ LLNotificationsUtil::add("LivePreviewUnavailablePBR");
}
}
}
@@ -5046,16 +5204,75 @@ void LLPanelFace::LLSelectedTE::getTexId(LLUUID& id, bool& identical)
identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, id );
}
-void LLPanelFace::LLSelectedTE::getPbrMaterialId(LLUUID& id, bool& identical)
+void LLPanelFace::LLSelectedTE::getPbrMaterialId(LLUUID& id, bool& identical, bool& has_faces_with_pbr, bool& has_faces_without_pbr)
{
- struct LLSelectedTEGetmatId : public LLSelectedTEGetFunctor<LLUUID>
+ struct LLSelectedTEGetmatId : public LLSelectedTEFunctor
{
- LLUUID get(LLViewerObject* object, S32 te_index)
+ LLSelectedTEGetmatId()
+ : mHasFacesWithoutPBR(false)
+ , mHasFacesWithPBR(false)
+ , mIdenticalId(true)
+ , mIdenticalOverride(true)
+ , mInitialized(false)
+ , mMaterialOverride(LLGLTFMaterial::sDefault)
{
- return object->getRenderMaterialID(te_index);
}
+ bool apply(LLViewerObject* object, S32 te_index) override
+ {
+ LLUUID pbr_id = object->getRenderMaterialID(te_index);
+ if (pbr_id.isNull())
+ {
+ mHasFacesWithoutPBR = true;
+ }
+ else
+ {
+ mHasFacesWithPBR = true;
+ }
+ if (mInitialized)
+ {
+ if (mPBRId != pbr_id)
+ {
+ mIdenticalId = false;
+ }
+
+ LLGLTFMaterial* te_override = object->getTE(te_index)->getGLTFMaterialOverride();
+ if (te_override)
+ {
+ LLGLTFMaterial override = *te_override;
+ override.sanitizeAssetMaterial();
+ mIdenticalOverride &= (override == mMaterialOverride);
+ }
+ else
+ {
+ mIdenticalOverride &= (mMaterialOverride == LLGLTFMaterial::sDefault);
+ }
+ }
+ else
+ {
+ mInitialized = true;
+ mPBRId = pbr_id;
+ LLGLTFMaterial* override = object->getTE(te_index)->getGLTFMaterialOverride();
+ if (override)
+ {
+ mMaterialOverride = *override;
+ mMaterialOverride.sanitizeAssetMaterial();
+ }
+ }
+ return true;
+ }
+ bool mHasFacesWithoutPBR;
+ bool mHasFacesWithPBR;
+ bool mIdenticalId;
+ bool mIdenticalOverride;
+ bool mInitialized;
+ LLGLTFMaterial mMaterialOverride;
+ LLUUID mPBRId;
} func;
- identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue(&func, id);
+ LLSelectMgr::getInstance()->getSelection()->applyToTEs(&func);
+ id = func.mPBRId;
+ identical = func.mIdenticalId && func.mIdenticalOverride;
+ has_faces_with_pbr = func.mHasFacesWithPBR;
+ has_faces_without_pbr = func.mHasFacesWithoutPBR;
}
void LLPanelFace::LLSelectedTEMaterial::getCurrent(LLMaterialPtr& material_ptr, bool& identical_material)
diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h
index 106259b84a..d36662c11b 100644
--- a/indra/newview/llpanelface.h
+++ b/indra/newview/llpanelface.h
@@ -35,6 +35,8 @@
#include "lltextureentry.h"
#include "llselectmgr.h"
+#include <memory>
+
class LLButton;
class LLCheckBoxCtrl;
class LLColorSwatchCtrl;
@@ -51,6 +53,8 @@ class LLMaterialID;
class LLMediaCtrl;
class LLMenuButton;
+class PBRPickerItemListener;
+
// Represents an edit for use in replicating the op across one or more materials in the selection set.
//
// The apply function optionally performs the edit which it implements
@@ -105,6 +109,7 @@ public:
static void onMaterialOverrideReceived(const LLUUID& object_id, S32 side);
+ /*virtual*/ void onVisibilityChange(BOOL new_visibility);
/*virtual*/ void draw();
LLMaterialPtr createDefaultMaterial(LLMaterialPtr current_material)
@@ -138,7 +143,7 @@ protected:
void sendTexGen(); // applies and sends bump map
void sendShiny(U32 shininess); // applies and sends shininess
void sendFullbright(); // applies and sends full bright
- void sendGlow();
+ void sendGlow();
void alignTestureLayer();
void updateCopyTexButton();
@@ -260,7 +265,6 @@ protected:
private:
-
bool isAlpha() { return mIsAlpha; }
// Convenience funcs to keep the visual flack to a minimum
@@ -269,10 +273,10 @@ private:
LLUUID getCurrentSpecularMap();
U32 getCurrentShininess();
U32 getCurrentBumpiness();
- U8 getCurrentDiffuseAlphaMode();
- U8 getCurrentAlphaMaskCutoff();
- U8 getCurrentEnvIntensity();
- U8 getCurrentGlossiness();
+ U8 getCurrentDiffuseAlphaMode();
+ U8 getCurrentAlphaMaskCutoff();
+ U8 getCurrentEnvIntensity();
+ U8 getCurrentGlossiness();
F32 getCurrentBumpyRot();
F32 getCurrentBumpyScaleU();
F32 getCurrentBumpyScaleV();
@@ -293,7 +297,7 @@ private:
//
// Do NOT call updateUI from within this function.
//
- void updateVisibility();
+ void updateVisibility(LLViewerObject* objectp = nullptr);
// Hey look everyone, a type-safe alternative to copy and paste! :)
//
@@ -348,7 +352,7 @@ private:
U32 new_alpha_mode = new_material->getDiffuseAlphaMode();
LLUUID new_normal_map_id = new_material->getNormalID();
- LLUUID new_spec_map_id = new_material->getSpecularID();
+ LLUUID new_spec_map_id = new_material->getSpecularID();
if ((new_alpha_mode == LLMaterial::DIFFUSE_ALPHA_MODE_BLEND) && !is_alpha_face)
{
@@ -453,8 +457,8 @@ private:
void onTextureSelectionChanged(LLInventoryItem* itemp);
void onPbrSelectionChanged(LLInventoryItem* itemp);
- void updateUIGLTF(LLViewerObject* objectp, bool& has_pbr_material, bool force_set_values);
- void updateVisibilityGLTF();
+ void updateUIGLTF(LLViewerObject* objectp, bool& has_pbr_material, bool& has_faces_without_pbr, bool force_set_values);
+ void updateVisibilityGLTF(LLViewerObject* objectp = nullptr);
void updateSelectedGLTFMaterials(std::function<void(LLGLTFMaterial*)> func);
void updateGLTFTextureTransform(float value, U32 pbr_type, std::function<void(LLGLTFMaterial::TextureTransform*)> edit);
@@ -483,7 +487,6 @@ private:
// Prevents update() returning true until the provided object is
// updated. Necessary to prevent controls updating when the mouse is
// held down.
- void setObjectUpdatePending(const LLUUID &object_id, S32 side);
void setDirty() { mChanged = true; };
// Callbacks
@@ -498,15 +501,15 @@ private:
boost::signals2::scoped_connection mSelectConnection;
bool mNeedsSelectionCheck = true;
S32 mSelectedObjectCount = 0;
+ S32 mSelectedTECount = 0;
LLUUID mSelectedObjectID;
- S32 mSelectedSide = -1;
-
- LLUUID mPendingObjectID;
- S32 mPendingSide = -1;
+ S32 mLastSelectedSide = -1;
};
static Selection sMaterialOverrideSelection;
+ std::unique_ptr<PBRPickerItemListener> mInventoryListener;
+
public:
#if defined(DEF_GET_MAT_STATE)
#undef DEF_GET_MAT_STATE
@@ -587,17 +590,15 @@ public:
DEF_EDIT_MAT_STATE(LLUUID,const LLUUID&,setNormalID);
DEF_EDIT_MAT_STATE(LLUUID,const LLUUID&,setSpecularID);
DEF_EDIT_MAT_STATE(LLColor4U, const LLColor4U&,setSpecularLightColor);
- DEF_EDIT_MAT_STATE(LLUUID, const LLUUID&, setMaterialID);
};
class LLSelectedTE
{
public:
-
static void getFace(class LLFace*& face_to_return, bool& identical_face);
static void getImageFormat(LLGLenum& image_format_to_return, bool& identical_face);
static void getTexId(LLUUID& id, bool& identical);
- static void getPbrMaterialId(LLUUID& id, bool& identical);
+ static void getPbrMaterialId(LLUUID& id, bool& identical, bool& has_pbr, bool& has_faces_without_pbr);
static void getObjectScaleS(F32& scale_s, bool& identical);
static void getObjectScaleT(F32& scale_t, bool& identical);
static void getMaxDiffuseRepeats(F32& repeats, bool& identical);
diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp
index 834e664723..cc3c51dd83 100644
--- a/indra/newview/llpanellandmarkinfo.cpp
+++ b/indra/newview/llpanellandmarkinfo.cpp
@@ -111,9 +111,9 @@ void LLPanelLandmarkInfo::setInfoType(EInfoType type)
}
// Sets CREATE_LANDMARK infotype and creates landmark at desired folder
-void LLPanelLandmarkInfo::setInfoAndCreateLandmark(const LLUUID& fodler_id)
+void LLPanelLandmarkInfo::setInfoAndCreateLandmark(const LLUUID& folder_id)
{
- setInfoType(CREATE_LANDMARK, fodler_id);
+ setInfoType(CREATE_LANDMARK, folder_id);
}
void LLPanelLandmarkInfo::setInfoType(EInfoType type, const LLUUID &folder_id)
diff --git a/indra/newview/llpanellandmarkinfo.h b/indra/newview/llpanellandmarkinfo.h
index 46e2a1935b..8802ce066e 100644
--- a/indra/newview/llpanellandmarkinfo.h
+++ b/indra/newview/llpanellandmarkinfo.h
@@ -48,7 +48,7 @@ public:
/*virtual*/ void setInfoType(EInfoType type);
// Sets CREATE_LANDMARK infotype and creates landmark at desired folder
- void setInfoAndCreateLandmark(const LLUUID& fodler_id);
+ void setInfoAndCreateLandmark(const LLUUID& folder_id);
/*virtual*/ void processParcelInfo(const LLParcelData& parcel_data);
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index b14fdbf38e..49756a4e09 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -97,7 +97,7 @@ class LLLoginLocationAutoHandler : public LLCommandHandler
public:
// don't allow from external browsers
LLLoginLocationAutoHandler() : LLCommandHandler("location_login", UNTRUSTED_BLOCK) { }
- bool handle(const LLSD& tokens, const LLSD& query_map, LLMediaCtrl* web)
+ bool handle(const LLSD& tokens, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web)
{
if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP)
{
@@ -1110,11 +1110,6 @@ void LLPanelLogin::onRememberPasswordCheck(void*)
std::string grid(LLGridManager::getInstance()->getGridId());
std::string user_id(cred->userID());
- if (!remember_password)
- {
- gSecAPIHandler->removeFromProtectedMap("mfa_hash", grid, user_id);
- gSecAPIHandler->syncProtectedMap();
- }
}
}
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index b332de3f98..20241aac24 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -37,8 +37,8 @@
#include "llfilepicker.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
+#include "llinventorygallery.h"
#include "llinventorymodelbackgroundfetch.h"
-#include "llinventorypanel.h"
#include "llfiltereditor.h"
#include "llfloatersidepanelcontainer.h"
#include "llfloaterreg.h"
@@ -53,12 +53,14 @@
#include "llspinctrl.h"
#include "lltoggleablemenu.h"
#include "lltooldraganddrop.h"
+#include "lltrans.h"
#include "llviewermenu.h"
#include "llviewertexturelist.h"
#include "llsidepanelinventory.h"
#include "llfolderview.h"
#include "llradiogroup.h"
#include "llenvironment.h"
+#include "llweb.h"
const std::string FILTERS_FILENAME("filters.xml");
@@ -113,7 +115,13 @@ LLPanelMainInventory::LLPanelMainInventory(const LLPanel::Params& p)
mMenuGearDefault(NULL),
mMenuVisibility(NULL),
mMenuAddHandle(),
- mNeedUploadCost(true)
+ mNeedUploadCost(true),
+ mMenuViewDefault(NULL),
+ mSingleFolderMode(false),
+ mForceShowInvLayout(false),
+ mViewMode(MODE_COMBINATION),
+ mListViewRootUpdatedConnection(),
+ mGalleryRootUpdatedConnection()
{
// Menu Callbacks (non contex menus)
mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelMainInventory::doToSelected, this, _2));
@@ -124,7 +132,6 @@ LLPanelMainInventory::LLPanelMainInventory(const LLPanel::Params& p)
mCommitCallbackRegistrar.add("Inventory.ShowFilters", boost::bind(&LLPanelMainInventory::toggleFindOptions, this));
mCommitCallbackRegistrar.add("Inventory.ResetFilters", boost::bind(&LLPanelMainInventory::resetFilters, this));
mCommitCallbackRegistrar.add("Inventory.SetSortBy", boost::bind(&LLPanelMainInventory::setSortBy, this, _2));
- mCommitCallbackRegistrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars, this));
mEnableCallbackRegistrar.add("Inventory.EnvironmentEnabled", [](LLUICtrl *, const LLSD &) { return LLPanelMainInventory::hasSettingsInventory(); });
mEnableCallbackRegistrar.add("Inventory.MaterialsEnabled", [](LLUICtrl *, const LLSD &) { return LLPanelMainInventory::hasMaterialsInventory(); });
@@ -193,7 +200,7 @@ BOOL LLPanelMainInventory::postBuild()
}
// Now load the stored settings from disk, if available.
std::string filterSaveName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, FILTERS_FILENAME));
- LL_INFOS() << "LLPanelMainInventory::init: reading from " << filterSaveName << LL_ENDL;
+ LL_INFOS("Inventory") << "LLPanelMainInventory::init: reading from " << filterSaveName << LL_ENDL;
llifstream file(filterSaveName.c_str());
LLSD savedFilterState;
if (file.is_open())
@@ -238,6 +245,34 @@ BOOL LLPanelMainInventory::postBuild()
mGearMenuButton = getChild<LLMenuButton>("options_gear_btn");
mVisibilityMenuButton = getChild<LLMenuButton>("options_visibility_btn");
+ mViewMenuButton = getChild<LLMenuButton>("view_btn");
+
+ mBackBtn = getChild<LLButton>("back_btn");
+ mForwardBtn = getChild<LLButton>("forward_btn");
+ mUpBtn = getChild<LLButton>("up_btn");
+ mViewModeBtn = getChild<LLButton>("view_mode_btn");
+ mNavigationBtnsPanel = getChild<LLLayoutPanel>("nav_buttons");
+
+ mDefaultViewPanel = getChild<LLPanel>("default_inventory_panel");
+ mCombinationViewPanel = getChild<LLPanel>("combination_view_inventory");
+ mCombinationGalleryLayoutPanel = getChild<LLLayoutPanel>("comb_gallery_layout");
+ mCombinationListLayoutPanel = getChild<LLLayoutPanel>("comb_inventory_layout");
+ mCombinationLayoutStack = getChild<LLLayoutStack>("combination_view_stack");
+
+ mCombinationInventoryPanel = getChild<LLInventorySingleFolderPanel>("comb_single_folder_inv");
+ LLInventoryFilter& comb_inv_filter = mCombinationInventoryPanel->getFilter();
+ comb_inv_filter.setFilterThumbnails(LLInventoryFilter::FILTER_EXCLUDE_THUMBNAILS);
+ comb_inv_filter.markDefault();
+ mCombinationInventoryPanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onCombinationInventorySelectionChanged, this, _1, _2));
+ mListViewRootUpdatedConnection = mCombinationInventoryPanel->setRootChangedCallback(boost::bind(&LLPanelMainInventory::onCombinationRootChanged, this, false));
+
+ mCombinationGalleryPanel = getChild<LLInventoryGallery>("comb_gallery_view_inv");
+ mCombinationGalleryPanel->setSortOrder(mCombinationInventoryPanel->getSortOrder());
+ LLInventoryFilter& comb_gallery_filter = mCombinationGalleryPanel->getFilter();
+ comb_gallery_filter.setFilterThumbnails(LLInventoryFilter::FILTER_ONLY_THUMBNAILS);
+ comb_gallery_filter.markDefault();
+ mGalleryRootUpdatedConnection = mCombinationGalleryPanel->setRootChangedCallback(boost::bind(&LLPanelMainInventory::onCombinationRootChanged, this, true));
+ mCombinationGalleryPanel->setSelectionChangeCallback(boost::bind(&LLPanelMainInventory::onCombinationGallerySelectionChanged, this, _1));
initListCommandsHandlers();
@@ -309,12 +344,21 @@ LLPanelMainInventory::~LLPanelMainInventory( void )
gInventory.removeObserver(this);
delete mSavedFolderState;
- auto menu = mMenuAddHandle.get();
- if(menu)
- {
- menu->die();
- mMenuAddHandle.markDead();
- }
+ auto menu = mMenuAddHandle.get();
+ if(menu)
+ {
+ menu->die();
+ mMenuAddHandle.markDead();
+ }
+
+ if (mListViewRootUpdatedConnection.connected())
+ {
+ mListViewRootUpdatedConnection.disconnect();
+ }
+ if (mGalleryRootUpdatedConnection.connected())
+ {
+ mGalleryRootUpdatedConnection.disconnect();
+ }
}
LLInventoryPanel* LLPanelMainInventory::getAllItemsPanel()
@@ -363,6 +407,10 @@ BOOL LLPanelMainInventory::handleKeyHere(KEY key, MASK mask)
{
startSearch();
}
+ if(mSingleFolderMode && key == KEY_LEFT)
+ {
+ onBackFolderClicked();
+ }
}
return LLPanel::handleKeyHere(key, mask);
@@ -382,27 +430,145 @@ void LLPanelMainInventory::closeAllFolders()
getPanel()->getRootFolder()->closeAllFolders();
}
-void LLPanelMainInventory::newWindow()
+S32 get_instance_num()
+{
+ static S32 instance_num = 0;
+ instance_num = (instance_num + 1) % S32_MAX;
+
+ return instance_num;
+}
+
+LLFloaterSidePanelContainer* LLPanelMainInventory::newWindow()
{
- static S32 instance_num = 0;
- instance_num = (instance_num + 1) % S32_MAX;
+ S32 instance_num = get_instance_num();
if (!gAgentCamera.cameraMouselook())
{
- LLFloaterReg::showTypedInstance<LLFloaterSidePanelContainer>("inventory", LLSD(instance_num));
+ LLFloaterSidePanelContainer* floater = LLFloaterReg::showTypedInstance<LLFloaterSidePanelContainer>("inventory", LLSD(instance_num));
+ LLSidepanelInventory* sidepanel_inventory = floater->findChild<LLSidepanelInventory>("main_panel");
+ sidepanel_inventory->initInventoryViews();
+ return floater;
}
+ return NULL;
+}
+
+//static
+void LLPanelMainInventory::newFolderWindow(LLUUID folder_id, LLUUID item_to_select)
+{
+ LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
+ for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end();)
+ {
+ LLFloaterSidePanelContainer* inventory_container = dynamic_cast<LLFloaterSidePanelContainer*>(*iter++);
+ if (inventory_container)
+ {
+ LLSidepanelInventory* sidepanel_inventory = dynamic_cast<LLSidepanelInventory*>(inventory_container->findChild<LLPanel>("main_panel", true));
+ if (sidepanel_inventory)
+ {
+ LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel();
+ if (main_inventory && main_inventory->isSingleFolderMode()
+ && (main_inventory->getCurrentSFVRoot() == folder_id))
+ {
+ main_inventory->setFocus(true);
+ if(item_to_select.notNull())
+ {
+ main_inventory->setGallerySelection(item_to_select);
+ }
+ return;
+ }
+ }
+ }
+ }
+
+ S32 instance_num = get_instance_num();
+
+ LLFloaterSidePanelContainer* inventory_container = LLFloaterReg::showTypedInstance<LLFloaterSidePanelContainer>("inventory", LLSD(instance_num));
+ if(inventory_container)
+ {
+ LLSidepanelInventory* sidepanel_inventory = dynamic_cast<LLSidepanelInventory*>(inventory_container->findChild<LLPanel>("main_panel", true));
+ if (sidepanel_inventory)
+ {
+ LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel();
+ if (main_inventory)
+ {
+ main_inventory->initSingleFolderRoot(folder_id);
+ main_inventory->toggleViewMode();
+ if(folder_id.notNull())
+ {
+ if(item_to_select.notNull())
+ {
+ main_inventory->setGallerySelection(item_to_select, true);
+ }
+ }
+ }
+ }
+ }
}
void LLPanelMainInventory::doCreate(const LLSD& userdata)
{
reset_inventory_filter();
- menu_create_inventory_item(getPanel(), NULL, userdata);
+ if(mSingleFolderMode)
+ {
+ if(isListViewMode() || isCombinationViewMode())
+ {
+ LLFolderViewItem* current_folder = getActivePanel()->getRootFolder();
+ if (current_folder)
+ {
+ if(isCombinationViewMode())
+ {
+ mForceShowInvLayout = true;
+ }
+
+ LLHandle<LLPanel> handle = getHandle();
+ std::function<void(const LLUUID&)> callback_created = [handle](const LLUUID& new_id)
+ {
+ gInventory.notifyObservers(); // not really needed, should have been already done
+ LLPanelMainInventory* panel = (LLPanelMainInventory*)handle.get();
+ if (new_id.notNull() && panel)
+ {
+ // might need to refresh visibility, delay rename
+ panel->mCombInvUUIDNeedsRename = new_id;
+
+ if (panel->isCombinationViewMode())
+ {
+ panel->mForceShowInvLayout = true;
+ }
+
+ LL_DEBUGS("Inventory") << "Done creating inventory: " << new_id << LL_ENDL;
+ }
+ };
+ menu_create_inventory_item(NULL, getCurrentSFVRoot(), userdata, LLUUID::null, callback_created);
+ }
+ }
+ else
+ {
+ LLHandle<LLPanel> handle = getHandle();
+ std::function<void(const LLUUID&)> callback_created = [handle](const LLUUID &new_id)
+ {
+ gInventory.notifyObservers(); // not really needed, should have been already done
+ if (new_id.notNull())
+ {
+ LLPanelMainInventory* panel = (LLPanelMainInventory*)handle.get();
+ if (panel)
+ {
+ panel->setGallerySelection(new_id);
+ LL_DEBUGS("Inventory") << "Done creating inventory: " << new_id << LL_ENDL;
+ }
+ }
+ };
+ menu_create_inventory_item(NULL, getCurrentSFVRoot(), userdata, LLUUID::null, callback_created);
+ }
+ }
+ else
+ {
+ menu_create_inventory_item(getPanel(), NULL, userdata);
+ }
}
void LLPanelMainInventory::resetFilters()
{
LLFloaterInventoryFinder *finder = getFinder();
- getActivePanel()->getFilter().resetDefault();
+ getCurrentFilter().resetDefault();
if (finder)
{
finder->updateElementsFromFilter();
@@ -423,6 +589,17 @@ void LLPanelMainInventory::resetAllItemsFilters()
setFilterTextFromFilter();
}
+void LLPanelMainInventory::findLinks(const LLUUID& item_id, const std::string& item_name)
+{
+ mFilterSubString = item_name;
+
+ LLInventoryFilter &filter = mActivePanel->getFilter();
+ filter.setFindAllLinksMode(item_name, item_id);
+
+ mFilterEditor->setText(item_name);
+ mFilterEditor->setFocus(TRUE);
+}
+
void LLPanelMainInventory::setSortBy(const LLSD& userdata)
{
U32 sort_order_mask = getActivePanel()->getSortOrder();
@@ -457,6 +634,10 @@ void LLPanelMainInventory::setSortBy(const LLSD& userdata)
sort_order_mask |= LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
}
}
+ if(mSingleFolderMode && !isListViewMode())
+ {
+ mCombinationGalleryPanel->setSortOrder(sort_order_mask, true);
+ }
getActivePanel()->setSortOrder(sort_order_mask);
if (isRecentItemsPanelSelected())
@@ -474,25 +655,56 @@ void LLPanelMainInventory::onSelectSearchType()
std::string new_type = mSearchTypeCombo->getValue();
if (new_type == "search_by_name")
{
- getActivePanel()->setSearchType(LLInventoryFilter::SEARCHTYPE_NAME);
+ setSearchType(LLInventoryFilter::SEARCHTYPE_NAME);
}
if (new_type == "search_by_creator")
{
- getActivePanel()->setSearchType(LLInventoryFilter::SEARCHTYPE_CREATOR);
+ setSearchType(LLInventoryFilter::SEARCHTYPE_CREATOR);
}
if (new_type == "search_by_description")
{
- getActivePanel()->setSearchType(LLInventoryFilter::SEARCHTYPE_DESCRIPTION);
+ setSearchType(LLInventoryFilter::SEARCHTYPE_DESCRIPTION);
}
if (new_type == "search_by_UUID")
{
- getActivePanel()->setSearchType(LLInventoryFilter::SEARCHTYPE_UUID);
+ setSearchType(LLInventoryFilter::SEARCHTYPE_UUID);
}
}
+void LLPanelMainInventory::setSearchType(LLInventoryFilter::ESearchType type)
+{
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ mCombinationGalleryPanel->setSearchType(type);
+ }
+ if(mSingleFolderMode && isCombinationViewMode())
+ {
+ mCombinationInventoryPanel->setSearchType(type);
+ mCombinationGalleryPanel->setSearchType(type);
+ }
+ else
+ {
+ getActivePanel()->setSearchType(type);
+ }
+}
+
void LLPanelMainInventory::updateSearchTypeCombo()
{
- LLInventoryFilter::ESearchType search_type = getActivePanel()->getSearchType();
+ LLInventoryFilter::ESearchType search_type(LLInventoryFilter::SEARCHTYPE_NAME);
+
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ search_type = mCombinationGalleryPanel->getSearchType();
+ }
+ else if(mSingleFolderMode && isCombinationViewMode())
+ {
+ search_type = mCombinationGalleryPanel->getSearchType();
+ }
+ else
+ {
+ search_type = getActivePanel()->getSearchType();
+ }
+
switch(search_type)
{
case LLInventoryFilter::SEARCHTYPE_CREATOR:
@@ -538,7 +750,7 @@ void LLPanelMainInventory::onClearSearch()
}
// re-open folders that were initially open in case filter was active
- if (mActivePanel && (mFilterSubString.size() || initially_active))
+ if (mActivePanel && (mFilterSubString.size() || initially_active) && !mSingleFolderMode)
{
mSavedFolderState->setApply(TRUE);
mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
@@ -548,7 +760,7 @@ void LLPanelMainInventory::onClearSearch()
}
mFilterSubString = "";
- LLSidepanelInventory * sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
+ LLSidepanelInventory * sidepanel_inventory = getParentSidepanelInventory();
if (sidepanel_inventory)
{
LLPanelMarketplaceInbox* inbox_panel = sidepanel_inventory->getChild<LLPanelMarketplaceInbox>("marketplace_inbox");
@@ -561,16 +773,32 @@ void LLPanelMainInventory::onClearSearch()
void LLPanelMainInventory::onFilterEdit(const std::string& search_string )
{
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ mFilterSubString = search_string;
+ mCombinationGalleryPanel->setFilterSubString(mFilterSubString);
+ return;
+ }
+ if(mSingleFolderMode && isCombinationViewMode())
+ {
+ mCombinationGalleryPanel->setFilterSubString(search_string);
+ }
+
if (search_string == "")
{
onClearSearch();
}
+
if (!mActivePanel)
{
return;
}
- LLInventoryModelBackgroundFetch::instance().start();
+ if (!LLInventoryModelBackgroundFetch::instance().inventoryFetchStarted())
+ {
+ llassert(false); // this should have been done on startup
+ LLInventoryModelBackgroundFetch::instance().start();
+ }
mFilterSubString = search_string;
if (mActivePanel->getFilterSubString().empty() && mFilterSubString.empty())
@@ -589,7 +817,7 @@ void LLPanelMainInventory::onFilterEdit(const std::string& search_string )
// set new filter string
setFilterSubString(mFilterSubString);
- LLSidepanelInventory * sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
+ LLSidepanelInventory * sidepanel_inventory = getParentSidepanelInventory();
if (sidepanel_inventory)
{
LLPanelMarketplaceInbox* inbox_panel = sidepanel_inventory->getChild<LLPanelMarketplaceInbox>("marketplace_inbox");
@@ -644,7 +872,7 @@ void LLPanelMainInventory::onFilterEdit(const std::string& search_string )
void LLPanelMainInventory::onFilterSelected()
{
// Find my index
- mActivePanel = (LLInventoryPanel*)getChild<LLTabContainer>("inventory filter tabs")->getCurrentPanel();
+ setActivePanel();
if (!mActivePanel)
{
@@ -657,15 +885,19 @@ void LLPanelMainInventory::onFilterSelected()
}
updateSearchTypeCombo();
setFilterSubString(mFilterSubString);
- LLInventoryFilter& filter = mActivePanel->getFilter();
+ LLInventoryFilter& filter = getCurrentFilter();
LLFloaterInventoryFinder *finder = getFinder();
if (finder)
{
finder->changeFilter(&filter);
+ if (mSingleFolderMode)
+ {
+ finder->setTitle(getLocalizedRootName());
+ }
}
- if (filter.isActive())
+ if (filter.isActive() && !LLInventoryModelBackgroundFetch::instance().inventoryFetchStarted())
{
- // If our filter is active we may be the first thing requiring a fetch so we better start it here.
+ llassert(false); // this should have been done on startup
LLInventoryModelBackgroundFetch::instance().start();
}
setFilterTextFromFilter();
@@ -737,6 +969,7 @@ void LLPanelMainInventory::draw()
}
LLPanel::draw();
updateItemcountText();
+ updateCombinationVisibility();
}
void LLPanelMainInventory::updateItemcountText()
@@ -776,6 +1009,21 @@ void LLPanelMainInventory::updateItemcountText()
{
text = getString("ItemcountUnknown", string_args);
}
+
+ if (mSingleFolderMode)
+ {
+ LLInventoryModel::cat_array_t *cats;
+ LLInventoryModel::item_array_t *items;
+
+ gInventory.getDirectDescendentsOf(getCurrentSFVRoot(), cats, items);
+
+ if (items && cats)
+ {
+ string_args["[ITEM_COUNT]"] = llformat("%d", items->size());
+ string_args["[CATEGORY_COUNT]"] = llformat("%d", cats->size());
+ text = getString("ItemcountCompleted", string_args);
+ }
+ }
mCounterCtrl->setValue(text);
mCounterCtrl->setToolTip(text);
@@ -795,7 +1043,7 @@ void LLPanelMainInventory::onFocusReceived()
void LLPanelMainInventory::setFilterTextFromFilter()
{
- mFilterText = mActivePanel->getFilter().getFilterText();
+ mFilterText = getCurrentFilter().getFilterText();
}
void LLPanelMainInventory::toggleFindOptions()
@@ -810,8 +1058,17 @@ void LLPanelMainInventory::toggleFindOptions()
LLFloater* parent_floater = gFloaterView->getParentFloater(this);
if (parent_floater)
parent_floater->addDependentFloater(mFinderHandle);
- // start background fetch of folders
- LLInventoryModelBackgroundFetch::instance().start();
+
+ if (!LLInventoryModelBackgroundFetch::instance().inventoryFetchStarted())
+ {
+ llassert(false); // this should have been done on startup
+ LLInventoryModelBackgroundFetch::instance().start();
+ }
+
+ if (mSingleFolderMode)
+ {
+ finder->setTitle(getLocalizedRootName());
+ }
}
else
{
@@ -1051,10 +1308,27 @@ void LLFloaterInventoryFinder::draw()
filter &= ~(0x1 << LLInventoryType::IT_CATEGORY);
}
- // update the panel, panel will update the filter
- mPanelMainInventory->getPanel()->setShowFolderState(getCheckShowEmpty() ?
- LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
- mPanelMainInventory->getPanel()->setFilterTypes(filter);
+
+ bool is_sf_mode = mPanelMainInventory->isSingleFolderMode();
+ if(is_sf_mode && mPanelMainInventory->isGalleryViewMode())
+ {
+ mPanelMainInventory->mCombinationGalleryPanel->getFilter().setShowFolderState(getCheckShowEmpty() ?
+ LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+ mPanelMainInventory->mCombinationGalleryPanel->getFilter().setFilterObjectTypes(filter);
+ }
+ else
+ {
+ if(is_sf_mode && mPanelMainInventory->isCombinationViewMode())
+ {
+ mPanelMainInventory->mCombinationGalleryPanel->getFilter().setShowFolderState(getCheckShowEmpty() ?
+ LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+ mPanelMainInventory->mCombinationGalleryPanel->getFilter().setFilterObjectTypes(filter);
+ }
+ // update the panel, panel will update the filter
+ mPanelMainInventory->getPanel()->setShowFolderState(getCheckShowEmpty() ?
+ LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+ mPanelMainInventory->getPanel()->setFilterTypes(filter);
+ }
if (getCheckSinceLogoff())
{
@@ -1076,10 +1350,26 @@ void LLFloaterInventoryFinder::draw()
}
hours += days * 24;
- mPanelMainInventory->getPanel()->setHoursAgo(hours);
- mPanelMainInventory->getPanel()->setSinceLogoff(getCheckSinceLogoff());
+
mPanelMainInventory->setFilterTextFromFilter();
- mPanelMainInventory->getPanel()->setDateSearchDirection(getDateSearchDirection());
+ if(is_sf_mode && mPanelMainInventory->isGalleryViewMode())
+ {
+ mPanelMainInventory->mCombinationGalleryPanel->getFilter().setHoursAgo(hours);
+ mPanelMainInventory->mCombinationGalleryPanel->getFilter().setDateRangeLastLogoff(getCheckSinceLogoff());
+ mPanelMainInventory->mCombinationGalleryPanel->getFilter().setDateSearchDirection(getDateSearchDirection());
+ }
+ else
+ {
+ if(is_sf_mode && mPanelMainInventory->isCombinationViewMode())
+ {
+ mPanelMainInventory->mCombinationGalleryPanel->getFilter().setHoursAgo(hours);
+ mPanelMainInventory->mCombinationGalleryPanel->getFilter().setDateRangeLastLogoff(getCheckSinceLogoff());
+ mPanelMainInventory->mCombinationGalleryPanel->getFilter().setDateSearchDirection(getDateSearchDirection());
+ }
+ mPanelMainInventory->getPanel()->setHoursAgo(hours);
+ mPanelMainInventory->getPanel()->setSinceLogoff(getCheckSinceLogoff());
+ mPanelMainInventory->getPanel()->setDateSearchDirection(getDateSearchDirection());
+ }
LLPanel::draw();
}
@@ -1091,15 +1381,15 @@ void LLFloaterInventoryFinder::onCreatorSelfFilterCommit()
if(show_creator_self && show_creator_other)
{
- mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_ALL);
+ mPanelMainInventory->getCurrentFilter().setFilterCreator(LLInventoryFilter::FILTERCREATOR_ALL);
}
else if(show_creator_self)
{
- mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_SELF);
+ mPanelMainInventory->getCurrentFilter().setFilterCreator(LLInventoryFilter::FILTERCREATOR_SELF);
}
else if(!show_creator_self || !show_creator_other)
{
- mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_OTHERS);
+ mPanelMainInventory->getCurrentFilter().setFilterCreator(LLInventoryFilter::FILTERCREATOR_OTHERS);
mCreatorOthers->set(TRUE);
}
}
@@ -1111,15 +1401,15 @@ void LLFloaterInventoryFinder::onCreatorOtherFilterCommit()
if(show_creator_self && show_creator_other)
{
- mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_ALL);
+ mPanelMainInventory->getCurrentFilter().setFilterCreator(LLInventoryFilter::FILTERCREATOR_ALL);
}
else if(show_creator_other)
{
- mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_OTHERS);
+ mPanelMainInventory->getCurrentFilter().setFilterCreator(LLInventoryFilter::FILTERCREATOR_OTHERS);
}
else if(!show_creator_other || !show_creator_self)
{
- mFilter->setFilterCreator(LLInventoryFilter::FILTERCREATOR_SELF);
+ mPanelMainInventory->getCurrentFilter().setFilterCreator(LLInventoryFilter::FILTERCREATOR_SELF);
mCreatorSelf->set(TRUE);
}
}
@@ -1192,26 +1482,25 @@ void LLFloaterInventoryFinder::selectNoTypes(void* user_data)
void LLPanelMainInventory::initListCommandsHandlers()
{
- childSetAction("trash_btn", boost::bind(&LLPanelMainInventory::onTrashButtonClick, this));
childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddButtonClick, this));
-
- mTrashButton = getChild<LLDragAndDropButton>("trash_btn");
- mTrashButton->setDragAndDropHandler(boost::bind(&LLPanelMainInventory::handleDragAndDropToTrash, this
- , _4 // BOOL drop
- , _5 // EDragAndDropType cargo_type
- , _7 // EAcceptance* accept
- ));
+ childSetAction("view_mode_btn", boost::bind(&LLPanelMainInventory::onViewModeClick, this));
+ childSetAction("up_btn", boost::bind(&LLPanelMainInventory::onUpFolderClicked, this));
+ childSetAction("back_btn", boost::bind(&LLPanelMainInventory::onBackFolderClicked, this));
+ childSetAction("forward_btn", boost::bind(&LLPanelMainInventory::onForwardFolderClicked, this));
mCommitCallbackRegistrar.add("Inventory.GearDefault.Custom.Action", boost::bind(&LLPanelMainInventory::onCustomAction, this, _2));
mEnableCallbackRegistrar.add("Inventory.GearDefault.Check", boost::bind(&LLPanelMainInventory::isActionChecked, this, _2));
mEnableCallbackRegistrar.add("Inventory.GearDefault.Enable", boost::bind(&LLPanelMainInventory::isActionEnabled, this, _2));
+ mEnableCallbackRegistrar.add("Inventory.GearDefault.Visible", boost::bind(&LLPanelMainInventory::isActionVisible, this, _2));
mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
- mGearMenuButton->setMenu(mMenuGearDefault, LLMenuButton::MP_TOP_LEFT, true);
+ mGearMenuButton->setMenu(mMenuGearDefault, LLMenuButton::MP_BOTTOM_LEFT, true);
+ mMenuViewDefault = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_inventory_view_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+ mViewMenuButton->setMenu(mMenuViewDefault, LLMenuButton::MP_BOTTOM_LEFT, true);
LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_add.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
mMenuAddHandle = menu->getHandle();
mMenuVisibility = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_inventory_search_visibility.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
- mVisibilityMenuButton->setMenu(mMenuVisibility, LLMenuButton::MP_BOTTOM_LEFT, true);
+ mVisibilityMenuButton->setMenu(mMenuVisibility, LLMenuButton::MP_BOTTOM_LEFT, true);
// Update the trash button when selected item(s) get worn or taken off.
LLOutfitObserver::instance().addCOFChangedCallback(boost::bind(&LLPanelMainInventory::updateListCommands, this));
@@ -1219,9 +1508,6 @@ void LLPanelMainInventory::initListCommandsHandlers()
void LLPanelMainInventory::updateListCommands()
{
- bool trash_enabled = isActionEnabled("delete");
-
- mTrashButton->setEnabled(trash_enabled);
}
void LLPanelMainInventory::onAddButtonClick()
@@ -1232,7 +1518,7 @@ void LLPanelMainInventory::onAddButtonClick()
LLMenuGL* menu = (LLMenuGL*)mMenuAddHandle.get();
if (menu)
{
- menu->getChild<LLMenuItemGL>("New Folder")->setEnabled(!isRecentItemsPanelSelected());
+ disableAddIfNeeded();
setUploadCostIfNeeded();
@@ -1240,6 +1526,215 @@ void LLPanelMainInventory::onAddButtonClick()
}
}
+void LLPanelMainInventory::setActivePanel()
+{
+ // Todo: should cover gallery mode in some way
+ if(mSingleFolderMode && isListViewMode())
+ {
+ mActivePanel = getChild<LLInventoryPanel>("comb_single_folder_inv");
+ }
+ else if(mSingleFolderMode && isCombinationViewMode())
+ {
+ mActivePanel = getChild<LLInventoryPanel>("comb_single_folder_inv");
+ }
+ else
+ {
+ mActivePanel = (LLInventoryPanel*)getChild<LLTabContainer>("inventory filter tabs")->getCurrentPanel();
+ }
+ mViewModeBtn->setEnabled(mSingleFolderMode || (getAllItemsPanel() == getActivePanel()));
+}
+
+void LLPanelMainInventory::initSingleFolderRoot(const LLUUID& start_folder_id)
+{
+ mCombinationInventoryPanel->initFolderRoot(start_folder_id);
+}
+
+void LLPanelMainInventory::initInventoryViews()
+{
+ LLInventoryPanel* all_item = getChild<LLInventoryPanel>(ALL_ITEMS);
+ all_item->initializeViewBuilding();
+ LLInventoryPanel* recent_item = getChild<LLInventoryPanel>(RECENT_ITEMS);
+ recent_item->initializeViewBuilding();
+ LLInventoryPanel* worn_item = getChild<LLInventoryPanel>(WORN_ITEMS);
+ worn_item->initializeViewBuilding();
+}
+
+void LLPanelMainInventory::toggleViewMode()
+{
+ if(mSingleFolderMode && isCombinationViewMode())
+ {
+ mCombinationInventoryPanel->getRootFolder()->setForceArrange(false);
+ }
+
+ mSingleFolderMode = !mSingleFolderMode;
+ mReshapeInvLayout = true;
+
+ if (mCombinationGalleryPanel->getRootFolder().isNull())
+ {
+ mCombinationGalleryPanel->setRootFolder(mCombinationInventoryPanel->getSingleFolderRoot());
+ mCombinationGalleryPanel->updateRootFolder();
+ }
+
+ updatePanelVisibility();
+ setActivePanel();
+ updateTitle();
+ onFilterSelected();
+
+ LLSidepanelInventory* sidepanel_inventory = getParentSidepanelInventory();
+ if (sidepanel_inventory)
+ {
+ if(mSingleFolderMode)
+ {
+ sidepanel_inventory->hideInbox();
+ }
+ else
+ {
+ sidepanel_inventory->toggleInbox();
+ }
+ }
+}
+
+void LLPanelMainInventory::onViewModeClick()
+{
+ LLUUID selected_folder;
+ LLUUID new_root_folder;
+ if(mSingleFolderMode)
+ {
+ selected_folder = getCurrentSFVRoot();
+ }
+ else
+ {
+ LLFolderView* root = getActivePanel()->getRootFolder();
+ std::set<LLFolderViewItem*> selection_set = root->getSelectionList();
+ if (selection_set.size() == 1)
+ {
+ LLFolderViewItem* current_item = *selection_set.begin();
+ if (current_item)
+ {
+ const LLUUID& id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
+ if(gInventory.getCategory(id) != NULL)
+ {
+ new_root_folder = id;
+ }
+ else
+ {
+ const LLViewerInventoryItem* selected_item = gInventory.getItem(id);
+ if (selected_item && selected_item->getParentUUID().notNull())
+ {
+ new_root_folder = selected_item->getParentUUID();
+ selected_folder = id;
+ }
+ }
+ }
+ }
+ mCombinationInventoryPanel->initFolderRoot(new_root_folder);
+ }
+
+ toggleViewMode();
+
+ if (mSingleFolderMode && new_root_folder.notNull())
+ {
+ setSingleFolderViewRoot(new_root_folder, true);
+ if(selected_folder.notNull() && isListViewMode())
+ {
+ getActivePanel()->setSelection(selected_folder, TAKE_FOCUS_YES);
+ }
+ }
+ else
+ {
+ if(selected_folder.notNull())
+ {
+ selectAllItemsPanel();
+ getActivePanel()->setSelection(selected_folder, TAKE_FOCUS_YES);
+ }
+ }
+}
+
+void LLPanelMainInventory::onUpFolderClicked()
+{
+ const LLViewerInventoryCategory* cat = gInventory.getCategory(getCurrentSFVRoot());
+ if (cat)
+ {
+ if (cat->getParentUUID().notNull())
+ {
+ if(isListViewMode())
+ {
+ mCombinationInventoryPanel->changeFolderRoot(cat->getParentUUID());
+ }
+ if(isGalleryViewMode())
+ {
+ mCombinationGalleryPanel->setRootFolder(cat->getParentUUID());
+ }
+ if(isCombinationViewMode())
+ {
+ mCombinationInventoryPanel->changeFolderRoot(cat->getParentUUID());
+ }
+ }
+ }
+}
+
+void LLPanelMainInventory::onBackFolderClicked()
+{
+ if(isListViewMode())
+ {
+ mCombinationInventoryPanel->onBackwardFolder();
+ }
+ if(isGalleryViewMode())
+ {
+ mCombinationGalleryPanel->onBackwardFolder();
+ }
+ if(isCombinationViewMode())
+ {
+ mCombinationInventoryPanel->onBackwardFolder();
+ }
+}
+
+void LLPanelMainInventory::onForwardFolderClicked()
+{
+ if(isListViewMode())
+ {
+ mCombinationInventoryPanel->onForwardFolder();
+ }
+ if(isGalleryViewMode())
+ {
+ mCombinationGalleryPanel->onForwardFolder();
+ }
+ if(isCombinationViewMode())
+ {
+ mCombinationInventoryPanel->onForwardFolder();
+ }
+}
+
+void LLPanelMainInventory::setSingleFolderViewRoot(const LLUUID& folder_id, bool clear_nav_history)
+{
+ if(isListViewMode())
+ {
+ mCombinationInventoryPanel->changeFolderRoot(folder_id);
+ if(clear_nav_history)
+ {
+ mCombinationInventoryPanel->clearNavigationHistory();
+ }
+ }
+ else if(isGalleryViewMode())
+ {
+ mCombinationGalleryPanel->setRootFolder(folder_id);
+ if(clear_nav_history)
+ {
+ mCombinationGalleryPanel->clearNavigationHistory();
+ }
+ }
+ else if(isCombinationViewMode())
+ {
+ mCombinationInventoryPanel->changeFolderRoot(folder_id);
+ }
+ updateNavButtons();
+}
+
+LLUUID LLPanelMainInventory::getSingleFolderViewRoot()
+{
+ return mCombinationInventoryPanel->getSingleFolderRoot();
+}
+
void LLPanelMainInventory::showActionMenu(LLMenuGL* menu, std::string spawning_view_name)
{
if (menu)
@@ -1249,17 +1744,11 @@ void LLPanelMainInventory::showActionMenu(LLMenuGL* menu, std::string spawning_v
LLView* spawning_view = getChild<LLView> (spawning_view_name);
S32 menu_x, menu_y;
//show menu in co-ordinates of panel
- spawning_view->localPointToOtherView(0, spawning_view->getRect().getHeight(), &menu_x, &menu_y, this);
- menu_y += menu->getRect().getHeight();
+ spawning_view->localPointToOtherView(0, 0, &menu_x, &menu_y, this);
LLMenuGL::showPopup(this, menu, menu_x, menu_y);
}
}
-void LLPanelMainInventory::onTrashButtonClick()
-{
- onClipboardAction("delete");
-}
-
void LLPanelMainInventory::onClipboardAction(const LLSD& userdata)
{
std::string command_name = userdata.asString();
@@ -1268,13 +1757,22 @@ void LLPanelMainInventory::onClipboardAction(const LLSD& userdata)
void LLPanelMainInventory::saveTexture(const LLSD& userdata)
{
- LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
- if (!current_item)
- {
- return;
- }
-
- const LLUUID& item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
+ LLUUID item_id;
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ item_id = mCombinationGalleryPanel->getFirstSelectedItemID();
+ if (item_id.isNull()) return;
+ }
+ else
+ {
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (!current_item)
+ {
+ return;
+ }
+ item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
+ }
+
LLPreviewTexture* preview_texture = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(item_id), TAKE_FOCUS_YES);
if (preview_texture)
{
@@ -1288,6 +1786,7 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
return;
const std::string command_name = userdata.asString();
+
if (command_name == "new_window")
{
newWindow();
@@ -1357,35 +1856,69 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
}
if (command_name == "find_original")
{
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ LLInventoryObject *obj = gInventory.getObject(mCombinationGalleryPanel->getFirstSelectedItemID());
+ if (obj && obj->getIsLinkType())
+ {
+ show_item_original(obj->getUUID());
+ }
+ }
+ else
+ {
LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
if (!current_item)
{
return;
}
static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->performAction(getActivePanel()->getModel(), "goto");
+ }
}
if (command_name == "find_links")
{
- LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
- if (!current_item)
- {
- return;
- }
- const LLUUID& item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
- const std::string &item_name = current_item->getViewModelItem()->getName();
- mFilterSubString = item_name;
-
- LLInventoryFilter &filter = mActivePanel->getFilter();
- filter.setFindAllLinksMode(item_name, item_id);
-
- mFilterEditor->setText(item_name);
- mFilterEditor->setFocus(TRUE);
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ LLFloaterSidePanelContainer* inventory_container = newWindow();
+ if (inventory_container)
+ {
+ LLSidepanelInventory* sidepanel_inventory = dynamic_cast<LLSidepanelInventory*>(inventory_container->findChild<LLPanel>("main_panel", true));
+ if (sidepanel_inventory)
+ {
+ LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel();
+ if (main_inventory)
+ {
+ LLInventoryObject *obj = gInventory.getObject(mCombinationGalleryPanel->getFirstSelectedItemID());
+ if (obj)
+ {
+ main_inventory->findLinks(obj->getUUID(), obj->getName());
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (!current_item)
+ {
+ return;
+ }
+ const LLUUID& item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
+ const std::string &item_name = current_item->getViewModelItem()->getName();
+ findLinks(item_id, item_name);
+ }
}
if (command_name == "replace_links")
{
- LLSD params;
+ LLSD params;
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ params = LLSD(mCombinationGalleryPanel->getFirstSelectedItemID());
+ }
+ else
+ {
LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
if (current_item)
{
@@ -1400,23 +1933,72 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
}
}
}
+ }
LLFloaterReg::showInstance("linkreplace", params);
}
+ if (command_name == "close_inv_windows")
+ {
+ LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
+ for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end();)
+ {
+ LLFloaterSidePanelContainer* iv = dynamic_cast<LLFloaterSidePanelContainer*>(*iter++);
+ if (iv)
+ {
+ iv->closeFloater();
+ }
+ }
+ LLFloaterReg::hideInstance("inventory_settings");
+ }
+
+ if (command_name == "toggle_search_outfits")
+ {
+ getCurrentFilter().toggleSearchVisibilityOutfits();
+ }
+
if (command_name == "toggle_search_trash")
{
- mActivePanel->getFilter().toggleSearchVisibilityTrash();
+ getCurrentFilter().toggleSearchVisibilityTrash();
}
if (command_name == "toggle_search_library")
{
- mActivePanel->getFilter().toggleSearchVisibilityLibrary();
+ getCurrentFilter().toggleSearchVisibilityLibrary();
}
if (command_name == "include_links")
{
- mActivePanel->getFilter().toggleSearchVisibilityLinks();
- }
+ getCurrentFilter().toggleSearchVisibilityLinks();
+ }
+
+ if (command_name == "share")
+ {
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ std::set<LLUUID> uuids{ mCombinationGalleryPanel->getFirstSelectedItemID()};
+ LLAvatarActions::shareWithAvatars(uuids, gFloaterView->getParentFloater(this));
+ }
+ else
+ {
+ LLAvatarActions::shareWithAvatars(this);
+ }
+ }
+ if (command_name == "shop")
+ {
+ LLWeb::loadURL(gSavedSettings.getString("MarketplaceURL"));
+ }
+ if (command_name == "list_view")
+ {
+ setViewMode(MODE_LIST);
+ }
+ if (command_name == "gallery_view")
+ {
+ setViewMode(MODE_GALLERY);
+ }
+ if (command_name == "combination_view")
+ {
+ setViewMode(MODE_COMBINATION);
+ }
}
void LLPanelMainInventory::onVisibilityChange( BOOL new_visibility )
@@ -1434,17 +2016,26 @@ void LLPanelMainInventory::onVisibilityChange( BOOL new_visibility )
bool LLPanelMainInventory::isSaveTextureEnabled(const LLSD& userdata)
{
- LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
- if (current_item)
- {
- LLViewerInventoryItem *inv_item = dynamic_cast<LLViewerInventoryItem*>(static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getInventoryObject());
+ LLViewerInventoryItem *inv_item = NULL;
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ inv_item = gInventory.getItem(mCombinationGalleryPanel->getFirstSelectedItemID());
+ }
+ else
+ {
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (current_item)
+ {
+ inv_item = dynamic_cast<LLViewerInventoryItem*>(static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getInventoryObject());
+ }
+ }
if(inv_item)
{
bool can_save = inv_item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED);
- LLInventoryType::EType curr_type = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getInventoryType();
+ LLInventoryType::EType curr_type = inv_item->getInventoryType();
return can_save && (curr_type == LLInventoryType::IT_TEXTURE || curr_type == LLInventoryType::IT_SNAPSHOT);
}
- }
+
return false;
}
@@ -1475,9 +2066,16 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
}
if (command_name == "find_original")
{
+ LLUUID item_id;
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ item_id = mCombinationGalleryPanel->getFirstSelectedItemID();
+ }
+ else{
LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
if (!current_item) return FALSE;
- const LLUUID& item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
+ item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
+ }
const LLViewerInventoryItem *item = gInventory.getItem(item_id);
if (item && item->getIsLinkType() && !item->getIsBrokenLink())
{
@@ -1488,12 +2086,19 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
if (command_name == "find_links")
{
+ LLUUID item_id;
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ item_id = mCombinationGalleryPanel->getFirstSelectedItemID();
+ }
+ else{
LLFolderView* root = getActivePanel()->getRootFolder();
std::set<LLFolderViewItem*> selection_set = root->getSelectionList();
if (selection_set.size() != 1) return FALSE;
LLFolderViewItem* current_item = root->getCurSelectedItem();
if (!current_item) return FALSE;
- const LLUUID& item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
+ item_id = static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->getUUID();
+ }
const LLInventoryObject *obj = gInventory.getObject(item_id);
if (obj && !obj->getIsLinkType() && LLAssetType::lookupCanLink(obj->getType()))
{
@@ -1517,10 +2122,16 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
if (command_name == "share")
{
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ return can_share_item(mCombinationGalleryPanel->getFirstSelectedItemID());
+ }
+ else{
LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
if (!current_item) return FALSE;
LLSidepanelInventory* parent = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
return parent ? parent->canShare() : FALSE;
+ }
}
if (command_name == "empty_trash")
{
@@ -1538,9 +2149,24 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
return TRUE;
}
+bool LLPanelMainInventory::isActionVisible(const LLSD& userdata)
+{
+ const std::string param_str = userdata.asString();
+ if (param_str == "single_folder_view")
+ {
+ return mSingleFolderMode;
+ }
+ if (param_str == "multi_folder_view")
+ {
+ return !mSingleFolderMode;
+ }
+
+ return true;
+}
+
BOOL LLPanelMainInventory::isActionChecked(const LLSD& userdata)
{
- U32 sort_order_mask = getActivePanel()->getSortOrder();
+ U32 sort_order_mask = (mSingleFolderMode && isGalleryViewMode()) ? mCombinationGalleryPanel->getSortOrder() : getActivePanel()->getSortOrder();
const std::string command_name = userdata.asString();
if (command_name == "sort_by_name")
{
@@ -1562,36 +2188,40 @@ BOOL LLPanelMainInventory::isActionChecked(const LLSD& userdata)
return sort_order_mask & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
}
+ if (command_name == "toggle_search_outfits")
+ {
+ return (getCurrentFilter().getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_OUTFITS) != 0;
+ }
+
if (command_name == "toggle_search_trash")
{
- return (mActivePanel->getFilter().getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_TRASH) != 0;
+ return (getCurrentFilter().getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_TRASH) != 0;
}
if (command_name == "toggle_search_library")
{
- return (mActivePanel->getFilter().getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_LIBRARY) != 0;
+ return (getCurrentFilter().getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_LIBRARY) != 0;
}
if (command_name == "include_links")
{
- return (mActivePanel->getFilter().getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_LINKS) != 0;
+ return (getCurrentFilter().getSearchVisibilityTypes() & LLInventoryFilter::VISIBILITY_LINKS) != 0;
}
- return FALSE;
-}
-
-bool LLPanelMainInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept)
-{
- *accept = ACCEPT_NO;
-
- const bool is_enabled = isActionEnabled("delete");
- if (is_enabled) *accept = ACCEPT_YES_MULTI;
+ if (command_name == "list_view")
+ {
+ return isListViewMode();
+ }
+ if (command_name == "gallery_view")
+ {
+ return isGalleryViewMode();
+ }
+ if (command_name == "combination_view")
+ {
+ return isCombinationViewMode();
+ }
- if (is_enabled && drop)
- {
- onClipboardAction("delete");
- }
- return true;
+ return FALSE;
}
void LLPanelMainInventory::setUploadCostIfNeeded()
@@ -1609,6 +2239,55 @@ void LLPanelMainInventory::setUploadCostIfNeeded()
}
}
+bool is_add_allowed(LLUUID folder_id)
+{
+ if(!gInventory.isObjectDescendentOf(folder_id, gInventory.getRootFolderID()))
+ {
+ return false;
+ }
+
+ std::vector<LLFolderType::EType> not_allowed_types;
+ not_allowed_types.push_back(LLFolderType::FT_LOST_AND_FOUND);
+ not_allowed_types.push_back(LLFolderType::FT_FAVORITE);
+ not_allowed_types.push_back(LLFolderType::FT_MARKETPLACE_LISTINGS);
+ not_allowed_types.push_back(LLFolderType::FT_TRASH);
+ not_allowed_types.push_back(LLFolderType::FT_CURRENT_OUTFIT);
+ not_allowed_types.push_back(LLFolderType::FT_INBOX);
+
+ for (std::vector<LLFolderType::EType>::const_iterator it = not_allowed_types.begin();
+ it != not_allowed_types.end(); ++it)
+ {
+ if(gInventory.isObjectDescendentOf(folder_id, gInventory.findCategoryUUIDForType(*it)))
+ {
+ return false;
+ }
+ }
+
+ LLViewerInventoryCategory* cat = gInventory.getCategory(folder_id);
+ if (cat && (cat->getPreferredType() == LLFolderType::FT_OUTFIT))
+ {
+ return false;
+ }
+ return true;
+}
+
+void LLPanelMainInventory::disableAddIfNeeded()
+{
+ LLMenuGL* menu = (LLMenuGL*)mMenuAddHandle.get();
+ if (menu)
+ {
+ bool enable = !mSingleFolderMode || is_add_allowed(getCurrentSFVRoot());
+
+ menu->getChild<LLMenuItemGL>("New Folder")->setEnabled(enable && !isRecentItemsPanelSelected());
+ menu->getChild<LLMenuItemGL>("New Script")->setEnabled(enable);
+ menu->getChild<LLMenuItemGL>("New Note")->setEnabled(enable);
+ menu->getChild<LLMenuItemGL>("New Gesture")->setEnabled(enable);
+ menu->setItemEnabled("New Clothes", enable);
+ menu->setItemEnabled("New Body Parts", enable);
+ menu->setItemEnabled("New Settings", enable);
+ }
+}
+
bool LLPanelMainInventory::hasSettingsInventory()
{
return LLEnvironment::instance().isInventoryEnabled();
@@ -1622,5 +2301,356 @@ bool LLPanelMainInventory::hasMaterialsInventory()
return (!agent_url.empty() && !task_url.empty());
}
+void LLPanelMainInventory::updateTitle()
+{
+ LLFloater* inventory_floater = gFloaterView->getParentFloater(this);
+ if(inventory_floater)
+ {
+ if(mSingleFolderMode)
+ {
+ inventory_floater->setTitle(getLocalizedRootName());
+ LLFloaterInventoryFinder *finder = getFinder();
+ if (finder)
+ {
+ finder->setTitle(getLocalizedRootName());
+ }
+ }
+ else
+ {
+ inventory_floater->setTitle(getString("inventory_title"));
+ }
+ }
+ updateNavButtons();
+}
+
+void LLPanelMainInventory::onCombinationRootChanged(bool gallery_clicked)
+{
+ if(gallery_clicked)
+ {
+ mCombinationInventoryPanel->changeFolderRoot(mCombinationGalleryPanel->getRootFolder());
+ }
+ else
+ {
+ mCombinationGalleryPanel->setRootFolder(mCombinationInventoryPanel->getSingleFolderRoot());
+ }
+ mForceShowInvLayout = false;
+ updateTitle();
+ mReshapeInvLayout = true;
+}
+
+void LLPanelMainInventory::onCombinationGallerySelectionChanged(const LLUUID& category_id)
+{
+}
+
+void LLPanelMainInventory::onCombinationInventorySelectionChanged(const std::deque<LLFolderViewItem*>& items, BOOL user_action)
+{
+ onSelectionChange(mCombinationInventoryPanel, items, user_action);
+}
+
+void LLPanelMainInventory::updatePanelVisibility()
+{
+ mDefaultViewPanel->setVisible(!mSingleFolderMode);
+ mCombinationViewPanel->setVisible(mSingleFolderMode);
+ mNavigationBtnsPanel->setVisible(mSingleFolderMode);
+ mViewModeBtn->setImageOverlay(mSingleFolderMode ? getString("default_mode_btn") : getString("single_folder_mode_btn"));
+ mViewModeBtn->setEnabled(mSingleFolderMode || (getAllItemsPanel() == getActivePanel()));
+ if (mSingleFolderMode)
+ {
+ if (isCombinationViewMode())
+ {
+ LLInventoryFilter& comb_inv_filter = mCombinationInventoryPanel->getFilter();
+ comb_inv_filter.setFilterThumbnails(LLInventoryFilter::FILTER_EXCLUDE_THUMBNAILS);
+ comb_inv_filter.markDefault();
+
+ LLInventoryFilter& comb_gallery_filter = mCombinationGalleryPanel->getFilter();
+ comb_gallery_filter.setFilterThumbnails(LLInventoryFilter::FILTER_ONLY_THUMBNAILS);
+ comb_gallery_filter.markDefault();
+
+ // visibility will be controled by updateCombinationVisibility()
+ mCombinationGalleryLayoutPanel->setVisible(true);
+ mCombinationGalleryPanel->setVisible(true);
+ mCombinationListLayoutPanel->setVisible(true);
+ }
+ else
+ {
+ LLInventoryFilter& comb_inv_filter = mCombinationInventoryPanel->getFilter();
+ comb_inv_filter.setFilterThumbnails(LLInventoryFilter::FILTER_INCLUDE_THUMBNAILS);
+ comb_inv_filter.markDefault();
+
+ LLInventoryFilter& comb_gallery_filter = mCombinationGalleryPanel->getFilter();
+ comb_gallery_filter.setFilterThumbnails(LLInventoryFilter::FILTER_INCLUDE_THUMBNAILS);
+ comb_gallery_filter.markDefault();
+
+ mCombinationLayoutStack->setPanelSpacing(0);
+ mCombinationGalleryLayoutPanel->setVisible(mSingleFolderMode && isGalleryViewMode());
+ mCombinationGalleryPanel->setVisible(mSingleFolderMode && isGalleryViewMode()); // to prevent or process updates
+ mCombinationListLayoutPanel->setVisible(mSingleFolderMode && isListViewMode());
+ }
+ }
+ else
+ {
+ mCombinationGalleryLayoutPanel->setVisible(false);
+ mCombinationGalleryPanel->setVisible(false); // to prevent updates
+ mCombinationListLayoutPanel->setVisible(false);
+ }
+}
+
+void LLPanelMainInventory::updateCombinationVisibility()
+{
+ if(mSingleFolderMode && isCombinationViewMode())
+ {
+ bool is_gallery_empty = !mCombinationGalleryPanel->hasVisibleItems();
+ bool show_inv_pane = mCombinationInventoryPanel->hasVisibleItems() || is_gallery_empty || mForceShowInvLayout;
+
+ const S32 DRAG_HANDLE_PADDING = 12; // for drag handle to not overlap gallery when both inventories are visible
+ mCombinationLayoutStack->setPanelSpacing(show_inv_pane ? DRAG_HANDLE_PADDING : 0);
+
+ mCombinationGalleryLayoutPanel->setVisible(!is_gallery_empty);
+ mCombinationListLayoutPanel->setVisible(show_inv_pane);
+ mCombinationInventoryPanel->getRootFolder()->setForceArrange(!show_inv_pane);
+ if(mCombinationInventoryPanel->hasVisibleItems())
+ {
+ mForceShowInvLayout = false;
+ }
+ if(is_gallery_empty)
+ {
+ mCombinationGalleryPanel->handleModifiedFilter();
+ }
+
+ getActivePanel()->getRootFolder();
+
+ if (mReshapeInvLayout
+ && show_inv_pane
+ && (mCombinationGalleryPanel->hasVisibleItems() || mCombinationGalleryPanel->areViewsInitialized())
+ && mCombinationInventoryPanel->areViewsInitialized())
+ {
+ mReshapeInvLayout = false;
+
+ // force drop previous shape (because panel doesn't decrease shape properly)
+ LLRect list_latout = mCombinationListLayoutPanel->getRect();
+ list_latout.mTop = list_latout.mBottom; // min height is at 100, so it should snap to be bigger
+ mCombinationListLayoutPanel->setShape(list_latout, false);
+
+ LLRect inv_inner_rect = mCombinationInventoryPanel->getScrollableContainer()->getScrolledViewRect();
+ S32 inv_height = inv_inner_rect.getHeight()
+ + (mCombinationInventoryPanel->getScrollableContainer()->getBorderWidth() * 2)
+ + mCombinationInventoryPanel->getScrollableContainer()->getSize();
+ LLRect inner_galery_rect = mCombinationGalleryPanel->getScrollableContainer()->getScrolledViewRect();
+ S32 gallery_height = inner_galery_rect.getHeight()
+ + (mCombinationGalleryPanel->getScrollableContainer()->getBorderWidth() * 2)
+ + mCombinationGalleryPanel->getScrollableContainer()->getSize();
+ LLRect layout_rect = mCombinationViewPanel->getRect();
+
+ // by default make it take 1/3 of the panel
+ S32 list_default_height = layout_rect.getHeight() / 3;
+ // Don't set height from gallery_default_height - needs to account for a resizer in such case
+ S32 gallery_default_height = layout_rect.getHeight() - list_default_height;
+
+ if (inv_height > list_default_height
+ && gallery_height < gallery_default_height)
+ {
+ LLRect gallery_latout = mCombinationGalleryLayoutPanel->getRect();
+ gallery_latout.mTop = gallery_latout.mBottom + gallery_height;
+ mCombinationGalleryLayoutPanel->setShape(gallery_latout, true /*tell stack to account for new shape*/);
+ }
+ else if (inv_height < list_default_height
+ && gallery_height > gallery_default_height)
+ {
+ LLRect list_latout = mCombinationListLayoutPanel->getRect();
+ list_latout.mTop = list_latout.mBottom + inv_height;
+ mCombinationListLayoutPanel->setShape(list_latout, true /*tell stack to account for new shape*/);
+ }
+ else
+ {
+ LLRect list_latout = mCombinationListLayoutPanel->getRect();
+ list_latout.mTop = list_latout.mBottom + list_default_height;
+ mCombinationListLayoutPanel->setShape(list_latout, true /*tell stack to account for new shape*/);
+ }
+ }
+ }
+
+ if (mSingleFolderMode
+ && !isGalleryViewMode()
+ && mCombInvUUIDNeedsRename.notNull()
+ && mCombinationInventoryPanel->areViewsInitialized())
+ {
+ mCombinationInventoryPanel->setSelectionByID(mCombInvUUIDNeedsRename, TRUE);
+ mCombinationInventoryPanel->getRootFolder()->scrollToShowSelection();
+ mCombinationInventoryPanel->getRootFolder()->setNeedsAutoRename(TRUE);
+ mCombInvUUIDNeedsRename.setNull();
+ }
+}
+
+void LLPanelMainInventory::updateNavButtons()
+{
+ if(isListViewMode())
+ {
+ mBackBtn->setEnabled(mCombinationInventoryPanel->isBackwardAvailable());
+ mForwardBtn->setEnabled(mCombinationInventoryPanel->isForwardAvailable());
+ }
+ if(isGalleryViewMode())
+ {
+ mBackBtn->setEnabled(mCombinationGalleryPanel->isBackwardAvailable());
+ mForwardBtn->setEnabled(mCombinationGalleryPanel->isForwardAvailable());
+ }
+ if(isCombinationViewMode())
+ {
+ mBackBtn->setEnabled(mCombinationInventoryPanel->isBackwardAvailable());
+ mForwardBtn->setEnabled(mCombinationInventoryPanel->isForwardAvailable());
+ }
+
+ const LLViewerInventoryCategory* cat = gInventory.getCategory(getCurrentSFVRoot());
+ bool up_enabled = (cat && cat->getParentUUID().notNull());
+ mUpBtn->setEnabled(up_enabled);
+}
+
+LLSidepanelInventory* LLPanelMainInventory::getParentSidepanelInventory()
+{
+ LLFloaterSidePanelContainer* inventory_container = dynamic_cast<LLFloaterSidePanelContainer*>(gFloaterView->getParentFloater(this));
+ if(inventory_container)
+ {
+ return dynamic_cast<LLSidepanelInventory*>(inventory_container->findChild<LLPanel>("main_panel", true));
+ }
+ return NULL;
+}
+
+void LLPanelMainInventory::setViewMode(EViewModeType mode)
+{
+ if(mode != mViewMode)
+ {
+ std::list<LLUUID> forward_history;
+ std::list<LLUUID> backward_history;
+ U32 sort_order = 0;
+ switch(mViewMode)
+ {
+ case MODE_LIST:
+ forward_history = mCombinationInventoryPanel->getNavForwardList();
+ backward_history = mCombinationInventoryPanel->getNavBackwardList();
+ sort_order = mCombinationInventoryPanel->getSortOrder();
+ break;
+ case MODE_GALLERY:
+ forward_history = mCombinationGalleryPanel->getNavForwardList();
+ backward_history = mCombinationGalleryPanel->getNavBackwardList();
+ sort_order = mCombinationGalleryPanel->getSortOrder();
+ break;
+ case MODE_COMBINATION:
+ forward_history = mCombinationInventoryPanel->getNavForwardList();
+ backward_history = mCombinationInventoryPanel->getNavBackwardList();
+ mCombinationInventoryPanel->getRootFolder()->setForceArrange(false);
+ sort_order = mCombinationInventoryPanel->getSortOrder();
+ break;
+ }
+
+ LLUUID cur_root = getCurrentSFVRoot();
+ mViewMode = mode;
+
+ updatePanelVisibility();
+
+ if(isListViewMode())
+ {
+ mCombinationInventoryPanel->changeFolderRoot(cur_root);
+ mCombinationInventoryPanel->setNavForwardList(forward_history);
+ mCombinationInventoryPanel->setNavBackwardList(backward_history);
+ mCombinationInventoryPanel->setSortOrder(sort_order);
+ }
+ if(isGalleryViewMode())
+ {
+ mCombinationGalleryPanel->setRootFolder(cur_root);
+ mCombinationGalleryPanel->setNavForwardList(forward_history);
+ mCombinationGalleryPanel->setNavBackwardList(backward_history);
+ mCombinationGalleryPanel->setSortOrder(sort_order, true);
+ }
+ if(isCombinationViewMode())
+ {
+ mCombinationInventoryPanel->changeFolderRoot(cur_root);
+ mCombinationGalleryPanel->setRootFolder(cur_root);
+ mCombinationInventoryPanel->setNavForwardList(forward_history);
+ mCombinationInventoryPanel->setNavBackwardList(backward_history);
+ mCombinationGalleryPanel->setNavForwardList(forward_history);
+ mCombinationGalleryPanel->setNavBackwardList(backward_history);
+ mCombinationInventoryPanel->setSortOrder(sort_order);
+ mCombinationGalleryPanel->setSortOrder(sort_order, true);
+ }
+
+ updateNavButtons();
+
+ onFilterSelected();
+ if((isListViewMode() && (mActivePanel->getFilterSubString() != mFilterSubString)) ||
+ (isGalleryViewMode() && (mCombinationGalleryPanel->getFilterSubString() != mFilterSubString)))
+ {
+ onFilterEdit(mFilterSubString);
+ }
+ }
+}
+
+std::string LLPanelMainInventory::getLocalizedRootName()
+{
+ return mSingleFolderMode ? get_localized_folder_name(getCurrentSFVRoot()) : "";
+}
+
+LLUUID LLPanelMainInventory::getCurrentSFVRoot()
+{
+ if(isListViewMode())
+ {
+ return mCombinationInventoryPanel->getSingleFolderRoot();
+ }
+ if(isGalleryViewMode())
+ {
+ return mCombinationGalleryPanel->getRootFolder();
+ }
+ if(isCombinationViewMode())
+ {
+ return mCombinationInventoryPanel->getSingleFolderRoot();
+ }
+ return LLUUID::null;
+}
+
+LLInventoryFilter& LLPanelMainInventory::getCurrentFilter()
+{
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ return mCombinationGalleryPanel->getFilter();
+ }
+ else
+ {
+ return mActivePanel->getFilter();
+ }
+}
+
+void LLPanelMainInventory::setGallerySelection(const LLUUID& item_id, bool new_window)
+{
+ if(mSingleFolderMode && isGalleryViewMode())
+ {
+ mCombinationGalleryPanel->changeItemSelection(item_id, true);
+ }
+ else if(mSingleFolderMode && isCombinationViewMode())
+ {
+ if(mCombinationGalleryPanel->getFilter().checkAgainstFilterThumbnails(item_id))
+ {
+ mCombinationGalleryPanel->changeItemSelection(item_id, false);
+ scrollToGallerySelection();
+ }
+ else
+ {
+ mCombinationInventoryPanel->setSelection(item_id, true);
+ scrollToInvPanelSelection();
+ }
+ }
+ else if (mSingleFolderMode && isListViewMode())
+ {
+ mCombinationInventoryPanel->setSelection(item_id, true);
+ }
+}
+
+void LLPanelMainInventory::scrollToGallerySelection()
+{
+ mCombinationGalleryPanel->scrollToShowItem(mCombinationGalleryPanel->getFirstSelectedItemID());
+}
+
+void LLPanelMainInventory::scrollToInvPanelSelection()
+{
+ mCombinationInventoryPanel->getRootFolder()->scrollToShowSelection();
+}
+
// List Commands //
////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index 8f357d9e5a..fbfca43f64 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -30,6 +30,7 @@
#include "llpanel.h"
#include "llinventoryobserver.h"
+#include "llinventorypanel.h"
#include "lldndbutton.h"
#include "llfolderview.h"
@@ -37,14 +38,17 @@
class LLComboBox;
class LLFolderViewItem;
class LLInventoryPanel;
+class LLInventoryGallery;
class LLSaveFolderState;
class LLFilterEditor;
class LLTabContainer;
class LLFloaterInventoryFinder;
class LLMenuButton;
class LLMenuGL;
+class LLSidepanelInventory;
class LLToggleableMenu;
class LLFloater;
+class LLFloaterSidePanelContainer;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLPanelMainInventory
@@ -63,6 +67,13 @@ public:
BOOL postBuild();
+ enum EViewModeType
+ {
+ MODE_LIST,
+ MODE_GALLERY,
+ MODE_COMBINATION
+ };
+
virtual BOOL handleKeyHere(KEY key, MASK mask);
// Inherited functionality
@@ -80,6 +91,7 @@ public:
LLInventoryPanel* getAllItemsPanel();
void selectAllItemsPanel();
const LLInventoryPanel* getActivePanel() const { return mActivePanel; }
+ void setActivePanel();
bool isRecentItemsPanelSelected();
@@ -91,13 +103,40 @@ public:
void setFocusFilterEditor();
- static void newWindow();
+ static LLFloaterSidePanelContainer* newWindow();
+ static void newFolderWindow(LLUUID folder_id = LLUUID(), LLUUID item_to_select = LLUUID());
void toggleFindOptions();
void resetFilters();
void resetAllItemsFilters();
+ void findLinks(const LLUUID& item_id, const std::string& item_name);
+
+ void onViewModeClick();
+ void toggleViewMode();
+ void initSingleFolderRoot(const LLUUID& start_folder_id = LLUUID::null);
+ void initInventoryViews();
+ void onUpFolderClicked();
+ void onBackFolderClicked();
+ void onForwardFolderClicked();
+ void setSingleFolderViewRoot(const LLUUID& folder_id, bool clear_nav_history = true);
+ void setGallerySelection(const LLUUID& item_id, bool new_window = false);
+ LLUUID getSingleFolderViewRoot();
+ bool isSingleFolderMode() { return mSingleFolderMode; }
+
+ void scrollToGallerySelection();
+ void scrollToInvPanelSelection();
+
+ void setViewMode(EViewModeType mode);
+ bool isListViewMode() { return (mViewMode == MODE_LIST); }
+ bool isGalleryViewMode() { return (mViewMode == MODE_GALLERY); }
+ bool isCombinationViewMode() { return (mViewMode == MODE_COMBINATION); }
+ LLUUID getCurrentSFVRoot();
+ std::string getLocalizedRootName();
+
+ LLInventoryFilter& getCurrentFilter();
+
protected:
//
// Misc functions
@@ -127,9 +166,15 @@ protected:
bool isSaveTextureEnabled(const LLSD& userdata);
void updateItemcountText();
+ void updatePanelVisibility();
+ void updateCombinationVisibility();
+
void onFocusReceived();
void onSelectSearchType();
void updateSearchTypeCombo();
+ void setSearchType(LLInventoryFilter::ESearchType type);
+
+ LLSidepanelInventory* getParentSidepanelInventory();
private:
LLFloaterInventoryFinder* getFinder();
@@ -150,7 +195,26 @@ private:
std::string mCategoryCountString;
LLComboBox* mSearchTypeCombo;
+ LLButton* mBackBtn;
+ LLButton* mForwardBtn;
+ LLButton* mUpBtn;
+ LLButton* mViewModeBtn;
+ LLLayoutPanel* mNavigationBtnsPanel;
+
+ LLPanel* mDefaultViewPanel;
+ LLPanel* mCombinationViewPanel;
+ bool mSingleFolderMode;
+ EViewModeType mViewMode;
+
+ LLInventorySingleFolderPanel* mCombinationInventoryPanel;
+ LLInventoryGallery* mCombinationGalleryPanel;
+ LLPanel* mCombinationGalleryLayoutPanel;
+ LLLayoutPanel* mCombinationListLayoutPanel;
+ LLLayoutStack* mCombinationLayoutStack;
+
+ boost::signals2::connection mListViewRootUpdatedConnection;
+ boost::signals2::connection mGalleryRootUpdatedConnection;
//////////////////////////////////////////////////////////////////////////////////
// List Commands //
@@ -159,27 +223,38 @@ protected:
void updateListCommands();
void onAddButtonClick();
void showActionMenu(LLMenuGL* menu, std::string spawning_view_name);
- void onTrashButtonClick();
void onClipboardAction(const LLSD& userdata);
BOOL isActionEnabled(const LLSD& command_name);
BOOL isActionChecked(const LLSD& userdata);
void onCustomAction(const LLSD& command_name);
- bool handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept);
+ bool isActionVisible(const LLSD& userdata);
static bool hasSettingsInventory();
static bool hasMaterialsInventory();
+ void updateTitle();
+ void updateNavButtons();
+
+ void onCombinationRootChanged(bool gallery_clicked);
+ void onCombinationGallerySelectionChanged(const LLUUID& category_id);
+ void onCombinationInventorySelectionChanged(const std::deque<LLFolderViewItem*>& items, BOOL user_action);
/**
* Set upload cost in "Upload" sub menu.
*/
void setUploadCostIfNeeded();
+ void disableAddIfNeeded();
private:
- LLDragAndDropButton* mTrashButton;
LLToggleableMenu* mMenuGearDefault;
+ LLToggleableMenu* mMenuViewDefault;
LLToggleableMenu* mMenuVisibility;
LLMenuButton* mGearMenuButton;
+ LLMenuButton* mViewMenuButton;
LLMenuButton* mVisibilityMenuButton;
LLHandle<LLView> mMenuAddHandle;
bool mNeedUploadCost;
+
+ bool mForceShowInvLayout;
+ bool mReshapeInvLayout;
+ LLUUID mCombInvUUIDNeedsRename;
// List Commands //
////////////////////////////////////////////////////////////////////////////////
};
diff --git a/indra/newview/llpanelmarketplaceinbox.cpp b/indra/newview/llpanelmarketplaceinbox.cpp
index 8a86f4f63d..3638ee14fc 100644
--- a/indra/newview/llpanelmarketplaceinbox.cpp
+++ b/indra/newview/llpanelmarketplaceinbox.cpp
@@ -75,9 +75,6 @@ BOOL LLPanelMarketplaceInbox::postBuild()
void LLPanelMarketplaceInbox::onSelectionChange()
{
- LLSidepanelInventory* sidepanel_inventory = LLFloaterSidePanelContainer::getPanel<LLSidepanelInventory>("inventory");
-
- sidepanel_inventory->updateVerbs();
}
diff --git a/indra/newview/llpanelmarketplaceinboxinventory.cpp b/indra/newview/llpanelmarketplaceinboxinventory.cpp
index 7a6631448b..e13bd0412d 100644
--- a/indra/newview/llpanelmarketplaceinboxinventory.cpp
+++ b/indra/newview/llpanelmarketplaceinboxinventory.cpp
@@ -62,10 +62,13 @@ LLInboxInventoryPanel::LLInboxInventoryPanel(const LLInboxInventoryPanel::Params
: LLInventoryPanel(p)
{
LLInboxNewItemsStorage::getInstance()->load();
+ LLInboxNewItemsStorage::getInstance()->addInboxPanel(this);
}
LLInboxInventoryPanel::~LLInboxInventoryPanel()
-{}
+{
+ LLInboxNewItemsStorage::getInstance()->removeInboxPanel(this);
+}
void LLInboxInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
{
@@ -108,6 +111,21 @@ LLFolderViewItem * LLInboxInventoryPanel::createFolderViewItem(LLInvFVBridge * b
return LLUICtrlFactory::create<LLInboxFolderViewItem>(params);
}
+void LLInboxInventoryPanel::onRemoveItemFreshness(const LLUUID& item_id)
+{
+ LLInboxFolderViewFolder* inbox_folder_view = dynamic_cast<LLInboxFolderViewFolder*>(getFolderByID(item_id));
+ if(inbox_folder_view)
+ {
+ inbox_folder_view->setFresh(false);
+ }
+
+ LLInboxFolderViewItem* inbox_item_view = dynamic_cast<LLInboxFolderViewItem*>(getItemByID(item_id));
+ if(inbox_item_view)
+ {
+ inbox_item_view->setFresh(false);
+ }
+}
+
//
// LLInboxFolderViewFolder Implementation
//
@@ -340,4 +358,18 @@ void LLInboxNewItemsStorage::load()
}
}
}
+
+void LLInboxNewItemsStorage::removeItem(const LLUUID& id)
+{
+ mNewItemsIDs.erase(id);
+
+ //notify inbox panels
+ for (auto inbox : mInboxPanels)
+ {
+ if(inbox)
+ {
+ inbox->onRemoveItemFreshness(id);
+ }
+ }
+}
// eof
diff --git a/indra/newview/llpanelmarketplaceinboxinventory.h b/indra/newview/llpanelmarketplaceinboxinventory.h
index 3e508e801b..9eef5f209c 100644
--- a/indra/newview/llpanelmarketplaceinboxinventory.h
+++ b/indra/newview/llpanelmarketplaceinboxinventory.h
@@ -49,6 +49,8 @@ public:
void initFromParams(const LLInventoryPanel::Params&);
LLFolderViewFolder* createFolderViewFolder(LLInvFVBridge * bridge, bool allow_drop);
LLFolderViewItem * createFolderViewItem(LLInvFVBridge * bridge);
+
+ void onRemoveItemFreshness(const LLUUID& item_id);
};
@@ -77,6 +79,7 @@ public:
void deFreshify();
bool isFresh() const { return mFresh; }
+ void setFresh(bool is_fresh) { mFresh = is_fresh; }
protected:
bool mFresh;
@@ -108,6 +111,7 @@ public:
void deFreshify();
bool isFresh() const { return mFresh; }
+ void setFresh(bool is_fresh) { mFresh = is_fresh; }
protected:
bool mFresh;
@@ -125,11 +129,16 @@ public:
void load();
void addFreshItem(const LLUUID& id) { mNewItemsIDs.insert(id); }
- void removeItem(const LLUUID& id) { mNewItemsIDs.erase(id); }
+ void removeItem(const LLUUID& id);
bool isItemFresh(const LLUUID& id) { return (mNewItemsIDs.find(id) != mNewItemsIDs.end()); }
+ void addInboxPanel(LLInboxInventoryPanel* inbox) { mInboxPanels.insert(inbox); }
+ void removeInboxPanel(LLInboxInventoryPanel* inbox) { mInboxPanels.erase(inbox); }
+
private:
std::set<LLUUID> mNewItemsIDs;
+
+ std::set<LLInboxInventoryPanel*> mInboxPanels;
};
#endif //LL_INBOXINVENTORYPANEL_H
diff --git a/indra/newview/llpanelnearbymedia.cpp b/indra/newview/llpanelnearbymedia.cpp
index 02911313ed..3c3cd5d522 100644
--- a/indra/newview/llpanelnearbymedia.cpp
+++ b/indra/newview/llpanelnearbymedia.cpp
@@ -619,7 +619,6 @@ void LLPanelNearByMedia::refreshList()
LLViewerMedia::impl_list impls = media_inst->getPriorityList();
LLViewerMedia::impl_list::iterator priority_iter;
- U32 enabled_count = 0;
U32 disabled_count = 0;
// iterate over the impl list, creating rows as necessary.
@@ -662,13 +661,10 @@ void LLPanelNearByMedia::refreshList()
{
disabled_count++;
}
- else {
- enabled_count++;
}
}
- }
mDisableAllCtrl->setEnabled((gSavedSettings.getBOOL("AudioStreamingMusic") ||
- gSavedSettings.getBOOL("AudioStreamingMedia")) &&
+ gSavedSettings.getBOOL("AudioStreamingMedia")) &&
(media_inst->isAnyMediaShowing() ||
media_inst->isParcelMediaPlaying() ||
media_inst->isParcelAudioPlaying()));
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index 2db8620d2d..f3a41f2e25 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -117,6 +117,7 @@ public:
virtual PermissionMask getPermissionMask() const { return PERM_NONE; }
/*virtual*/ LLFolderType::EType getPreferredType() const { return LLFolderType::FT_NONE; }
virtual const LLUUID& getUUID() const { return mUUID; }
+ virtual const LLUUID& getThumbnailUUID() const { return LLUUID::null;}
virtual time_t getCreationDate() const;
virtual void setCreationDate(time_t creation_date_utc);
@@ -125,6 +126,7 @@ public:
virtual BOOL canOpenItem() const { return FALSE; }
virtual void closeItem() {}
virtual void selectItem() {}
+ virtual void navigateToFolder(bool new_window = false, bool change_mode = false) {}
virtual BOOL isItemRenameable() const;
virtual BOOL renameItem(const std::string& new_name);
virtual BOOL isItemMovable() const;
@@ -1427,7 +1429,8 @@ void LLPanelObjectInventory::reset()
LLEditMenuHandler::gEditMenuHandler = mFolders;
}
- LLRect scroller_rect(0, getRect().getHeight(), getRect().getWidth(), 0);
+ int offset = hasBorder() ? getBorder()->getBorderWidth() << 1 : 0;
+ LLRect scroller_rect(0, getRect().getHeight() - offset, getRect().getWidth() - offset, 0);
LLScrollContainer::Params scroll_p;
scroll_p.name("task inventory scroller");
scroll_p.rect(scroller_rect);
@@ -1456,21 +1459,6 @@ void LLPanelObjectInventory::inventoryChanged(LLViewerObject* object,
{
mInventoryNeedsUpdate = TRUE;
}
-
- // refresh any properties floaters that are hanging around.
- if(inventory)
- {
- for (LLInventoryObject::object_list_t::const_iterator iter = inventory->begin();
- iter != inventory->end(); )
- {
- LLInventoryObject* item = *iter++;
- LLFloaterProperties* floater = LLFloaterReg::findTypedInstance<LLFloaterProperties>("properties", item->getUUID());
- if(floater)
- {
- floater->refresh();
- }
- }
- }
}
void LLPanelObjectInventory::updateInventory()
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
index 35582d2967..4a755a6e93 100644
--- a/indra/newview/llpaneloutfitedit.cpp
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -699,8 +699,12 @@ void LLPanelOutfitEdit::onFolderViewFilterCommitted(LLUICtrl* ctrl)
LLOpenFoldersWithSelection opener;
mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(opener);
mInventoryItemsPanel->getRootFolder()->scrollToShowSelection();
-
- LLInventoryModelBackgroundFetch::instance().start();
+
+ if (!LLInventoryModelBackgroundFetch::instance().inventoryFetchStarted())
+ {
+ llassert(false); // this should have been done on startup
+ LLInventoryModelBackgroundFetch::instance().start();
+ }
}
void LLPanelOutfitEdit::onListViewFilterCommitted(LLUICtrl* ctrl)
@@ -737,8 +741,12 @@ void LLPanelOutfitEdit::onSearchEdit(const std::string& string)
mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(opener);
mInventoryItemsPanel->getRootFolder()->scrollToShowSelection();
}
-
- LLInventoryModelBackgroundFetch::instance().start();
+
+ if (!LLInventoryModelBackgroundFetch::instance().inventoryFetchStarted())
+ {
+ llassert(false); // this should have been done on startup
+ LLInventoryModelBackgroundFetch::instance().start();
+ }
if (mInventoryItemsPanel->getFilterSubString().empty() && mSearchString.empty())
{
diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp
index 531073526b..d8c34d5c40 100644
--- a/indra/newview/llpaneloutfitsinventory.cpp
+++ b/indra/newview/llpaneloutfitsinventory.cpp
@@ -87,7 +87,7 @@ BOOL LLPanelOutfitsInventory::postBuild()
// ( This is only necessary if we want to show a warning if a user deletes an item that has a
// a link in an outfit, see "ConfirmItemDeleteHasLinks". )
- const LLUUID &outfits_cat = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS, false);
+ const LLUUID &outfits_cat = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
if (outfits_cat.notNull())
{
LLInventoryModelBackgroundFetch::instance().start(outfits_cat);
@@ -166,7 +166,11 @@ void LLPanelOutfitsInventory::onSearchEdit(const std::string& string)
mActivePanel->setFilterSubString(LLStringUtil::null);
}
- LLInventoryModelBackgroundFetch::instance().start();
+ if (!LLInventoryModelBackgroundFetch::instance().inventoryFetchStarted())
+ {
+ llassert(false); // this should have been done on startup
+ LLInventoryModelBackgroundFetch::instance().start();
+ }
if (mActivePanel->getFilterSubString().empty() && string.empty())
{
diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp
index 3e770958da..67f913a067 100644
--- a/indra/newview/llpanelpermissions.cpp
+++ b/indra/newview/llpanelpermissions.cpp
@@ -76,30 +76,34 @@ std::string click_action_to_string_value( U8 action);
U8 string_value_to_click_action(std::string p_value)
{
- if(p_value == "Touch")
+ if (p_value == "Touch")
{
return CLICK_ACTION_TOUCH;
}
- if(p_value == "Sit")
+ if (p_value == "Sit")
{
return CLICK_ACTION_SIT;
}
- if(p_value == "Buy")
+ if (p_value == "Buy")
{
return CLICK_ACTION_BUY;
}
- if(p_value == "Pay")
+ if (p_value == "Pay")
{
return CLICK_ACTION_PAY;
}
- if(p_value == "Open")
+ if (p_value == "Open")
{
return CLICK_ACTION_OPEN;
}
- if(p_value == "Zoom")
+ if (p_value == "Zoom")
{
return CLICK_ACTION_ZOOM;
}
+ if (p_value == "Ignore")
+ {
+ return CLICK_ACTION_IGNORE;
+ }
if (p_value == "None")
{
return CLICK_ACTION_DISABLED;
@@ -130,6 +134,9 @@ std::string click_action_to_string_value( U8 action)
case CLICK_ACTION_ZOOM:
return "Zoom";
break;
+ case CLICK_ACTION_IGNORE:
+ return "Ignore";
+ break;
case CLICK_ACTION_DISABLED:
return "None";
break;
@@ -274,12 +281,12 @@ void LLPanelPermissions::disableAll()
combo_click_action->setEnabled(FALSE);
combo_click_action->clear();
}
- getChildView("B:")->setVisible( FALSE);
- getChildView("O:")->setVisible( FALSE);
- getChildView("G:")->setVisible( FALSE);
- getChildView("E:")->setVisible( FALSE);
- getChildView("N:")->setVisible( FALSE);
- getChildView("F:")->setVisible( FALSE);
+ getChildView("B:")->setVisible(FALSE);
+ getChildView("O:")->setVisible(FALSE);
+ getChildView("G:")->setVisible(FALSE);
+ getChildView("E:")->setVisible(FALSE);
+ getChildView("N:")->setVisible(FALSE);
+ getChildView("F:")->setVisible(FALSE);
}
void LLPanelPermissions::refresh()
@@ -949,19 +956,19 @@ void LLPanelPermissions::refresh()
getChild<LLUICtrl>("search_check")->setValue(include_in_search);
getChild<LLUICtrl>("search_check")->setTentative( !all_include_in_search);
- // Click action (touch, sit, buy)
+ // Click action (touch, sit, buy, pay, open, play, open media, zoom, ignore)
U8 click_action = 0;
if (LLSelectMgr::getInstance()->selectionGetClickAction(&click_action))
{
LLComboBox* combo_click_action = getChild<LLComboBox>("clickaction");
- if(combo_click_action)
+ if (combo_click_action)
{
const std::string combo_value = click_action_to_string_value(click_action);
combo_click_action->setValue(LLSD(combo_value));
}
}
- if(LLSelectMgr::getInstance()->getSelection()->isAttachment())
+ if (LLSelectMgr::getInstance()->getSelection()->isAttachment())
{
getChildView("checkbox for sale")->setEnabled(FALSE);
getChildView("Edit Cost")->setEnabled(FALSE);
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index 0f00231643..1d5ed93c4d 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -91,8 +91,10 @@ class LLParcelHandler : public LLCommandHandler
public:
// requires trusted browser to trigger
LLParcelHandler() : LLCommandHandler("parcel", UNTRUSTED_THROTTLE) { }
- bool handle(const LLSD& params, const LLSD& query_map,
- LLMediaCtrl* web)
+ bool handle(const LLSD& params,
+ const LLSD& query_map,
+ const std::string& grid,
+ LLMediaCtrl* web)
{
if (params.size() < 2)
{
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index 816633b545..1a4546875d 100644
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
@@ -71,6 +71,7 @@
#include "llpanelblockedlist.h"
#include "llpanelprofileclassifieds.h"
#include "llpanelprofilepicks.h"
+#include "llthumbnailctrl.h"
#include "lltrans.h"
#include "llviewercontrol.h"
#include "llviewermenu.h" //is_agent_mappable
@@ -159,6 +160,7 @@ void request_avatar_properties_coro(std::string cap_url, LLUUID agent_id)
avatar_data->fl_about_text = result["fl_about_text"].asString();
avatar_data->born_on = result["member_since"].asDate();
avatar_data->profile_url = getProfileURL(agent_id.asString());
+ avatar_data->customer_type = result["customer_type"].asString();
avatar_data->flags = 0;
@@ -365,7 +367,7 @@ LLUUID post_profile_image(std::string cap_url, const LLSD &first_data, std::stri
httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
- LL_WARNS("AvatarProperties") << result << LL_ENDL;
+ LL_DEBUGS("AvatarProperties") << result << LL_ENDL;
if (!status)
{
@@ -460,8 +462,10 @@ public:
// requires trusted browser to trigger
LLProfileHandler() : LLCommandHandler("profile", UNTRUSTED_THROTTLE) { }
- bool handle(const LLSD& params, const LLSD& query_map,
- LLMediaCtrl* web)
+ bool handle(const LLSD& params,
+ const LLSD& query_map,
+ const std::string& grid,
+ LLMediaCtrl* web)
{
if (params.size() < 1) return false;
std::string agent_name = params[0];
@@ -508,8 +512,10 @@ public:
return false;
}
- bool handle(const LLSD& params, const LLSD& query_map,
- LLMediaCtrl* web)
+ bool handle(const LLSD& params,
+ const LLSD& query_map,
+ const std::string& grid,
+ LLMediaCtrl* web)
{
if (params.size() < 2) return false;
LLUUID avatar_id;
@@ -908,7 +914,7 @@ BOOL LLPanelProfileSecondLife::postBuild()
{
mGroupList = getChild<LLGroupList>("group_list");
mShowInSearchCombo = getChild<LLComboBox>("show_in_search");
- mSecondLifePic = getChild<LLIconCtrl>("2nd_life_pic");
+ mSecondLifePic = getChild<LLThumbnailCtrl>("2nd_life_pic");
mSecondLifePicLayout = getChild<LLPanel>("image_panel");
mDescriptionEdit = getChild<LLTextEditor>("sl_description_edit");
mAgentActionMenuButton = getChild<LLMenuButton>("agent_actions_menu");
@@ -1051,6 +1057,8 @@ void LLPanelProfileSecondLife::resetData()
mCantEditObjectsIcon->setEnabled(false);
childSetVisible("partner_layout", FALSE);
+ childSetVisible("badge_layout", FALSE);
+ childSetVisible("partner_spacer_layout", TRUE);
}
void LLPanelProfileSecondLife::processProfileProperties(const LLAvatarData* avatar_data)
@@ -1258,6 +1266,59 @@ void LLPanelProfileSecondLife::fillAccountStatus(const LLAvatarData* avatar_data
std::string caption_text = getString("CaptionTextAcctInfo", args);
getChild<LLUICtrl>("account_info")->setValue(caption_text);
+
+ const S32 LINDEN_EMPLOYEE_INDEX = 3;
+ LLDate sl_release;
+ sl_release.fromYMDHMS(2003, 6, 23, 0, 0, 0);
+ std::string customer_lower = avatar_data->customer_type;
+ LLStringUtil::toLower(customer_lower);
+ if (avatar_data->caption_index == LINDEN_EMPLOYEE_INDEX)
+ {
+ getChild<LLUICtrl>("badge_icon")->setValue("Profile_Badge_Linden");
+ getChild<LLUICtrl>("badge_text")->setValue(getString("BadgeLinden"));
+ childSetVisible("badge_layout", TRUE);
+ childSetVisible("partner_spacer_layout", FALSE);
+ }
+ else if (avatar_data->born_on < sl_release)
+ {
+ getChild<LLUICtrl>("badge_icon")->setValue("Profile_Badge_Beta");
+ getChild<LLUICtrl>("badge_text")->setValue(getString("BadgeBeta"));
+ childSetVisible("badge_layout", TRUE);
+ childSetVisible("partner_spacer_layout", FALSE);
+ }
+ else if (customer_lower == "beta_lifetime")
+ {
+ getChild<LLUICtrl>("badge_icon")->setValue("Profile_Badge_Beta_Lifetime");
+ getChild<LLUICtrl>("badge_text")->setValue(getString("BadgeBetaLifetime"));
+ childSetVisible("badge_layout", TRUE);
+ childSetVisible("partner_spacer_layout", FALSE);
+ }
+ else if (customer_lower == "lifetime")
+ {
+ getChild<LLUICtrl>("badge_icon")->setValue("Profile_Badge_Lifetime");
+ getChild<LLUICtrl>("badge_text")->setValue(getString("BadgeLifetime"));
+ childSetVisible("badge_layout", TRUE);
+ childSetVisible("partner_spacer_layout", FALSE);
+ }
+ else if (customer_lower == "secondlifetime_premium")
+ {
+ getChild<LLUICtrl>("badge_icon")->setValue("Profile_Badge_Premium_Lifetime");
+ getChild<LLUICtrl>("badge_text")->setValue(getString("BadgePremiumLifetime"));
+ childSetVisible("badge_layout", TRUE);
+ childSetVisible("partner_spacer_layout", FALSE);
+ }
+ else if (customer_lower == "secondlifetime_premium_plus")
+ {
+ getChild<LLUICtrl>("badge_icon")->setValue("Profile_Badge_Pplus_Lifetime");
+ getChild<LLUICtrl>("badge_text")->setValue(getString("BadgePremiumPlusLifetime"));
+ childSetVisible("badge_layout", TRUE);
+ childSetVisible("partner_spacer_layout", FALSE);
+ }
+ else
+ {
+ childSetVisible("badge_layout", FALSE);
+ childSetVisible("partner_spacer_layout", TRUE);
+ }
}
void LLPanelProfileSecondLife::fillRightsData()
@@ -1412,7 +1473,7 @@ void LLPanelProfileSecondLife::updateOnlineStatus()
}
else
{
- childSetVisible("frind_layout", false);
+ childSetVisible("friend_layout", false);
childSetVisible("online_layout", false);
childSetVisible("offline_layout", false);
}
@@ -1420,7 +1481,7 @@ void LLPanelProfileSecondLife::updateOnlineStatus()
void LLPanelProfileSecondLife::processOnlineStatus(bool is_friend, bool show_online, bool online)
{
- childSetVisible("frind_layout", is_friend);
+ childSetVisible("friend_layout", is_friend);
childSetVisible("online_layout", online && show_online);
childSetVisible("offline_layout", !online && show_online);
}
@@ -1437,7 +1498,6 @@ void LLPanelProfileSecondLife::setLoaded()
}
-
class LLProfileImagePicker : public LLFilePickerThread
{
public:
@@ -1484,15 +1544,20 @@ void LLProfileImagePicker::notify(const std::vector<std::string>& filenames)
const S32 MAX_DIM = 256;
if (!LLViewerTextureList::createUploadFile(file_path, temp_file, codec, MAX_DIM))
{
- //todo: image not supported notification
- LL_WARNS("AvatarProperties") << "Failed to upload profile image of type " << (S32)PROFILE_IMAGE_SL << ", failed to open image" << LL_ENDL;
+ LLSD notif_args;
+ notif_args["REASON"] = LLImage::getLastError().c_str();
+ LLNotificationsUtil::add("CannotUploadTexture", notif_args);
+ LL_WARNS("AvatarProperties") << "Failed to upload profile image of type " << (S32)mType << ", " << notif_args["REASON"].asString() << LL_ENDL;
return;
}
std::string cap_url = gAgent.getRegionCapability(PROFILE_IMAGE_UPLOAD_CAP);
if (cap_url.empty())
{
- LL_WARNS("AvatarProperties") << "Failed to upload profile image of type " << (S32)PROFILE_IMAGE_SL << ", no cap found" << LL_ENDL;
+ LLSD args;
+ args["CAPABILITY"] = PROFILE_IMAGE_UPLOAD_CAP;
+ LLNotificationsUtil::add("RegionCapabilityRequestError", args);
+ LL_WARNS("AvatarProperties") << "Failed to upload profile image of type " << (S32)mType << ", no cap found" << LL_ENDL;
return;
}
@@ -1894,30 +1959,16 @@ void LLPanelProfileSecondLife::onShowTexturePicker()
mFloaterTexturePickerHandle = texture_floaterp->getHandle();
- texture_floaterp->setOnFloaterCommitCallback([this](LLTextureCtrl::ETexturePickOp op, LLUUID id)
+ texture_floaterp->setOnFloaterCommitCallback([this](LLTextureCtrl::ETexturePickOp op, LLPickerSource source, const LLUUID& asset_id, const LLUUID&)
{
if (op == LLTextureCtrl::TEXTURE_SELECT)
{
- LLUUID image_asset_id;
- LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)mFloaterTexturePickerHandle.get();
- if (floaterp)
- {
- if (id.notNull())
- {
- image_asset_id = id;
- }
- else
- {
- image_asset_id = floaterp->getAssetID();
- }
- }
-
- onCommitProfileImage(image_asset_id);
+ onCommitProfileImage(asset_id);
}
});
texture_floaterp->setLocalTextureEnabled(FALSE);
texture_floaterp->setBakeTextureEnabled(FALSE);
- texture_floaterp->setCanApply(false, true);
+ texture_floaterp->setCanApply(false, true, false);
parent_floater->addDependentFloater(mFloaterTexturePickerHandle);
@@ -2132,7 +2183,7 @@ LLPanelProfileFirstLife::~LLPanelProfileFirstLife()
BOOL LLPanelProfileFirstLife::postBuild()
{
mDescriptionEdit = getChild<LLTextEditor>("fl_description_edit");
- mPicture = getChild<LLIconCtrl>("real_world_pic");
+ mPicture = getChild<LLThumbnailCtrl>("real_world_pic");
mUploadPhoto = getChild<LLButton>("fl_upload_image");
mChangePhoto = getChild<LLButton>("fl_change_image");
@@ -2234,29 +2285,15 @@ void LLPanelProfileFirstLife::onChangePhoto()
mFloaterTexturePickerHandle = texture_floaterp->getHandle();
- texture_floaterp->setOnFloaterCommitCallback([this](LLTextureCtrl::ETexturePickOp op, LLUUID id)
+ texture_floaterp->setOnFloaterCommitCallback([this](LLTextureCtrl::ETexturePickOp op, LLPickerSource source, const LLUUID& asset_id, const LLUUID&)
{
if (op == LLTextureCtrl::TEXTURE_SELECT)
{
- LLUUID image_asset_id;
- LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)mFloaterTexturePickerHandle.get();
- if (floaterp)
- {
- if (id.notNull())
- {
- image_asset_id = id;
- }
- else
- {
- image_asset_id = floaterp->getAssetID();
- }
- }
-
- onCommitPhoto(image_asset_id);
+ onCommitPhoto(asset_id);
}
});
texture_floaterp->setLocalTextureEnabled(FALSE);
- texture_floaterp->setCanApply(false, true);
+ texture_floaterp->setCanApply(false, true, false);
parent_floater->addDependentFloater(mFloaterTexturePickerHandle);
diff --git a/indra/newview/llpanelprofile.h b/indra/newview/llpanelprofile.h
index d32bb943bd..11632a10ae 100644
--- a/indra/newview/llpanelprofile.h
+++ b/indra/newview/llpanelprofile.h
@@ -58,6 +58,7 @@ class LLTextBase;
class LLMenuButton;
class LLLineEditor;
class LLTextEditor;
+class LLThumbnailCtrl;
class LLPanelProfileClassifieds;
class LLPanelProfilePicks;
class LLViewerFetchedTexture;
@@ -192,7 +193,7 @@ private:
LLGroupList* mGroupList;
LLComboBox* mShowInSearchCombo;
- LLIconCtrl* mSecondLifePic;
+ LLThumbnailCtrl* mSecondLifePic;
LLPanel* mSecondLifePicLayout;
LLTextEditor* mDescriptionEdit;
LLMenuButton* mAgentActionMenuButton;
@@ -301,7 +302,7 @@ protected:
void onDiscardDescriptionChanges();
LLTextEditor* mDescriptionEdit;
- LLIconCtrl* mPicture;
+ LLThumbnailCtrl* mPicture;
LLButton* mUploadPhoto;
LLButton* mChangePhoto;
LLButton* mRemovePhoto;
diff --git a/indra/newview/llpanelprofileclassifieds.cpp b/indra/newview/llpanelprofileclassifieds.cpp
index 1ff12b4f37..dec6cfd83b 100644
--- a/indra/newview/llpanelprofileclassifieds.cpp
+++ b/indra/newview/llpanelprofileclassifieds.cpp
@@ -106,7 +106,7 @@ public:
return true;
}
- bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
+ bool handle(const LLSD& params, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web)
{
if (LLStartUp::getStartupState() < STATE_STARTED)
{
diff --git a/indra/newview/llpanelprofilepicks.cpp b/indra/newview/llpanelprofilepicks.cpp
index 45d0252e4f..0535036cb0 100644
--- a/indra/newview/llpanelprofilepicks.cpp
+++ b/indra/newview/llpanelprofilepicks.cpp
@@ -87,8 +87,10 @@ public:
return true;
}
- bool handle(const LLSD& params, const LLSD& query_map,
- LLMediaCtrl* web)
+ bool handle(const LLSD& params,
+ const LLSD& query_map,
+ const std::string& grid,
+ LLMediaCtrl* web)
{
if (LLStartUp::getStartupState() < STATE_STARTED)
{
@@ -529,6 +531,7 @@ void LLPanelProfilePick::setAvatarId(const LLUUID& avatar_id)
pick_name = parcel->getName();
pick_desc = parcel->getDesc();
snapshot_id = parcel->getSnapshotID();
+ mPickDescription->setParseHTML(false);
}
LLViewerRegion* region = gAgent.getRegion();
diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp
index ed244f773c..d6c36bbfb7 100644
--- a/indra/newview/llpanelvolume.cpp
+++ b/indra/newview/llpanelvolume.cpp
@@ -365,6 +365,15 @@ void LLPanelVolume::getState( )
{
LightTextureCtrl->setEnabled(FALSE);
LightTextureCtrl->setValid(FALSE);
+
+ if (objectp->isAttachment())
+ {
+ LightTextureCtrl->setImmediateFilterPermMask(PERM_COPY | PERM_TRANSFER);
+ }
+ else
+ {
+ LightTextureCtrl->setImmediateFilterPermMask(PERM_NONE);
+ }
}
getChildView("Light Intensity")->setEnabled(false);
@@ -1409,6 +1418,19 @@ void LLPanelVolume::setLightTextureID(const LLUUID &asset_id, const LLUUID &item
if (volobjp)
{
LLViewerInventoryItem* item = gInventory.getItem(item_id);
+
+ if (item && volobjp->isAttachment())
+ {
+ const LLPermissions& perm = item->getPermissions();
+ BOOL unrestricted = ((perm.getMaskBase() & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED) ? TRUE : FALSE;
+ if (!unrestricted)
+ {
+ // Attachments are in world and in inventory simultaneously,
+ // at the moment server doesn't support such a situation.
+ return;
+ }
+ }
+
if (item && !item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID()))
{
LLToolDragAndDrop::handleDropMaterialProtections(volobjp, item, LLToolDragAndDrop::SOURCE_AGENT, LLUUID::null);
diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp
index 3347c40687..5242c4fef9 100644
--- a/indra/newview/llpanelwearing.cpp
+++ b/indra/newview/llpanelwearing.cpp
@@ -40,6 +40,7 @@
#include "llinventorymodel.h"
#include "llinventoryobserver.h"
#include "llmenubutton.h"
+#include "lloutfitobserver.h"
#include "llscrolllistctrl.h"
#include "llviewermenu.h"
#include "llviewerregion.h"
@@ -218,8 +219,6 @@ LLPanelWearing::LLPanelWearing()
, mIsInitialized(false)
, mAttachmentsChangedConnection()
{
- mCategoriesObserver = new LLInventoryCategoriesObserver();
-
mGearMenu = new LLWearingGearMenu(this);
mContextMenu = new LLWearingContextMenu();
mAttachmentsMenu = new LLTempAttachmentsContextMenu(this);
@@ -231,12 +230,6 @@ LLPanelWearing::~LLPanelWearing()
delete mContextMenu;
delete mAttachmentsMenu;
- if (gInventory.containsObserver(mCategoriesObserver))
- {
- gInventory.removeObserver(mCategoriesObserver);
- }
- delete mCategoriesObserver;
-
if (mAttachmentsChangedConnection.connected())
{
mAttachmentsChangedConnection.disconnect();
@@ -281,10 +274,8 @@ void LLPanelWearing::onOpen(const LLSD& /*info*/)
if (!category)
return;
- gInventory.addObserver(mCategoriesObserver);
-
// Start observing changes in Current Outfit category.
- mCategoriesObserver->addCategory(cof, boost::bind(&LLWearableItemsList::updateList, mCOFItemsList, cof));
+ LLOutfitObserver::instance().addCOFChangedCallback(boost::bind(&LLWearableItemsList::updateList, mCOFItemsList, cof));
// Fetch Current Outfit contents and refresh the list to display
// initially fetched items. If not all items are fetched now
@@ -566,7 +557,7 @@ void LLPanelWearing::onRemoveAttachment()
{
LLSelectMgr::getInstance()->deselectAll();
LLSelectMgr::getInstance()->selectObjectAndFamily(mAttachmentsMap[item->getUUID()]);
- LLSelectMgr::getInstance()->sendDropAttachment();
+ LLSelectMgr::getInstance()->sendDetach();
}
}
diff --git a/indra/newview/llpanelwearing.h b/indra/newview/llpanelwearing.h
index 715404a457..18e543eec6 100644
--- a/indra/newview/llpanelwearing.h
+++ b/indra/newview/llpanelwearing.h
@@ -90,7 +90,6 @@ private:
void getAttachmentLimitsCoro(std::string url);
- LLInventoryCategoriesObserver* mCategoriesObserver;
LLWearableItemsList* mCOFItemsList;
LLScrollListCtrl* mTempItemsList;
LLWearingGearMenu* mGearMenu;
diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp
index b9b2279e77..0117db86e8 100644
--- a/indra/newview/llpreview.cpp
+++ b/indra/newview/llpreview.cpp
@@ -241,14 +241,22 @@ void LLPreview::refreshFromItem()
// static
BOOL LLPreview::canModify(const LLUUID taskUUID, const LLInventoryItem* item)
{
+ const LLViewerObject* object = nullptr;
if (taskUUID.notNull())
{
- LLViewerObject* object = gObjectList.findObject(taskUUID);
- if(object && !object->permModify())
- {
- // No permission to edit in-world inventory
- return FALSE;
- }
+ object = gObjectList.findObject(taskUUID);
+ }
+
+ return canModify(object, item);
+}
+
+// static
+BOOL LLPreview::canModify(const LLViewerObject* object, const LLInventoryItem* item)
+{
+ if (object && !object->permModify())
+ {
+ // No permission to edit in-world inventory
+ return FALSE;
}
return item && gAgent.allowOperation(PERM_MODIFY, item->getPermissions(), GP_OBJECT_MANIPULATE);
diff --git a/indra/newview/llpreview.h b/indra/newview/llpreview.h
index ab60f4c008..3688ee0192 100644
--- a/indra/newview/llpreview.h
+++ b/indra/newview/llpreview.h
@@ -36,6 +36,7 @@
#include <map>
class LLInventoryItem;
+class LLViewerObject;
class LLLineEditor;
class LLRadioGroup;
class LLPreview;
@@ -109,6 +110,7 @@ public:
// We can't modify Item or description in preview if either in-world Object
// or Item itself is unmodifiable
static BOOL canModify(const LLUUID taskUUID, const LLInventoryItem* item);
+ static BOOL canModify(const LLViewerObject* object, const LLInventoryItem* item);
protected:
virtual void onCommit();
diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp
index 20b821f895..6681703625 100644
--- a/indra/newview/llpreviewnotecard.cpp
+++ b/indra/newview/llpreviewnotecard.cpp
@@ -39,7 +39,9 @@
#include "llinventorydefines.h"
#include "llinventorymodel.h"
#include "lllineeditor.h"
+#include "llmd5.h"
#include "llnotificationsutil.h"
+#include "llmd5.h"
#include "llresmgr.h"
#include "roles_constants.h"
#include "llscrollbar.h"
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index 8b93dd103d..aceb8539d2 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -40,6 +40,7 @@
#include "llinventorymodel.h"
#include "llkeyboard.h"
#include "lllineeditor.h"
+#include "llmd5.h"
#include "llhelp.h"
#include "llnotificationsutil.h"
#include "llresmgr.h"
diff --git a/indra/newview/llreflectionmap.cpp b/indra/newview/llreflectionmap.cpp
index efaf068bd2..ec54fa1165 100644
--- a/indra/newview/llreflectionmap.cpp
+++ b/indra/newview/llreflectionmap.cpp
@@ -117,7 +117,7 @@ void LLReflectionMap::autoAdjustOrigin()
{
int face = -1;
LLVector4a intersection;
- LLDrawable* drawable = mGroup->lineSegmentIntersect(bounds[0], corners[i], false, false, true, &face, &intersection);
+ LLDrawable* drawable = mGroup->lineSegmentIntersect(bounds[0], corners[i], false, false, true, true, &face, &intersection);
if (drawable != nullptr)
{
hit = true;
@@ -157,6 +157,10 @@ void LLReflectionMap::autoAdjustOrigin()
}
mRadius = llmax(sqrtf(r2.getF32()), 8.f);
+
+ // make sure near clip doesn't poke through ground
+ fp[2] = llmax(fp[2], height+mRadius*0.5f);
+
}
}
else if (mViewerObject)
@@ -204,6 +208,14 @@ F32 LLReflectionMap::getNearClip()
{
ret = ((LLVOVolume*)mViewerObject)->getReflectionProbeNearClip();
}
+ else if (mGroup)
+ {
+ ret = mRadius * 0.5f; // default to half radius for automatic object probes
+ }
+ else
+ {
+ ret = 1.f; // default to 1m for automatic terrain probes
+ }
return llmax(ret, MINIMUM_NEAR_CLIP);
}
diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp
index bb0bb04797..915c8893a4 100644
--- a/indra/newview/llreflectionmapmanager.cpp
+++ b/indra/newview/llreflectionmapmanager.cpp
@@ -244,11 +244,14 @@ void LLReflectionMapManager::update()
continue;
}
- if (probe != mDefaultProbe && !probe->isRelevant())
- {
+ if (probe != mDefaultProbe &&
+ (!probe->isRelevant() || mPaused))
+ { // skip irrelevant probes (or all non-default probes if paused)
continue;
}
+
+
LLVector4a d;
if (probe != mDefaultProbe)
@@ -807,6 +810,16 @@ void LLReflectionMapManager::reset()
mReset = true;
}
+void LLReflectionMapManager::pause()
+{
+ mPaused = true;
+}
+
+void LLReflectionMapManager::resume()
+{
+ mPaused = false;
+}
+
void LLReflectionMapManager::shift(const LLVector4a& offset)
{
for (auto& probe : mProbes)
diff --git a/indra/newview/llreflectionmapmanager.h b/indra/newview/llreflectionmapmanager.h
index 5a3901cae9..b77a33da89 100644
--- a/indra/newview/llreflectionmapmanager.h
+++ b/indra/newview/llreflectionmapmanager.h
@@ -84,6 +84,12 @@ public:
// reset all state on the next update
void reset();
+ // pause all updates other than the default probe
+ void pause();
+
+ // unpause (see pause)
+ void resume();
+
// called on region crossing to "shift" probes into new coordinate frame
void shift(const LLVector4a& offset);
@@ -191,5 +197,8 @@ private:
// if true, reset all probe render state on the next update (for teleports and sky changes)
bool mReset = false;
+
+ // if true, only update the default probe
+ bool mPaused = false;
};
diff --git a/indra/newview/llsceneview.cpp b/indra/newview/llsceneview.cpp
index 5e339a52bf..9b1d2d48c6 100644
--- a/indra/newview/llsceneview.cpp
+++ b/indra/newview/llsceneview.cpp
@@ -100,8 +100,6 @@ void LLSceneView::draw()
F32 total_physics[] = { 0.f, 0.f };
- U32 object_count = 0;
-
LLViewerRegion* region = gAgent.getRegion();
if (region)
{
@@ -116,8 +114,7 @@ void LLSceneView::draw()
U32 idx = object->isAttachment() ? 1 : 0;
LLVolume* volume = object->getVolume();
- object_count++;
-
+
F32 radius = object->getScale().magVec();
size[idx].push_back(radius);
diff --git a/indra/newview/llscripteditor.cpp b/indra/newview/llscripteditor.cpp
index 140cbbedbe..3278bd3aa9 100644
--- a/indra/newview/llscripteditor.cpp
+++ b/indra/newview/llscripteditor.cpp
@@ -187,7 +187,7 @@ void LLScriptEditor::drawSelectionBackground()
// Draw selection even if we don't have keyboard focus for search/replace
if( hasSelection() && !mLineInfoList.empty())
{
- std::vector<LLRect> selection_rects = getSelctionRects();
+ std::vector<LLRect> selection_rects = getSelectionRects();
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
const LLColor4& color = mReadOnly ? mReadOnlyFgColor : mFgColor;
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index dca341e5a2..c86e43333c 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -57,7 +57,6 @@
#include "llviewerwindow.h"
#include "lldrawable.h"
#include "llfloaterinspect.h"
-#include "llfloaterproperties.h"
#include "llfloaterreporter.h"
#include "llfloaterreg.h"
#include "llfloatertools.h"
@@ -1773,14 +1772,20 @@ void LLObjectSelection::applyNoCopyTextureToTEs(LLViewerInventoryItem* item)
}
}
-void LLObjectSelection::applyNoCopyPbrMaterialToTEs(LLViewerInventoryItem* item)
+bool LLObjectSelection::applyRestrictedPbrMaterialToTEs(LLViewerInventoryItem* item)
{
if (!item)
{
- return;
+ return false;
}
LLUUID asset_id = item->getAssetUUID();
+ if (asset_id.isNull())
+ {
+ asset_id = LLGLTFMaterialList::BLANK_MATERIAL_ASSET_ID;
+ }
+
+ bool material_copied_all_faces = true;
for (iterator iter = begin(); iter != end(); ++iter)
{
@@ -1797,12 +1802,17 @@ void LLObjectSelection::applyNoCopyPbrMaterialToTEs(LLViewerInventoryItem* item)
{
if (node->isTESelected(te))
{
- //(no-copy) materials must be moved to the object's inventory only once
+ //(no-copy), (no-modify), and (no-transfer) materials must be moved to the object's inventory only once
// without making any copies
if (!material_copied && asset_id.notNull())
{
- LLToolDragAndDrop::handleDropMaterialProtections(object, item, LLToolDragAndDrop::SOURCE_AGENT, LLUUID::null);
- material_copied = true;
+ material_copied = (bool)LLToolDragAndDrop::handleDropMaterialProtections(object, item, LLToolDragAndDrop::SOURCE_AGENT, LLUUID::null);
+ }
+ if (!material_copied)
+ {
+ // Applying the material is not possible for this object given the current inventory
+ material_copied_all_faces = false;
+ break;
}
// apply texture for the selected faces
@@ -1814,6 +1824,8 @@ void LLObjectSelection::applyNoCopyPbrMaterialToTEs(LLViewerInventoryItem* item)
}
LLGLTFMaterialList::flushUpdates();
+
+ return material_copied_all_faces;
}
@@ -1821,7 +1833,7 @@ void LLObjectSelection::applyNoCopyPbrMaterialToTEs(LLViewerInventoryItem* item)
// selectionSetImage()
//-----------------------------------------------------------------------------
// *TODO: re-arch texture applying out of lltooldraganddrop
-void LLSelectMgr::selectionSetImage(const LLUUID& imageid)
+bool LLSelectMgr::selectionSetImage(const LLUUID& imageid)
{
// First for (no copy) textures and multiple object selection
LLViewerInventoryItem* item = gInventory.getItem(imageid);
@@ -1829,9 +1841,11 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid)
&& !item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID())
&& (mSelectedObjects->getNumNodes() > 1) )
{
- LL_WARNS() << "Attempted to apply no-copy texture to multiple objects"
- << LL_ENDL;
- return;
+ LL_DEBUGS() << "Attempted to apply no-copy texture " << imageid
+ << " to multiple objects" << LL_ENDL;
+
+ LLNotificationsUtil::add("FailedToApplyTextureNoCopyToMultiple");
+ return false;
}
struct f : public LLSelectedTEFunctor
@@ -1841,10 +1855,24 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid)
f(LLViewerInventoryItem* item, const LLUUID& id) : mItem(item), mImageID(id) {}
bool apply(LLViewerObject* objectp, S32 te)
{
- if(objectp && !objectp->permModify())
+ if(!objectp || !objectp->permModify())
{
return false;
}
+
+ // Might be better to run willObjectAcceptInventory
+ if (mItem && objectp->isAttachment())
+ {
+ const LLPermissions& perm = mItem->getPermissions();
+ BOOL unrestricted = ((perm.getMaskBase() & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED) ? TRUE : FALSE;
+ if (!unrestricted)
+ {
+ // Attachments are in world and in inventory simultaneously,
+ // at the moment server doesn't support such a situation.
+ return false;
+ }
+ }
+
if (mItem)
{
LLToolDragAndDrop::dropTextureOneFace(objectp,
@@ -1896,12 +1924,14 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid)
}
} sendfunc(item);
getSelection()->applyToObjects(&sendfunc);
+
+ return true;
}
//-----------------------------------------------------------------------------
// selectionSetGLTFMaterial()
//-----------------------------------------------------------------------------
-void LLSelectMgr::selectionSetGLTFMaterial(const LLUUID& mat_id)
+bool LLSelectMgr::selectionSetGLTFMaterial(const LLUUID& mat_id)
{
// First for (no copy) textures and multiple object selection
LLViewerInventoryItem* item = gInventory.getItem(mat_id);
@@ -1909,22 +1939,37 @@ void LLSelectMgr::selectionSetGLTFMaterial(const LLUUID& mat_id)
&& !item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID())
&& (mSelectedObjects->getNumNodes() > 1))
{
- LL_WARNS() << "Attempted to apply no-copy material to multiple objects"
- << LL_ENDL;
- return;
+ LL_DEBUGS() << "Attempted to apply no-copy material " << mat_id
+ << "to multiple objects" << LL_ENDL;
+
+ LLNotificationsUtil::add("FailedToApplyGLTFNoCopyToMultiple");
+ return false;
}
struct f : public LLSelectedTEFunctor
{
LLViewerInventoryItem* mItem;
LLUUID mMatId;
+ bool material_copied_any_face = false;
+ bool material_copied_all_faces = true;
f(LLViewerInventoryItem* item, const LLUUID& id) : mItem(item), mMatId(id) {}
bool apply(LLViewerObject* objectp, S32 te)
{
- if (objectp && !objectp->permModify())
+ if (!objectp || !objectp->permModify())
{
return false;
}
+ if (mItem && objectp->isAttachment())
+ {
+ const LLPermissions& perm = mItem->getPermissions();
+ BOOL unrestricted = ((perm.getMaskBase() & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED) ? TRUE : FALSE;
+ if (!unrestricted)
+ {
+ // Attachments are in world and in inventory simultaneously,
+ // at the moment server doesn't support such a situation.
+ return false;
+ }
+ }
LLUUID asset_id = mMatId;
if (mItem)
{
@@ -1935,6 +1980,10 @@ void LLSelectMgr::selectionSetGLTFMaterial(const LLUUID& mat_id)
return false;
}
asset_id = mItem->getAssetUUID();
+ if (asset_id.isNull())
+ {
+ asset_id = LLGLTFMaterialList::BLANK_MATERIAL_ASSET_ID;
+ }
}
// Blank out most override data on the object and send to server
@@ -1944,14 +1993,19 @@ void LLSelectMgr::selectionSetGLTFMaterial(const LLUUID& mat_id)
}
};
- if (item && !item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID()))
+ bool success = true;
+ if (item &&
+ (!item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID()) ||
+ !item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID()) ||
+ !item->getPermissions().allowOperationBy(PERM_MODIFY, gAgent.getID())
+ ))
{
- getSelection()->applyNoCopyPbrMaterialToTEs(item);
+ success = success && getSelection()->applyRestrictedPbrMaterialToTEs(item);
}
else
{
f setfunc(item, mat_id);
- getSelection()->applyToTEs(&setfunc);
+ success = success && getSelection()->applyToTEs(&setfunc);
}
struct g : public LLSelectedObjectFunctor
@@ -1980,9 +2034,11 @@ void LLSelectMgr::selectionSetGLTFMaterial(const LLUUID& mat_id)
return true;
}
} sendfunc(item);
- getSelection()->applyToObjects(&sendfunc);
+ success = success && getSelection()->applyToObjects(&sendfunc);
LLGLTFMaterialList::flushUpdates();
+
+ return success;
}
//-----------------------------------------------------------------------------
@@ -2232,7 +2288,19 @@ void LLSelectMgr::selectionSetBumpmap(U8 bumpmap, const LLUUID &image_id)
if (item && !item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID()))
{
LLViewerObject *object = mSelectedObjects->getFirstRootObject();
- if (!object) return;
+ if (!object)
+ {
+ return;
+ }
+ const LLPermissions& perm = item->getPermissions();
+ BOOL unrestricted = ((perm.getMaskBase() & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED) ? TRUE : FALSE;
+ BOOL attached = object->isAttachment();
+ if (attached && !unrestricted)
+ {
+ // Attachments are in world and in inventory simultaneously,
+ // at the moment server doesn't support such a situation.
+ return;
+ }
LLToolDragAndDrop::handleDropMaterialProtections(object, item, LLToolDragAndDrop::SOURCE_AGENT, LLUUID::null);
}
getSelection()->applyToTEs(&setfunc);
@@ -2292,7 +2360,19 @@ void LLSelectMgr::selectionSetShiny(U8 shiny, const LLUUID &image_id)
if (item && !item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID()))
{
LLViewerObject *object = mSelectedObjects->getFirstRootObject();
- if (!object) return;
+ if (!object)
+ {
+ return;
+ }
+ const LLPermissions& perm = item->getPermissions();
+ BOOL unrestricted = ((perm.getMaskBase() & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED) ? TRUE : FALSE;
+ BOOL attached = object->isAttachment();
+ if (attached && !unrestricted)
+ {
+ // Attachments are in world and in inventory simultaneously,
+ // at the moment server doesn't support such a situation.
+ return;
+ }
LLToolDragAndDrop::handleDropMaterialProtections(object, item, LLToolDragAndDrop::SOURCE_AGENT, LLUUID::null);
}
getSelection()->applyToTEs(&setfunc);
@@ -5440,8 +5520,8 @@ void LLSelectMgr::sendListToRegions(LLObjectSelectionHandle selected_handle,
LLViewerRegion* last_region;
LLViewerRegion* current_region;
- S32 objects_sent = 0;
- S32 packets_sent = 0;
+// S32 objects_sent = 0;
+// S32 packets_sent = 0;
S32 objects_in_this_packet = 0;
bool link_operation = message_name == "ObjectLink";
@@ -5573,7 +5653,7 @@ void LLSelectMgr::sendListToRegions(LLObjectSelectionHandle selected_handle,
(*pack_body)(node, user_data);
// do any related logging
(*log_func)(node, user_data);
- ++objects_sent;
+// ++objects_sent;
++objects_in_this_packet;
// and on to the next object
@@ -5591,7 +5671,7 @@ void LLSelectMgr::sendListToRegions(LLObjectSelectionHandle selected_handle,
{
// otherwise send current message and start new one
gMessageSystem->sendReliable( last_region->getHost());
- packets_sent++;
+// packets_sent++;
objects_in_this_packet = 0;
gMessageSystem->newMessage(message_name.c_str());
@@ -5608,7 +5688,7 @@ void LLSelectMgr::sendListToRegions(LLObjectSelectionHandle selected_handle,
{
// add root instance into new message
(*pack_body)(linkset_root, user_data);
- ++objects_sent;
+// ++objects_sent;
++objects_in_this_packet;
}
}
@@ -5622,7 +5702,7 @@ void LLSelectMgr::sendListToRegions(LLObjectSelectionHandle selected_handle,
if (gMessageSystem->getCurrentSendTotal() > 0)
{
gMessageSystem->sendReliable( current_region->getHost());
- packets_sent++;
+// packets_sent++;
}
else
{
@@ -7057,8 +7137,6 @@ void dialog_refresh_all()
gMenuAttachmentOther->arrange();
}
- LLFloaterProperties::dirtyAll();
-
LLFloaterInspect* inspect_instance = LLFloaterReg::getTypedInstance<LLFloaterInspect>("inspect");
if(inspect_instance)
{
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index ca9a32f0db..f89209b437 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -378,7 +378,17 @@ public:
* Then this only texture is used for all selected faces.
*/
void applyNoCopyTextureToTEs(LLViewerInventoryItem* item);
- void applyNoCopyPbrMaterialToTEs(LLViewerInventoryItem* item);
+ /*
+ * Multi-purpose function for applying PBR materials to the
+ * selected object or faces, any combination of copy/mod/transfer
+ * permission restrictions. This method moves the restricted
+ * material to the object's inventory and doesn't make a copy of the
+ * material for each face. Then this only material is used for
+ * all selected faces.
+ * Returns false if applying the material failed on one or more selected
+ * faces.
+ */
+ bool applyRestrictedPbrMaterialToTEs(LLViewerInventoryItem* item);
ESelectType getSelectType() const { return mSelectType; }
@@ -634,8 +644,8 @@ public:
void selectionSetDensity(F32 density);
void selectionSetRestitution(F32 restitution);
void selectionSetMaterial(U8 material);
- void selectionSetImage(const LLUUID& imageid); // could be item or asset id
- void selectionSetGLTFMaterial(const LLUUID& mat_id); // could be item or asset id
+ bool selectionSetImage(const LLUUID& imageid); // could be item or asset id
+ bool selectionSetGLTFMaterial(const LLUUID& mat_id); // material id only
void selectionSetColor(const LLColor4 &color);
void selectionSetColorOnly(const LLColor4 &color); // Set only the RGB channels
void selectionSetAlphaOnly(const F32 alpha); // Set only the alpha channel
diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp
index 264359a3a9..42587658a6 100644
--- a/indra/newview/llsettingsvo.cpp
+++ b/indra/newview/llsettingsvo.cpp
@@ -97,6 +97,20 @@ namespace
//=========================================================================
+void LLSettingsVOBase::createNewInventoryItem(LLSettingsType::type_e stype, const LLUUID& parent_id, std::function<void(const LLUUID&)> created_cb)
+{
+ inventory_result_fn cb = NULL;
+
+ if (created_cb != NULL)
+ {
+ cb = [created_cb](LLUUID asset_id, LLUUID inventory_id, LLUUID object_id, LLSD results)
+ {
+ created_cb(inventory_id);
+ };
+ }
+ createNewInventoryItem(stype, parent_id, cb);
+}
+
void LLSettingsVOBase::createNewInventoryItem(LLSettingsType::type_e stype, const LLUUID &parent_id, inventory_result_fn callback)
{
LLTransactionID tid;
@@ -318,7 +332,7 @@ void LLSettingsVOBase::onAssetDownloadComplete(const LLUUID &asset_id, S32 statu
std::stringstream llsdstream(buffer);
LLSD llsdsettings;
- if (LLSDSerialize::deserialize(llsdsettings, llsdstream, -1))
+ if (LLSDSerialize::deserialize(llsdsettings, llsdstream, LLSDSerialize::SIZE_UNLIMITED))
{
settings = createFromLLSD(llsdsettings);
}
@@ -385,7 +399,7 @@ LLSettingsBase::ptr_t LLSettingsVOBase::importFile(const std::string &filename)
return LLSettingsBase::ptr_t();
}
- if (!LLSDSerialize::deserialize(settings, file, -1))
+ if (!LLSDSerialize::deserialize(settings, file, LLSDSerialize::SIZE_UNLIMITED))
{
LL_WARNS("SETTINGS") << "Unable to deserialize settings from '" << filename << "'" << LL_ENDL;
return LLSettingsBase::ptr_t();
@@ -721,6 +735,15 @@ void LLSettingsVOSky::applySpecial(void *ptarget, bool force)
static LLCachedControl<bool> should_auto_adjust(gSavedSettings, "RenderSkyAutoAdjustLegacy", true);
static LLCachedControl<F32> auto_adjust_ambient_scale(gSavedSettings, "RenderSkyAutoAdjustAmbientScale", 0.75f);
static LLCachedControl<F32> auto_adjust_hdr_scale(gSavedSettings, "RenderSkyAutoAdjustHDRScale", 2.f);
+ static LLCachedControl<F32> auto_adjust_blue_horizon_scale(gSavedSettings, "RenderSkyAutoAdjustBlueHorizonScale", 1.f);
+ static LLCachedControl<F32> auto_adjust_blue_density_scale(gSavedSettings, "RenderSkyAutoAdjustBlueDensityScale", 1.f);
+ static LLCachedControl<F32> auto_adjust_sun_color_scale(gSavedSettings, "RenderSkyAutoAdjustSunColorScale", 1.f);
+ static LLCachedControl<F32> auto_adjust_probe_ambiance(gSavedSettings, "RenderSkyAutoAdjustProbeAmbiance", 1.f);
+ static LLCachedControl<F32> sunlight_scale(gSavedSettings, "RenderSkySunlightScale", 1.5f);
+ static LLCachedControl<F32> ambient_scale(gSavedSettings, "RenderSkyAmbientScale", 1.5f);
+
+ shader->uniform1f(LLShaderMgr::SKY_SUNLIGHT_SCALE, sunlight_scale);
+ shader->uniform1f(LLShaderMgr::SKY_AMBIENT_SCALE, ambient_scale);
static LLCachedControl<F32> cloud_shadow_scale(gSavedSettings, "RenderCloudShadowAmbianceFactor", 0.125f);
F32 probe_ambiance = getTotalReflectionProbeAmbiance(cloud_shadow_scale);
@@ -733,14 +756,23 @@ void LLSettingsVOSky::applySpecial(void *ptarget, bool force)
{
if (psky->getReflectionProbeAmbiance() != 0.f)
{
- shader->uniform3fv(LLShaderMgr::AMBIENT, getAmbientColor().mV);
+ shader->uniform3fv(LLShaderMgr::AMBIENT, LLVector3(ambient.mV));
shader->uniform1f(LLShaderMgr::SKY_HDR_SCALE, sqrtf(g)*2.0); // use a modifier here so 1.0 maps to the "most desirable" default and the maximum value doesn't go off the rails
}
else if (psky->canAutoAdjust() && should_auto_adjust)
{ // auto-adjust legacy sky to take advantage of probe ambiance
shader->uniform3fv(LLShaderMgr::AMBIENT, (ambient * auto_adjust_ambient_scale).mV);
shader->uniform1f(LLShaderMgr::SKY_HDR_SCALE, auto_adjust_hdr_scale);
- probe_ambiance = 1.f; // NOTE -- must match LLSettingsSky::getReflectionProbeAmbiance value for "auto_adjust" true
+ LLColor3 blue_horizon = getBlueHorizon() * auto_adjust_blue_horizon_scale;
+ LLColor3 blue_density = getBlueDensity() * auto_adjust_blue_density_scale;
+ LLColor3 sun_diffuse = getSunDiffuse() * auto_adjust_sun_color_scale;
+
+ shader->uniform3fv(LLShaderMgr::SUNLIGHT_COLOR, sun_diffuse.mV);
+ shader->uniform3fv(LLShaderMgr::BLUE_DENSITY, blue_density.mV);
+ shader->uniform3fv(LLShaderMgr::BLUE_HORIZON, blue_horizon.mV);
+
+ LLSettingsSky::sAutoAdjustProbeAmbiance = auto_adjust_probe_ambiance;
+ probe_ambiance = auto_adjust_probe_ambiance; // NOTE -- must match LLSettingsSky::getReflectionProbeAmbiance value for "auto_adjust" true
}
else
{
@@ -755,7 +787,7 @@ void LLSettingsVOSky::applySpecial(void *ptarget, bool force)
shader->uniform1f(LLShaderMgr::SUN_MOON_GLOW_FACTOR, getSunMoonGlowFactor());
shader->uniform1f(LLShaderMgr::DENSITY_MULTIPLIER, getDensityMultiplier());
shader->uniform1f(LLShaderMgr::DISTANCE_MULTIPLIER, getDistanceMultiplier());
-
+
shader->uniform1f(LLShaderMgr::GAMMA, g);
}
diff --git a/indra/newview/llsettingsvo.h b/indra/newview/llsettingsvo.h
index 05ec0e9275..4f410ab7d9 100644
--- a/indra/newview/llsettingsvo.h
+++ b/indra/newview/llsettingsvo.h
@@ -49,6 +49,7 @@ public:
typedef std::function<void(LLInventoryItem *inv_item, LLSettingsBase::ptr_t settings, S32 status, LLExtStat extstat)> inventory_download_fn;
typedef std::function<void(LLUUID asset_id, LLUUID inventory_id, LLUUID object_id, LLSD results)> inventory_result_fn;
+ static void createNewInventoryItem(LLSettingsType::type_e stype, const LLUUID& parent_id, std::function<void(const LLUUID&)> created_cb);
static void createNewInventoryItem(LLSettingsType::type_e stype, const LLUUID &parent_id, inventory_result_fn callback = inventory_result_fn());
static void createInventoryItem(const LLSettingsBase::ptr_t &settings, const LLUUID &parent_id, std::string settings_name, inventory_result_fn callback = inventory_result_fn());
static void createInventoryItem(const LLSettingsBase::ptr_t &settings, U32 next_owner_perm, const LLUUID &parent_id, std::string settings_name, inventory_result_fn callback = inventory_result_fn());
diff --git a/indra/newview/llshareavatarhandler.cpp b/indra/newview/llshareavatarhandler.cpp
index 142e00c3f7..8c5ebb75ef 100644
--- a/indra/newview/llshareavatarhandler.cpp
+++ b/indra/newview/llshareavatarhandler.cpp
@@ -38,7 +38,7 @@ public:
{
}
- bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
+ bool handle(const LLSD& params, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web)
{
if (!LLUI::getInstance()->mSettingGroups["config"]->getBOOL("EnableAvatarShare"))
{
diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp
index a5dcdc41ed..e970f70e92 100644
--- a/indra/newview/llsidepanelinventory.cpp
+++ b/indra/newview/llsidepanelinventory.cpp
@@ -73,6 +73,8 @@ static const char * const INBOX_LAYOUT_PANEL_NAME = "inbox_layout_panel";
static const char * const INVENTORY_LAYOUT_STACK_NAME = "inventory_layout_stack";
static const char * const MARKETPLACE_INBOX_PANEL = "marketplace_inbox";
+static bool sLoginCompleted = false;
+
//
// Helpers
//
@@ -115,21 +117,19 @@ private:
LLSidepanelInventory::LLSidepanelInventory()
: LLPanel()
- , mItemPanel(NULL)
, mPanelMainInventory(NULL)
, mInboxEnabled(false)
, mCategoriesObserver(NULL)
, mInboxAddedObserver(NULL)
+ , mInboxLayoutPanel(NULL)
{
//buildFromFile( "panel_inventory.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder()
}
LLSidepanelInventory::~LLSidepanelInventory()
{
- LLLayoutPanel* inbox_layout_panel = getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME);
-
// Save the InventoryMainPanelHeight in settings per account
- gSavedPerAccountSettings.setS32("InventoryInboxHeight", inbox_layout_panel->getTargetDim());
+ gSavedPerAccountSettings.setS32("InventoryInboxHeight", mInboxLayoutPanel->getTargetDim());
if (mCategoriesObserver && gInventory.containsObserver(mCategoriesObserver))
{
@@ -158,29 +158,11 @@ BOOL LLSidepanelInventory::postBuild()
// UI elements from inventory panel
{
mInventoryPanel = getChild<LLPanel>("sidepanel_inventory_panel");
-
- mInfoBtn = mInventoryPanel->getChild<LLButton>("info_btn");
- mInfoBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onInfoButtonClicked, this));
-
- mShareBtn = mInventoryPanel->getChild<LLButton>("share_btn");
- mShareBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShareButtonClicked, this));
-
- mShopBtn = mInventoryPanel->getChild<LLButton>("shop_btn");
- mShopBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShopButtonClicked, this));
-
- mWearBtn = mInventoryPanel->getChild<LLButton>("wear_btn");
- mWearBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onWearButtonClicked, this));
-
- mPlayBtn = mInventoryPanel->getChild<LLButton>("play_btn");
- mPlayBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onPlayButtonClicked, this));
-
- mTeleportBtn = mInventoryPanel->getChild<LLButton>("teleport_btn");
- mTeleportBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onTeleportButtonClicked, this));
mPanelMainInventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
mPanelMainInventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2));
- LLTabContainer* tabs = mPanelMainInventory->getChild<LLTabContainer>("inventory filter tabs");
- tabs->setCommitCallback(boost::bind(&LLSidepanelInventory::updateVerbs, this));
+ //LLTabContainer* tabs = mPanelMainInventory->getChild<LLTabContainer>("inventory filter tabs");
+ //tabs->setCommitCallback(boost::bind(&LLSidepanelInventory::updateVerbs, this));
/*
EXT-4846 : "Can we suppress the "Landmarks" and "My Favorites" folder since they have their own Task Panel?"
@@ -190,25 +172,7 @@ BOOL LLSidepanelInventory::postBuild()
my_inventory_panel->addHideFolderType(LLFolderType::FT_FAVORITE);
*/
- LLOutfitObserver::instance().addCOFChangedCallback(boost::bind(&LLSidepanelInventory::updateVerbs, this));
- }
-
- // UI elements from item panel
- {
- mItemPanel = getChild<LLSidepanelItemInfo>("sidepanel__item_panel");
-
- LLButton* back_btn = mItemPanel->getChild<LLButton>("back_btn");
- back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this));
- }
-
- // UI elements from task panel
- {
- mTaskPanel = findChild<LLSidepanelTaskInfo>("sidepanel__task_panel");
- if (mTaskPanel)
- {
- LLButton* back_btn = mTaskPanel->getChild<LLButton>("back_btn");
- back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this));
- }
+ //LLOutfitObserver::instance().addCOFChangedCallback(boost::bind(&LLSidepanelInventory::updateVerbs, this));
}
// Received items inbox setup
@@ -220,38 +184,55 @@ BOOL LLSidepanelInventory::postBuild()
inbox_button->setCommitCallback(boost::bind(&LLSidepanelInventory::onToggleInboxBtn, this));
- // Get the previous inbox state from "InventoryInboxToggleState" setting.
- bool is_inbox_collapsed = !inbox_button->getToggleState();
+ // For main Inventory floater: Get the previous inbox state from "InventoryInboxToggleState" setting.
+ // For additional Inventory floaters: Collapsed state is default.
+ bool is_inbox_collapsed = !inbox_button->getToggleState() || sLoginCompleted;
// Restore the collapsed inbox panel state
- LLLayoutPanel* inbox_panel = getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME);
- inv_stack->collapsePanel(inbox_panel, is_inbox_collapsed);
- if (!is_inbox_collapsed)
- {
- inbox_panel->setTargetDim(gSavedPerAccountSettings.getS32("InventoryInboxHeight"));
- }
-
- // Set the inbox visible based on debug settings (final setting comes from http request below)
- enableInbox(gSavedSettings.getBOOL("InventoryDisplayInbox"));
-
- // Trigger callback for after login so we can setup to track inbox changes after initial inventory load
- LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLSidepanelInventory::updateInbox, this));
+ mInboxLayoutPanel = getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME);
+ inv_stack->collapsePanel(mInboxLayoutPanel, is_inbox_collapsed);
+ if (!is_inbox_collapsed)
+ {
+ mInboxLayoutPanel->setTargetDim(gSavedPerAccountSettings.getS32("InventoryInboxHeight"));
+ }
+
+ if (sLoginCompleted)
+ {
+ //save the state of Inbox panel only for main Inventory floater
+ inbox_button->removeControlVariable();
+ inbox_button->setToggleState(false);
+ updateInbox();
+ }
+ else
+ {
+ // Trigger callback for after login so we can setup to track inbox changes after initial inventory load
+ LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLSidepanelInventory::updateInbox, this));
+ }
}
gSavedSettings.getControl("InventoryDisplayInbox")->getCommitSignal()->connect(boost::bind(&handleInventoryDisplayInboxChanged));
- // Update the verbs buttons state.
- updateVerbs();
+ LLFloater *floater = dynamic_cast<LLFloater*>(getParent());
+ if (floater && floater->getKey().isUndefined() && !sLoginCompleted)
+ {
+ // Prefill inventory for primary inventory floater
+ // Other floaters should fill on visibility change
+ //
+ // see get_instance_num();
+ // Primary inventory floater will have undefined key
+ initInventoryViews();
+ }
return TRUE;
}
void LLSidepanelInventory::updateInbox()
{
+ sLoginCompleted = true;
//
// Track inbox folder changes
//
- const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX, true);
+ const LLUUID inbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX);
// Set up observer to listen for creation of inbox if it doesn't exist
if (inbox_id.isNull())
@@ -336,8 +317,20 @@ void LLSidepanelInventory::enableInbox(bool enabled)
{
mInboxEnabled = enabled;
- LLLayoutPanel * inbox_layout_panel = getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME);
- inbox_layout_panel->setVisible(enabled);
+ if(!enabled || !mPanelMainInventory->isSingleFolderMode())
+ {
+ toggleInbox();
+ }
+}
+
+void LLSidepanelInventory::hideInbox()
+{
+ mInboxLayoutPanel->setVisible(false);
+}
+
+void LLSidepanelInventory::toggleInbox()
+{
+ mInboxLayoutPanel->setVisible(mInboxEnabled);
}
void LLSidepanelInventory::openInbox()
@@ -367,25 +360,24 @@ void LLSidepanelInventory::onInboxChanged(const LLUUID& inbox_id)
void LLSidepanelInventory::onToggleInboxBtn()
{
LLButton* inboxButton = getChild<LLButton>(INBOX_BUTTON_NAME);
- LLLayoutPanel* inboxPanel = getChild<LLLayoutPanel>(INBOX_LAYOUT_PANEL_NAME);
LLLayoutStack* inv_stack = getChild<LLLayoutStack>(INVENTORY_LAYOUT_STACK_NAME);
const bool inbox_expanded = inboxButton->getToggleState();
// Expand/collapse the indicated panel
- inv_stack->collapsePanel(inboxPanel, !inbox_expanded);
+ inv_stack->collapsePanel(mInboxLayoutPanel, !inbox_expanded);
if (inbox_expanded)
{
- inboxPanel->setTargetDim(gSavedPerAccountSettings.getS32("InventoryInboxHeight"));
- if (inboxPanel->isInVisibleChain())
+ mInboxLayoutPanel->setTargetDim(gSavedPerAccountSettings.getS32("InventoryInboxHeight"));
+ if (mInboxLayoutPanel->isInVisibleChain())
{
gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected());
}
}
else
{
- gSavedPerAccountSettings.setS32("InventoryInboxHeight", inboxPanel->getTargetDim());
+ gSavedPerAccountSettings.setS32("InventoryInboxHeight", mInboxLayoutPanel->getTargetDim());
}
}
@@ -409,47 +401,7 @@ void LLSidepanelInventory::onOpen(const LLSD& key)
}
#endif
- if(key.size() == 0)
- return;
-
- mItemPanel->reset();
-
- if (key.has("id"))
- {
- mItemPanel->setItemID(key["id"].asUUID());
- if (key.has("object"))
- {
- mItemPanel->setObjectID(key["object"].asUUID());
- }
- showItemInfoPanel();
- }
- if (key.has("task"))
- {
- if (mTaskPanel)
- mTaskPanel->setObjectSelection(LLSelectMgr::getInstance()->getSelection());
- showTaskInfoPanel();
- }
-}
-
-void LLSidepanelInventory::onInfoButtonClicked()
-{
- LLInventoryItem *item = getSelectedItem();
- if (item)
- {
- mItemPanel->reset();
- mItemPanel->setItemID(item->getUUID());
- showItemInfoPanel();
- }
-}
-
-void LLSidepanelInventory::onShareButtonClicked()
-{
- LLAvatarActions::shareWithAvatars(this);
-}
-
-void LLSidepanelInventory::onShopButtonClicked()
-{
- LLWeb::loadURL(gSavedSettings.getString("MarketplaceURL"));
+ gAgent.showLatestFeatureNotification("inventory");
}
void LLSidepanelInventory::performActionOnSelection(const std::string &action)
@@ -471,47 +423,6 @@ void LLSidepanelInventory::performActionOnSelection(const std::string &action)
static_cast<LLFolderViewModelItemInventory*>(current_item->getViewModelItem())->performAction(mPanelMainInventory->getActivePanel()->getModel(), action);
}
-void LLSidepanelInventory::onWearButtonClicked()
-{
- // Get selected items set.
- const std::set<LLUUID> selected_uuids_set = LLAvatarActions::getInventorySelectedUUIDs();
- if (selected_uuids_set.empty()) return; // nothing selected
-
- // Convert the set to a vector.
- uuid_vec_t selected_uuids_vec;
- for (std::set<LLUUID>::const_iterator it = selected_uuids_set.begin(); it != selected_uuids_set.end(); ++it)
- {
- selected_uuids_vec.push_back(*it);
- }
-
- // Wear all selected items.
- wear_multiple(selected_uuids_vec, true);
-}
-
-void LLSidepanelInventory::onPlayButtonClicked()
-{
- const LLInventoryItem *item = getSelectedItem();
- if (!item)
- {
- return;
- }
-
- switch(item->getInventoryType())
- {
- case LLInventoryType::IT_GESTURE:
- performActionOnSelection("play");
- break;
- default:
- performActionOnSelection("open");
- break;
- }
-}
-
-void LLSidepanelInventory::onTeleportButtonClicked()
-{
- performActionOnSelection("teleport");
-}
-
void LLSidepanelInventory::onBackButtonClicked()
{
showInventoryPanel();
@@ -519,102 +430,17 @@ void LLSidepanelInventory::onBackButtonClicked()
void LLSidepanelInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action)
{
- updateVerbs();
-}
-
-void LLSidepanelInventory::showItemInfoPanel()
-{
- mItemPanel->setVisible(TRUE);
- if (mTaskPanel)
- mTaskPanel->setVisible(FALSE);
- mInventoryPanel->setVisible(FALSE);
- mItemPanel->dirty();
- mItemPanel->setIsEditing(FALSE);
-}
-
-void LLSidepanelInventory::showTaskInfoPanel()
-{
- mItemPanel->setVisible(FALSE);
- mInventoryPanel->setVisible(FALSE);
-
- if (mTaskPanel)
- {
- mTaskPanel->setVisible(TRUE);
- mTaskPanel->dirty();
- mTaskPanel->setIsEditing(FALSE);
- }
}
void LLSidepanelInventory::showInventoryPanel()
{
- mItemPanel->setVisible(FALSE);
- if (mTaskPanel)
- mTaskPanel->setVisible(FALSE);
mInventoryPanel->setVisible(TRUE);
- updateVerbs();
}
-void LLSidepanelInventory::updateVerbs()
+void LLSidepanelInventory::initInventoryViews()
{
- mInfoBtn->setEnabled(FALSE);
- mShareBtn->setEnabled(FALSE);
-
- mWearBtn->setVisible(FALSE);
- mWearBtn->setEnabled(FALSE);
- mPlayBtn->setVisible(FALSE);
- mPlayBtn->setEnabled(FALSE);
- mPlayBtn->setToolTip(std::string(""));
- mTeleportBtn->setVisible(FALSE);
- mTeleportBtn->setEnabled(FALSE);
- mShopBtn->setVisible(TRUE);
-
- mShareBtn->setEnabled(canShare());
-
- const LLInventoryItem *item = getSelectedItem();
- if (!item)
- return;
-
- bool is_single_selection = getSelectedCount() == 1;
-
- mInfoBtn->setEnabled(is_single_selection);
-
- switch(item->getInventoryType())
- {
- case LLInventoryType::IT_WEARABLE:
- case LLInventoryType::IT_OBJECT:
- case LLInventoryType::IT_ATTACHMENT:
- mWearBtn->setVisible(TRUE);
- mWearBtn->setEnabled(canWearSelected());
- mShopBtn->setVisible(FALSE);
- break;
- case LLInventoryType::IT_SOUND:
- mPlayBtn->setVisible(TRUE);
- mPlayBtn->setEnabled(TRUE);
- mPlayBtn->setToolTip(LLTrans::getString("InventoryPlaySoundTooltip"));
- mShopBtn->setVisible(FALSE);
- break;
- case LLInventoryType::IT_GESTURE:
- mPlayBtn->setVisible(TRUE);
- mPlayBtn->setEnabled(TRUE);
- mPlayBtn->setToolTip(LLTrans::getString("InventoryPlayGestureTooltip"));
- mShopBtn->setVisible(FALSE);
- break;
- case LLInventoryType::IT_ANIMATION:
- mPlayBtn->setVisible(TRUE);
- mPlayBtn->setEnabled(TRUE);
- mPlayBtn->setEnabled(TRUE);
- mPlayBtn->setToolTip(LLTrans::getString("InventoryPlayAnimationTooltip"));
- mShopBtn->setVisible(FALSE);
- break;
- case LLInventoryType::IT_LANDMARK:
- mTeleportBtn->setVisible(TRUE);
- mTeleportBtn->setEnabled(TRUE);
- mShopBtn->setVisible(FALSE);
- break;
- default:
- break;
- }
+ mPanelMainInventory->initInventoryViews();
}
bool LLSidepanelInventory::canShare()
@@ -737,12 +563,10 @@ void LLSidepanelInventory::clearSelections(bool clearMain, bool clearInbox)
}
}
- if (clearInbox && mInboxEnabled && mInventoryPanelInbox.get())
+ if (clearInbox && mInboxEnabled && !mInventoryPanelInbox.isDead())
{
mInventoryPanelInbox.get()->getRootFolder()->clearSelection();
}
-
- updateVerbs();
}
std::set<LLFolderViewItem*> LLSidepanelInventory::getInboxSelectionList()
diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h
index a3cd20a2c6..08989bb6af 100644
--- a/indra/newview/llsidepanelinventory.h
+++ b/indra/newview/llsidepanelinventory.h
@@ -66,9 +66,8 @@ public:
void clearSelections(bool clearMain, bool clearInbox);
std::set<LLFolderViewItem*> getInboxSelectionList();
- void showItemInfoPanel();
- void showTaskInfoPanel();
void showInventoryPanel();
+ void initInventoryViews();
// checks can share selected item(s)
bool canShare();
@@ -76,13 +75,13 @@ public:
void onToggleInboxBtn();
void enableInbox(bool enabled);
+ void toggleInbox();
+ void hideInbox();
void openInbox();
bool isInboxEnabled() const { return mInboxEnabled; }
- void updateVerbs();
-
static void cleanup();
protected:
@@ -103,27 +102,14 @@ protected:
private:
LLPanel* mInventoryPanel; // Main inventory view
LLHandle<LLInventoryPanel> mInventoryPanelInbox;
- LLSidepanelItemInfo* mItemPanel; // Individual item view
- LLSidepanelTaskInfo* mTaskPanel; // Individual in-world object view
LLPanelMainInventory* mPanelMainInventory;
+ LLLayoutPanel* mInboxLayoutPanel;
+
protected:
- void onInfoButtonClicked();
- void onShareButtonClicked();
- void onShopButtonClicked();
- void onWearButtonClicked();
- void onPlayButtonClicked();
- void onTeleportButtonClicked();
void onBackButtonClicked();
private:
- LLButton* mInfoBtn;
- LLButton* mShareBtn;
- LLButton* mWearBtn;
- LLButton* mPlayBtn;
- LLButton* mTeleportBtn;
- LLButton* mShopBtn;
-
bool mInboxEnabled;
LLInventoryCategoriesObserver* mCategoriesObserver;
diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp
index b23e24a222..d6d5a4ef2d 100644
--- a/indra/newview/llsidepaneliteminfo.cpp
+++ b/indra/newview/llsidepaneliteminfo.cpp
@@ -31,16 +31,23 @@
#include "llagent.h"
#include "llavataractions.h"
+#include "llavatarnamecache.h"
#include "llbutton.h"
+#include "llcallbacklist.h"
#include "llcombobox.h"
+#include "llfloater.h"
#include "llfloaterreg.h"
#include "llgroupactions.h"
+#include "llgroupmgr.h"
+#include "lliconctrl.h"
#include "llinventorydefines.h"
+#include "llinventoryicon.h"
#include "llinventorymodel.h"
#include "llinventoryobserver.h"
#include "lllineeditor.h"
#include "llradiogroup.h"
#include "llslurl.h"
+#include "lltexteditor.h"
#include "llviewercontrol.h"
#include "llviewerinventory.h"
#include "llviewerobjectlist.h"
@@ -73,49 +80,6 @@ private:
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLItemPropertiesObserver
-//
-// Helper class to watch for changes to the item.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLItemPropertiesObserver : public LLInventoryObserver
-{
-public:
- LLItemPropertiesObserver(LLSidepanelItemInfo* floater)
- : mFloater(floater)
- {
- gInventory.addObserver(this);
- }
- virtual ~LLItemPropertiesObserver()
- {
- gInventory.removeObserver(this);
- }
- virtual void changed(U32 mask);
-private:
- LLSidepanelItemInfo* mFloater; // Not a handle because LLSidepanelItemInfo is managing LLItemPropertiesObserver
-};
-
-void LLItemPropertiesObserver::changed(U32 mask)
-{
- const std::set<LLUUID>& mChangedItemIDs = gInventory.getChangedIDs();
- std::set<LLUUID>::const_iterator it;
-
- const LLUUID& item_id = mFloater->getItemID();
-
- for (it = mChangedItemIDs.begin(); it != mChangedItemIDs.end(); it++)
- {
- // set dirty for 'item profile panel' only if changed item is the item for which 'item profile panel' is shown (STORM-288)
- if (*it == item_id)
- {
- // if there's a change we're interested in.
- if((mask & (LLInventoryObserver::LABEL | LLInventoryObserver::INTERNAL | LLInventoryObserver::REMOVE)) != 0)
- {
- mFloater->dirty();
- }
- }
- }
-}
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLObjectInventoryObserver
//
// Helper class to watch for changes in an object inventory.
@@ -158,36 +122,48 @@ static LLPanelInjector<LLSidepanelItemInfo> t_item_info("sidepanel_item_info");
// Default constructor
LLSidepanelItemInfo::LLSidepanelItemInfo(const LLPanel::Params& p)
- : LLSidepanelInventorySubpanel(p)
+ : LLPanel(p)
, mItemID(LLUUID::null)
, mObjectInventoryObserver(NULL)
, mUpdatePendingId(-1)
+ , mIsDirty(false) /*Not ready*/
+ , mParentFloater(NULL)
{
- mPropertiesObserver = new LLItemPropertiesObserver(this);
+ gInventory.addObserver(this);
+ gIdleCallbacks.addFunction(&LLSidepanelItemInfo::onIdle, (void*)this);
}
// Destroys the object
LLSidepanelItemInfo::~LLSidepanelItemInfo()
{
- delete mPropertiesObserver;
- mPropertiesObserver = NULL;
+ gInventory.removeObserver(this);
+ gIdleCallbacks.deleteFunction(&LLSidepanelItemInfo::onIdle, (void*)this);
stopObjectInventoryObserver();
+
+ if (mOwnerCacheConnection.connected())
+ {
+ mOwnerCacheConnection.disconnect();
+ }
+ if (mCreatorCacheConnection.connected())
+ {
+ mCreatorCacheConnection.disconnect();
+ }
}
// virtual
BOOL LLSidepanelItemInfo::postBuild()
{
- LLSidepanelInventorySubpanel::postBuild();
-
+ mChangeThumbnailBtn = getChild<LLUICtrl>("change_thumbnail_btn");
+ mItemTypeIcon = getChild<LLIconCtrl>("item_type_icon");
+ mLabelOwnerName = getChild<LLTextBox>("LabelOwnerName");
+ mLabelCreatorName = getChild<LLTextBox>("LabelCreatorName");
+
getChild<LLLineEditor>("LabelItemName")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitName,this));
- getChild<LLLineEditor>("LabelItemDesc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLSidepanelItemInfo:: onCommitDescription, this));
- // Creator information
- getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickCreator,this));
- // owner information
- getChild<LLUICtrl>("BtnOwner")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickOwner,this));
+ // Thumnail edition
+ mChangeThumbnailBtn->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onEditThumbnail, this));
// acquired date
// owner permissions
// Permissions debug text
@@ -226,6 +202,12 @@ void LLSidepanelItemInfo::setItemID(const LLUUID& item_id)
mItemID = item_id;
mUpdatePendingId = -1;
}
+ dirty();
+}
+
+void LLSidepanelItemInfo::setParentFloater(LLFloater* parent)
+{
+ mParentFloater = parent;
}
const LLUUID& LLSidepanelItemInfo::getObjectID() const
@@ -249,12 +231,11 @@ void LLSidepanelItemInfo::onUpdateCallback(const LLUUID& item_id, S32 received_u
void LLSidepanelItemInfo::reset()
{
- LLSidepanelInventorySubpanel::reset();
-
mObjectID = LLUUID::null;
mItemID = LLUUID::null;
stopObjectInventoryObserver();
+ dirty();
}
void LLSidepanelItemInfo::refresh()
@@ -262,60 +243,37 @@ void LLSidepanelItemInfo::refresh()
LLViewerInventoryItem* item = findItem();
if(item)
{
- refreshFromItem(item);
- updateVerbs();
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ bool in_trash = (item->getUUID() == trash_id) || gInventory.isObjectDescendentOf(item->getUUID(), trash_id);
+ if (in_trash && mParentFloater)
+ {
+ // Close properties when moving to trash
+ // Aren't supposed to view properties from trash
+ mParentFloater->closeFloater();
+ }
+ else
+ {
+ refreshFromItem(item);
+ }
return;
}
- else
- {
- if (getIsEditing())
- {
- setIsEditing(FALSE);
- }
- }
-
- if (!getIsEditing())
- {
- const std::string no_item_names[]={
- "LabelItemName",
- "LabelItemDesc",
- "LabelCreatorName",
- "LabelOwnerName"
- };
-
- for(size_t t=0; t<LL_ARRAY_SIZE(no_item_names); ++t)
- {
- getChildView(no_item_names[t])->setEnabled(false);
- }
-
- setPropertiesFieldsEnabled(false);
-
- const std::string hide_names[]={
- "BaseMaskDebug",
- "OwnerMaskDebug",
- "GroupMaskDebug",
- "EveryoneMaskDebug",
- "NextMaskDebug"
- };
- for(size_t t=0; t<LL_ARRAY_SIZE(hide_names); ++t)
- {
- getChildView(hide_names[t])->setVisible(false);
- }
- }
- if (!item)
- {
- const std::string no_edit_mode_names[]={
- "BtnCreator",
- "BtnOwner",
- };
- for(size_t t=0; t<LL_ARRAY_SIZE(no_edit_mode_names); ++t)
- {
- getChildView(no_edit_mode_names[t])->setEnabled(false);
- }
- }
-
- updateVerbs();
+ if (mObjectID.notNull())
+ {
+ LLViewerObject* object = gObjectList.findObject(mObjectID);
+ if (object)
+ {
+ // Object exists, but object's content is not nessesary
+ // loaded, so assume item exists as well
+ return;
+ }
+ }
+
+ if (mParentFloater)
+ {
+ // if we failed to get item, it likely no longer exists
+ mParentFloater->closeFloater();
+ }
}
void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
@@ -333,7 +291,7 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
}
// do not enable the UI for incomplete items.
- BOOL is_complete = item->isFinished();
+ bool is_complete = item->isFinished();
const BOOL cannot_restrict_permissions = LLInventoryType::cannotRestrictPermissions(item->getInventoryType());
const BOOL is_calling_card = (item->getInventoryType() == LLInventoryType::IT_CALLINGCARD);
const BOOL is_settings = (item->getInventoryType() == LLInventoryType::IT_SETTINGS);
@@ -385,8 +343,22 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
getChild<LLUICtrl>("LabelItemName")->setValue(item->getName());
getChildView("LabelItemDescTitle")->setEnabled(TRUE);
getChildView("LabelItemDesc")->setEnabled(is_modifiable);
- getChildView("IconLocked")->setVisible(!is_modifiable);
getChild<LLUICtrl>("LabelItemDesc")->setValue(item->getDescription());
+ getChild<LLUICtrl>("item_thumbnail")->setValue(item->getThumbnailUUID());
+
+ LLUIImagePtr icon_img = LLInventoryIcon::getIcon(item->getType(), item->getInventoryType(), item->getFlags(), FALSE);
+ mItemTypeIcon->setImage(icon_img);
+
+ // Style for creator and owner links
+ LLStyle::Params style_params;
+ LLColor4 link_color = LLUIColorTable::instance().getColor("HTMLLinkColor");
+ style_params.color = link_color;
+ style_params.readonly_color = link_color;
+ style_params.is_link = true; // link will be added later
+ const LLFontGL* fontp = mLabelCreatorName->getFont();
+ style_params.font.name = LLFontGL::nameFromFont(fontp);
+ style_params.font.size = LLFontGL::sizeFromFont(fontp);
+ style_params.font.style = "UNDERLINE";
//////////////////
// CREATOR NAME //
@@ -397,19 +369,34 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
if (item->getCreatorUUID().notNull())
{
LLUUID creator_id = item->getCreatorUUID();
- std::string name =
- LLSLURL("agent", creator_id, "completename").getSLURLString();
- getChildView("BtnCreator")->setEnabled(TRUE);
+ std::string slurl =
+ LLSLURL("agent", creator_id, "inspect").getSLURLString();
+
+ style_params.link_href = slurl;
+
+ LLAvatarName av_name;
+ if (LLAvatarNameCache::get(creator_id, &av_name))
+ {
+ updateCreatorName(creator_id, av_name, style_params);
+ }
+ else
+ {
+ if (mCreatorCacheConnection.connected())
+ {
+ mCreatorCacheConnection.disconnect();
+ }
+ mLabelCreatorName->setText(LLTrans::getString("None"));
+ mCreatorCacheConnection = LLAvatarNameCache::get(creator_id, boost::bind(&LLSidepanelItemInfo::updateCreatorName, this, _1, _2, style_params));
+ }
+
getChildView("LabelCreatorTitle")->setEnabled(TRUE);
- getChildView("LabelCreatorName")->setEnabled(FALSE);
- getChild<LLUICtrl>("LabelCreatorName")->setValue(name);
+ mLabelCreatorName->setEnabled(TRUE);
}
else
{
- getChildView("BtnCreator")->setEnabled(FALSE);
getChildView("LabelCreatorTitle")->setEnabled(FALSE);
- getChildView("LabelCreatorName")->setEnabled(FALSE);
- getChild<LLUICtrl>("LabelCreatorName")->setValue(getString("unknown_multiple"));
+ mLabelCreatorName->setEnabled(FALSE);
+ mLabelCreatorName->setValue(getString("unknown_multiple"));
}
////////////////
@@ -417,28 +404,60 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
////////////////
if(perm.isOwned())
{
- std::string name;
+ std::string slurl;
if (perm.isGroupOwned())
{
- gCacheName->getGroupName(perm.getGroup(), name);
+ LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(perm.getGroup());
+
+ slurl = LLSLURL("group", perm.getGroup(), "inspect").getSLURLString();
+ style_params.link_href = slurl;
+ if (group_data && group_data->isGroupPropertiesDataComplete())
+ {
+ mLabelOwnerName->setText(group_data->mName, style_params);
+ }
+ else
+ {
+ // Triggers refresh
+ LLGroupMgr::getInstance()->sendGroupPropertiesRequest(perm.getGroup());
+
+ std::string name;
+ gCacheName->getGroupName(perm.getGroup(), name);
+ mLabelOwnerName->setText(name, style_params);
+ }
}
else
{
LLUUID owner_id = perm.getOwner();
- name = LLSLURL("agent", owner_id, "completename").getSLURLString();
+ slurl = LLSLURL("agent", owner_id, "inspect").getSLURLString();
+
+ style_params.link_href = slurl;
+ LLAvatarName av_name;
+ if (LLAvatarNameCache::get(owner_id, &av_name))
+ {
+ updateOwnerName(owner_id, av_name, style_params);
+ }
+ else
+ {
+ if (mOwnerCacheConnection.connected())
+ {
+ mOwnerCacheConnection.disconnect();
+ }
+ mLabelOwnerName->setText(LLTrans::getString("None"));
+ mOwnerCacheConnection = LLAvatarNameCache::get(owner_id, boost::bind(&LLSidepanelItemInfo::updateOwnerName, this, _1, _2, style_params));
+ }
}
- getChildView("BtnOwner")->setEnabled(TRUE);
getChildView("LabelOwnerTitle")->setEnabled(TRUE);
- getChildView("LabelOwnerName")->setEnabled(FALSE);
- getChild<LLUICtrl>("LabelOwnerName")->setValue(name);
+ mLabelOwnerName->setEnabled(TRUE);
}
else
{
- getChildView("BtnOwner")->setEnabled(FALSE);
getChildView("LabelOwnerTitle")->setEnabled(FALSE);
- getChildView("LabelOwnerName")->setEnabled(FALSE);
- getChild<LLUICtrl>("LabelOwnerName")->setValue(getString("public"));
+ mLabelOwnerName->setEnabled(FALSE);
+ mLabelOwnerName->setValue(getString("public"));
}
+
+ // Not yet supported for task inventories
+ mChangeThumbnailBtn->setEnabled(mObjectID.isNull() && ALEXANDRIA_LINDEN_ID != perm.getOwner());
////////////
// ORIGIN //
@@ -548,6 +567,8 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
if( gSavedSettings.getBOOL("DebugPermissions") )
{
+ childSetVisible("layout_debug_permissions", true);
+
BOOL slam_perm = FALSE;
BOOL overwrite_group = FALSE;
BOOL overwrite_everyone = FALSE;
@@ -565,38 +586,29 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
perm_string = "B: ";
perm_string += mask_to_string(base_mask);
getChild<LLUICtrl>("BaseMaskDebug")->setValue(perm_string);
- getChildView("BaseMaskDebug")->setVisible(TRUE);
perm_string = "O: ";
perm_string += mask_to_string(owner_mask);
getChild<LLUICtrl>("OwnerMaskDebug")->setValue(perm_string);
- getChildView("OwnerMaskDebug")->setVisible(TRUE);
perm_string = "G";
perm_string += overwrite_group ? "*: " : ": ";
perm_string += mask_to_string(group_mask);
getChild<LLUICtrl>("GroupMaskDebug")->setValue(perm_string);
- getChildView("GroupMaskDebug")->setVisible(TRUE);
perm_string = "E";
perm_string += overwrite_everyone ? "*: " : ": ";
perm_string += mask_to_string(everyone_mask);
getChild<LLUICtrl>("EveryoneMaskDebug")->setValue(perm_string);
- getChildView("EveryoneMaskDebug")->setVisible(TRUE);
perm_string = "N";
perm_string += slam_perm ? "*: " : ": ";
perm_string += mask_to_string(next_owner_mask);
getChild<LLUICtrl>("NextMaskDebug")->setValue(perm_string);
- getChildView("NextMaskDebug")->setVisible(TRUE);
}
else
{
- getChildView("BaseMaskDebug")->setVisible(FALSE);
- getChildView("OwnerMaskDebug")->setVisible(FALSE);
- getChildView("GroupMaskDebug")->setVisible(FALSE);
- getChildView("EveryoneMaskDebug")->setVisible(FALSE);
- getChildView("NextMaskDebug")->setVisible(FALSE);
+ childSetVisible("layout_debug_permissions", false);
}
/////////////
@@ -731,6 +743,68 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
}
}
+void LLSidepanelItemInfo::updateCreatorName(const LLUUID& creator_id, const LLAvatarName& creator_name, const LLStyle::Params& style_params)
+{
+ if (mCreatorCacheConnection.connected())
+ {
+ mCreatorCacheConnection.disconnect();
+ }
+ std::string name = creator_name.getCompleteName();
+ mLabelCreatorName->setText(name, style_params);
+}
+
+void LLSidepanelItemInfo::updateOwnerName(const LLUUID& owner_id, const LLAvatarName& owner_name, const LLStyle::Params& style_params)
+{
+ if (mOwnerCacheConnection.connected())
+ {
+ mOwnerCacheConnection.disconnect();
+ }
+ std::string name = owner_name.getCompleteName();
+ mLabelOwnerName->setText(name, style_params);
+}
+
+void LLSidepanelItemInfo::changed(U32 mask)
+{
+ const LLUUID& item_id = getItemID();
+ if (getObjectID().notNull() || item_id.isNull())
+ {
+ // Task inventory or not set up yet
+ return;
+ }
+
+ const std::set<LLUUID>& mChangedItemIDs = gInventory.getChangedIDs();
+ std::set<LLUUID>::const_iterator it;
+
+ for (it = mChangedItemIDs.begin(); it != mChangedItemIDs.end(); it++)
+ {
+ // set dirty for 'item profile panel' only if changed item is the item for which 'item profile panel' is shown (STORM-288)
+ if (*it == item_id)
+ {
+ // if there's a change we're interested in.
+ if((mask & (LLInventoryObserver::LABEL | LLInventoryObserver::INTERNAL | LLInventoryObserver::REMOVE)) != 0)
+ {
+ dirty();
+ }
+ }
+ }
+}
+
+void LLSidepanelItemInfo::dirty()
+{
+ mIsDirty = true;
+}
+
+// static
+void LLSidepanelItemInfo::onIdle( void* user_data )
+{
+ LLSidepanelItemInfo* self = reinterpret_cast<LLSidepanelItemInfo*>(user_data);
+
+ if( self->mIsDirty )
+ {
+ self->refresh();
+ self->mIsDirty = false;
+ }
+}
void LLSidepanelItemInfo::setAssociatedExperience( LLHandle<LLSidepanelItemInfo> hInfo, const LLSD& experience )
{
@@ -853,7 +927,7 @@ void LLSidepanelItemInfo::onCommitDescription()
LLViewerInventoryItem* item = findItem();
if(!item) return;
- LLLineEditor* labelItemDesc = getChild<LLLineEditor>("LabelItemDesc");
+ LLTextEditor* labelItemDesc = getChild<LLTextEditor>("LabelItemDesc");
if(!labelItemDesc)
{
return;
@@ -966,7 +1040,14 @@ void LLSidepanelItemInfo::updatePermissions()
}
}
-// static
+void LLSidepanelItemInfo::onEditThumbnail()
+{
+ LLSD data;
+ data["task_id"] = mObjectID;
+ data["item_id"] = mItemID;
+ LLFloaterReg::showInstance("change_item_thumbnail", data);
+}
+
void LLSidepanelItemInfo::onCommitSaleInfo(LLUICtrl* ctrl)
{
if (ctrl)
diff --git a/indra/newview/llsidepaneliteminfo.h b/indra/newview/llsidepaneliteminfo.h
index 5f29254182..b916f44520 100644
--- a/indra/newview/llsidepaneliteminfo.h
+++ b/indra/newview/llsidepaneliteminfo.h
@@ -27,42 +27,55 @@
#ifndef LL_LLSIDEPANELITEMINFO_H
#define LL_LLSIDEPANELITEMINFO_H
-#include "llsidepanelinventorysubpanel.h"
+#include "llinventoryobserver.h"
+#include "llpanel.h"
+#include "llstyle.h"
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLSidepanelItemInfo
// Object properties for inventory side panel.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLAvatarName;
class LLButton;
+class LLFloater;
+class LLIconCtrl;
class LLViewerInventoryItem;
class LLItemPropertiesObserver;
class LLObjectInventoryObserver;
class LLViewerObject;
class LLPermissions;
+class LLTextBox;
-class LLSidepanelItemInfo : public LLSidepanelInventorySubpanel
+class LLSidepanelItemInfo : public LLPanel, public LLInventoryObserver
{
public:
LLSidepanelItemInfo(const LLPanel::Params& p = getDefaultParams());
virtual ~LLSidepanelItemInfo();
- /*virtual*/ BOOL postBuild();
+ /*virtual*/ BOOL postBuild() override;
/*virtual*/ void reset();
void setObjectID(const LLUUID& object_id);
void setItemID(const LLUUID& item_id);
- void setEditMode(BOOL edit);
+ void setParentFloater(LLFloater* parent); // For simplicity
const LLUUID& getObjectID() const;
const LLUUID& getItemID() const;
// if received update and item id (from callback) matches internal ones, update UI
void onUpdateCallback(const LLUUID& item_id, S32 received_update_id);
+
+ void changed(U32 mask) override;
+ void dirty();
+
+ static void onIdle( void* user_data );
+ void updateOwnerName(const LLUUID& owner_id, const LLAvatarName& owner_name, const LLStyle::Params& style_params);
+ void updateCreatorName(const LLUUID& creator_id, const LLAvatarName& creator_name, const LLStyle::Params& style_params);
protected:
- /*virtual*/ void refresh();
- /*virtual*/ void save();
+ void refresh() override;
+ void save();
LLViewerInventoryItem* findItem() const;
LLViewerObject* findObject() const;
@@ -75,14 +88,23 @@ private:
void startObjectInventoryObserver();
void stopObjectInventoryObserver();
void setPropertiesFieldsEnabled(bool enabled);
+
+ boost::signals2::connection mOwnerCacheConnection;
+ boost::signals2::connection mCreatorCacheConnection;
LLUUID mItemID; // inventory UUID for the inventory item.
LLUUID mObjectID; // in-world task UUID, or null if in agent inventory.
- LLItemPropertiesObserver* mPropertiesObserver; // for syncing changes to item
LLObjectInventoryObserver* mObjectInventoryObserver; // for syncing changes to items inside an object
// We can send multiple properties updates simultaneously, make sure only last response counts and there won't be a race condition.
S32 mUpdatePendingId;
+ bool mIsDirty; // item properties need to be updated
+ LLFloater* mParentFloater;
+
+ LLUICtrl* mChangeThumbnailBtn;
+ LLIconCtrl* mItemTypeIcon;
+ LLTextBox* mLabelOwnerName;
+ LLTextBox* mLabelCreatorName;
//
// UI Elements
@@ -94,6 +116,7 @@ protected:
void onCommitDescription();
void onCommitPermissions(LLUICtrl* ctrl);
void updatePermissions();
+ void onEditThumbnail();
void onCommitSaleInfo(LLUICtrl* ctrl);
void updateSaleInfo();
void onCommitChanges(LLPointer<LLViewerInventoryItem> item);
diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp
index 6216057c17..fe61b7a02a 100644
--- a/indra/newview/llsidepaneltaskinfo.cpp
+++ b/indra/newview/llsidepaneltaskinfo.cpp
@@ -42,6 +42,7 @@
#include "llresmgr.h"
#include "lltextbox.h"
#include "llbutton.h"
+#include "llcallbacklist.h"
#include "llcheckboxctrl.h"
#include "llviewerobject.h"
#include "llselectmgr.h"
@@ -75,9 +76,11 @@ static LLPanelInjector<LLSidepanelTaskInfo> t_task_info("sidepanel_task_info");
// Default constructor
LLSidepanelTaskInfo::LLSidepanelTaskInfo()
+ : mVisibleDebugPermissions(true) // space was allocated by default
{
setMouseOpaque(FALSE);
mSelectionUpdateSlot = LLSelectMgr::instance().mUpdateSignal.connect(boost::bind(&LLSidepanelTaskInfo::refreshAll, this));
+ gIdleCallbacks.addFunction(&LLSidepanelTaskInfo::onIdle, (void*)this);
}
@@ -85,6 +88,7 @@ LLSidepanelTaskInfo::~LLSidepanelTaskInfo()
{
if (sActivePanel == this)
sActivePanel = NULL;
+ gIdleCallbacks.deleteFunction(&LLSidepanelTaskInfo::onIdle, (void*)this);
if (mSelectionUpdateSlot.connected())
{
@@ -95,8 +99,6 @@ LLSidepanelTaskInfo::~LLSidepanelTaskInfo()
// virtual
BOOL LLSidepanelTaskInfo::postBuild()
{
- LLSidepanelInventorySubpanel::postBuild();
-
mOpenBtn = getChild<LLButton>("open_btn");
mOpenBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onOpenButtonClicked, this));
mPayBtn = getChild<LLButton>("pay_btn");
@@ -151,12 +153,12 @@ BOOL LLSidepanelTaskInfo::postBuild()
mDALabelClickAction = getChildView("label click action");
mDAComboClickAction = getChild<LLComboBox>("clickaction");
mDAPathfindingAttributes = getChild<LLTextBase>("pathfinding_attributes_value");
- mDAB = getChildView("B:");
- mDAO = getChildView("O:");
- mDAG = getChildView("G:");
- mDAE = getChildView("E:");
- mDAN = getChildView("N:");
- mDAF = getChildView("F:");
+ mDAB = getChild<LLUICtrl>("B:");
+ mDAO = getChild<LLUICtrl>("O:");
+ mDAG = getChild<LLUICtrl>("G:");
+ mDAE = getChild<LLUICtrl>("E:");
+ mDAN = getChild<LLUICtrl>("N:");
+ mDAF = getChild<LLUICtrl>("F:");
return TRUE;
}
@@ -206,12 +208,22 @@ void LLSidepanelTaskInfo::disableAll()
disablePermissions();
- mDAB->setVisible(FALSE);
- mDAO->setVisible(FALSE);
- mDAG->setVisible(FALSE);
- mDAE->setVisible(FALSE);
- mDAN->setVisible(FALSE);
- mDAF->setVisible(FALSE);
+ if (mVisibleDebugPermissions)
+ {
+ mDAB->setVisible(FALSE);
+ mDAO->setVisible(FALSE);
+ mDAG->setVisible(FALSE);
+ mDAE->setVisible(FALSE);
+ mDAN->setVisible(FALSE);
+ mDAF->setVisible(FALSE);
+
+ LLFloater* parent_floater = gFloaterView->getParentFloater(this);
+ LLRect parent_rect = parent_floater->getRect();
+ LLRect debug_rect = mDAB->getRect();
+ // use double the debug rect for padding (since it isn't trivial to extract top_pad)
+ parent_floater->reshape(parent_rect.getWidth(), parent_rect.getHeight() - (debug_rect.getHeight() * 2));
+ mVisibleDebugPermissions = false;
+ }
mOpenBtn->setEnabled(FALSE);
mPayBtn->setEnabled(FALSE);
@@ -258,6 +270,8 @@ void LLSidepanelTaskInfo::disablePermissions()
void LLSidepanelTaskInfo::refresh()
{
+ mIsDirty = false;
+
LLButton* btn_deed_to_group = mDeedBtn;
if (btn_deed_to_group)
{
@@ -611,23 +625,23 @@ void LLSidepanelTaskInfo::refresh()
if (gSavedSettings.getBOOL("DebugPermissions") )
{
- if (valid_base_perms)
- {
- getChild<LLUICtrl>("B:")->setValue("B: " + mask_to_string(base_mask_on));
- getChildView("B:")->setVisible( TRUE);
-
- getChild<LLUICtrl>("O:")->setValue("O: " + mask_to_string(owner_mask_on));
- getChildView("O:")->setVisible( TRUE);
-
- getChild<LLUICtrl>("G:")->setValue("G: " + mask_to_string(group_mask_on));
- getChildView("G:")->setVisible( TRUE);
-
- getChild<LLUICtrl>("E:")->setValue("E: " + mask_to_string(everyone_mask_on));
- getChildView("E:")->setVisible( TRUE);
-
- getChild<LLUICtrl>("N:")->setValue("N: " + mask_to_string(next_owner_mask_on));
- getChildView("N:")->setVisible( TRUE);
- }
+ if (valid_base_perms)
+ {
+ mDAB->setValue("B: " + mask_to_string(base_mask_on));
+ mDAB->setVisible( TRUE);
+
+ mDAO->setValue("O: " + mask_to_string(owner_mask_on));
+ mDAO->setVisible( TRUE);
+
+ mDAG->setValue("G: " + mask_to_string(group_mask_on));
+ mDAG->setVisible( TRUE);
+
+ mDAE->setValue("E: " + mask_to_string(everyone_mask_on));
+ mDAE->setVisible( TRUE);
+
+ mDAN->setValue("N: " + mask_to_string(next_owner_mask_on));
+ mDAN->setVisible( TRUE);
+ }
U32 flag_mask = 0x0;
if (objectp->permMove()) flag_mask |= PERM_MOVE;
@@ -635,18 +649,35 @@ void LLSidepanelTaskInfo::refresh()
if (objectp->permCopy()) flag_mask |= PERM_COPY;
if (objectp->permTransfer()) flag_mask |= PERM_TRANSFER;
- getChild<LLUICtrl>("F:")->setValue("F:" + mask_to_string(flag_mask));
- getChildView("F:")->setVisible( TRUE);
- }
- else
- {
- getChildView("B:")->setVisible( FALSE);
- getChildView("O:")->setVisible( FALSE);
- getChildView("G:")->setVisible( FALSE);
- getChildView("E:")->setVisible( FALSE);
- getChildView("N:")->setVisible( FALSE);
- getChildView("F:")->setVisible( FALSE);
- }
+ mDAF->setValue("F:" + mask_to_string(flag_mask));
+ mDAF->setVisible(TRUE);
+
+ if (!mVisibleDebugPermissions)
+ {
+ LLFloater* parent_floater = gFloaterView->getParentFloater(this);
+ LLRect parent_rect = parent_floater->getRect();
+ LLRect debug_rect = mDAB->getRect();
+ // use double the debug rect for padding (since it isn't trivial to extract top_pad)
+ parent_floater->reshape(parent_rect.getWidth(), parent_rect.getHeight() + (debug_rect.getHeight() * 2));
+ mVisibleDebugPermissions = true;
+ }
+ }
+ else if (mVisibleDebugPermissions)
+ {
+ mDAB->setVisible(FALSE);
+ mDAO->setVisible(FALSE);
+ mDAG->setVisible(FALSE);
+ mDAE->setVisible(FALSE);
+ mDAN->setVisible(FALSE);
+ mDAF->setVisible(FALSE);
+
+ LLFloater* parent_floater = gFloaterView->getParentFloater(this);
+ LLRect parent_rect = parent_floater->getRect();
+ LLRect debug_rect = mDAB->getRect();
+ // use double the debug rect for padding (since it isn't trivial to extract top_pad)
+ parent_floater->reshape(parent_rect.getWidth(), parent_rect.getHeight() - (debug_rect.getHeight() * 2));
+ mVisibleDebugPermissions = false;
+ }
BOOL has_change_perm_ability = FALSE;
BOOL has_change_sale_ability = FALSE;
@@ -854,7 +885,7 @@ void LLSidepanelTaskInfo::refresh()
const BOOL all_include_in_search = LLSelectMgr::getInstance()->selectionGetIncludeInSearch(&include_in_search);
getChildView("search_check")->setEnabled(has_change_sale_ability && all_volume);
getChild<LLUICtrl>("search_check")->setValue(include_in_search);
- getChild<LLUICtrl>("search_check")->setTentative( !all_include_in_search);
+ getChild<LLUICtrl>("search_check")->setTentative(!all_include_in_search);
// Click action (touch, sit, buy)
U8 click_action = 0;
@@ -869,33 +900,6 @@ void LLSidepanelTaskInfo::refresh()
getChildView("label click action")->setEnabled(is_perm_modify && is_nonpermanent_enforced && all_volume);
getChildView("clickaction")->setEnabled(is_perm_modify && is_nonpermanent_enforced && all_volume);
- if (!getIsEditing())
- {
- const std::string no_item_names[] =
- {
- "Object Name",
- "Object Description",
- "button set group",
- "checkbox share with group",
- "button deed",
- "checkbox allow everyone move",
- "checkbox allow everyone copy",
- "checkbox for sale",
- "sale type",
- "Edit Cost",
- "checkbox next owner can modify",
- "checkbox next owner can copy",
- "checkbox next owner can transfer",
- "clickaction",
- "search_check",
- "perm_modify",
- "Group Name",
- };
- for (size_t t=0; t<LL_ARRAY_SIZE(no_item_names); ++t)
- {
- getChildView(no_item_names[t])->setEnabled( FALSE);
- }
- }
updateVerbs();
}
@@ -1155,7 +1159,8 @@ static U8 string_value_to_click_action(std::string p_value)
void LLSidepanelTaskInfo::onCommitClickAction(LLUICtrl* ctrl, void*)
{
LLComboBox* box = (LLComboBox*)ctrl;
- if (!box) return;
+ if (!box)
+ return;
std::string value = box->getValue().asString();
U8 click_action = string_value_to_click_action(value);
doClickAction(click_action);
@@ -1207,16 +1212,6 @@ void LLSidepanelTaskInfo::onCommitIncludeInSearch(LLUICtrl* ctrl, void* data)
// virtual
void LLSidepanelTaskInfo::updateVerbs()
{
- LLSidepanelInventorySubpanel::updateVerbs();
-
- /*
- mOpenBtn->setVisible(!getIsEditing());
- mPayBtn->setVisible(!getIsEditing());
- mBuyBtn->setVisible(!getIsEditing());
- //const LLViewerObject *obj = getFirstSelectedObject();
- //mEditBtn->setEnabled(obj && obj->permModify());
- */
-
LLSafeHandle<LLObjectSelection> object_selection = LLSelectMgr::getInstance()->getSelection();
const BOOL any_selected = (object_selection->getNumNodes() > 0);
@@ -1301,6 +1296,23 @@ LLSidepanelTaskInfo* LLSidepanelTaskInfo::getActivePanel()
return sActivePanel;
}
+void LLSidepanelTaskInfo::dirty()
+{
+ mIsDirty = true;
+}
+
+// static
+void LLSidepanelTaskInfo::onIdle( void* user_data )
+{
+ LLSidepanelTaskInfo* self = reinterpret_cast<LLSidepanelTaskInfo*>(user_data);
+
+ if( self->mIsDirty )
+ {
+ self->refresh();
+ self->mIsDirty = false;
+ }
+}
+
LLViewerObject* LLSidepanelTaskInfo::getObject()
{
if (!mObject->isDead())
diff --git a/indra/newview/llsidepaneltaskinfo.h b/indra/newview/llsidepaneltaskinfo.h
index ac9c57f2e2..2baafc67e7 100644
--- a/indra/newview/llsidepaneltaskinfo.h
+++ b/indra/newview/llsidepaneltaskinfo.h
@@ -27,8 +27,8 @@
#ifndef LL_LLSIDEPANELTASKINFO_H
#define LL_LLSIDEPANELTASKINFO_H
-#include "llsidepanelinventorysubpanel.h"
#include "lluuid.h"
+#include "llpanel.h"
#include "llselectmgr.h"
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -43,14 +43,14 @@ class LLNameBox;
class LLViewerObject;
class LLTextBase;
-class LLSidepanelTaskInfo : public LLSidepanelInventorySubpanel
+class LLSidepanelTaskInfo : public LLPanel
{
public:
LLSidepanelTaskInfo();
virtual ~LLSidepanelTaskInfo();
- /*virtual*/ BOOL postBuild();
- /*virtual*/ void onVisibilityChange ( BOOL new_visibility );
+ BOOL postBuild() override;
+ void onVisibilityChange ( BOOL new_visibility ) override;
void setObjectSelection(LLObjectSelectionHandle selection);
@@ -58,10 +58,12 @@ public:
LLViewerObject* getFirstSelectedObject();
static LLSidepanelTaskInfo *getActivePanel();
+ void dirty();
+ static void onIdle( void* user_data );
protected:
- /*virtual*/ void refresh(); // refresh all labels as needed
- /*virtual*/ void save();
- /*virtual*/ void updateVerbs();
+ void refresh() override; // refresh all labels as needed
+ void save();
+ void updateVerbs();
void refreshAll(); // ignore current keyboard focus and update all fields
@@ -103,6 +105,8 @@ private:
LLUUID mCreatorID;
LLUUID mOwnerID;
LLUUID mLastOwnerID;
+
+ bool mIsDirty;
protected:
void onOpenButtonClicked();
@@ -121,6 +125,10 @@ protected:
private:
LLPointer<LLViewerObject> mObject;
LLObjectSelectionHandle mObjectSelection;
+
+ // mVisibleDebugPermissions doesn't nessesarily matche state
+ // of viewes and is primarily for floater resize
+ bool mVisibleDebugPermissions;
static LLSidepanelTaskInfo* sActivePanel;
private:
@@ -148,12 +156,12 @@ private:
LLView* mDALabelClickAction;
LLComboBox* mDAComboClickAction;
LLTextBase* mDAPathfindingAttributes;
- LLView* mDAB;
- LLView* mDAO;
- LLView* mDAG;
- LLView* mDAE;
- LLView* mDAN;
- LLView* mDAF;
+ LLUICtrl* mDAB;
+ LLUICtrl* mDAO;
+ LLUICtrl* mDAG;
+ LLUICtrl* mDAE;
+ LLUICtrl* mDAN;
+ LLUICtrl* mDAF;
boost::signals2::connection mSelectionUpdateSlot;
};
diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp
index ed7e18fadc..b7a1832b17 100644
--- a/indra/newview/llsnapshotlivepreview.cpp
+++ b/indra/newview/llsnapshotlivepreview.cpp
@@ -51,6 +51,7 @@
#include "llviewercontrol.h"
#include "llviewermenufile.h" // upload_new_resource()
#include "llviewerstats.h"
+#include "llviewertexturelist.h"
#include "llwindow.h"
#include "llworld.h"
#include <boost/filesystem.hpp>
@@ -873,6 +874,11 @@ LLPointer<LLImageRaw> LLSnapshotLivePreview::getEncodedImage()
return mPreviewImageEncoded;
}
+bool LLSnapshotLivePreview::createUploadFile(const std::string &out_filename, const S32 max_image_dimentions, const S32 min_image_dimentions)
+{
+ return LLViewerTextureList::createUploadFile(mPreviewImage, out_filename, max_image_dimentions, min_image_dimentions);
+}
+
// We actually estimate the data size so that we do not require actual compression when showing the preview
// Note : whenever formatted image is computed, mDataSize will be updated to reflect the true size
void LLSnapshotLivePreview::estimateDataSize()
diff --git a/indra/newview/llsnapshotlivepreview.h b/indra/newview/llsnapshotlivepreview.h
index 1f81307976..6e38a957b4 100644
--- a/indra/newview/llsnapshotlivepreview.h
+++ b/indra/newview/llsnapshotlivepreview.h
@@ -106,6 +106,7 @@ public:
LLPointer<LLImageFormatted> getFormattedImage();
LLPointer<LLImageRaw> getEncodedImage();
+ bool createUploadFile(const std::string &out_file, const S32 max_image_dimentions, const S32 min_image_dimentions);
/// Sets size of preview thumbnail image and the surrounding rect.
void setThumbnailPlaceholderRect(const LLRect& rect) {mThumbnailPlaceholderRect = rect; }
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index f52f1a925d..29d42b3c00 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -235,6 +235,59 @@ BOOL LLSpatialGroup::updateInGroup(LLDrawable *drawablep, BOOL immediate)
return FALSE;
}
+void LLSpatialGroup::expandExtents(const LLVector4a* addingExtents, const LLXformMatrix& currentTransform)
+{
+ // Get coordinates of the adding extents
+ const LLVector4a& min = addingExtents[0];
+ const LLVector4a& max = addingExtents[1];
+
+ // Get coordinates of all corners of the bounding box
+ LLVector3 corners[] =
+ {
+ LLVector3(min[0], min[1], min[2]),
+ LLVector3(min[0], min[1], max[2]),
+ LLVector3(min[0], max[1], min[2]),
+ LLVector3(min[0], max[1], max[2]),
+ LLVector3(max[0], min[1], min[2]),
+ LLVector3(max[0], min[1], max[2]),
+ LLVector3(max[0], max[1], min[2]),
+ LLVector3(max[0], max[1], max[2])
+ };
+
+ // New extents (to be expanded)
+ LLVector3 extents[] =
+ {
+ LLVector3(mExtents[0].getF32ptr()),
+ LLVector3(mExtents[1].getF32ptr())
+ };
+
+ LLQuaternion backwardRotation = ~currentTransform.getRotation();
+ for (LLVector3& corner : corners)
+ {
+ // Make coordinates relative to the current position
+ corner -= currentTransform.getPosition();
+ // Rotate coordinates backward to the current rotation
+ corner.rotVec(backwardRotation);
+ // Expand root extents on the current corner
+ for (int j = 0; j < 3; ++j)
+ {
+ if (corner[j] < extents[0][j])
+ extents[0][j] = corner[j];
+ if (corner[j] > extents[1][j])
+ extents[1][j] = corner[j];
+ }
+ }
+
+ // Set new expanded extents
+ mExtents[0].load3(extents[0].mV);
+ mExtents[1].load3(extents[1].mV);
+
+ // Calculate new center and size
+ mBounds[0].setAdd(mExtents[0], mExtents[1]);
+ mBounds[0].mul(0.5f);
+ mBounds[1].setSub(mExtents[0], mExtents[1]);
+ mBounds[1].mul(0.5f);
+}
BOOL LLSpatialGroup::addObject(LLDrawable *drawablep)
{
@@ -3507,8 +3560,9 @@ public:
BOOL mPickTransparent;
BOOL mPickRigged;
BOOL mPickUnselectable;
+ BOOL mPickReflectionProbe;
- LLOctreeIntersect(const LLVector4a& start, const LLVector4a& end, BOOL pick_transparent, BOOL pick_rigged, BOOL pick_unselectable,
+ LLOctreeIntersect(const LLVector4a& start, const LLVector4a& end, BOOL pick_transparent, BOOL pick_rigged, BOOL pick_unselectable, BOOL pick_reflection_probe,
S32* face_hit, LLVector4a* intersection, LLVector2* tex_coord, LLVector4a* normal, LLVector4a* tangent)
: mStart(start),
mEnd(end),
@@ -3520,7 +3574,8 @@ public:
mHit(NULL),
mPickTransparent(pick_transparent),
mPickRigged(pick_rigged),
- mPickUnselectable(pick_unselectable)
+ mPickUnselectable(pick_unselectable),
+ mPickReflectionProbe(pick_reflection_probe)
{
}
@@ -3596,8 +3651,14 @@ public:
{
LLViewerObject* vobj = drawable->getVObj();
- if (vobj)
+ if (vobj &&
+ (!vobj->isReflectionProbe() || mPickReflectionProbe))
{
+ if (vobj->getClickAction() == CLICK_ACTION_IGNORE && !LLFloater::isVisible(gFloaterTools))
+ {
+ return false;
+ }
+
LLVector4a intersection;
bool skip_check = false;
if (vobj->isAvatar())
@@ -3621,7 +3682,9 @@ public:
}
}
- if (!skip_check && vobj->lineSegmentIntersect(mStart, mEnd, -1, mPickTransparent, mPickRigged, mPickUnselectable, mFaceHit, &intersection, mTexCoord, mNormal, mTangent))
+ if (!skip_check && vobj->lineSegmentIntersect(mStart, mEnd, -1,
+ (mPickReflectionProbe && vobj->isReflectionProbe()) ? TRUE : mPickTransparent, // always pick transparent when picking selection probe
+ mPickRigged, mPickUnselectable, mFaceHit, &intersection, mTexCoord, mNormal, mTangent))
{
mEnd = intersection; // shorten ray so we only find CLOSER hits
if (mIntersection)
@@ -3642,6 +3705,7 @@ LLDrawable* LLSpatialPartition::lineSegmentIntersect(const LLVector4a& start, co
BOOL pick_transparent,
BOOL pick_rigged,
BOOL pick_unselectable,
+ BOOL pick_reflection_probe,
S32* face_hit, // return the face hit
LLVector4a* intersection, // return the intersection point
LLVector2* tex_coord, // return the texture coordinates of the intersection point
@@ -3650,7 +3714,7 @@ LLDrawable* LLSpatialPartition::lineSegmentIntersect(const LLVector4a& start, co
)
{
- LLOctreeIntersect intersect(start, end, pick_transparent, pick_rigged, pick_unselectable, face_hit, intersection, tex_coord, normal, tangent);
+ LLOctreeIntersect intersect(start, end, pick_transparent, pick_rigged, pick_unselectable, pick_reflection_probe, face_hit, intersection, tex_coord, normal, tangent);
LLDrawable* drawable = intersect.check(mOctree);
return drawable;
@@ -3660,6 +3724,7 @@ LLDrawable* LLSpatialGroup::lineSegmentIntersect(const LLVector4a& start, const
BOOL pick_transparent,
BOOL pick_rigged,
BOOL pick_unselectable,
+ BOOL pick_reflection_probe,
S32* face_hit, // return the face hit
LLVector4a* intersection, // return the intersection point
LLVector2* tex_coord, // return the texture coordinates of the intersection point
@@ -3668,7 +3733,7 @@ LLDrawable* LLSpatialGroup::lineSegmentIntersect(const LLVector4a& start, const
)
{
- LLOctreeIntersect intersect(start, end, pick_transparent, pick_rigged, pick_unselectable, face_hit, intersection, tex_coord, normal, tangent);
+ LLOctreeIntersect intersect(start, end, pick_transparent, pick_rigged, pick_unselectable, pick_reflection_probe, face_hit, intersection, tex_coord, normal, tangent);
LLDrawable* drawable = intersect.check(getOctreeNode());
return drawable;
@@ -4011,7 +4076,8 @@ void LLCullResult::assertDrawMapsEmpty()
{
if (mRenderMapSize[i] != 0)
{
- LL_ERRS() << "Stale LLDrawInfo's in LLCullResult!" << LL_ENDL;
+ LL_ERRS() << "Stale LLDrawInfo's in LLCullResult!"
+ << " (mRenderMapSize[" << i << "] = " << mRenderMapSize[i] << ")" << LL_ENDL;
}
}
}
diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h
index 88584f535a..4214c26391 100644
--- a/indra/newview/llspatialpartition.h
+++ b/indra/newview/llspatialpartition.h
@@ -294,6 +294,7 @@ public:
BOOL addObject(LLDrawable *drawablep);
BOOL removeObject(LLDrawable *drawablep, BOOL from_octree = FALSE);
BOOL updateInGroup(LLDrawable *drawablep, BOOL immediate = FALSE); // Update position if it's in the group
+ void expandExtents(const LLVector4a* addingExtents, const LLXformMatrix& currentTransform);
void shift(const LLVector4a &offset);
// TODO: this no longer appears to be called, figure out if it's important and if not remove it
@@ -315,6 +316,7 @@ public:
BOOL pick_transparent,
BOOL pick_rigged,
BOOL pick_unselectable,
+ BOOL pick_reflection_probe,
S32* face_hit, // return the face hit
LLVector4a* intersection = NULL, // return the intersection point
LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point
@@ -389,6 +391,7 @@ public:
BOOL pick_transparent,
BOOL pick_rigged,
BOOL pick_unselectable,
+ BOOL pick_reflection_probe,
S32* face_hit, // return the face hit
LLVector4a* intersection = NULL, // return the intersection point
LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point
@@ -719,8 +722,10 @@ public:
class LLControlAVBridge : public LLVolumeBridge
{
+ using super = LLVolumeBridge;
public:
LLControlAVBridge(LLDrawable* drawablep, LLViewerRegion* regionp);
+ virtual void updateSpatialExtents();
};
class LLHUDBridge : public LLVolumeBridge
diff --git a/indra/newview/llsprite.cpp b/indra/newview/llsprite.cpp
index b641afc1ef..af0b5a40b4 100644
--- a/indra/newview/llsprite.cpp
+++ b/indra/newview/llsprite.cpp
@@ -79,7 +79,6 @@ void LLSprite::updateFace(LLFace &face)
// First, figure out how many vertices/indices we need.
U32 num_vertices, num_indices;
- U32 vertex_count = 0;
// Get the total number of vertices and indices
if (mFollow)
@@ -202,25 +201,21 @@ void LLSprite::updateFace(LLFace &face)
*verticesp = mC;
tex_coordsp++;
verticesp++;
- vertex_count++;
*tex_coordsp = LLVector2(0.f, 1.f);
*verticesp = mB;
tex_coordsp++;
verticesp++;
- vertex_count++;
*tex_coordsp = LLVector2(1.f, 1.f);
*verticesp = mA;
tex_coordsp++;
verticesp++;
- vertex_count++;
*tex_coordsp = LLVector2(1.f, 0.0f);
*verticesp = mD;
tex_coordsp++;
verticesp++;
- vertex_count++;
// Generate indices, since they're easy.
// Just a series of quads.
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 39d640e85f..6f8ffd3610 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -257,7 +257,7 @@ static bool mLoginStatePastUI = false;
static bool mBenefitsSuccessfullyInit = false;
const F32 STATE_AGENT_WAIT_TIMEOUT = 240; //seconds
-const S32 MAX_SEED_CAP_ATTEMPTS_BEFORE_LOGIN = 3; // Give region 3 chances
+const S32 MAX_SEED_CAP_ATTEMPTS_BEFORE_ABORT = 4; // Give region 4 chances
std::unique_ptr<LLEventPump> LLStartUp::sStateWatcher(new LLEventStream("StartupState"));
std::unique_ptr<LLStartupListener> LLStartUp::sListener(new LLStartupListener());
@@ -664,9 +664,22 @@ bool idle_startup()
#else
void* window_handle = NULL;
#endif
- bool init = gAudiop->init(window_handle, LLAppViewer::instance()->getSecondLifeTitle());
- if(init)
+ if (gAudiop->init(window_handle, LLAppViewer::instance()->getSecondLifeTitle()))
{
+ if (FALSE == gSavedSettings.getBOOL("UseMediaPluginsForStreamingAudio"))
+ {
+ LL_INFOS("AppInit") << "Using default impl to render streaming audio" << LL_ENDL;
+ gAudiop->setStreamingAudioImpl(gAudiop->createDefaultStreamingAudioImpl());
+ }
+
+ // if the audio engine hasn't set up its own preferred handler for streaming audio
+ // then set up the generic streaming audio implementation which uses media plugins
+ if (NULL == gAudiop->getStreamingAudioImpl())
+ {
+ LL_INFOS("AppInit") << "Using media plugins to render streaming audio" << LL_ENDL;
+ gAudiop->setStreamingAudioImpl(new LLStreamingAudio_MediaPlugins());
+ }
+
gAudiop->setMuted(TRUE);
}
else
@@ -675,16 +688,6 @@ bool idle_startup()
delete gAudiop;
gAudiop = NULL;
}
-
- if (gAudiop)
- {
- // if the audio engine hasn't set up its own preferred handler for streaming audio then set up the generic streaming audio implementation which uses media plugins
- if (NULL == gAudiop->getStreamingAudioImpl())
- {
- LL_INFOS("AppInit") << "Using media plugins to render streaming audio" << LL_ENDL;
- gAudiop->setStreamingAudioImpl(new LLStreamingAudio_MediaPlugins());
- }
- }
}
}
@@ -1396,17 +1399,32 @@ bool idle_startup()
}
else if (regionp->capabilitiesError())
{
- // Try to connect despite capabilities' error state
- LLStartUp::setStartupState(STATE_SEED_CAP_GRANTED);
+ LL_WARNS("AppInit") << "Failed to get capabilities. Backing up to login screen!" << LL_ENDL;
+ if (gRememberPassword)
+ {
+ LLNotificationsUtil::add("LoginPacketNeverReceived", LLSD(), LLSD(), login_alert_status);
+ }
+ else
+ {
+ LLNotificationsUtil::add("LoginPacketNeverReceivedNoTP", LLSD(), LLSD(), login_alert_status);
+ }
+ reset_login();
}
else
{
U32 num_retries = regionp->getNumSeedCapRetries();
- if (num_retries > MAX_SEED_CAP_ATTEMPTS_BEFORE_LOGIN)
+ if (num_retries > MAX_SEED_CAP_ATTEMPTS_BEFORE_ABORT)
{
- // Region will keep trying to get capabilities,
- // but for now continue as if caps were granted
- LLStartUp::setStartupState(STATE_SEED_CAP_GRANTED);
+ LL_WARNS("AppInit") << "Failed to get capabilities. Backing up to login screen!" << LL_ENDL;
+ if (gRememberPassword)
+ {
+ LLNotificationsUtil::add("LoginPacketNeverReceived", LLSD(), LLSD(), login_alert_status);
+ }
+ else
+ {
+ LLNotificationsUtil::add("LoginPacketNeverReceivedNoTP", LLSD(), LLSD(), login_alert_status);
+ }
+ reset_login();
}
else if (num_retries > 0)
{
@@ -1901,7 +1919,36 @@ bool idle_startup()
LLNotificationsUtil::add("InventoryUnusable");
}
+ LLInventoryModelBackgroundFetch::instance().start();
gInventory.createCommonSystemCategories();
+ LLStartUp::setStartupState(STATE_INVENTORY_CALLBACKS );
+ display_startup();
+
+ return FALSE;
+ }
+
+ //---------------------------------------------------------------------
+ // STATE_INVENTORY_CALLBACKS
+ //---------------------------------------------------------------------
+ if (STATE_INVENTORY_CALLBACKS == LLStartUp::getStartupState())
+ {
+ if (!LLInventoryModel::isSysFoldersReady())
+ {
+ display_startup();
+ return FALSE;
+ }
+ LLInventoryModelBackgroundFetch::instance().start();
+ LLUUID cof_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
+ LLViewerInventoryCategory* cof = gInventory.getCategory(cof_id);
+ if (cof
+ && cof->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN)
+ {
+ // Special case, dupplicate request prevention.
+ // Cof folder will be requested via FetchCOF
+ // in appearance manager, prevent recursive fetch
+ cof->setFetching(LLViewerInventoryCategory::FETCH_RECURSIVE);
+ }
+
// It's debatable whether this flag is a good idea - sets all
// bits, and in general it isn't true that inventory
@@ -2163,7 +2210,7 @@ bool idle_startup()
gAgentWearables.notifyLoadingStarted();
gAgent.setOutfitChosen(TRUE);
gAgentWearables.sendDummyAgentWearablesUpdate();
- callAfterCategoryFetch(LLAppearanceMgr::instance().getCOF(), set_flags_and_update_appearance);
+ callAfterCOFFetch(set_flags_and_update_appearance);
}
display_startup();
@@ -2700,6 +2747,7 @@ void register_viewer_callbacks(LLMessageSystem* msg)
msg->setHandlerFunc("InitiateDownload", process_initiate_download);
msg->setHandlerFunc("LandStatReply", LLFloaterTopObjects::handle_land_reply);
msg->setHandlerFunc("GenericMessage", process_generic_message);
+ msg->setHandlerFunc("GenericStreamingMessage", process_generic_streaming_message);
msg->setHandlerFunc("LargeGenericMessage", process_large_generic_message);
msg->setHandlerFuncFast(_PREHASH_FeatureDisabled, process_feature_disabled_message);
@@ -2774,7 +2822,7 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
// Not going through the processAgentInitialWearables path, so need to set this here.
LLAppearanceMgr::instance().setAttachmentInvLinkEnable(true);
// Initiate creation of COF, since we're also bypassing that.
- gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
+ gInventory.ensureCategoryForTypeExists(LLFolderType::FT_CURRENT_OUTFIT);
ESex gender;
if (gender_name == "male")
@@ -2827,8 +2875,15 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
bool do_append = false;
LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);
// Need to fetch cof contents before we can wear.
- callAfterCategoryFetch(LLAppearanceMgr::instance().getCOF(),
+ if (do_copy)
+ {
+ callAfterCategoryFetch(LLAppearanceMgr::instance().getCOF(),
boost::bind(&LLAppearanceMgr::wearInventoryCategory, LLAppearanceMgr::getInstance(), cat, do_copy, do_append));
+ }
+ else
+ {
+ callAfterCategoryLinksFetch(cat_id, boost::bind(&LLAppearanceMgr::wearInventoryCategory, LLAppearanceMgr::getInstance(), cat, do_copy, do_append));
+ }
LL_DEBUGS() << "initial outfit category id: " << cat_id << LL_ENDL;
}
@@ -2881,6 +2936,7 @@ std::string LLStartUp::startupStateToString(EStartupState state)
RTNENUM( STATE_AGENT_SEND );
RTNENUM( STATE_AGENT_WAIT );
RTNENUM( STATE_INVENTORY_SEND );
+ RTNENUM(STATE_INVENTORY_CALLBACKS );
RTNENUM( STATE_MISC );
RTNENUM( STATE_PRECACHE );
RTNENUM( STATE_WEARABLES_WAIT );
@@ -2935,6 +2991,11 @@ void reset_login()
LLFloaterReg::hideVisibleInstances();
LLStartUp::setStartupState( STATE_BROWSER_INIT );
+ if (LLVoiceClient::instanceExists())
+ {
+ LLVoiceClient::getInstance()->terminate();
+ }
+
// Clear any verified certs and verify them again on next login
// to ensure cert matches server instead of just getting reused
LLPointer<LLCertificateStore> store = gSecAPIHandler->getCertificateStore("");
@@ -3250,7 +3311,7 @@ LLSD transform_cert_args(LLPointer<LLCertificate> cert)
// are actually arrays, and we want to format them as comma separated
// strings, so special case those.
LLSDSerialize::toXML(cert_info[iter->first], std::cout);
- if((iter->first== std::string(CERT_KEY_USAGE)) |
+ if((iter->first == std::string(CERT_KEY_USAGE)) ||
(iter->first == std::string(CERT_EXTENDED_KEY_USAGE)))
{
value = "";
@@ -3608,7 +3669,7 @@ bool process_login_success_response()
std::string flag = login_flags["ever_logged_in"];
if(!flag.empty())
{
- gAgent.setFirstLogin((flag == "N") ? TRUE : FALSE);
+ gAgent.setFirstLogin(flag == "N");
}
/* Flag is currently ignored by the viewer.
@@ -3699,7 +3760,7 @@ bool process_login_success_response()
std::string fake_initial_outfit_name = gSavedSettings.getString("FakeInitialOutfitName");
if (!fake_initial_outfit_name.empty())
{
- gAgent.setFirstLogin(TRUE);
+ gAgent.setFirstLogin(true);
sInitialOutfit = fake_initial_outfit_name;
if (sInitialOutfitGender.empty())
{
@@ -3734,7 +3795,9 @@ bool process_login_success_response()
// Only save mfa_hash for future logins if the user wants their info remembered.
- if(response.has("mfa_hash") && gSavedSettings.getBOOL("RememberUser") && gSavedSettings.getBOOL("RememberPassword"))
+ if(response.has("mfa_hash")
+ && gSavedSettings.getBOOL("RememberUser")
+ && LLLoginInstance::getInstance()->saveMFA())
{
std::string grid(LLGridManager::getInstance()->getGridId());
std::string user_id(gUserCredential->userID());
@@ -3742,6 +3805,13 @@ bool process_login_success_response()
// TODO(brad) - related to SL-17223 consider building a better interface that sync's automatically
gSecAPIHandler->syncProtectedMap();
}
+ else if (!LLLoginInstance::getInstance()->saveMFA())
+ {
+ std::string grid(LLGridManager::getInstance()->getGridId());
+ std::string user_id(gUserCredential->userID());
+ gSecAPIHandler->removeFromProtectedMap("mfa_hash", grid, user_id);
+ gSecAPIHandler->syncProtectedMap();
+ }
bool success = false;
// JC: gesture loading done below, when we have an asset system
diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h
index fe8e215f76..921f088423 100644
--- a/indra/newview/llstartup.h
+++ b/indra/newview/llstartup.h
@@ -71,6 +71,7 @@ typedef enum {
STATE_AGENT_SEND, // Connect to a region
STATE_AGENT_WAIT, // Wait for region
STATE_INVENTORY_SEND, // Do inventory transfer
+ STATE_INVENTORY_CALLBACKS, // Wait for missing system folders and register callbacks
STATE_MISC, // Do more things (set bandwidth, start audio, save location, etc)
STATE_PRECACHE, // Wait a bit for textures to download
STATE_WEARABLES_WAIT, // Wait for clothing to download
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index 0a87b14e17..1ef5d1c50b 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -729,7 +729,7 @@ class LLBalanceHandler : public LLCommandHandler
public:
// Requires "trusted" browser/URL source
LLBalanceHandler() : LLCommandHandler("balance", UNTRUSTED_BLOCK) { }
- bool handle(const LLSD& tokens, const LLSD& query_map, LLMediaCtrl* web)
+ bool handle(const LLSD& tokens, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web)
{
if (tokens.size() == 1
&& tokens[0].asString() == "request")
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index ef58bba71e..3abe8ab1dc 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -138,6 +138,8 @@ bool get_can_copy_texture(LLUUID asset_id)
return get_is_predefined_texture(asset_id) || get_copy_free_item_by_asset_id(asset_id).notNull();
}
+S32 LLFloaterTexturePicker::sLastPickerMode = 0;
+
LLFloaterTexturePicker::LLFloaterTexturePicker(
LLView* owner,
LLUUID image_asset_id,
@@ -170,13 +172,16 @@ LLFloaterTexturePicker::LLFloaterTexturePicker(
mSelectedItemPinned( FALSE ),
mCanApply(true),
mCanPreview(true),
+ mLimitsSet(false),
+ mMaxDim(S32_MAX),
+ mMinDim(0),
mPreviewSettingChanged(false),
mOnFloaterCommitCallback(NULL),
mOnFloaterCloseCallback(NULL),
mSetImageAssetIDCallback(NULL),
mOnUpdateImageStatsCallback(NULL),
mBakeTextureEnabled(FALSE),
- mInventoryPickType(EPickInventoryType::TEXTURE)
+ mInventoryPickType(LLTextureCtrl::PICK_TEXTURE)
{
mCanApplyImmediately = can_apply_immediately;
buildFromFile("floater_texture_ctrl.xml");
@@ -210,15 +215,38 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selecti
mModeSelector->selectByValue(0);
onModeSelect(0,this);
}
-
- LLUUID item_id = findItemID(mImageAssetID, FALSE);
+
+ LLUUID item_id;
+ LLFolderView* root_folder = mInventoryPanel->getRootFolder();
+ if (root_folder && root_folder->getCurSelectedItem())
+ {
+ LLFolderViewItem* last_selected = root_folder->getCurSelectedItem();
+ LLFolderViewModelItemInventory* inv_view = static_cast<LLFolderViewModelItemInventory*>(last_selected->getViewModelItem());
+
+ LLInventoryItem* itemp = gInventory.getItem(inv_view->getUUID());
+
+ if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL
+ && mImageAssetID == LLGLTFMaterialList::BLANK_MATERIAL_ASSET_ID
+ && itemp && itemp->getAssetUUID().isNull())
+ {
+ item_id = inv_view->getUUID();
+ }
+ else if (itemp && itemp->getAssetUUID() == mImageAssetID)
+ {
+ item_id = inv_view->getUUID();
+ }
+ }
+ if (item_id.isNull())
+ {
+ item_id = findItemID(mImageAssetID, FALSE);
+ }
if (item_id.isNull())
{
mInventoryPanel->getRootFolder()->clearSelection();
}
else
{
- LLInventoryItem* itemp = gInventory.getItem(image_id);
+ LLInventoryItem* itemp = gInventory.getItem(item_id);
if (itemp && !itemp->getPermissions().allowCopyBy(gAgent.getID()))
{
// no copy texture
@@ -232,12 +260,20 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selecti
mInventoryPanel->setSelection(item_id, TAKE_FOCUS_NO);
}
}
-
-
-
}
}
+void LLFloaterTexturePicker::setImageIDFromItem(const LLInventoryItem* itemp, bool set_selection)
+{
+ LLUUID asset_id = itemp->getAssetUUID();
+ if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL && asset_id.isNull())
+ {
+ // If an inventory item has a null asset, consider it a valid blank material(gltf)
+ asset_id = LLGLTFMaterialList::BLANK_MATERIAL_ASSET_ID;
+ }
+ setImageID(asset_id, set_selection);
+}
+
void LLFloaterTexturePicker::setActive( BOOL active )
{
if (!active && getChild<LLUICtrl>("Pipette")->getValue().asBoolean())
@@ -264,8 +300,9 @@ void LLFloaterTexturePicker::stopUsingPipette()
}
}
-void LLFloaterTexturePicker::updateImageStats()
+bool LLFloaterTexturePicker::updateImageStats()
{
+ bool result = true;
if (mGLTFMaterial.notNull())
{
S32 width = 0;
@@ -321,14 +358,31 @@ void LLFloaterTexturePicker::updateImageStats()
else if (mTexturep.notNull())
{
//RN: have we received header data for this image?
- if (mTexturep->getFullWidth() > 0 && mTexturep->getFullHeight() > 0)
+ S32 width = mTexturep->getFullWidth();
+ S32 height = mTexturep->getFullHeight();
+ if (width > 0 && height > 0)
{
- std::string formatted_dims = llformat("%d x %d", mTexturep->getFullWidth(),mTexturep->getFullHeight());
- mResolutionLabel->setTextArg("[DIMENSIONS]", formatted_dims);
- if (mOnUpdateImageStatsCallback)
- {
- mOnUpdateImageStatsCallback(mTexturep);
- }
+ if ((mLimitsSet && (width != height))
+ || width < mMinDim
+ || width > mMaxDim
+ || height < mMinDim
+ || height > mMaxDim
+ )
+ {
+ std::string formatted_dims = llformat("%dx%d", width, height);
+ mResolutionWarning->setTextArg("[TEXDIM]", formatted_dims);
+ result = false;
+ }
+ else
+ {
+ std::string formatted_dims = llformat("%d x %d", width, height);
+ mResolutionLabel->setTextArg("[DIMENSIONS]", formatted_dims);
+ }
+
+ if (mOnUpdateImageStatsCallback)
+ {
+ mOnUpdateImageStatsCallback(mTexturep);
+ }
}
else
{
@@ -339,6 +393,21 @@ void LLFloaterTexturePicker::updateImageStats()
{
mResolutionLabel->setTextArg("[DIMENSIONS]", std::string(""));
}
+ mResolutionLabel->setVisible(result);
+ mResolutionWarning->setVisible(!result);
+
+ // Hide buttons and pipete to make space for mResolutionWarning
+ // Hiding buttons is suboptimal, but at the moment limited to inventory thumbnails
+ // may be this should be an info/warning icon with a tooltip?
+ S32 index = mModeSelector->getValue().asInteger();
+ if (index == 0)
+ {
+ mDefaultBtn->setVisible(result);
+ mNoneBtn->setVisible(result);
+ mBlankBtn->setVisible(result);
+ mPipetteBtn->setVisible(result);
+ }
+ return result;
}
// virtual
@@ -356,11 +425,11 @@ BOOL LLFloaterTexturePicker::handleDragAndDrop(
bool is_material = cargo_type == DAD_MATERIAL;
bool allow_dnd = false;
- if (mInventoryPickType == EPickInventoryType::MATERIAL)
+ if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
{
allow_dnd = is_material;
}
- else if (mInventoryPickType == EPickInventoryType::TEXTURE)
+ else if (mInventoryPickType == LLTextureCtrl::PICK_TEXTURE)
{
allow_dnd = is_texture || is_mesh;
}
@@ -388,7 +457,7 @@ BOOL LLFloaterTexturePicker::handleDragAndDrop(
{
if (drop)
{
- setImageID( item->getAssetUUID() );
+ setImageIDFromItem(item);
commitIfImmediateSet();
}
@@ -448,6 +517,15 @@ BOOL LLFloaterTexturePicker::handleKeyHere(KEY key, MASK mask)
return LLFloater::handleKeyHere(key, mask);
}
+void LLFloaterTexturePicker::onOpen(const LLSD& key)
+{
+ if (sLastPickerMode != 0
+ && mModeSelector->selectByValue(sLastPickerMode))
+ {
+ changeMode();
+ }
+}
+
void LLFloaterTexturePicker::onClose(bool app_quitting)
{
if (mOwner && mOnFloaterCloseCallback)
@@ -455,6 +533,7 @@ void LLFloaterTexturePicker::onClose(bool app_quitting)
mOnFloaterCloseCallback();
}
stopUsingPipette();
+ sLastPickerMode = mModeSelector->getValue().asInteger();
}
// virtual
@@ -471,11 +550,22 @@ BOOL LLFloaterTexturePicker::postBuild()
mTentativeLabel = getChild<LLTextBox>("Multiple");
mResolutionLabel = getChild<LLTextBox>("size_lbl");
+ mResolutionWarning = getChild<LLTextBox>("over_limit_lbl");
- childSetAction("Default",LLFloaterTexturePicker::onBtnSetToDefault,this);
- childSetAction("None", LLFloaterTexturePicker::onBtnNone,this);
- childSetAction("Blank", LLFloaterTexturePicker::onBtnBlank,this);
+ mDefaultBtn = getChild<LLButton>("Default");
+ mNoneBtn = getChild<LLButton>("None");
+ mBlankBtn = getChild<LLButton>("Blank");
+ mPipetteBtn = getChild<LLButton>("Pipette");
+ mSelectBtn = getChild<LLButton>("Select");
+ mCancelBtn = getChild<LLButton>("Cancel");
+
+ mDefaultBtn->setClickedCallback(boost::bind(LLFloaterTexturePicker::onBtnSetToDefault,this));
+ mNoneBtn->setClickedCallback(boost::bind(LLFloaterTexturePicker::onBtnNone, this));
+ mBlankBtn->setClickedCallback(boost::bind(LLFloaterTexturePicker::onBtnBlank, this));
+ mPipetteBtn->setCommitCallback(boost::bind(&LLFloaterTexturePicker::onBtnPipette, this));
+ mSelectBtn->setClickedCallback(boost::bind(LLFloaterTexturePicker::onBtnSelect, this));
+ mCancelBtn->setClickedCallback(boost::bind(LLFloaterTexturePicker::onBtnCancel, this));
mFilterEdit = getChild<LLFilterEditor>("inventory search editor");
mFilterEdit->setCommitCallback(boost::bind(&LLFloaterTexturePicker::onFilterEdit, this, _2));
@@ -556,12 +646,13 @@ void LLFloaterTexturePicker::draw()
// This is going to spam mOnUpdateImageStatsCallback,
// either move elsewhere or fix to cause update once per image
- updateImageStats();
+ bool valid_dims = updateImageStats();
// if we're inactive, gray out "apply immediate" checkbox
- getChildView("Select")->setEnabled(mActive && mCanApply);
- getChildView("Pipette")->setEnabled(mActive);
- getChild<LLUICtrl>("Pipette")->setValue(LLToolMgr::getInstance()->getCurrentTool() == LLToolPipette::getInstance());
+ getChildView("show_folders_check")->setEnabled(mActive && mCanApplyImmediately && !mNoCopyTextureSelected);
+ mSelectBtn->setEnabled(mActive && mCanApply && valid_dims);
+ mPipetteBtn->setEnabled(mActive);
+ mPipetteBtn->setValue(LLToolMgr::getInstance()->getCurrentTool() == LLToolPipette::getInstance());
//BOOL allow_copy = FALSE;
if( mOwner )
@@ -570,7 +661,7 @@ void LLFloaterTexturePicker::draw()
mGLTFMaterial = NULL;
if (mImageAssetID.notNull())
{
- if (mInventoryPickType == EPickInventoryType::MATERIAL)
+ if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
{
mGLTFMaterial = (LLFetchedGLTFMaterial*) gGLTFMaterialList.getMaterial(mImageAssetID);
llassert(mGLTFMaterial == nullptr || dynamic_cast<LLFetchedGLTFMaterial*>(gGLTFMaterialList.getMaterial(mImageAssetID)) != nullptr);
@@ -606,9 +697,9 @@ void LLFloaterTexturePicker::draw()
mTentativeLabel->setVisible( FALSE );
}
- getChildView("Default")->setEnabled(mImageAssetID != mDefaultImageAssetID || mTentative);
- getChildView("Blank")->setEnabled((mImageAssetID != mBlankImageAssetID && mBlankImageAssetID.notNull()) || mTentative);
- getChildView("None")->setEnabled(mAllowNoTexture && (!mImageAssetID.isNull() || mTentative));
+ mDefaultBtn->setEnabled(mImageAssetID != mDefaultImageAssetID || mTentative);
+ mBlankBtn->setEnabled((mImageAssetID != mBlankImageAssetID && mBlankImageAssetID.notNull()) || mTentative);
+ mNoneBtn->setEnabled(mAllowNoTexture && (!mImageAssetID.isNull() || mTentative));
LLFloater::draw();
@@ -685,9 +776,22 @@ void LLFloaterTexturePicker::draw()
const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, BOOL copyable_only, BOOL ignore_library)
{
+ LLUUID loockup_id = asset_id;
+ if (loockup_id.isNull())
+ {
+ if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
+ {
+ loockup_id = LLGLTFMaterialList::BLANK_MATERIAL_ASSET_ID;
+ }
+ else
+ {
+ return LLUUID::null;
+ }
+ }
+
LLViewerInventoryCategory::cat_array_t cats;
LLViewerInventoryItem::item_array_t items;
- LLAssetIDMatches asset_id_matches(asset_id);
+ LLAssetIDMatches asset_id_matches(loockup_id);
gInventory.collectDescendentsIf(LLUUID::null,
cats,
items,
@@ -728,17 +832,93 @@ const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, BOOL co
void LLFloaterTexturePicker::commitIfImmediateSet()
{
- if (!mNoCopyTextureSelected && mOnFloaterCommitCallback && mCanApply)
+ if (!mNoCopyTextureSelected && mCanApply)
{
- mOnFloaterCommitCallback(LLTextureCtrl::TEXTURE_CHANGE, LLUUID::null);
+ commitCallback(LLTextureCtrl::TEXTURE_CHANGE);
}
}
+void LLFloaterTexturePicker::commitCallback(LLTextureCtrl::ETexturePickOp op)
+{
+ if (!mOnFloaterCommitCallback)
+ {
+ return;
+ }
+ LLUUID asset_id = mImageAssetID;
+ LLUUID inventory_id;
+ LLPickerSource mode = (LLPickerSource)mModeSelector->getValue().asInteger();
+
+ switch (mode)
+ {
+ case PICKER_INVENTORY:
+ {
+ LLFolderView* root_folder = mInventoryPanel->getRootFolder();
+ if (root_folder && root_folder->getCurSelectedItem())
+ {
+ LLFolderViewItem* last_selected = root_folder->getCurSelectedItem();
+ LLFolderViewModelItemInventory* inv_view = static_cast<LLFolderViewModelItemInventory*>(last_selected->getViewModelItem());
+
+ LLInventoryItem* itemp = gInventory.getItem(inv_view->getUUID());
+
+ if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL
+ && mImageAssetID == LLGLTFMaterialList::BLANK_MATERIAL_ASSET_ID
+ && itemp && itemp->getAssetUUID().isNull())
+ {
+ inventory_id = inv_view->getUUID();
+ }
+ else if (itemp && itemp->getAssetUUID() == mImageAssetID)
+ {
+ inventory_id = inv_view->getUUID();
+ }
+ else
+ {
+ mode = PICKER_UNKNOWN; // source of id unknown
+ }
+ }
+ else
+ {
+ mode = PICKER_UNKNOWN; // source of id unknown
+ }
+ break;
+ }
+ case PICKER_LOCAL:
+ {
+ if (!mLocalScrollCtrl->getAllSelected().empty())
+ {
+ LLSD data = mLocalScrollCtrl->getFirstSelected()->getValue();
+ LLUUID temp_id = data["id"];
+ S32 asset_type = data["type"].asInteger();
+
+ if (LLAssetType::AT_MATERIAL == asset_type)
+ {
+ asset_id = LLLocalGLTFMaterialMgr::getInstance()->getWorldID(temp_id);
+ }
+ else
+ {
+ asset_id = LLLocalBitmapMgr::getInstance()->getWorldID(temp_id);
+ }
+ }
+ else
+ {
+ asset_id = mImageAssetID;
+ mode = PICKER_UNKNOWN; // source of id unknown
+ }
+ break;
+ }
+ case PICKER_BAKE:
+ break;
+ default:
+ mode = PICKER_UNKNOWN; // source of id unknown
+ break;
+ }
+
+ mOnFloaterCommitCallback(op, mode, asset_id, inventory_id);
+}
void LLFloaterTexturePicker::commitCancel()
{
if (!mNoCopyTextureSelected && mOnFloaterCommitCallback && mCanApply)
{
- mOnFloaterCommitCallback(LLTextureCtrl::TEXTURE_CANCEL, LLUUID::null);
+ mOnFloaterCommitCallback(LLTextureCtrl::TEXTURE_CANCEL, PICKER_UNKNOWN, mOriginalImageAssetID, LLUUID::null);
}
}
@@ -792,7 +972,7 @@ void LLFloaterTexturePicker::onBtnCancel(void* userdata)
self->setImageID( self->mOriginalImageAssetID );
if (self->mOnFloaterCommitCallback)
{
- self->mOnFloaterCommitCallback(LLTextureCtrl::TEXTURE_CANCEL, LLUUID::null);
+ self->mOnFloaterCommitCallback(LLTextureCtrl::TEXTURE_CANCEL, PICKER_UNKNOWN, self->mOriginalImageAssetID, LLUUID::null);
}
self->mViewModel->resetDirty();
self->closeFloater();
@@ -801,30 +981,10 @@ void LLFloaterTexturePicker::onBtnCancel(void* userdata)
// static
void LLFloaterTexturePicker::onBtnSelect(void* userdata)
{
- LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
- LLUUID local_id = LLUUID::null;
- if (self->mOwner)
- {
- if (self->mLocalScrollCtrl->getVisible() && !self->mLocalScrollCtrl->getAllSelected().empty())
- {
- LLSD data = self->mLocalScrollCtrl->getFirstSelected()->getValue();
- LLUUID temp_id = data["id"];
- S32 asset_type = data["type"].asInteger();
-
- if (LLAssetType::AT_MATERIAL == asset_type)
- {
- local_id = LLLocalGLTFMaterialMgr::getInstance()->getWorldID(temp_id);
- }
- else
- {
- local_id = LLLocalBitmapMgr::getInstance()->getWorldID(temp_id);
- }
- }
- }
-
+ LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
if (self->mOnFloaterCommitCallback)
{
- self->mOnFloaterCommitCallback(LLTextureCtrl::TEXTURE_SELECT, local_id);
+ self->commitCallback(LLTextureCtrl::TEXTURE_SELECT);
}
self->closeFloater();
}
@@ -860,7 +1020,7 @@ void LLFloaterTexturePicker::onSelectionChange(const std::deque<LLFolderViewItem
{
mNoCopyTextureSelected = TRUE;
}
- setImageID(itemp->getAssetUUID(),false);
+ setImageIDFromItem(itemp, false);
mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here?
if(!mPreviewSettingChanged)
@@ -884,81 +1044,8 @@ void LLFloaterTexturePicker::onSelectionChange(const std::deque<LLFolderViewItem
// static
void LLFloaterTexturePicker::onModeSelect(LLUICtrl* ctrl, void *userdata)
{
- LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
- int index = self->mModeSelector->getValue().asInteger();
-
- self->getChild<LLButton>("Default")->setVisible(index == 0 ? TRUE : FALSE);
- self->getChild<LLButton>("Blank")->setVisible(index == 0 ? TRUE : FALSE);
- self->getChild<LLButton>("None")->setVisible(index == 0 ? TRUE : FALSE);
- self->getChild<LLFilterEditor>("inventory search editor")->setVisible(index == 0 ? TRUE : FALSE);
- self->getChild<LLInventoryPanel>("inventory panel")->setVisible(index == 0 ? TRUE : FALSE);
-
- self->getChild<LLButton>("l_add_btn")->setVisible(index == 1 ? TRUE : FALSE);
- self->getChild<LLButton>("l_rem_btn")->setVisible(index == 1 ? TRUE : FALSE);
- self->getChild<LLButton>("l_upl_btn")->setVisible(index == 1 ? TRUE : FALSE);
- self->getChild<LLScrollListCtrl>("l_name_list")->setVisible(index == 1 ? TRUE : FALSE);
-
- self->getChild<LLComboBox>("l_bake_use_texture_combo_box")->setVisible(index == 2 ? TRUE : FALSE);
-
- bool pipette_visible = (index == 0)
- && (self->mInventoryPickType != EPickInventoryType::MATERIAL);
- self->getChild<LLButton>("Pipette")->setVisible(pipette_visible);
-
- if (index == 2)
- {
- self->stopUsingPipette();
-
- S8 val = -1;
-
- LLUUID imageID = self->mImageAssetID;
- if (imageID == IMG_USE_BAKED_HEAD)
- {
- val = 0;
- }
- else if (imageID == IMG_USE_BAKED_UPPER)
- {
- val = 1;
- }
- else if (imageID == IMG_USE_BAKED_LOWER)
- {
- val = 2;
- }
- else if (imageID == IMG_USE_BAKED_EYES)
- {
- val = 3;
- }
- else if (imageID == IMG_USE_BAKED_SKIRT)
- {
- val = 4;
- }
- else if (imageID == IMG_USE_BAKED_HAIR)
- {
- val = 5;
- }
- else if (imageID == IMG_USE_BAKED_LEFTARM)
- {
- val = 6;
- }
- else if (imageID == IMG_USE_BAKED_LEFTLEG)
- {
- val = 7;
- }
- else if (imageID == IMG_USE_BAKED_AUX1)
- {
- val = 8;
- }
- else if (imageID == IMG_USE_BAKED_AUX2)
- {
- val = 9;
- }
- else if (imageID == IMG_USE_BAKED_AUX3)
- {
- val = 10;
- }
-
-
- self->getChild<LLComboBox>("l_bake_use_texture_combo_box")->setSelectedByValue(val, TRUE);
- }
+ LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
+ self->changeMode();
}
// static
@@ -966,15 +1053,15 @@ void LLFloaterTexturePicker::onBtnAdd(void* userdata)
{
LLFloaterTexturePicker* self = (LLFloaterTexturePicker*)userdata;
- if (self->mInventoryPickType == EPickInventoryType::TEXTURE_MATERIAL)
+ if (self->mInventoryPickType == LLTextureCtrl::PICK_TEXTURE_MATERIAL)
{
LLFilePickerReplyThread::startPicker(boost::bind(&onPickerCallback, _1, self->getHandle()), LLFilePicker::FFLOAD_MATERIAL_TEXTURE, true);
}
- else if (self->mInventoryPickType == EPickInventoryType::TEXTURE)
+ else if (self->mInventoryPickType == LLTextureCtrl::PICK_TEXTURE)
{
LLFilePickerReplyThread::startPicker(boost::bind(&onPickerCallback, _1, self->getHandle()), LLFilePicker::FFLOAD_IMAGE, true);
}
- else if (self->mInventoryPickType == EPickInventoryType::MATERIAL)
+ else if (self->mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
{
LLFilePickerReplyThread::startPicker(boost::bind(&onPickerCallback, _1, self->getHandle()), LLFilePicker::FFLOAD_MATERIAL, true);
}
@@ -1090,7 +1177,7 @@ void LLFloaterTexturePicker::onLocalScrollCommit(LLUICtrl* ctrl, void* userdata)
{
if (self->mOnFloaterCommitCallback)
{
- self->mOnFloaterCommitCallback(LLTextureCtrl::TEXTURE_CHANGE, inworld_id);
+ self->mOnFloaterCommitCallback(LLTextureCtrl::TEXTURE_CHANGE, PICKER_LOCAL, inworld_id, LLUUID::null);
}
}
}
@@ -1180,10 +1267,10 @@ void LLFloaterTexturePicker::onBakeTextureSelect(LLUICtrl* ctrl, void *user_data
}
}
-void LLFloaterTexturePicker::setCanApply(bool can_preview, bool can_apply)
+void LLFloaterTexturePicker::setCanApply(bool can_preview, bool can_apply, bool inworld_image)
{
- getChildRef<LLUICtrl>("Select").setEnabled(can_apply);
- getChildRef<LLUICtrl>("preview_disabled").setVisible(!can_preview);
+ mSelectBtn->setEnabled(can_apply);
+ getChildRef<LLUICtrl>("preview_disabled").setVisible(!can_preview && inworld_image);
getChildRef<LLUICtrl>("apply_immediate_check").setVisible(can_preview);
mCanApply = can_apply;
@@ -1191,6 +1278,15 @@ void LLFloaterTexturePicker::setCanApply(bool can_preview, bool can_apply)
mPreviewSettingChanged = true;
}
+void LLFloaterTexturePicker::setMinDimentionsLimits(S32 min_dim)
+{
+ mMinDim = min_dim;
+ mLimitsSet = true;
+
+ std::string formatted_dims = llformat("%dx%d", mMinDim, mMinDim);
+ mResolutionWarning->setTextArg("[MINTEXDIM]", formatted_dims);
+}
+
void LLFloaterTexturePicker::onFilterEdit(const std::string& search_string )
{
std::string upper_case_search_string = search_string;
@@ -1225,20 +1321,98 @@ void LLFloaterTexturePicker::onFilterEdit(const std::string& search_string )
mInventoryPanel->setFilterSubString(search_string);
}
+void LLFloaterTexturePicker::changeMode()
+{
+ int index = mModeSelector->getValue().asInteger();
+
+ mDefaultBtn->setVisible(index == PICKER_INVENTORY ? TRUE : FALSE);
+ mBlankBtn->setVisible(index == PICKER_INVENTORY ? TRUE : FALSE);
+ mNoneBtn->setVisible(index == PICKER_INVENTORY ? TRUE : FALSE);
+ mFilterEdit->setVisible(index == PICKER_INVENTORY ? TRUE : FALSE);
+ mInventoryPanel->setVisible(index == PICKER_INVENTORY ? TRUE : FALSE);
+
+ getChild<LLButton>("l_add_btn")->setVisible(index == PICKER_LOCAL ? TRUE : FALSE);
+ getChild<LLButton>("l_rem_btn")->setVisible(index == PICKER_LOCAL ? TRUE : FALSE);
+ getChild<LLButton>("l_upl_btn")->setVisible(index == PICKER_LOCAL ? TRUE : FALSE);
+ getChild<LLScrollListCtrl>("l_name_list")->setVisible(index == PICKER_LOCAL ? TRUE : FALSE);
+
+ getChild<LLComboBox>("l_bake_use_texture_combo_box")->setVisible(index == PICKER_BAKE ? TRUE : FALSE);
+ getChild<LLCheckBoxCtrl>("hide_base_mesh_region")->setVisible(FALSE);// index == 2 ? TRUE : FALSE);
+
+ bool pipette_visible = (index == PICKER_INVENTORY)
+ && (mInventoryPickType != LLTextureCtrl::PICK_MATERIAL);
+ mPipetteBtn->setVisible(pipette_visible);
+
+ if (index == PICKER_BAKE)
+ {
+ stopUsingPipette();
+
+ S8 val = -1;
+
+ LLUUID imageID = mImageAssetID;
+ if (imageID == IMG_USE_BAKED_HEAD)
+ {
+ val = 0;
+ }
+ else if (imageID == IMG_USE_BAKED_UPPER)
+ {
+ val = 1;
+ }
+ else if (imageID == IMG_USE_BAKED_LOWER)
+ {
+ val = 2;
+ }
+ else if (imageID == IMG_USE_BAKED_EYES)
+ {
+ val = 3;
+ }
+ else if (imageID == IMG_USE_BAKED_SKIRT)
+ {
+ val = 4;
+ }
+ else if (imageID == IMG_USE_BAKED_HAIR)
+ {
+ val = 5;
+ }
+ else if (imageID == IMG_USE_BAKED_LEFTARM)
+ {
+ val = 6;
+ }
+ else if (imageID == IMG_USE_BAKED_LEFTLEG)
+ {
+ val = 7;
+ }
+ else if (imageID == IMG_USE_BAKED_AUX1)
+ {
+ val = 8;
+ }
+ else if (imageID == IMG_USE_BAKED_AUX2)
+ {
+ val = 9;
+ }
+ else if (imageID == IMG_USE_BAKED_AUX3)
+ {
+ val = 10;
+ }
+
+ getChild<LLComboBox>("l_bake_use_texture_combo_box")->setSelectedByValue(val, TRUE);
+ }
+}
+
void LLFloaterTexturePicker::refreshLocalList()
{
mLocalScrollCtrl->clearRows();
- if (mInventoryPickType == EPickInventoryType::TEXTURE_MATERIAL)
+ if (mInventoryPickType == LLTextureCtrl::PICK_TEXTURE_MATERIAL)
{
LLLocalBitmapMgr::getInstance()->feedScrollList(mLocalScrollCtrl);
LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(mLocalScrollCtrl);
}
- else if (mInventoryPickType == EPickInventoryType::TEXTURE)
+ else if (mInventoryPickType == LLTextureCtrl::PICK_TEXTURE)
{
LLLocalBitmapMgr::getInstance()->feedScrollList(mLocalScrollCtrl);
}
- else if (mInventoryPickType == EPickInventoryType::MATERIAL)
+ else if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
{
LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(mLocalScrollCtrl);
}
@@ -1248,18 +1422,18 @@ void LLFloaterTexturePicker::refreshInventoryFilter()
{
U32 filter_types = 0x0;
- if (mInventoryPickType == EPickInventoryType::TEXTURE_MATERIAL)
+ if (mInventoryPickType == LLTextureCtrl::PICK_TEXTURE_MATERIAL)
{
filter_types |= 0x1 << LLInventoryType::IT_TEXTURE;
filter_types |= 0x1 << LLInventoryType::IT_SNAPSHOT;
filter_types |= 0x1 << LLInventoryType::IT_MATERIAL;
}
- else if (mInventoryPickType == EPickInventoryType::TEXTURE)
+ else if (mInventoryPickType == LLTextureCtrl::PICK_TEXTURE)
{
filter_types |= 0x1 << LLInventoryType::IT_TEXTURE;
filter_types |= 0x1 << LLInventoryType::IT_SNAPSHOT;
}
- else if (mInventoryPickType == EPickInventoryType::MATERIAL)
+ else if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
{
filter_types |= 0x1 << LLInventoryType::IT_MATERIAL;
}
@@ -1294,13 +1468,13 @@ void LLFloaterTexturePicker::setBakeTextureEnabled(BOOL enabled)
onModeSelect(0, this);
}
-void LLFloaterTexturePicker::setInventoryPickType(EPickInventoryType type)
+void LLFloaterTexturePicker::setInventoryPickType(LLTextureCtrl::EPickInventoryType type)
{
mInventoryPickType = type;
refreshLocalList();
refreshInventoryFilter();
- if (mInventoryPickType == EPickInventoryType::MATERIAL)
+ if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
{
getChild<LLButton>("Pipette")->setVisible(false);
}
@@ -1316,7 +1490,7 @@ void LLFloaterTexturePicker::setInventoryPickType(EPickInventoryType type)
setTitle(pick + mLabel);
}
- else if(mInventoryPickType == EPickInventoryType::MATERIAL)
+ else if(mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
{
setTitle(getString("pick_material"));
}
@@ -1326,6 +1500,12 @@ void LLFloaterTexturePicker::setInventoryPickType(EPickInventoryType type)
}
}
+void LLFloaterTexturePicker::setImmediateFilterPermMask(PermissionMask mask)
+{
+ mImmediateFilterPermMask = mask;
+ mInventoryPanel->setFilterPermMask(mask);
+}
+
void LLFloaterTexturePicker::onPickerCallback(const std::vector<std::string>& filenames, LLHandle<LLFloater> handle)
{
std::vector<std::string>::const_iterator iter = filenames.begin();
@@ -1352,16 +1532,16 @@ void LLFloaterTexturePicker::onPickerCallback(const std::vector<std::string>& fi
LLFloaterTexturePicker* self = (LLFloaterTexturePicker*)handle.get();
self->mLocalScrollCtrl->clearRows();
- if (self->mInventoryPickType == EPickInventoryType::TEXTURE_MATERIAL)
+ if (self->mInventoryPickType == LLTextureCtrl::PICK_TEXTURE_MATERIAL)
{
LLLocalBitmapMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl);
LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl);
}
- else if (self->mInventoryPickType == EPickInventoryType::TEXTURE)
+ else if (self->mInventoryPickType == LLTextureCtrl::PICK_TEXTURE)
{
LLLocalBitmapMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl);
}
- else if (self->mInventoryPickType == EPickInventoryType::MATERIAL)
+ else if (self->mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
{
LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl);
}
@@ -1374,7 +1554,7 @@ void LLFloaterTexturePicker::onTextureSelect( const LLTextureEntry& te )
if (inventory_item_id.notNull())
{
LLToolPipette::getInstance()->setResult(TRUE, "");
- if (mInventoryPickType == EPickInventoryType::MATERIAL)
+ if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
{
// tes have no data about material ids
// Plus gltf materials are layered with overrides,
@@ -1513,6 +1693,17 @@ void LLTextureCtrl::setCanApply(bool can_preview, bool can_apply)
}
}
+void LLTextureCtrl::setImmediateFilterPermMask(PermissionMask mask)
+{
+ mImmediateFilterPermMask = mask;
+
+ LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)mFloaterHandle.get();
+ if (floaterp)
+ {
+ floaterp->setImmediateFilterPermMask(mask);
+ }
+}
+
void LLTextureCtrl::setVisible( BOOL visible )
{
if( !visible )
@@ -1613,7 +1804,10 @@ void LLTextureCtrl::showPicker(BOOL take_focus)
}
if (texture_floaterp)
{
- texture_floaterp->setOnFloaterCommitCallback(boost::bind(&LLTextureCtrl::onFloaterCommit, this, _1, _2));
+ texture_floaterp->setOnFloaterCommitCallback(boost::bind(&LLTextureCtrl::onFloaterCommit, this, _1, _2, _3, _4));
+ }
+ if (texture_floaterp)
+ {
texture_floaterp->setSetImageAssetIDCallback(boost::bind(&LLTextureCtrl::setImageAssetID, this, _1));
texture_floaterp->setBakeTextureEnabled(mBakeTextureEnabled);
@@ -1680,7 +1874,7 @@ BOOL LLTextureCtrl::handleMouseDown(S32 x, S32 y, MASK mask)
if (!mOpenTexPreview)
{
showPicker(FALSE);
- if (mInventoryPickType == EPickInventoryType::MATERIAL)
+ if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
{
//grab materials first...
LLInventoryModelBackgroundFetch::instance().start(gInventory.findCategoryUUIDForType(LLFolderType::FT_MATERIAL));
@@ -1691,7 +1885,10 @@ BOOL LLTextureCtrl::handleMouseDown(S32 x, S32 y, MASK mask)
LLInventoryModelBackgroundFetch::instance().start(gInventory.findCategoryUUIDForType(LLFolderType::FT_TEXTURE));
}
//...then start full inventory fetch.
- LLInventoryModelBackgroundFetch::instance().start();
+ if (!LLInventoryModelBackgroundFetch::instance().inventoryFetchStarted())
+ {
+ LLInventoryModelBackgroundFetch::instance().start();
+ }
handled = TRUE;
}
else
@@ -1731,7 +1928,7 @@ void LLTextureCtrl::onFloaterClose()
mFloaterHandle.markDead();
}
-void LLTextureCtrl::onFloaterCommit(ETexturePickOp op, LLUUID id)
+void LLTextureCtrl::onFloaterCommit(ETexturePickOp op, LLPickerSource source, const LLUUID& asset_id, const LLUUID& inv_id)
{
LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)mFloaterHandle.get();
@@ -1745,22 +1942,29 @@ void LLTextureCtrl::onFloaterCommit(ETexturePickOp op, LLUUID id)
else if (mCommitOnSelection || op == TEXTURE_SELECT)
mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here?
- if(floaterp->isDirty() || id.notNull()) // mModelView->setDirty does not work.
+ if(floaterp->isDirty() || asset_id.notNull()) // mModelView->setDirty does not work.
{
setTentative( FALSE );
- if (id.notNull())
- {
- mImageItemID = id;
- mImageAssetID = id;
- }
- else
- {
- mImageItemID = floaterp->findItemID(floaterp->getAssetID(), FALSE);
- LL_DEBUGS() << "mImageItemID: " << mImageItemID << LL_ENDL;
- mImageAssetID = floaterp->getAssetID();
- LL_DEBUGS() << "mImageAssetID: " << mImageAssetID << LL_ENDL;
- }
+ switch(source)
+ {
+ case PICKER_INVENTORY:
+ mImageItemID = inv_id;
+ mImageAssetID = asset_id;
+ break;
+ case PICKER_BAKE:
+ case PICKER_LOCAL:
+ mImageItemID = LLUUID::null;
+ mImageAssetID = asset_id;
+ break;
+ case PICKER_UNKNOWN:
+ default:
+ mImageItemID = floaterp->findItemID(asset_id, FALSE);
+ mImageAssetID = asset_id;
+ break;
+ }
+
+ LL_DEBUGS() << "mImageAssetID: " << mImageAssetID << ", mImageItemID: " << mImageItemID << LL_ENDL;
if (op == TEXTURE_SELECT && mOnSelectCallback)
{
@@ -1860,11 +2064,11 @@ BOOL LLTextureCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask,
bool is_material = cargo_type == DAD_MATERIAL;
bool allow_dnd = false;
- if (mInventoryPickType == EPickInventoryType::MATERIAL)
+ if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
{
allow_dnd = is_material;
}
- else if (mInventoryPickType == EPickInventoryType::TEXTURE)
+ else if (mInventoryPickType == LLTextureCtrl::PICK_TEXTURE)
{
allow_dnd = is_texture || is_mesh;
}
@@ -2071,8 +2275,16 @@ BOOL LLTextureCtrl::doDrop(LLInventoryItem* item)
return mDropCallback(this, item);
}
- // no callback installed, so just set the image ids and carry on.
- setImageAssetID( item->getAssetUUID() );
+ // no callback installed, so just set the image ids and carry on.
+ LLUUID asset_id = item->getAssetUUID();
+
+ if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL && asset_id.isNull())
+ {
+ // If an inventory material has a null asset, consider it a valid blank material(gltf)
+ asset_id = LLGLTFMaterialList::BLANK_MATERIAL_ASSET_ID;
+ }
+
+ setImageAssetID(asset_id);
mImageItemID = item->getUUID();
return TRUE;
}
@@ -2099,11 +2311,11 @@ LLSD LLTextureCtrl::getValue() const
namespace LLInitParam
{
- void TypeValues<EPickInventoryType>::declareValues()
+ void TypeValues<LLTextureCtrl::EPickInventoryType>::declareValues()
{
- declare("texture_material", EPickInventoryType::TEXTURE_MATERIAL);
- declare("texture", EPickInventoryType::TEXTURE);
- declare("material", EPickInventoryType::MATERIAL);
+ declare("texture_material", LLTextureCtrl::PICK_TEXTURE_MATERIAL);
+ declare("texture", LLTextureCtrl::PICK_TEXTURE);
+ declare("material", LLTextureCtrl::PICK_MATERIAL);
}
}
diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h
index 28630d4ac4..08c530314e 100644
--- a/indra/newview/lltexturectrl.h
+++ b/indra/newview/lltexturectrl.h
@@ -64,25 +64,34 @@ bool get_is_predefined_texture(LLUUID asset_id);
LLUUID get_copy_free_item_by_asset_id(LLUUID image_id, bool no_trans_perm = false);
bool get_can_copy_texture(LLUUID image_id);
-enum class EPickInventoryType
+enum class LLTexPickInventoryType : U32
{
- TEXTURE_MATERIAL = 0,
- TEXTURE = 1,
- MATERIAL = 2,
+ TEXTURE_MATERIAL = 0,
+ TEXTURE = 1,
+ MATERIAL = 2,
};
namespace LLInitParam
{
template<>
- struct TypeValues<EPickInventoryType> : public TypeValuesHelper<EPickInventoryType>
+ struct TypeValues<LLTexPickInventoryType> : public TypeValuesHelper<LLTexPickInventoryType>
{
static void declareValues();
};
}
+enum LLPickerSource
+{
+ PICKER_INVENTORY,
+ PICKER_LOCAL,
+ PICKER_BAKE,
+ PICKER_UNKNOWN, // on cancel, default ids
+};
+
//////////////////////////////////////////////////////////////////////////////////////////
// LLTextureCtrl
+
class LLTextureCtrl
: public LLUICtrl
{
@@ -94,6 +103,12 @@ public:
TEXTURE_CANCEL
} ETexturePickOp;
+ // *HACK: Can't forward-declare an enum scoped inside a class. Maybe there's a better way to initialize LLInitParam::TypeValues<LLTexPickInventoryType> that doesn't run into this limitation.
+ typedef LLTexPickInventoryType EPickInventoryType;
+ static const EPickInventoryType PICK_TEXTURE_MATERIAL = LLTexPickInventoryType::TEXTURE_MATERIAL;
+ static const EPickInventoryType PICK_TEXTURE = LLTexPickInventoryType::TEXTURE;
+ static const EPickInventoryType PICK_MATERIAL = LLTexPickInventoryType::MATERIAL;
+
public:
struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
{
@@ -118,7 +133,7 @@ public:
: image_id("image"),
default_image_id("default_image_id"),
default_image_name("default_image_name"),
- pick_type("pick_type", EPickInventoryType::TEXTURE),
+ pick_type("pick_type", PICK_TEXTURE),
allow_no_texture("allow_no_texture", false),
can_apply_immediately("can_apply_immediately"),
no_commit_on_selection("no_commit_on_selection", false),
@@ -194,8 +209,7 @@ public:
void setCanApply(bool can_preview, bool can_apply);
- void setImmediateFilterPermMask(PermissionMask mask)
- { mImmediateFilterPermMask = mask; }
+ void setImmediateFilterPermMask(PermissionMask mask);
void setDnDFilterPermMask(PermissionMask mask)
{ mDnDFilterPermMask = mask; }
PermissionMask getImmediateFilterPermMask() { return mImmediateFilterPermMask; }
@@ -203,7 +217,7 @@ public:
void closeDependentFloater();
void onFloaterClose();
- void onFloaterCommit(ETexturePickOp op, LLUUID id);
+ void onFloaterCommit(ETexturePickOp op, LLPickerSource source, const LLUUID& local_id, const LLUUID& inv_id);
// This call is returned when a drag is detected. Your callback
// should return TRUE if the drag is acceptable.
@@ -275,7 +289,7 @@ private:
//////////////////////////////////////////////////////////////////////////////////////////
// LLFloaterTexturePicker
-typedef boost::function<void(LLTextureCtrl::ETexturePickOp op, LLUUID id)> floater_commit_callback;
+typedef boost::function<void(LLTextureCtrl::ETexturePickOp op, LLPickerSource source, const LLUUID& asset_id, const LLUUID& inventory_id)> floater_commit_callback;
typedef boost::function<void()> floater_close_callback;
typedef boost::function<void(const LLUUID& asset_id)> set_image_asset_id_callback;
typedef boost::function<void(LLPointer<LLViewerTexture> texture)> set_on_update_image_stats_callback;
@@ -309,11 +323,12 @@ public:
// LLFloater overrides
/*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
/*virtual*/ void onClose(bool app_settings);
// New functions
void setImageID(const LLUUID& image_asset_id, bool set_selection = true);
- void updateImageStats();
+ bool updateImageStats(); // true if within limits
const LLUUID& getAssetID() { return mImageAssetID; }
const LLUUID& findItemID(const LLUUID& asset_id, BOOL copyable_only, BOOL ignore_library = FALSE);
void setCanApplyImmediately(BOOL b);
@@ -325,11 +340,13 @@ public:
void stopUsingPipette();
void commitIfImmediateSet();
+ void commitCallback(LLTextureCtrl::ETexturePickOp op);
void commitCancel();
void onFilterEdit(const std::string& search_string);
- void setCanApply(bool can_preview, bool can_apply);
+ void setCanApply(bool can_preview, bool can_apply, bool inworld_image = true);
+ void setMinDimentionsLimits(S32 min_dim);
void setTextureSelectedCallback(const texture_selected_callback& cb) { mTextureSelectedCallback = cb; }
void setOnFloaterCloseCallback(const floater_close_callback& cb) { mOnFloaterCloseCallback = cb; }
void setOnFloaterCommitCallback(const floater_commit_callback& cb) { mOnFloaterCommitCallback = cb; }
@@ -360,13 +377,16 @@ public:
void setLocalTextureEnabled(BOOL enabled);
void setBakeTextureEnabled(BOOL enabled);
- void setInventoryPickType(EPickInventoryType type);
+ void setInventoryPickType(LLTextureCtrl::EPickInventoryType type);
+ void setImmediateFilterPermMask(PermissionMask mask);
static void onPickerCallback(const std::vector<std::string>& filenames, LLHandle<LLFloater> handle);
protected:
+ void changeMode();
void refreshLocalList();
void refreshInventoryFilter();
+ void setImageIDFromItem(const LLInventoryItem* itemp, bool set_selection = true);
LLPointer<LLViewerTexture> mTexturep;
LLPointer<LLFetchedGLTFMaterial> mGLTFMaterial;
@@ -385,6 +405,7 @@ protected:
LLTextBox* mTentativeLabel;
LLTextBox* mResolutionLabel;
+ LLTextBox* mResolutionWarning;
std::string mPendingName;
BOOL mActive;
@@ -401,12 +422,21 @@ protected:
LLComboBox* mModeSelector;
LLScrollListCtrl* mLocalScrollCtrl;
+ LLButton* mDefaultBtn;
+ LLButton* mNoneBtn;
+ LLButton* mBlankBtn;
+ LLButton* mPipetteBtn;
+ LLButton* mSelectBtn;
+ LLButton* mCancelBtn;
private:
bool mCanApply;
bool mCanPreview;
bool mPreviewSettingChanged;
- EPickInventoryType mInventoryPickType;
+ bool mLimitsSet;
+ S32 mMaxDim;
+ S32 mMinDim;
+ LLTextureCtrl::EPickInventoryType mInventoryPickType;
texture_selected_callback mTextureSelectedCallback;
@@ -416,6 +446,8 @@ private:
set_on_update_image_stats_callback mOnUpdateImageStatsCallback;
BOOL mBakeTextureEnabled;
+
+ static S32 sLastPickerMode;
};
#endif // LL_LLTEXTURECTRL_H
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 2128b55029..e669393dba 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -239,6 +239,10 @@ static const S32 HTTP_NONPIPE_REQUESTS_LOW_WATER = 20;
// request (e.g. 'Range: <start>-') which seems to fix the problem.
static const S32 HTTP_REQUESTS_RANGE_END_MAX = 20000000;
+// stop after 720 seconds, might be overkill, but cap request can keep going forever.
+static const S32 MAX_CAP_MISSING_RETRIES = 720;
+static const S32 CAP_MISSING_EXPIRATION_DELAY = 1; // seconds
+
//////////////////////////////////////////////////////////////////////////////
namespace
{
@@ -526,6 +530,7 @@ private:
e_state mState;
void setState(e_state new_state);
+ LLViewerRegion* getRegion();
e_write_to_cache_state mWriteToCacheState;
LLTextureFetch* mFetcher;
@@ -579,6 +584,10 @@ private:
LLCore::HttpStatus mGetStatus;
std::string mGetReason;
LLAdaptiveRetryPolicy mFetchRetryPolicy;
+ bool mCanUseCapability;
+ LLTimer mRegionRetryTimer;
+ S32 mRegionRetryAttempt;
+ LLUUID mLastRegionId;
// Work Data
@@ -928,7 +937,9 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
mCacheReadCount(0U),
mCacheWriteCount(0U),
mResourceWaitCount(0U),
- mFetchRetryPolicy(10.f,3600.f,2.f,10)
+ mFetchRetryPolicy(10.f,3600.f,2.f,10),
+ mCanUseCapability(true),
+ mRegionRetryAttempt(0)
{
mType = host.isOk() ? LLImageBase::TYPE_AVATAR_BAKE : LLImageBase::TYPE_NORMAL;
// LL_INFOS(LOG_TXT) << "Create: " << mID << " mHost:" << host << " Discard=" << discard << LL_ENDL;
@@ -1089,6 +1100,18 @@ bool LLTextureFetchWorker::doWork(S32 param)
return true; // abort
}
}
+ if (mState > CACHE_POST && !mCanUseCapability && mCanUseHTTP)
+ {
+ if (mRegionRetryAttempt > MAX_CAP_MISSING_RETRIES)
+ {
+ mCanUseHTTP = false;
+ }
+ else if (!mRegionRetryTimer.hasExpired())
+ {
+ return false;
+ }
+ // else retry
+ }
if(mState > CACHE_POST && !mCanUseHTTP)
{
LL_PROFILE_ZONE_NAMED_CATEGORY_THREAD("tfwdw - state > cache_post");
@@ -1290,16 +1313,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
// if (mHost.isInvalid()) get_url = false;
if ( use_http && mCanUseHTTP && mUrl.empty())//get http url.
{
- LLViewerRegion* region = NULL;
- if (mHost.isInvalid())
- {
- region = gAgent.getRegion();
- }
- else if (LLWorld::instanceExists())
- {
- region = LLWorld::getInstance()->getRegion(mHost);
- }
-
+ LLViewerRegion* region = getRegion();
if (region)
{
std::string http_url = region->getViewerAssetUrl();
@@ -1312,19 +1326,27 @@ bool LLTextureFetchWorker::doWork(S32 param)
setUrl(http_url + "/?texture_id=" + mID.asString().c_str());
LL_DEBUGS(LOG_TXT) << "Texture URL: " << mUrl << LL_ENDL;
mWriteToCacheState = CAN_WRITE ; //because this texture has a fixed texture id.
+ mCanUseCapability = true;
+ mRegionRetryAttempt = 0;
+ mLastRegionId = region->getRegionID();
}
else
{
- mCanUseHTTP = false ;
- LL_WARNS(LOG_TXT) << "Texture not available via HTTP: empty URL." << LL_ENDL;
+ mCanUseCapability = false;
+ mRegionRetryAttempt++;
+ mRegionRetryTimer.setTimerExpirySec(CAP_MISSING_EXPIRATION_DELAY);
+ // ex: waiting for caps
+ LL_INFOS_ONCE(LOG_TXT) << "Texture not available via HTTP: empty URL." << LL_ENDL;
}
}
else
{
+ mCanUseCapability = false;
+ mRegionRetryAttempt++;
+ mRegionRetryTimer.setTimerExpirySec(CAP_MISSING_EXPIRATION_DELAY);
// This will happen if not logged in or if a region deoes not have HTTP Texture enabled
//LL_WARNS(LOG_TXT) << "Region not found for host: " << mHost << LL_ENDL;
- LL_WARNS(LOG_TXT) << "Texture not available via HTTP: no region " << mUrl << LL_ENDL;
- mCanUseHTTP = false;
+ LL_INFOS_ONCE(LOG_TXT) << "Texture not available via HTTP: no region " << mUrl << LL_ENDL;
}
}
else if (mFTType == FTT_SERVER_BAKE)
@@ -1332,7 +1354,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
mWriteToCacheState = CAN_WRITE;
}
- if (mCanUseHTTP && !mUrl.empty())
+ if (mCanUseCapability && mCanUseHTTP && !mUrl.empty())
{
setState(WAIT_HTTP_RESOURCE);
if(mWriteToCacheState != NOT_WRITE)
@@ -1534,10 +1556,37 @@ bool LLTextureFetchWorker::doWork(S32 param)
}
return true;
}
+
+ if (mCanUseHTTP && !mUrl.empty() && cur_size <= 0)
+ {
+ LLViewerRegion* region = getRegion();
+ if (!region || mLastRegionId != region->getRegionID())
+ {
+ // cap failure? try on new region.
+ mUrl.clear();
+ ++mRetryAttempt;
+ mLastRegionId.setNull();
+ setState(INIT);
+ return false;
+ }
+ }
}
else if (http_service_unavail == mGetStatus)
{
LL_INFOS_ONCE(LOG_TXT) << "Texture server busy (503): " << mUrl << LL_ENDL;
+ if (mCanUseHTTP && !mUrl.empty() && cur_size <= 0)
+ {
+ LLViewerRegion* region = getRegion();
+ if (!region || mLastRegionId != region->getRegionID())
+ {
+ // try on new region.
+ mUrl.clear();
+ ++mRetryAttempt;
+ mLastRegionId.setNull();
+ setState(INIT);
+ return false;
+ }
+ }
}
else if (http_not_sat == mGetStatus)
{
@@ -2128,7 +2177,6 @@ S32 LLTextureFetchWorker::callbackHttpGet(LLCore::HttpResponse * response,
LL_DEBUGS(LOG_TXT) << "HTTP RECEIVED: " << mID.asString() << " Bytes: " << data_size << LL_ENDL;
if (data_size > 0)
{
- LLViewerStatsRecorder::instance().textureFetch(data_size);
// *TODO: set the formatted image data here directly to avoid the copy
// Hold on to body for later copy
@@ -2194,6 +2242,13 @@ S32 LLTextureFetchWorker::callbackHttpGet(LLCore::HttpResponse * response,
mHaveAllData = TRUE;
}
mRequestedSize = data_size;
+
+ if (mHaveAllData)
+ {
+ LLViewerStatsRecorder::instance().textureFetch();
+ }
+
+ // *TODO: set the formatted image data here directly to avoid the copy
}
else
{
@@ -2202,11 +2257,6 @@ S32 LLTextureFetchWorker::callbackHttpGet(LLCore::HttpResponse * response,
mLoaded = TRUE;
- if (LLViewerStatsRecorder::instanceExists())
- {
- // Do not create this instance inside thread
- LLViewerStatsRecorder::instance().log(0.2f);
- }
return data_size ;
}
@@ -3053,6 +3103,20 @@ void LLTextureFetchWorker::setState(e_state new_state)
mState = new_state;
}
+LLViewerRegion* LLTextureFetchWorker::getRegion()
+{
+ LLViewerRegion* region = NULL;
+ if (mHost.isInvalid())
+ {
+ region = gAgent.getRegion();
+ }
+ else if (LLWorld::instanceExists())
+ {
+ region = LLWorld::getInstance()->getRegion(mHost);
+ }
+ return region;
+}
+
//////////////////////////////////////////////////////////////////////////////
// Threads: T*
diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp
index ca93eb648b..62703e3499 100644
--- a/indra/newview/lltextureview.cpp
+++ b/indra/newview/lltextureview.cpp
@@ -821,8 +821,8 @@ void LLTextureView::draw()
if (imagep->getID() == LLAppViewer::getTextureFetch()->mDebugID)
{
- static S32 debug_count = 0;
- ++debug_count; // for breakpoints
+// static S32 debug_count = 0;
+// ++debug_count; // for breakpoints
}
F32 pri;
diff --git a/indra/newview/llthumbnailctrl.cpp b/indra/newview/llthumbnailctrl.cpp
new file mode 100644
index 0000000000..04130fc724
--- /dev/null
+++ b/indra/newview/llthumbnailctrl.cpp
@@ -0,0 +1,239 @@
+/**
+ * @file llthumbnailctrl.cpp
+ * @brief LLThumbnailCtrl base class
+ *
+ * $LicenseInfo:firstyear=2023&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2023, 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 "llthumbnailctrl.h"
+
+#include "linden_common.h"
+#include "llagent.h"
+#include "lluictrlfactory.h"
+#include "lluuid.h"
+#include "lltrans.h"
+#include "llviewborder.h"
+#include "llviewertexture.h"
+#include "llviewertexturelist.h"
+#include "llwindow.h"
+
+static LLDefaultChildRegistry::Register<LLThumbnailCtrl> r("thumbnail");
+
+LLThumbnailCtrl::Params::Params()
+: border("border")
+, border_color("border_color")
+, fallback_image("fallback_image")
+, image_name("image_name")
+, border_visible("show_visible", false)
+, interactable("interactable", false)
+, show_loading("show_loading", true)
+{}
+
+LLThumbnailCtrl::LLThumbnailCtrl(const LLThumbnailCtrl::Params& p)
+: LLUICtrl(p)
+, mBorderColor(p.border_color())
+, mBorderVisible(p.border_visible())
+, mFallbackImagep(p.fallback_image)
+, mInteractable(p.interactable())
+, mShowLoadingPlaceholder(p.show_loading())
+, mPriority(LLGLTexture::BOOST_PREVIEW)
+{
+ mLoadingPlaceholderString = LLTrans::getString("texture_loading");
+
+ LLRect border_rect = getLocalRect();
+ LLViewBorder::Params vbparams(p.border);
+ vbparams.name("border");
+ vbparams.rect(border_rect);
+ mBorder = LLUICtrlFactory::create<LLViewBorder> (vbparams);
+ addChild(mBorder);
+
+ if (p.image_name.isProvided())
+ {
+ setValue(p.image_name());
+ }
+}
+
+LLThumbnailCtrl::~LLThumbnailCtrl()
+{
+ mTexturep = nullptr;
+ mImagep = nullptr;
+ mFallbackImagep = nullptr;
+}
+
+
+void LLThumbnailCtrl::draw()
+{
+ LLRect draw_rect = getLocalRect();
+
+ if (mBorderVisible)
+ {
+ mBorder->setKeyboardFocusHighlight(hasFocus());
+
+ gl_rect_2d( draw_rect, mBorderColor.get(), FALSE );
+ draw_rect.stretch( -1 );
+ }
+
+ // If we're in a focused floater, don't apply the floater's alpha to the texture.
+ const F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency();
+ if( mTexturep )
+ {
+ if( mTexturep->getComponents() == 4 )
+ {
+ const LLColor4 color(.098f, .098f, .098f);
+ gl_rect_2d( draw_rect, color, TRUE);
+ }
+
+ gl_draw_scaled_image( draw_rect.mLeft, draw_rect.mBottom, draw_rect.getWidth(), draw_rect.getHeight(), mTexturep, UI_VERTEX_COLOR % alpha);
+
+ mTexturep->setKnownDrawSize(draw_rect.getWidth(), draw_rect.getHeight());
+ }
+ else if( mImagep.notNull() )
+ {
+ mImagep->draw(draw_rect, UI_VERTEX_COLOR % alpha );
+ }
+ else if (mFallbackImagep.notNull())
+ {
+ if (draw_rect.getWidth() > mFallbackImagep->getWidth()
+ && draw_rect.getHeight() > mFallbackImagep->getHeight())
+ {
+ S32 img_width = mFallbackImagep->getWidth();
+ S32 img_height = mFallbackImagep->getHeight();
+ S32 rect_width = draw_rect.getWidth();
+ S32 rect_height = draw_rect.getHeight();
+
+ LLRect fallback_rect;
+ fallback_rect.mLeft = draw_rect.mLeft + (rect_width - img_width) / 2;
+ fallback_rect.mRight = fallback_rect.mLeft + img_width;
+ fallback_rect.mBottom = draw_rect.mBottom + (rect_height - img_height) / 2;
+ fallback_rect.mTop = fallback_rect.mBottom + img_height;
+
+ mFallbackImagep->draw(fallback_rect, UI_VERTEX_COLOR % alpha);
+ }
+ else
+ {
+ mFallbackImagep->draw(draw_rect, UI_VERTEX_COLOR % alpha);
+ }
+ }
+ else
+ {
+ gl_rect_2d( draw_rect, LLColor4::grey % alpha, TRUE );
+
+ // Draw X
+ gl_draw_x( draw_rect, LLColor4::black );
+ }
+
+ // Show "Loading..." string on the top left corner while this texture is loading.
+ // Using the discard level, do not show the string if the texture is almost but not
+ // fully loaded.
+ if (mTexturep.notNull()
+ && mShowLoadingPlaceholder
+ && !mTexturep->isFullyLoaded())
+ {
+ U32 v_offset = 25;
+ LLFontGL* font = LLFontGL::getFontSansSerif();
+
+ // Don't show as loaded if the texture is almost fully loaded (i.e. discard1) unless god
+ if ((mTexturep->getDiscardLevel() > 1) || gAgent.isGodlike())
+ {
+ font->renderUTF8(
+ mLoadingPlaceholderString,
+ 0,
+ llfloor(draw_rect.mLeft+3),
+ llfloor(draw_rect.mTop-v_offset),
+ LLColor4::white,
+ LLFontGL::LEFT,
+ LLFontGL::BASELINE,
+ LLFontGL::DROP_SHADOW);
+ }
+ }
+
+ LLUICtrl::draw();
+}
+
+void LLThumbnailCtrl::clearTexture()
+{
+ mImageAssetID = LLUUID::null;
+ mTexturep = nullptr;
+ mImagep = nullptr;
+}
+
+// virtual
+// value might be a string or a UUID
+void LLThumbnailCtrl::setValue(const LLSD& value)
+{
+ LLSD tvalue(value);
+ if (value.isString() && LLUUID::validate(value.asString()))
+ {
+ //RN: support UUIDs masquerading as strings
+ tvalue = LLSD(LLUUID(value.asString()));
+ }
+
+ LLUICtrl::setValue(tvalue);
+
+ mImageAssetID = LLUUID::null;
+ mTexturep = nullptr;
+ mImagep = nullptr;
+
+ if (tvalue.isUUID())
+ {
+ mImageAssetID = tvalue.asUUID();
+ if (mImageAssetID.notNull())
+ {
+ // Should it support baked textures?
+ mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, FTT_DEFAULT, MIPMAP_YES, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+
+ mTexturep->setBoostLevel(mPriority);
+ mTexturep->forceToSaveRawImage(0);
+
+ S32 desired_draw_width = mTexturep->getWidth();
+ S32 desired_draw_height = mTexturep->getHeight();
+
+ mTexturep->setKnownDrawSize(desired_draw_width, desired_draw_height);
+ }
+ }
+ else if (tvalue.isString())
+ {
+ mImagep = LLUI::getUIImage(tvalue.asString(), LLGLTexture::BOOST_UI);
+ if (mImagep)
+ {
+ LLViewerFetchedTexture* texture = dynamic_cast<LLViewerFetchedTexture*>(mImagep->getImage().get());
+ if(texture)
+ {
+ mImageAssetID = texture->getID();
+ }
+ }
+ }
+}
+
+BOOL LLThumbnailCtrl::handleHover(S32 x, S32 y, MASK mask)
+{
+ if (mInteractable && getEnabled())
+ {
+ getWindow()->setCursor(UI_CURSOR_HAND);
+ return TRUE;
+ }
+ return LLUICtrl::handleHover(x, y, mask);
+}
+
+
diff --git a/indra/newview/llthumbnailctrl.h b/indra/newview/llthumbnailctrl.h
new file mode 100644
index 0000000000..686603b373
--- /dev/null
+++ b/indra/newview/llthumbnailctrl.h
@@ -0,0 +1,88 @@
+/**
+ * @file llthumbnailctrl.h
+ * @brief LLThumbnailCtrl base class
+ *
+ * $LicenseInfo:firstyear=2023&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2023 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$
+ */
+
+#ifndef LL_LLTHUMBNAILCTRL_H
+#define LL_LLTHUMBNAILCTRL_H
+
+#include "llui.h"
+#include "lluictrl.h"
+#include "llviewborder.h" // for params
+
+class LLUICtrlFactory;
+class LLUUID;
+class LLViewerFetchedTexture;
+
+//
+// Classes
+//
+
+//
+class LLThumbnailCtrl
+: public LLUICtrl
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
+ {
+ Optional<LLViewBorder::Params> border;
+ Optional<LLUIColor> border_color;
+ Optional<std::string> image_name;
+ Optional<LLUIImage*> fallback_image;
+ Optional<bool> border_visible;
+ Optional<bool> interactable;
+ Optional<bool> show_loading;
+
+ Params();
+ };
+protected:
+ LLThumbnailCtrl(const Params&);
+ friend class LLUICtrlFactory;
+
+public:
+ virtual ~LLThumbnailCtrl();
+
+ virtual void draw() override;
+
+ virtual void setValue(const LLSD& value ) override;
+ void clearTexture();
+
+ virtual BOOL handleHover(S32 x, S32 y, MASK mask) override;
+
+private:
+ S32 mPriority;
+ bool mBorderVisible;
+ bool mInteractable;
+ bool mShowLoadingPlaceholder;
+ std::string mLoadingPlaceholderString;
+ LLUUID mImageAssetID;
+ LLViewBorder* mBorder;
+ LLUIColor mBorderColor;
+
+ LLPointer<LLViewerFetchedTexture> mTexturep;
+ LLPointer<LLUIImage> mImagep;
+ LLPointer<LLUIImage> mFallbackImagep;
+};
+
+#endif
diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp
index 692e8d91a9..d35833fac9 100644
--- a/indra/newview/lltoastalertpanel.cpp
+++ b/indra/newview/lltoastalertpanel.cpp
@@ -279,6 +279,10 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
if (!edit_text_name.empty())
{
S32 y = VPAD + BTN_HEIGHT + VPAD/2;
+ if (form->getIgnoreType() != LLNotificationForm::IGNORE_NO)
+ {
+ y += EDITOR_HEIGHT;
+ }
mLineEditor = LLUICtrlFactory::getInstance()->createFromFile<LLLineEditor>("alert_line_editor.xml", this, LLPanel::child_registry_t::instance());
if (mLineEditor)
@@ -522,6 +526,10 @@ void LLToastAlertPanel::onButtonPressed( const LLSD& data, S32 button )
{
response[mLineEditor->getName()] = mLineEditor->getValue();
}
+ if (mNotification->getForm()->getIgnoreType() != LLNotificationForm::IGNORE_NO)
+ {
+ response["ignore"] = mNotification->isIgnored();
+ }
response[button_data->mButton->getName()] = true;
// If we declared a URL and chose the URL option, go to the url
diff --git a/indra/newview/lltoolbarview.cpp b/indra/newview/lltoolbarview.cpp
index 4f47c465c4..f6628293ee 100644
--- a/indra/newview/lltoolbarview.cpp
+++ b/indra/newview/lltoolbarview.cpp
@@ -322,9 +322,9 @@ bool LLToolBarView::loadToolbars(bool force_default)
}
// SL-18581: Don't show the starter avatar toolbar button for NUX users
- LLViewerInventoryCategory* my_outfits_cat = gInventory.getCategory(gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS));
if (gAgent.isFirstLogin())
{
+ LLViewerInventoryCategory* my_outfits_cat = gInventory.getCategory(gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS));
LL_WARNS() << "First login: checking for NUX user." << LL_ENDL;
if (my_outfits_cat != NULL && my_outfits_cat->getDescendentCount() > 0)
{
diff --git a/indra/newview/lltoolcomp.cpp b/indra/newview/lltoolcomp.cpp
index b8357b3454..aaf2bacc7b 100644
--- a/indra/newview/lltoolcomp.cpp
+++ b/indra/newview/lltoolcomp.cpp
@@ -268,7 +268,8 @@ BOOL LLToolCompTranslate::handleHover(S32 x, S32 y, MASK mask)
BOOL LLToolCompTranslate::handleMouseDown(S32 x, S32 y, MASK mask)
{
mMouseDown = TRUE;
- gViewerWindow->pickAsync(x, y, mask, pickCallback, /*BOOL pick_transparent*/ FALSE, LLFloaterReg::instanceVisible("build"));
+ gViewerWindow->pickAsync(x, y, mask, pickCallback, /*BOOL pick_transparent*/ FALSE, LLFloaterReg::instanceVisible("build"), FALSE,
+ gSavedSettings.getBOOL("SelectReflectionProbes"));;
return TRUE;
}
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 6633951db3..f1813c9d17 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -40,6 +40,7 @@
#include "llfloatertools.h"
#include "llgesturemgr.h"
#include "llgiveinventory.h"
+#include "llgltfmateriallist.h"
#include "llhudmanager.h"
#include "llhudeffecttrail.h"
#include "llimview.h"
@@ -766,7 +767,7 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop,
if (!handled)
{
// Disallow drag and drop to 3D from the marketplace
- const LLUUID marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ const LLUUID marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
if (marketplacelistings_id.notNull())
{
for (S32 item_index = 0; item_index < (S32)mCargoIDs.size(); item_index++)
@@ -929,6 +930,8 @@ BOOL LLToolDragAndDrop::handleDropMaterialProtections(LLViewerObject* hit_obj,
LLToolDragAndDrop::ESource source,
const LLUUID& src_id)
{
+ if (!item) return FALSE;
+
// Always succeed if....
// material is from the library
// or already in the contents of the object
@@ -947,7 +950,14 @@ BOOL LLToolDragAndDrop::handleDropMaterialProtections(LLViewerObject* hit_obj,
{
hit_obj->requestInventory();
LLSD args;
- args["ERROR_MESSAGE"] = "Unable to add texture.\nPlease wait a few seconds and try again.";
+ if (LLAssetType::AT_MATERIAL == item->getType())
+ {
+ args["ERROR_MESSAGE"] = "Unable to add material.\nPlease wait a few seconds and try again.";
+ }
+ else
+ {
+ args["ERROR_MESSAGE"] = "Unable to add texture.\nPlease wait a few seconds and try again.";
+ }
LLNotificationsUtil::add("ErrorMessage", args);
return FALSE;
}
@@ -956,11 +966,9 @@ BOOL LLToolDragAndDrop::handleDropMaterialProtections(LLViewerObject* hit_obj,
// if the asset is already in the object's inventory
// then it can always be added to a side.
// This saves some work if the task's inventory is already loaded
- // and ensures that the texture item is only added once.
+ // and ensures that the asset item is only added once.
return TRUE;
}
-
- if (!item) return FALSE;
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
if (!item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID()))
@@ -994,7 +1002,7 @@ BOOL LLToolDragAndDrop::handleDropMaterialProtections(LLViewerObject* hit_obj,
return FALSE;
}
}
- // Add the texture item to the target object's inventory.
+ // Add the asset item to the target object's inventory.
if (LLAssetType::AT_TEXTURE == new_item->getType()
|| LLAssetType::AT_MATERIAL == new_item->getType())
{
@@ -1004,20 +1012,24 @@ BOOL LLToolDragAndDrop::handleDropMaterialProtections(LLViewerObject* hit_obj,
{
hit_obj->updateInventory(new_item, TASK_INVENTORY_ITEM_KEY, true);
}
- // TODO: Check to see if adding the item was successful; if not, then
- // we should return false here.
+ // Force the object to update and refetch its inventory so it has this asset.
+ hit_obj->dirtyInventory();
+ hit_obj->requestInventory();
+ // TODO: Check to see if adding the item was successful; if not, then
+ // we should return false here. This will requre a separate listener
+ // since without listener, we have no way to receive update
}
else if (!item->getPermissions().allowOperationBy(PERM_TRANSFER,
gAgent.getID()))
{
- // Check that we can add the texture as inventory to the object
+ // Check that we can add the asset as inventory to the object
if (willObjectAcceptInventory(hit_obj,item) < ACCEPT_YES_COPY_SINGLE )
{
return FALSE;
}
// *FIX: may want to make sure agent can paint hit_obj.
- // Add the texture item to the target object's inventory.
+ // Add the asset item to the target object's inventory.
if (LLAssetType::AT_TEXTURE == new_item->getType()
|| LLAssetType::AT_MATERIAL == new_item->getType())
{
@@ -1027,7 +1039,27 @@ BOOL LLToolDragAndDrop::handleDropMaterialProtections(LLViewerObject* hit_obj,
{
hit_obj->updateInventory(new_item, TASK_INVENTORY_ITEM_KEY, true);
}
- // Force the object to update and refetch its inventory so it has this texture.
+ // Force the object to update and refetch its inventory so it has this asset.
+ hit_obj->dirtyInventory();
+ hit_obj->requestInventory();
+ // TODO: Check to see if adding the item was successful; if not, then
+ // we should return false here. This will requre a separate listener
+ // since without listener, we have no way to receive update
+ }
+ else if (LLAssetType::AT_MATERIAL == new_item->getType() &&
+ !item->getPermissions().allowOperationBy(PERM_MODIFY, gAgent.getID()))
+ {
+ // Check that we can add the material as inventory to the object
+ if (willObjectAcceptInventory(hit_obj,item) < ACCEPT_YES_COPY_SINGLE )
+ {
+ return FALSE;
+ }
+ // *FIX: may want to make sure agent can paint hit_obj.
+
+ // Add the material item to the target object's inventory.
+ hit_obj->updateMaterialInventory(new_item, TASK_INVENTORY_ITEM_KEY, true);
+
+ // Force the object to update and refetch its inventory so it has this material.
hit_obj->dirtyInventory();
hit_obj->requestInventory();
// TODO: Check to see if adding the item was successful; if not, then
@@ -1095,6 +1127,9 @@ void LLToolDragAndDrop::dropMaterialOneFace(LLViewerObject* hit_obj,
LL_WARNS() << "LLToolDragAndDrop::dropTextureOneFace no material item." << LL_ENDL;
return;
}
+
+ // SL-20013 must save asset_id before handleDropMaterialProtections since our item instance
+ // may be deleted if it is moved into task inventory
LLUUID asset_id = item->getAssetUUID();
BOOL success = handleDropMaterialProtections(hit_obj, item, source, src_id);
if (!success)
@@ -1102,6 +1137,12 @@ void LLToolDragAndDrop::dropMaterialOneFace(LLViewerObject* hit_obj,
return;
}
+ if (asset_id.isNull())
+ {
+ // use blank material
+ asset_id = LLGLTFMaterialList::BLANK_MATERIAL_ASSET_ID;
+ }
+
hit_obj->setRenderMaterialID(hit_face, asset_id);
dialog_refresh_all();
@@ -1121,13 +1162,23 @@ void LLToolDragAndDrop::dropMaterialAllFaces(LLViewerObject* hit_obj,
LL_WARNS() << "LLToolDragAndDrop::dropTextureAllFaces no material item." << LL_ENDL;
return;
}
+
+ // SL-20013 must save asset_id before handleDropMaterialProtections since our item instance
+ // may be deleted if it is moved into task inventory
LLUUID asset_id = item->getAssetUUID();
BOOL success = handleDropMaterialProtections(hit_obj, item, source, src_id);
+
if (!success)
{
return;
}
+ if (asset_id.isNull())
+ {
+ // use blank material
+ asset_id = LLGLTFMaterialList::BLANK_MATERIAL_ASSET_ID;
+ }
+
hit_obj->setRenderMaterialIDs(asset_id);
dialog_refresh_all();
// send the update to the simulator
@@ -1597,6 +1648,8 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL
BOOL unrestricted = ((perm.getMaskBase() & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED) ? TRUE : FALSE;
if(attached && !unrestricted)
{
+ // Attachments are in world and in inventory simultaneously,
+ // at the moment server doesn't support such a situation.
return ACCEPT_NO_LOCKED;
}
else if(modify && transfer && volume && !worn)
@@ -1809,8 +1862,8 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv(
return ACCEPT_NO;
}
- const LLUUID &outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
- if(gInventory.isObjectDescendentOf(item->getUUID(), outbox_id))
+ const LLUUID &outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX);
+ if(outbox_id.notNull() && gInventory.isObjectDescendentOf(item->getUUID(), outbox_id))
{
// Legacy
return ACCEPT_NO;
@@ -2353,8 +2406,8 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory(
return ACCEPT_NO;
}
- const LLUUID &outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false);
- if(gInventory.isObjectDescendentOf(category->getUUID(), outbox_id))
+ const LLUUID &outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX);
+ if(outbox_id.notNull() && gInventory.isObjectDescendentOf(category->getUUID(), outbox_id))
{
// Legacy
return ACCEPT_NO;
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 2c5b8ffae4..935d61f7ea 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -114,7 +114,7 @@ BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask)
mMouseDownY = y;
LLTimer pick_timer;
BOOL pick_rigged = false; //gSavedSettings.getBOOL("AnimatedObjectsAllowLeftClick");
- LLPickInfo transparent_pick = gViewerWindow->pickImmediate(x, y, TRUE /*includes transparent*/, pick_rigged);
+ LLPickInfo transparent_pick = gViewerWindow->pickImmediate(x, y, TRUE /*includes transparent*/, pick_rigged, FALSE, TRUE, FALSE);
LLPickInfo visible_pick = gViewerWindow->pickImmediate(x, y, FALSE, pick_rigged);
LLViewerObject *transp_object = transparent_pick.getObject();
LLViewerObject *visible_object = visible_pick.getObject();
@@ -183,11 +183,15 @@ BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask)
// an item.
BOOL LLToolPie::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
+ BOOL pick_reflection_probe = gSavedSettings.getBOOL("SelectReflectionProbes");
+
// don't pick transparent so users can't "pay" transparent objects
mPick = gViewerWindow->pickImmediate(x, y,
/*BOOL pick_transparent*/ FALSE,
/*BOOL pick_rigged*/ TRUE,
- /*BOOL pick_particle*/ TRUE);
+ /*BOOL pick_particle*/ TRUE,
+ /*BOOL pick_unselectable*/ TRUE,
+ pick_reflection_probe);
mPick.mKeyMask = mask;
// claim not handled so UI focus stays same
diff --git a/indra/newview/lltoolselect.cpp b/indra/newview/lltoolselect.cpp
index c6f3905ddc..f7455c6cb8 100644
--- a/indra/newview/lltoolselect.cpp
+++ b/indra/newview/lltoolselect.cpp
@@ -66,7 +66,9 @@ BOOL LLToolSelect::handleMouseDown(S32 x, S32 y, MASK mask)
// do immediate pick query
BOOL pick_rigged = false; //gSavedSettings.getBOOL("AnimatedObjectsAllowLeftClick");
BOOL pick_transparent = gSavedSettings.getBOOL("SelectInvisibleObjects");
- mPick = gViewerWindow->pickImmediate(x, y, pick_transparent, pick_rigged);
+ BOOL pick_reflection_probe = gSavedSettings.getBOOL("SelectReflectionProbes");
+
+ mPick = gViewerWindow->pickImmediate(x, y, pick_transparent, pick_rigged, FALSE, TRUE, pick_reflection_probe);
// Pass mousedown to agent
LLTool::handleMouseDown(x, y, mask);
diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp
index 34d3ed8bb1..c37c955e8d 100644
--- a/indra/newview/lltranslate.cpp
+++ b/indra/newview/lltranslate.cpp
@@ -41,8 +41,8 @@
#include "llurlregistry.h"
-static const std::string BING_NOTRANSLATE_OPENING_TAG("<div class=\"notranslate\">");
-static const std::string BING_NOTRANSLATE_CLOSING_TAG("</div>");
+static const std::string AZURE_NOTRANSLATE_OPENING_TAG("<div translate=\"no\">");
+static const std::string AZURE_NOTRANSLATE_CLOSING_TAG("</div>");
/**
* Handler of an HTTP machine translation service.
@@ -80,7 +80,18 @@ public:
* @param[in] key Key to verify.
*/
virtual std::string getKeyVerificationURL(
- const std::string &key) const = 0;
+ const LLSD &key) const = 0;
+
+ /**
+ * Check API verification response.
+ *
+ * @param[out] bool true if valid.
+ * @param[in] response
+ * @param[in] status
+ */
+ virtual bool checkVerificationResponse(
+ const LLSD &response,
+ int status) const = 0;
/**
* Parse translation response.
@@ -92,6 +103,7 @@ public:
* @param[out] err_msg Error message (in case of error).
*/
virtual bool parseResponse(
+ const LLSD& http_response,
int& status,
const std::string& body,
std::string& translation,
@@ -105,14 +117,30 @@ public:
virtual LLTranslate::EService getCurrentService() = 0;
- virtual void verifyKey(const std::string &key, LLTranslate::KeyVerificationResult_fn fnc) = 0;
+ virtual void verifyKey(const LLSD &key, LLTranslate::KeyVerificationResult_fn fnc) = 0;
virtual void translateMessage(LanguagePair_t fromTo, std::string msg, LLTranslate::TranslationSuccess_fn success, LLTranslate::TranslationFailure_fn failure);
virtual ~LLTranslationAPIHandler() {}
- void verifyKeyCoro(LLTranslate::EService service, std::string key, LLTranslate::KeyVerificationResult_fn fnc);
+ void verifyKeyCoro(LLTranslate::EService service, LLSD key, LLTranslate::KeyVerificationResult_fn fnc);
void translateMessageCoro(LanguagePair_t fromTo, std::string msg, LLTranslate::TranslationSuccess_fn success, LLTranslate::TranslationFailure_fn failure);
+
+ virtual void initHttpHeader(LLCore::HttpHeaders::ptr_t headers, const std::string& user_agent) const = 0;
+ virtual void initHttpHeader(LLCore::HttpHeaders::ptr_t headers, const std::string& user_agent, const LLSD &key) const = 0;
+ virtual LLSD sendMessageAndSuspend(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t adapter,
+ LLCore::HttpRequest::ptr_t request,
+ LLCore::HttpOptions::ptr_t options,
+ LLCore::HttpHeaders::ptr_t headers,
+ const std::string & url,
+ const std::string & msg,
+ const std::string& from_lang,
+ const std::string& to_lang) const = 0;
+ virtual LLSD verifyAndSuspend(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t adapter,
+ LLCore::HttpRequest::ptr_t request,
+ LLCore::HttpOptions::ptr_t options,
+ LLCore::HttpHeaders::ptr_t headers,
+ const std::string & url) const = 0;
};
void LLTranslationAPIHandler::translateMessage(LanguagePair_t fromTo, std::string msg, LLTranslate::TranslationSuccess_fn success, LLTranslate::TranslationFailure_fn failure)
@@ -122,8 +150,7 @@ void LLTranslationAPIHandler::translateMessage(LanguagePair_t fromTo, std::strin
}
-
-void LLTranslationAPIHandler::verifyKeyCoro(LLTranslate::EService service, std::string key, LLTranslate::KeyVerificationResult_fn fnc)
+void LLTranslationAPIHandler::verifyKeyCoro(LLTranslate::EService service, LLSD key, LLTranslate::KeyVerificationResult_fn fnc)
{
LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
@@ -140,8 +167,7 @@ void LLTranslationAPIHandler::verifyKeyCoro(LLTranslate::EService service, std::
LLVersionInfo::instance().getPatch(),
LLVersionInfo::instance().getBuild());
- httpHeaders->append(HTTP_OUT_HEADER_ACCEPT, HTTP_CONTENT_TEXT_PLAIN);
- httpHeaders->append(HTTP_OUT_HEADER_USER_AGENT, user_agent);
+ initHttpHeader(httpHeaders, user_agent, key);
httpOpts->setFollowRedirects(true);
httpOpts->setSSLVerifyPeer(false);
@@ -153,17 +179,29 @@ void LLTranslationAPIHandler::verifyKeyCoro(LLTranslate::EService service, std::
return;
}
- LLSD result = httpAdapter->getAndSuspend(httpRequest, url, httpOpts, httpHeaders);
+ std::string::size_type delim_pos = url.find("://");
+ if (delim_pos == std::string::npos)
+ {
+ LL_INFOS("Translate") << "URL is missing a scheme" << LL_ENDL;
+ return;
+ }
+
+ LLSD result = verifyAndSuspend(httpAdapter, httpRequest, httpOpts, httpHeaders, url);
LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
bool bOk = true;
- if (!status)
+ int parseResult = status.getType();
+ if (!checkVerificationResponse(httpResults, parseResult))
+ {
bOk = false;
+ }
if (!fnc.empty())
- fnc(service, bOk);
+ {
+ fnc(service, bOk, parseResult);
+ }
}
void LLTranslationAPIHandler::translateMessageCoro(LanguagePair_t fromTo, std::string msg,
@@ -184,8 +222,7 @@ void LLTranslationAPIHandler::translateMessageCoro(LanguagePair_t fromTo, std::s
LLVersionInfo::instance().getPatch(),
LLVersionInfo::instance().getBuild());
- httpHeaders->append(HTTP_OUT_HEADER_ACCEPT, HTTP_CONTENT_TEXT_PLAIN);
- httpHeaders->append(HTTP_OUT_HEADER_USER_AGENT, user_agent);
+ initHttpHeader(httpHeaders, user_agent);
httpOpts->setSSLVerifyPeer(false);
std::string url = this->getTranslateURL(fromTo.first, fromTo.second, msg);
@@ -195,7 +232,7 @@ void LLTranslationAPIHandler::translateMessageCoro(LanguagePair_t fromTo, std::s
return;
}
- LLSD result = httpAdapter->getRawAndSuspend(httpRequest, url, httpOpts, httpHeaders);
+ LLSD result = sendMessageAndSuspend(httpAdapter, httpRequest, httpOpts, httpHeaders, url, msg, fromTo.first, fromTo.second);
if (LLApp::isQuitting())
{
@@ -216,7 +253,7 @@ void LLTranslationAPIHandler::translateMessageCoro(LanguagePair_t fromTo, std::s
try
{
- res = this->parseResponse(parseResult, body, translation, detected_lang, err_msg);
+ res = this->parseResponse(httpResults, parseResult, body, translation, detected_lang, err_msg);
}
catch (std::out_of_range&)
{
@@ -242,6 +279,11 @@ void LLTranslationAPIHandler::translateMessageCoro(LanguagePair_t fromTo, std::s
}
else
{
+ if (err_msg.empty() && httpResults.has("error_body"))
+ {
+ err_msg = httpResults["error_body"].asString();
+ }
+
if (err_msg.empty())
{
err_msg = LLTrans::getString("TranslationResponseParseError");
@@ -262,23 +304,44 @@ class LLGoogleTranslationHandler : public LLTranslationAPIHandler
LOG_CLASS(LLGoogleTranslationHandler);
public:
- /*virtual*/ std::string getTranslateURL(
+ std::string getTranslateURL(
const std::string &from_lang,
const std::string &to_lang,
- const std::string &text) const;
- /*virtual*/ std::string getKeyVerificationURL(
- const std::string &key) const;
- /*virtual*/ bool parseResponse(
+ const std::string &text) const override;
+ std::string getKeyVerificationURL(
+ const LLSD &key) const override;
+ bool checkVerificationResponse(
+ const LLSD &response,
+ int status) const override;
+ bool parseResponse(
+ const LLSD& http_response,
int& status,
const std::string& body,
std::string& translation,
std::string& detected_lang,
- std::string& err_msg) const;
- /*virtual*/ bool isConfigured() const;
-
- /*virtual*/ LLTranslate::EService getCurrentService() { return LLTranslate::EService::SERVICE_GOOGLE; }
-
- /*virtual*/ void verifyKey(const std::string &key, LLTranslate::KeyVerificationResult_fn fnc);
+ std::string& err_msg) const override;
+ bool isConfigured() const override;
+
+ LLTranslate::EService getCurrentService() override { return LLTranslate::EService::SERVICE_GOOGLE; }
+
+ void verifyKey(const LLSD &key, LLTranslate::KeyVerificationResult_fn fnc) override;
+
+ void initHttpHeader(LLCore::HttpHeaders::ptr_t headers, const std::string& user_agent) const override;
+ void initHttpHeader(LLCore::HttpHeaders::ptr_t headers, const std::string& user_agent, const LLSD &key) const override;
+ LLSD sendMessageAndSuspend(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t adapter,
+ LLCore::HttpRequest::ptr_t request,
+ LLCore::HttpOptions::ptr_t options,
+ LLCore::HttpHeaders::ptr_t headers,
+ const std::string & url,
+ const std::string & msg,
+ const std::string& from_lang,
+ const std::string& to_lang) const override;
+
+ LLSD verifyAndSuspend(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t adapter,
+ LLCore::HttpRequest::ptr_t request,
+ LLCore::HttpOptions::ptr_t options,
+ LLCore::HttpHeaders::ptr_t headers,
+ const std::string & url) const override;
private:
static void parseErrorResponse(
@@ -311,15 +374,24 @@ std::string LLGoogleTranslationHandler::getTranslateURL(
// virtual
std::string LLGoogleTranslationHandler::getKeyVerificationURL(
- const std::string& key) const
+ const LLSD& key) const
{
- std::string url = std::string("https://www.googleapis.com/language/translate/v2/languages?key=")
- + key + "&target=en";
+ std::string url = std::string("https://www.googleapis.com/language/translate/v2/languages?key=")
+ + key.asString() +"&target=en";
return url;
}
+//virtual
+bool LLGoogleTranslationHandler::checkVerificationResponse(
+ const LLSD &response,
+ int status) const
+{
+ return status == HTTP_OK;
+}
+
// virtual
bool LLGoogleTranslationHandler::parseResponse(
+ const LLSD& http_response,
int& status,
const std::string& body,
std::string& translation,
@@ -407,75 +479,196 @@ bool LLGoogleTranslationHandler::parseTranslation(
// static
std::string LLGoogleTranslationHandler::getAPIKey()
{
- return gSavedSettings.getString("GoogleTranslateAPIKey");
+ static LLCachedControl<std::string> google_key(gSavedSettings, "GoogleTranslateAPIKey");
+ return google_key;
}
/*virtual*/
-void LLGoogleTranslationHandler::verifyKey(const std::string &key, LLTranslate::KeyVerificationResult_fn fnc)
+void LLGoogleTranslationHandler::verifyKey(const LLSD &key, LLTranslate::KeyVerificationResult_fn fnc)
{
LLCoros::instance().launch("Google /Verify Key", boost::bind(&LLTranslationAPIHandler::verifyKeyCoro,
this, LLTranslate::SERVICE_GOOGLE, key, fnc));
}
+/*virtual*/
+void LLGoogleTranslationHandler::initHttpHeader(LLCore::HttpHeaders::ptr_t headers, const std::string& user_agent) const
+{
+ headers->append(HTTP_OUT_HEADER_ACCEPT, HTTP_CONTENT_TEXT_PLAIN);
+ headers->append(HTTP_OUT_HEADER_USER_AGENT, user_agent);
+}
+
+/*virtual*/
+void LLGoogleTranslationHandler::initHttpHeader(
+ LLCore::HttpHeaders::ptr_t headers,
+ const std::string& user_agent,
+ const LLSD &key) const
+{
+ headers->append(HTTP_OUT_HEADER_ACCEPT, HTTP_CONTENT_TEXT_PLAIN);
+ headers->append(HTTP_OUT_HEADER_USER_AGENT, user_agent);
+}
+
+LLSD LLGoogleTranslationHandler::sendMessageAndSuspend(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t adapter,
+ LLCore::HttpRequest::ptr_t request,
+ LLCore::HttpOptions::ptr_t options,
+ LLCore::HttpHeaders::ptr_t headers,
+ const std::string & url,
+ const std::string & msg,
+ const std::string& from_lang,
+ const std::string& to_lang) const
+{
+ return adapter->getRawAndSuspend(request, url, options, headers);
+}
+
+LLSD LLGoogleTranslationHandler::verifyAndSuspend(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t adapter,
+ LLCore::HttpRequest::ptr_t request,
+ LLCore::HttpOptions::ptr_t options,
+ LLCore::HttpHeaders::ptr_t headers,
+ const std::string & url) const
+{
+ return adapter->getAndSuspend(request, url, options, headers);
+}
//=========================================================================
/// Microsoft Translator v2 API handler.
-class LLBingTranslationHandler : public LLTranslationAPIHandler
+class LLAzureTranslationHandler : public LLTranslationAPIHandler
{
- LOG_CLASS(LLBingTranslationHandler);
+ LOG_CLASS(LLAzureTranslationHandler);
public:
- /*virtual*/ std::string getTranslateURL(
+ std::string getTranslateURL(
const std::string &from_lang,
const std::string &to_lang,
- const std::string &text) const;
- /*virtual*/ std::string getKeyVerificationURL(
- const std::string &key) const;
- /*virtual*/ bool parseResponse(
+ const std::string &text) const override;
+ std::string getKeyVerificationURL(
+ const LLSD &key) const override;
+ bool checkVerificationResponse(
+ const LLSD &response,
+ int status) const override;
+ bool parseResponse(
+ const LLSD& http_response,
int& status,
const std::string& body,
std::string& translation,
std::string& detected_lang,
- std::string& err_msg) const;
- /*virtual*/ bool isConfigured() const;
-
- /*virtual*/ LLTranslate::EService getCurrentService() { return LLTranslate::EService::SERVICE_BING; }
-
- /*virtual*/ void verifyKey(const std::string &key, LLTranslate::KeyVerificationResult_fn fnc);
+ std::string& err_msg) const override;
+ bool isConfigured() const override;
+
+ LLTranslate::EService getCurrentService() override { return LLTranslate::EService::SERVICE_AZURE; }
+
+ void verifyKey(const LLSD &key, LLTranslate::KeyVerificationResult_fn fnc) override;
+
+ void initHttpHeader(LLCore::HttpHeaders::ptr_t headers, const std::string& user_agent) const override;
+ void initHttpHeader(LLCore::HttpHeaders::ptr_t headers, const std::string& user_agent, const LLSD &key) const override;
+ LLSD sendMessageAndSuspend(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t adapter,
+ LLCore::HttpRequest::ptr_t request,
+ LLCore::HttpOptions::ptr_t options,
+ LLCore::HttpHeaders::ptr_t headers,
+ const std::string & url,
+ const std::string & msg,
+ const std::string& from_lang,
+ const std::string& to_lang) const override;
+
+ LLSD verifyAndSuspend(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t adapter,
+ LLCore::HttpRequest::ptr_t request,
+ LLCore::HttpOptions::ptr_t options,
+ LLCore::HttpHeaders::ptr_t headers,
+ const std::string & url) const override;
private:
- static std::string getAPIKey();
+ static std::string parseErrorResponse(
+ const std::string& body);
+ static LLSD getAPIKey();
static std::string getAPILanguageCode(const std::string& lang);
};
//-------------------------------------------------------------------------
// virtual
-std::string LLBingTranslationHandler::getTranslateURL(
+std::string LLAzureTranslationHandler::getTranslateURL(
const std::string &from_lang,
const std::string &to_lang,
const std::string &text) const
{
- std::string url = std::string("http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=")
- + getAPIKey() + "&text=" + LLURI::escape(text) + "&to=" + getAPILanguageCode(to_lang);
- if (!from_lang.empty())
- {
- url += "&from=" + getAPILanguageCode(from_lang);
- }
+ std::string url;
+ LLSD key = getAPIKey();
+ if (key.isMap())
+ {
+ std::string endpoint = key["endpoint"].asString();
+
+ if (*endpoint.rbegin() != '/')
+ {
+ endpoint += "/";
+ }
+ url = endpoint + std::string("translate?api-version=3.0&to=")
+ + getAPILanguageCode(to_lang);
+ }
return url;
}
// virtual
-std::string LLBingTranslationHandler::getKeyVerificationURL(
- const std::string& key) const
+std::string LLAzureTranslationHandler::getKeyVerificationURL(
+ const LLSD& key) const
{
- std::string url = std::string("http://api.microsofttranslator.com/v2/Http.svc/GetLanguagesForTranslate?appId=")
- + key;
+ std::string url;
+ if (key.isMap())
+ {
+ std::string endpoint = key["endpoint"].asString();
+ if (*endpoint.rbegin() != '/')
+ {
+ endpoint += "/";
+ }
+ url = endpoint + std::string("translate?api-version=3.0&to=en");
+ }
return url;
}
+//virtual
+bool LLAzureTranslationHandler::checkVerificationResponse(
+ const LLSD &response,
+ int status) const
+{
+ if (status == HTTP_UNAUTHORIZED)
+ {
+ LL_DEBUGS("Translate") << "Key unathorised" << LL_ENDL;
+ return false;
+ }
+
+ if (status == HTTP_NOT_FOUND)
+ {
+ LL_DEBUGS("Translate") << "Either endpoint doesn't have requested resource" << LL_ENDL;
+ return false;
+ }
+
+ if (status != HTTP_BAD_REQUEST)
+ {
+ LL_DEBUGS("Translate") << "Unexpected error code" << LL_ENDL;
+ return false;
+ }
+
+ if (!response.has("error_body"))
+ {
+ LL_DEBUGS("Translate") << "Unexpected response, no error returned" << LL_ENDL;
+ return false;
+ }
+
+ // Expected: "{\"error\":{\"code\":400000,\"message\":\"One of the request inputs is not valid.\"}}"
+ // But for now just verify response is a valid json
+
+ Json::Value root;
+ Json::Reader reader;
+
+ if (!reader.parse(response["error_body"].asString(), root))
+ {
+ LL_DEBUGS("Translate") << "Failed to parse error_body:" << reader.getFormatedErrorMessages() << LL_ENDL;
+ return false;
+ }
+
+ return true;
+}
+
// virtual
-bool LLBingTranslationHandler::parseResponse(
+bool LLAzureTranslationHandler::parseResponse(
+ const LLSD& http_response,
int& status,
const std::string& body,
std::string& translation,
@@ -484,65 +677,443 @@ bool LLBingTranslationHandler::parseResponse(
{
if (status != HTTP_OK)
{
- static const std::string MSG_BEGIN_MARKER = "Message: ";
- size_t begin = body.find(MSG_BEGIN_MARKER);
- if (begin != std::string::npos)
- {
- begin += MSG_BEGIN_MARKER.size();
- }
- else
- {
- begin = 0;
- err_msg.clear();
- }
- size_t end = body.find("</p>", begin);
- err_msg = body.substr(begin, end-begin);
- LLStringUtil::replaceString(err_msg, "&#xD;", ""); // strip CR
+ if (http_response.has("error_body"))
+ err_msg = parseErrorResponse(http_response["error_body"].asString());
return false;
}
- // Sample response: <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Hola</string>
- size_t begin = body.find(">");
- if (begin == std::string::npos || begin >= (body.size() - 1))
- {
- begin = 0;
- }
- else
- {
- ++begin;
- }
+ //Example:
+ // "[{\"detectedLanguage\":{\"language\":\"en\",\"score\":1.0},\"translations\":[{\"text\":\"Hello, what is your name?\",\"to\":\"en\"}]}]"
- size_t end = body.find("</string>", begin);
+ Json::Value root;
+ Json::Reader reader;
- detected_lang = ""; // unsupported by this API
- translation = body.substr(begin, end-begin);
- LLStringUtil::replaceString(translation, "&#xD;", ""); // strip CR
- return true;
+ if (!reader.parse(body, root))
+ {
+ err_msg = reader.getFormatedErrorMessages();
+ return false;
+ }
+
+ if (!root.isArray()) // empty response? should not happen
+ {
+ return false;
+ }
+
+ // Request succeeded, extract translation from the response.
+
+ const Json::Value& data = root[0U];
+ if (!data.isObject()
+ || !data.isMember("detectedLanguage")
+ || !data.isMember("translations"))
+ {
+ return false;
+ }
+
+ const Json::Value& detectedLanguage = data["detectedLanguage"];
+ if (!detectedLanguage.isObject() || !detectedLanguage.isMember("language"))
+ {
+ return false;
+ }
+ detected_lang = detectedLanguage["language"].asString();
+
+ const Json::Value& translations = data["translations"];
+ if (!translations.isArray() || translations.size() == 0)
+ {
+ return false;
+ }
+
+ const Json::Value& first = translations[0U];
+ if (!first.isObject() || !first.isMember("text"))
+ {
+ return false;
+ }
+
+ translation = first["text"].asString();
+
+ return true;
}
// virtual
-bool LLBingTranslationHandler::isConfigured() const
+bool LLAzureTranslationHandler::isConfigured() const
{
- return !getAPIKey().empty();
+ return getAPIKey().isMap();
+}
+
+//static
+std::string LLAzureTranslationHandler::parseErrorResponse(
+ const std::string& body)
+{
+ // Expected: "{\"error\":{\"code\":400000,\"message\":\"One of the request inputs is not valid.\"}}"
+ // But for now just verify response is a valid json with an error
+
+ Json::Value root;
+ Json::Reader reader;
+
+ if (!reader.parse(body, root))
+ {
+ return std::string();
+ }
+
+ if (!root.isObject() || !root.isMember("error"))
+ {
+ return std::string();
+ }
+
+ const Json::Value& error_map = root["error"];
+
+ if (!error_map.isObject() || !error_map.isMember("message"))
+ {
+ return std::string();
+ }
+
+ return error_map["message"].asString();
}
// static
-std::string LLBingTranslationHandler::getAPIKey()
+LLSD LLAzureTranslationHandler::getAPIKey()
{
- return gSavedSettings.getString("BingTranslateAPIKey");
+ static LLCachedControl<LLSD> azure_key(gSavedSettings, "AzureTranslateAPIKey");
+ return azure_key;
}
// static
-std::string LLBingTranslationHandler::getAPILanguageCode(const std::string& lang)
+std::string LLAzureTranslationHandler::getAPILanguageCode(const std::string& lang)
{
return lang == "zh" ? "zh-CHT" : lang; // treat Chinese as Traditional Chinese
}
/*virtual*/
-void LLBingTranslationHandler::verifyKey(const std::string &key, LLTranslate::KeyVerificationResult_fn fnc)
+void LLAzureTranslationHandler::verifyKey(const LLSD &key, LLTranslate::KeyVerificationResult_fn fnc)
+{
+ LLCoros::instance().launch("Azure /Verify Key", boost::bind(&LLTranslationAPIHandler::verifyKeyCoro,
+ this, LLTranslate::SERVICE_AZURE, key, fnc));
+}
+/*virtual*/
+void LLAzureTranslationHandler::initHttpHeader(
+ LLCore::HttpHeaders::ptr_t headers,
+ const std::string& user_agent) const
+{
+ initHttpHeader(headers, user_agent, getAPIKey());
+}
+
+/*virtual*/
+void LLAzureTranslationHandler::initHttpHeader(
+ LLCore::HttpHeaders::ptr_t headers,
+ const std::string& user_agent,
+ const LLSD &key) const
+{
+ headers->append(HTTP_OUT_HEADER_CONTENT_TYPE, HTTP_CONTENT_JSON);
+ headers->append(HTTP_OUT_HEADER_USER_AGENT, user_agent);
+
+ if (key.has("id"))
+ {
+ // Token based autorization
+ headers->append("Ocp-Apim-Subscription-Key", key["id"].asString());
+ }
+ if (key.has("region"))
+ {
+ // ex: "westeurope"
+ headers->append("Ocp-Apim-Subscription-Region", key["region"].asString());
+ }
+}
+
+LLSD LLAzureTranslationHandler::sendMessageAndSuspend(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t adapter,
+ LLCore::HttpRequest::ptr_t request,
+ LLCore::HttpOptions::ptr_t options,
+ LLCore::HttpHeaders::ptr_t headers,
+ const std::string & url,
+ const std::string & msg,
+ const std::string& from_lang,
+ const std::string& to_lang) const
+{
+ LLCore::BufferArray::ptr_t rawbody(new LLCore::BufferArray);
+ LLCore::BufferArrayStream outs(rawbody.get());
+ outs << "[{\"text\":\"";
+ outs << msg;
+ outs << "\"}]";
+
+ return adapter->postRawAndSuspend(request, url, rawbody, options, headers);
+}
+
+LLSD LLAzureTranslationHandler::verifyAndSuspend(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t adapter,
+ LLCore::HttpRequest::ptr_t request,
+ LLCore::HttpOptions::ptr_t options,
+ LLCore::HttpHeaders::ptr_t headers,
+ const std::string & url) const
+{
+ LLCore::BufferArray::ptr_t rawbody(new LLCore::BufferArray);
+ LLCore::BufferArrayStream outs(rawbody.get());
+ outs << "[{\"intentionally_invalid_400\"}]";
+
+ return adapter->postRawAndSuspend(request, url, rawbody, options, headers);
+}
+
+//=========================================================================
+/// DeepL Translator API handler.
+class LLDeepLTranslationHandler: public LLTranslationAPIHandler
+{
+ LOG_CLASS(LLDeepLTranslationHandler);
+
+public:
+ std::string getTranslateURL(
+ const std::string& from_lang,
+ const std::string& to_lang,
+ const std::string& text) const override;
+ std::string getKeyVerificationURL(
+ const LLSD& key) const override;
+ bool checkVerificationResponse(
+ const LLSD& response,
+ int status) const override;
+ bool parseResponse(
+ const LLSD& http_response,
+ int& status,
+ const std::string& body,
+ std::string& translation,
+ std::string& detected_lang,
+ std::string& err_msg) const override;
+ bool isConfigured() const override;
+
+ LLTranslate::EService getCurrentService() override
+ {
+ return LLTranslate::EService::SERVICE_DEEPL;
+ }
+
+ void verifyKey(const LLSD& key, LLTranslate::KeyVerificationResult_fn fnc) override;
+
+ void initHttpHeader(LLCore::HttpHeaders::ptr_t headers, const std::string& user_agent) const override;
+ void initHttpHeader(LLCore::HttpHeaders::ptr_t headers, const std::string& user_agent, const LLSD& key) const override;
+ LLSD sendMessageAndSuspend(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t adapter,
+ LLCore::HttpRequest::ptr_t request,
+ LLCore::HttpOptions::ptr_t options,
+ LLCore::HttpHeaders::ptr_t headers,
+ const std::string& url,
+ const std::string& msg,
+ const std::string& from_lang,
+ const std::string& to_lang) const override;
+
+ LLSD verifyAndSuspend(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t adapter,
+ LLCore::HttpRequest::ptr_t request,
+ LLCore::HttpOptions::ptr_t options,
+ LLCore::HttpHeaders::ptr_t headers,
+ const std::string& url) const override;
+private:
+ static std::string parseErrorResponse(
+ const std::string& body);
+ static LLSD getAPIKey();
+ static std::string getAPILanguageCode(const std::string& lang);
+};
+
+//-------------------------------------------------------------------------
+// virtual
+std::string LLDeepLTranslationHandler::getTranslateURL(
+ const std::string& from_lang,
+ const std::string& to_lang,
+ const std::string& text) const
+{
+ std::string url;
+ LLSD key = getAPIKey();
+ if (key.isMap())
+ {
+ url = key["domain"].asString();
+
+ if (*url.rbegin() != '/')
+ {
+ url += "/";
+ }
+ url += std::string("v2/translate");
+ }
+ return url;
+}
+
+
+// virtual
+std::string LLDeepLTranslationHandler::getKeyVerificationURL(
+ const LLSD& key) const
+{
+ std::string url;
+ if (key.isMap())
+ {
+ url = key["domain"].asString();
+
+ if (*url.rbegin() != '/')
+ {
+ url += "/";
+ }
+ url += std::string("v2/translate");
+ }
+ return url;
+}
+
+//virtual
+bool LLDeepLTranslationHandler::checkVerificationResponse(
+ const LLSD& response,
+ int status) const
+{
+ // Might need to parse body to make sure we got
+ // a valid response and not a message
+ return status == HTTP_OK;
+}
+
+// virtual
+bool LLDeepLTranslationHandler::parseResponse(
+ const LLSD& http_response,
+ int& status,
+ const std::string& body,
+ std::string& translation,
+ std::string& detected_lang,
+ std::string& err_msg) const
+{
+ if (status != HTTP_OK)
+ {
+ if (http_response.has("error_body"))
+ err_msg = parseErrorResponse(http_response["error_body"].asString());
+ return false;
+ }
+
+ //Example:
+ // "{\"translations\":[{\"detected_source_language\":\"EN\",\"text\":\"test\"}]}"
+
+ Json::Value root;
+ Json::Reader reader;
+
+ if (!reader.parse(body, root))
+ {
+ err_msg = reader.getFormatedErrorMessages();
+ return false;
+ }
+
+ if (!root.isObject()
+ || !root.isMember("translations")) // empty response? should not happen
+ {
+ return false;
+ }
+
+ // Request succeeded, extract translation from the response.
+ const Json::Value& translations = root["translations"];
+ if (!translations.isArray() || translations.size() == 0)
+ {
+ return false;
+ }
+
+ const Json::Value& data= translations[0U];
+ if (!data.isObject()
+ || !data.isMember("detected_source_language")
+ || !data.isMember("text"))
+ {
+ return false;
+ }
+
+ detected_lang = data["detected_source_language"].asString();
+ LLStringUtil::toLower(detected_lang);
+ translation = data["text"].asString();
+
+ return true;
+}
+
+// virtual
+bool LLDeepLTranslationHandler::isConfigured() const
+{
+ return getAPIKey().isMap();
+}
+
+//static
+std::string LLDeepLTranslationHandler::parseErrorResponse(
+ const std::string& body)
+{
+ // Example: "{\"message\":\"One of the request inputs is not valid.\"}"
+
+ Json::Value root;
+ Json::Reader reader;
+
+ if (!reader.parse(body, root))
+ {
+ return std::string();
+ }
+
+ if (!root.isObject() || !root.isMember("message"))
+ {
+ return std::string();
+ }
+
+ return root["message"].asString();
+}
+
+// static
+LLSD LLDeepLTranslationHandler::getAPIKey()
+{
+ static LLCachedControl<LLSD> deepl_key(gSavedSettings, "DeepLTranslateAPIKey");
+ return deepl_key;
+}
+
+// static
+std::string LLDeepLTranslationHandler::getAPILanguageCode(const std::string& lang)
+{
+ return lang == "zh" ? "zh-CHT" : lang; // treat Chinese as Traditional Chinese
+}
+
+/*virtual*/
+void LLDeepLTranslationHandler::verifyKey(const LLSD& key, LLTranslate::KeyVerificationResult_fn fnc)
+{
+ LLCoros::instance().launch("DeepL /Verify Key", boost::bind(&LLTranslationAPIHandler::verifyKeyCoro,
+ this, LLTranslate::SERVICE_DEEPL, key, fnc));
+}
+/*virtual*/
+void LLDeepLTranslationHandler::initHttpHeader(
+ LLCore::HttpHeaders::ptr_t headers,
+ const std::string& user_agent) const
{
- LLCoros::instance().launch("Bing /Verify Key", boost::bind(&LLTranslationAPIHandler::verifyKeyCoro,
- this, LLTranslate::SERVICE_BING, key, fnc));
+ initHttpHeader(headers, user_agent, getAPIKey());
+}
+
+/*virtual*/
+void LLDeepLTranslationHandler::initHttpHeader(
+ LLCore::HttpHeaders::ptr_t headers,
+ const std::string& user_agent,
+ const LLSD& key) const
+{
+ headers->append(HTTP_OUT_HEADER_CONTENT_TYPE, "application/x-www-form-urlencoded");
+ headers->append(HTTP_OUT_HEADER_USER_AGENT, user_agent);
+
+ if (key.has("id"))
+ {
+ std::string authkey = "DeepL-Auth-Key " + key["id"].asString();
+ headers->append(HTTP_OUT_HEADER_AUTHORIZATION, authkey);
+ }
+}
+
+LLSD LLDeepLTranslationHandler::sendMessageAndSuspend(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t adapter,
+ LLCore::HttpRequest::ptr_t request,
+ LLCore::HttpOptions::ptr_t options,
+ LLCore::HttpHeaders::ptr_t headers,
+ const std::string& url,
+ const std::string& msg,
+ const std::string& from_lang,
+ const std::string& to_lang) const
+{
+ LLCore::BufferArray::ptr_t rawbody(new LLCore::BufferArray);
+ LLCore::BufferArrayStream outs(rawbody.get());
+ outs << "text=";
+ std::string escaped_string = LLURI::escape(msg);
+ outs << escaped_string;
+ outs << "&target_lang=";
+ std::string lang = to_lang;
+ LLStringUtil::toUpper(lang);
+ outs << lang;
+
+ return adapter->postRawAndSuspend(request, url, rawbody, options, headers);
+}
+
+LLSD LLDeepLTranslationHandler::verifyAndSuspend(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t adapter,
+ LLCore::HttpRequest::ptr_t request,
+ LLCore::HttpOptions::ptr_t options,
+ LLCore::HttpHeaders::ptr_t headers,
+ const std::string& url) const
+{
+ LLCore::BufferArray::ptr_t rawbody(new LLCore::BufferArray);
+ LLCore::BufferArrayStream outs(rawbody.get());
+ outs << "text=&target_lang=EN";
+
+ return adapter->postRawAndSuspend(request, url, rawbody, options, headers);
}
//=========================================================================
@@ -569,58 +1140,78 @@ void LLTranslate::translateMessage(const std::string &from_lang, const std::stri
std::string LLTranslate::addNoTranslateTags(std::string mesg)
{
- if (getPreferredHandler().getCurrentService() != SERVICE_BING)
+ if (getPreferredHandler().getCurrentService() == SERVICE_GOOGLE)
+ {
+ return mesg;
+ }
+
+ if (getPreferredHandler().getCurrentService() == SERVICE_DEEPL)
{
return mesg;
}
- std::string upd_msg(mesg);
- LLUrlMatch match;
- S32 dif = 0;
- //surround all links (including SLURLs) with 'no-translate' tags to prevent unnecessary translation
- while (LLUrlRegistry::instance().findUrl(mesg, match))
+ if (getPreferredHandler().getCurrentService() == SERVICE_AZURE)
{
- upd_msg.insert(dif + match.getStart(), BING_NOTRANSLATE_OPENING_TAG);
- upd_msg.insert(dif + BING_NOTRANSLATE_OPENING_TAG.size() + match.getEnd() + 1, BING_NOTRANSLATE_CLOSING_TAG);
- mesg.erase(match.getStart(), match.getEnd() - match.getStart());
- dif += match.getEnd() - match.getStart() + BING_NOTRANSLATE_OPENING_TAG.size() + BING_NOTRANSLATE_CLOSING_TAG.size();
+ // https://learn.microsoft.com/en-us/azure/cognitive-services/translator/prevent-translation
+ std::string upd_msg(mesg);
+ LLUrlMatch match;
+ S32 dif = 0;
+ //surround all links (including SLURLs) with 'no-translate' tags to prevent unnecessary translation
+ while (LLUrlRegistry::instance().findUrl(mesg, match))
+ {
+ upd_msg.insert(dif + match.getStart(), AZURE_NOTRANSLATE_OPENING_TAG);
+ upd_msg.insert(dif + AZURE_NOTRANSLATE_OPENING_TAG.size() + match.getEnd() + 1, AZURE_NOTRANSLATE_CLOSING_TAG);
+ mesg.erase(match.getStart(), match.getEnd() - match.getStart());
+ dif += match.getEnd() - match.getStart() + AZURE_NOTRANSLATE_OPENING_TAG.size() + AZURE_NOTRANSLATE_CLOSING_TAG.size();
+ }
+ return upd_msg;
}
- return upd_msg;
+ return mesg;
}
std::string LLTranslate::removeNoTranslateTags(std::string mesg)
{
- if (getPreferredHandler().getCurrentService() != SERVICE_BING)
+ if (getPreferredHandler().getCurrentService() == SERVICE_GOOGLE)
{
return mesg;
}
- std::string upd_msg(mesg);
- LLUrlMatch match;
- S32 opening_tag_size = BING_NOTRANSLATE_OPENING_TAG.size();
- S32 closing_tag_size = BING_NOTRANSLATE_CLOSING_TAG.size();
- S32 dif = 0;
- //remove 'no-translate' tags we added to the links before
- while (LLUrlRegistry::instance().findUrl(mesg, match))
+ if (getPreferredHandler().getCurrentService() == SERVICE_DEEPL)
{
- if (upd_msg.substr(dif + match.getStart() - opening_tag_size, opening_tag_size) == BING_NOTRANSLATE_OPENING_TAG)
- {
- upd_msg.erase(dif + match.getStart() - opening_tag_size, opening_tag_size);
- dif -= opening_tag_size;
+ return mesg;
+ }
- if (upd_msg.substr(dif + match.getEnd() + 1, closing_tag_size) == BING_NOTRANSLATE_CLOSING_TAG)
+ if (getPreferredHandler().getCurrentService() == SERVICE_AZURE)
+ {
+ std::string upd_msg(mesg);
+ LLUrlMatch match;
+ S32 opening_tag_size = AZURE_NOTRANSLATE_OPENING_TAG.size();
+ S32 closing_tag_size = AZURE_NOTRANSLATE_CLOSING_TAG.size();
+ S32 dif = 0;
+ //remove 'no-translate' tags we added to the links before
+ while (LLUrlRegistry::instance().findUrl(mesg, match))
+ {
+ if (upd_msg.substr(dif + match.getStart() - opening_tag_size, opening_tag_size) == AZURE_NOTRANSLATE_OPENING_TAG)
{
- upd_msg.replace(dif + match.getEnd() + 1, closing_tag_size, " ");
- dif -= closing_tag_size - 1;
+ upd_msg.erase(dif + match.getStart() - opening_tag_size, opening_tag_size);
+ dif -= opening_tag_size;
+
+ if (upd_msg.substr(dif + match.getEnd() + 1, closing_tag_size) == AZURE_NOTRANSLATE_CLOSING_TAG)
+ {
+ upd_msg.replace(dif + match.getEnd() + 1, closing_tag_size, " ");
+ dif -= closing_tag_size - 1;
+ }
}
+ mesg.erase(match.getStart(), match.getUrl().size());
+ dif += match.getUrl().size();
}
- mesg.erase(match.getStart(), match.getUrl().size());
- dif += match.getUrl().size();
+ return upd_msg;
}
- return upd_msg;
+
+ return mesg;
}
/*static*/
-void LLTranslate::verifyKey(EService service, const std::string &key, KeyVerificationResult_fn fnc)
+void LLTranslate::verifyKey(EService service, const LLSD &key, KeyVerificationResult_fn fnc)
{
LLTranslationAPIHandler& handler = getHandler(service);
@@ -686,13 +1277,21 @@ LLSD LLTranslate::asLLSD() const
// static
LLTranslationAPIHandler& LLTranslate::getPreferredHandler()
{
- EService service = SERVICE_BING;
+ EService service = SERVICE_AZURE;
std::string service_str = gSavedSettings.getString("TranslationService");
if (service_str == "google")
{
service = SERVICE_GOOGLE;
}
+ if (service_str == "azure")
+ {
+ service = SERVICE_AZURE;
+ }
+ if (service_str == "deepl")
+ {
+ service = SERVICE_DEEPL;
+ }
return getHandler(service);
}
@@ -701,12 +1300,19 @@ LLTranslationAPIHandler& LLTranslate::getPreferredHandler()
LLTranslationAPIHandler& LLTranslate::getHandler(EService service)
{
static LLGoogleTranslationHandler google;
- static LLBingTranslationHandler bing;
+ static LLAzureTranslationHandler azure;
+ static LLDeepLTranslationHandler deepl;
- if (service == SERVICE_GOOGLE)
- {
- return google;
- }
+ switch (service)
+ {
+ case SERVICE_AZURE:
+ return azure;
+ case SERVICE_GOOGLE:
+ return google;
+ case SERVICE_DEEPL:
+ return deepl;
+ }
+
+ return azure;
- return bing;
}
diff --git a/indra/newview/lltranslate.h b/indra/newview/lltranslate.h
index 58707e2d36..4a5d80737c 100644
--- a/indra/newview/lltranslate.h
+++ b/indra/newview/lltranslate.h
@@ -59,11 +59,12 @@ class LLTranslate: public LLSingleton<LLTranslate>
public :
typedef enum e_service {
- SERVICE_BING,
+ SERVICE_AZURE,
SERVICE_GOOGLE,
+ SERVICE_DEEPL,
} EService;
- typedef boost::function<void(EService, bool)> KeyVerificationResult_fn;
+ typedef boost::function<void(EService, bool, S32)> KeyVerificationResult_fn;
typedef boost::function<void(std::string , std::string )> TranslationSuccess_fn;
typedef boost::function<void(int, std::string)> TranslationFailure_fn;
@@ -78,12 +79,12 @@ public :
static void translateMessage(const std::string &from_lang, const std::string &to_lang, const std::string &mesg, TranslationSuccess_fn success, TranslationFailure_fn failure);
/**
- * Verify given API key of a translation service.
- *
- * @param receiver Object to pass verification result to.
- * @param key Key to verify.
- */
- static void verifyKey(EService service, const std::string &key, KeyVerificationResult_fn fnc);
+ * Verify given API key of a translation service.
+ *
+ * @param receiver Object to pass verification result to.
+ * @param key Key to verify.
+ */
+ static void verifyKey(EService service, const LLSD &key, KeyVerificationResult_fn fnc);
/**
* @return translation target language
diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp
index 0da769999b..76fb138768 100644
--- a/indra/newview/llurldispatcher.cpp
+++ b/indra/newview/llurldispatcher.cpp
@@ -97,6 +97,8 @@ private:
// Called by LLWorldMap when a region name has been resolved to a
// location in-world, used by places-panel display.
+ static bool handleGrid(const LLSLURL& slurl);
+
friend class LLTeleportHandler;
};
@@ -155,7 +157,7 @@ bool LLURLDispatcherImpl::dispatchApp(const LLSLURL& slurl,
LL_INFOS() << "cmd: " << slurl.getAppCmd() << " path: " << slurl.getAppPath() << " query: " << slurl.getAppQuery() << LL_ENDL;
const LLSD& query_map = LLURI::queryMap(slurl.getAppQuery());
bool handled = LLCommandDispatcher::dispatch(
- slurl.getAppCmd(), slurl.getAppPath(), query_map, web, nav_type, trusted_browser);
+ slurl.getAppCmd(), slurl.getAppPath(), query_map, slurl.getGrid(), web, nav_type, trusted_browser);
// alert if we didn't handle this secondlife:///app/ SLURL
// (but still return true because it is a valid app SLURL)
@@ -184,6 +186,11 @@ bool LLURLDispatcherImpl::dispatchRegion(const LLSLURL& slurl, const std::string
return true;
}
+ if (!handleGrid(slurl))
+ {
+ return true;
+ }
+
// Request a region handle by name
LLWorldMapMessage::getInstance()->sendNamedRegionRequest(slurl.getRegion(),
LLURLDispatcherImpl::regionNameCallback,
@@ -202,31 +209,39 @@ void LLURLDispatcherImpl::regionNameCallback(U64 region_handle, const LLSLURL& s
}
}
+bool LLURLDispatcherImpl::handleGrid(const LLSLURL& slurl)
+{
+ if (LLGridManager::getInstance()->getGrid(slurl.getGrid())
+ != LLGridManager::getInstance()->getGrid())
+ {
+ LLSD args;
+ args["SLURL"] = slurl.getLocationString();
+ args["CURRENT_GRID"] = LLGridManager::getInstance()->getGridLabel();
+ std::string grid_label =
+ LLGridManager::getInstance()->getGridLabel(slurl.getGrid());
+
+ if (!grid_label.empty())
+ {
+ args["GRID"] = grid_label;
+ }
+ else
+ {
+ args["GRID"] = slurl.getGrid();
+ }
+ LLNotificationsUtil::add("CantTeleportToGrid", args);
+ return false;
+ }
+ return true;
+}
+
/* static */
void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const LLSLURL& slurl, const LLUUID& snapshot_id, bool teleport)
{
-
- // we can't teleport cross grid at this point
- if( LLGridManager::getInstance()->getGrid(slurl.getGrid())
- != LLGridManager::getInstance()->getGrid())
- {
- LLSD args;
- args["SLURL"] = slurl.getLocationString();
- args["CURRENT_GRID"] = LLGridManager::getInstance()->getGridLabel();
- std::string grid_label =
- LLGridManager::getInstance()->getGridLabel(slurl.getGrid());
-
- if(!grid_label.empty())
- {
- args["GRID"] = grid_label;
- }
- else
- {
- args["GRID"] = slurl.getGrid();
- }
- LLNotificationsUtil::add("CantTeleportToGrid", args);
- return;
- }
+ if (!handleGrid(slurl))
+ {
+ // we can't teleport cross grid at this point
+ return;
+ }
LLVector3d global_pos = from_region_handle(region_handle);
global_pos += LLVector3d(slurl.getPosition());
@@ -274,8 +289,10 @@ public:
&LLTeleportHandler::from_event);
}
- bool handle(const LLSD& tokens, const LLSD& query_map,
- LLMediaCtrl* web)
+ bool handle(const LLSD& tokens,
+ const LLSD& query_map,
+ const std::string& grid,
+ LLMediaCtrl* web)
{
// construct a "normal" SLURL, resolve the region to
// a global position, and teleport to it
@@ -297,7 +314,7 @@ public:
LLSD payload;
payload["region_name"] = region_name;
- payload["callback_url"] = LLSLURL(region_name, coords).getSLURLString();
+ payload["callback_url"] = LLSLURL(grid, region_name, coords).getSLURLString();
LLNotificationsUtil::add("TeleportViaSLAPP", args, payload);
return true;
diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp
index cc73f7ca80..6a0edbecb1 100644
--- a/indra/newview/llvieweraudio.cpp
+++ b/indra/newview/llvieweraudio.cpp
@@ -91,17 +91,18 @@ void LLViewerAudio::startInternetStreamWithAutoFade(const std::string &streamURI
return;
}
- // Record the URI we are going to be switching to
+ if (!gAudiop)
+ {
+ LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
+ return;
+ }
+
+ // Record the URI we are going to be switching to
mNextStreamURI = streamURI;
switch (mFadeState)
{
case FADE_IDLE:
- if (!gAudiop)
- {
- LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
- break;
- }
// If a stream is playing fade it out first
if (!gAudiop->getInternetStreamURL().empty())
{
@@ -114,28 +115,28 @@ void LLViewerAudio::startInternetStreamWithAutoFade(const std::string &streamURI
mFadeState = FADE_IN;
LLStreamingAudioInterface *stream = gAudiop->getStreamingAudioImpl();
- if(stream && stream->supportsAdjustableBufferSizes())
- stream->setBufferSizes(gSavedSettings.getU32("FMODExStreamBufferSize"),gSavedSettings.getU32("FMODExDecodeBufferSize"));
+ if (stream && stream->supportsAdjustableBufferSizes())
+ stream->setBufferSizes(gSavedSettings.getU32("FMODExStreamBufferSize"), gSavedSettings.getU32("FMODExDecodeBufferSize"));
gAudiop->startInternetStream(mNextStreamURI);
- startFading();
- registerIdleListener();
- break;
}
+ startFading();
+ break;
+
case FADE_OUT:
startFading();
- registerIdleListener();
break;
case FADE_IN:
- registerIdleListener();
break;
default:
LL_WARNS() << "Unknown fading state: " << mFadeState << LL_ENDL;
- break;
+ return;
}
+
+ registerIdleListener();
}
// A return of false from onIdleUpdate means it will be called again next idle update.
@@ -236,15 +237,12 @@ void LLViewerAudio::startFading()
// This minimum fade time prevents divide by zero and negative times
const F32 AUDIO_MUSIC_MINIMUM_FADE_TIME = 0.01f;
- if(mDone)
+ if (mDone)
{
// The fade state here should only be one of FADE_IN or FADE_OUT, but, in case it is not,
// rather than check for both states assume a fade in and check for the fade out case.
- mFadeTime = AUDIO_MUSIC_FADE_IN_TIME;
- if (LLViewerAudio::getInstance()->getFadeState() == LLViewerAudio::FADE_OUT)
- {
- mFadeTime = AUDIO_MUSIC_FADE_OUT_TIME;
- }
+ mFadeTime = LLViewerAudio::getInstance()->getFadeState() == LLViewerAudio::FADE_OUT ?
+ AUDIO_MUSIC_FADE_OUT_TIME : AUDIO_MUSIC_FADE_IN_TIME;
// Prevent invalid fade time
mFadeTime = llmax(mFadeTime, AUDIO_MUSIC_MINIMUM_FADE_TIME);
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index b6f01f2843..ba1add9b92 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -428,12 +428,6 @@ static bool handleRenderDynamicLODChanged(const LLSD& newvalue)
return true;
}
-static bool handleRenderLocalLightsChanged(const LLSD& newvalue)
-{
- gPipeline.setLightingDetail(-1);
- return true;
-}
-
static bool handleReflectionProbeDetailChanged(const LLSD& newvalue)
{
if (gPipeline.isInit())
@@ -728,6 +722,7 @@ void settings_setup_listeners()
setting_setup_signal_listener(gSavedSettings, "RenderUIBuffer", handleWindowResized);
setting_setup_signal_listener(gSavedSettings, "RenderDepthOfField", handleReleaseGLBufferChanged);
setting_setup_signal_listener(gSavedSettings, "RenderFSAASamples", handleReleaseGLBufferChanged);
+ setting_setup_signal_listener(gSavedSettings, "RenderPostProcessingHDR", handleReleaseGLBufferChanged);
setting_setup_signal_listener(gSavedSettings, "RenderSpecularResX", handleLUTBufferChanged);
setting_setup_signal_listener(gSavedSettings, "RenderSpecularResY", handleLUTBufferChanged);
setting_setup_signal_listener(gSavedSettings, "RenderSpecularExponent", handleLUTBufferChanged);
@@ -736,6 +731,8 @@ void settings_setup_listeners()
setting_setup_signal_listener(gSavedSettings, "RenderGlow", handleReleaseGLBufferChanged);
setting_setup_signal_listener(gSavedSettings, "RenderGlow", handleSetShaderChanged);
setting_setup_signal_listener(gSavedSettings, "RenderGlowResolutionPow", handleReleaseGLBufferChanged);
+ setting_setup_signal_listener(gSavedSettings, "RenderGlowHDR", handleReleaseGLBufferChanged);
+ setting_setup_signal_listener(gSavedSettings, "RenderGlowNoise", handleSetShaderChanged);
setting_setup_signal_listener(gSavedSettings, "RenderGammaFull", handleSetShaderChanged);
setting_setup_signal_listener(gSavedSettings, "RenderVolumeLODFactor", handleVolumeLODChanged);
setting_setup_signal_listener(gSavedSettings, "RenderAvatarLODFactor", handleAvatarLODChanged);
@@ -747,7 +744,6 @@ void settings_setup_listeners()
setting_setup_signal_listener(gSavedSettings, "RenderFogRatio", handleFogRatioChanged);
setting_setup_signal_listener(gSavedSettings, "RenderMaxPartCount", handleMaxPartCountChanged);
setting_setup_signal_listener(gSavedSettings, "RenderDynamicLOD", handleRenderDynamicLODChanged);
- setting_setup_signal_listener(gSavedSettings, "RenderLocalLights", handleRenderLocalLightsChanged);
setting_setup_signal_listener(gSavedSettings, "RenderVSyncEnable", handleVSyncChanged);
setting_setup_signal_listener(gSavedSettings, "RenderDeferredNoise", handleReleaseGLBufferChanged);
setting_setup_signal_listener(gSavedSettings, "RenderDebugPipeline", handleRenderDebugPipelineChanged);
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index ca87ff0092..6da0e9d695 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -56,6 +56,7 @@
#include "llfloaterbvhpreview.h"
#include "llfloatercamera.h"
#include "llfloatercamerapresets.h"
+#include "llfloaterchangeitemthumbnail.h"
#include "llfloaterchatvoicevolume.h"
#include "llfloaterclassified.h"
#include "llfloaterconversationlog.h"
@@ -84,6 +85,7 @@
#include "llfloaterimagepreview.h"
#include "llfloaterimsession.h"
#include "llfloaterinspect.h"
+#include "llfloaterinventorysettings.h"
#include "llfloaterjoystick.h"
#include "llfloaterlagmeter.h"
#include "llfloaterland.h"
@@ -98,12 +100,12 @@
#include "llfloatermyscripts.h"
#include "llfloatermyenvironment.h"
#include "llfloaternamedesc.h"
+#include "llfloaternewfeaturenotification.h"
#include "llfloaternotificationsconsole.h"
#include "llfloaternotificationstabbed.h"
#include "llfloaterobjectweights.h"
#include "llfloateropenobject.h"
-#include "llfloateroutfitphotopreview.h"
-#include "llfloatersimpleoutfitsnapshot.h"
+#include "llfloatersimplesnapshot.h"
#include "llfloaterpathfindingcharacters.h"
#include "llfloaterpathfindingconsole.h"
#include "llfloaterpathfindinglinksets.h"
@@ -116,7 +118,6 @@
#include "llfloaterpreferenceviewadvanced.h"
#include "llfloaterpreviewtrash.h"
#include "llfloaterprofile.h"
-#include "llfloaterproperties.h"
#include "llfloaterregiondebugconsole.h"
#include "llfloaterregioninfo.h"
#include "llfloaterregionrestarting.h"
@@ -229,6 +230,7 @@ public:
"avatar_picker",
"camera",
"camera_presets",
+ "change_item_thumbnail"
"classified",
"add_landmark",
"delete_pref_preset",
@@ -247,6 +249,7 @@ public:
"message_critical", // Modal!!! Login specific. If this is in use elsewhere, better to create a non modal variant
"message_tos", // Modal!!! Login specific.
"mute_object_by_name",
+ "new_feature_notification",
"publish_classified",
"save_pref_preset",
"save_camera_preset",
@@ -272,6 +275,7 @@ public:
bool handle(
const LLSD& params,
const LLSD& query_map,
+ const std::string& grid,
LLMediaCtrl* web) override
{
if (params.size() != 1)
@@ -329,6 +333,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("camera", "floater_camera.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCamera>);
LLFloaterReg::add("camera_presets", "floater_camera_presets.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCameraPresets>);
LLFloaterReg::add("chat_voice", "floater_voice_chat_volume.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterChatVoiceVolume>);
+ LLFloaterReg::add("change_item_thumbnail", "floater_change_item_thumbnail.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterChangeItemThumbnail>);
LLFloaterReg::add("nearby_chat", "floater_im_session.xml", (LLFloaterBuildFunc)&LLFloaterIMNearbyChat::buildFloater);
LLFloaterReg::add("classified", "floater_classified.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterClassified>);
LLFloaterReg::add("compile_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCompileQueue>);
@@ -372,6 +377,8 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("inventory", "floater_my_inventory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
LLFloaterReg::add("inspect", "floater_inspect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInspect>);
LLFloaterReg::add("item_properties", "floater_item_properties.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterItemProperties>);
+ LLFloaterReg::add("task_properties", "floater_task_properties.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterItemProperties>);
+ LLFloaterReg::add("inventory_settings", "floater_inventory_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInventorySettings>);
LLInspectAvatarUtil::registerFloater();
LLInspectGroupUtil::registerFloater();
LLInspectObjectUtil::registerFloater();
@@ -395,6 +402,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("moveview", "floater_moveview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMove>);
LLFloaterReg::add("mute_object_by_name", "floater_mute_object.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGetBlockedObjectName>);
LLFloaterReg::add("mini_map", "floater_map.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMap>);
+ LLFloaterReg::add("new_feature_notification", "floater_new_feature_notification.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNewFeatureNotification>);
LLFloaterReg::add("notifications_console", "floater_notifications_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotificationConsole>);
@@ -403,7 +411,6 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("object_weights", "floater_object_weights.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterObjectWeights>);
LLFloaterReg::add("openobject", "floater_openobject.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterOpenObject>);
LLFloaterReg::add("outgoing_call", "floater_outgoing_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLOutgoingCallDialog>);
- LLFloaterReg::add("outfit_photo_preview", "floater_outfit_photo_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterOutfitPhotoPreview>);
LLFloaterPayUtil::registerFloater();
LLFloaterReg::add("pathfinding_characters", "floater_pathfinding_characters.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPathfindingCharacters>);
@@ -431,7 +438,6 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("preview_sound", "floater_preview_sound.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewSound>, "preview");
LLFloaterReg::add("preview_texture", "floater_preview_texture.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewTexture>, "preview");
LLFloaterReg::add("preview_trash", "floater_preview_trash.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreviewTrash>);
- LLFloaterReg::add("properties", "floater_inventory_item_properties.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterProperties>);
LLFloaterReg::add("publish_classified", "floater_publish_classified.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPublishClassifiedFloater>);
LLFloaterReg::add("save_pref_preset", "floater_save_pref_preset.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSavePrefPreset>);
LLFloaterReg::add("save_camera_preset", "floater_save_camera_preset.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSaveCameraPreset>);
@@ -468,7 +474,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("scene_load_stats", "floater_scene_load_stats.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSceneLoadStats>);
LLFloaterReg::add("stop_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotRunQueue>);
LLFloaterReg::add("snapshot", "floater_snapshot.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSnapshot>);
- LLFloaterReg::add("simple_outfit_snapshot", "floater_simple_outfit_snapshot.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSimpleOutfitSnapshot>);
+ LLFloaterReg::add("simple_snapshot", "floater_simple_snapshot.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSimpleSnapshot>);
LLFloaterReg::add("search", "floater_search.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSearch>);
LLFloaterReg::add("profile", "floater_profile.xml",(LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterProfile>);
LLFloaterReg::add("guidebook", "floater_how_to.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHowTo>);
diff --git a/indra/newview/llviewergenericmessage.cpp b/indra/newview/llviewergenericmessage.cpp
index d3de9d72bf..aaa1313ff6 100644
--- a/indra/newview/llviewergenericmessage.cpp
+++ b/indra/newview/llviewergenericmessage.cpp
@@ -32,9 +32,10 @@
#include "lldispatcher.h"
#include "lluuid.h"
#include "message.h"
+#include "llgenericstreamingmessage.h"
#include "llagent.h"
-
+#include "llgltfmateriallist.h"
LLDispatcher gGenericDispatcher;
@@ -92,6 +93,21 @@ void process_generic_message(LLMessageSystem* msg, void**)
}
}
+void process_generic_streaming_message(LLMessageSystem* msg, void**)
+{
+ LLGenericStreamingMessage data;
+ data.unpack(msg);
+ switch (data.mMethod)
+ {
+ case LLGenericStreamingMessage::METHOD_GLTF_MATERIAL_OVERRIDE:
+ gGLTFMaterialList.applyOverrideMessage(msg, data.mData);
+ break;
+ default:
+ LL_WARNS_ONCE() << "Received unknown method" << LL_ENDL;
+ break;
+ }
+}
+
void process_large_generic_message(LLMessageSystem* msg, void**)
{
LLUUID agent_id;
diff --git a/indra/newview/llviewergenericmessage.h b/indra/newview/llviewergenericmessage.h
index 170f38a485..96a73a3d5f 100644
--- a/indra/newview/llviewergenericmessage.h
+++ b/indra/newview/llviewergenericmessage.h
@@ -38,6 +38,7 @@ void send_generic_message(const std::string& method,
const LLUUID& invoice = LLUUID::null);
void process_generic_message(LLMessageSystem* msg, void**);
+void process_generic_streaming_message(LLMessageSystem* msg, void**);
void process_large_generic_message(LLMessageSystem* msg, void**);
diff --git a/indra/newview/llviewerhelp.cpp b/indra/newview/llviewerhelp.cpp
index 3273090da5..3181ae6283 100644
--- a/indra/newview/llviewerhelp.cpp
+++ b/indra/newview/llviewerhelp.cpp
@@ -45,7 +45,7 @@ public:
// requests will be throttled from a non-trusted browser
LLHelpHandler() : LLCommandHandler("help", UNTRUSTED_CLICK_ONLY) {}
- bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
+ bool handle(const LLSD& params, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web)
{
LLViewerHelp* vhelp = LLViewerHelp::getInstance();
if (! vhelp)
diff --git a/indra/newview/llviewerinput.cpp b/indra/newview/llviewerinput.cpp
index 6bab2c2100..7207d6c6ba 100644
--- a/indra/newview/llviewerinput.cpp
+++ b/indra/newview/llviewerinput.cpp
@@ -1597,7 +1597,8 @@ bool LLViewerInput::scanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level)
BOOL LLViewerInput::handleMouse(LLWindow *window_impl, LLCoordGL pos, MASK mask, EMouseClickType clicktype, BOOL down)
{
- BOOL handled = gViewerWindow->handleAnyMouseClick(window_impl, pos, mask, clicktype, down);
+ bool is_toolmgr_action = false;
+ BOOL handled = gViewerWindow->handleAnyMouseClick(window_impl, pos, mask, clicktype, down, is_toolmgr_action);
if (clicktype != CLICK_NONE)
{
@@ -1616,9 +1617,9 @@ BOOL LLViewerInput::handleMouse(LLWindow *window_impl, LLCoordGL pos, MASK mask,
// If the first LMB click is handled by the menu, skip the following double click
static bool skip_double_click = false;
- if (clicktype == CLICK_LEFT && down )
+ if (clicktype == CLICK_LEFT && down)
{
- skip_double_click = handled;
+ skip_double_click = is_toolmgr_action ? false : handled;
}
if (double_click_sp && down)
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 518967709d..5ee613d49d 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -235,8 +235,10 @@ public:
// requires trusted browser to trigger
LLInventoryHandler() : LLCommandHandler("inventory", UNTRUSTED_CLICK_ONLY) { }
- bool handle(const LLSD& params, const LLSD& query_map,
- LLMediaCtrl* web)
+ bool handle(const LLSD& params,
+ const LLSD& query_map,
+ const std::string& grid,
+ LLMediaCtrl* web)
{
if (params.size() < 1)
{
@@ -313,7 +315,7 @@ LLViewerInventoryItem::LLViewerInventoryItem(const LLUUID& uuid,
time_t creation_date_utc) :
LLInventoryItem(uuid, parent_uuid, perm, asset_uuid, type, inv_type,
name, desc, sale_info, flags, creation_date_utc),
- mIsComplete(TRUE)
+ mIsComplete(true)
{
}
@@ -322,7 +324,7 @@ LLViewerInventoryItem::LLViewerInventoryItem(const LLUUID& item_id,
const std::string& name,
LLInventoryType::EType inv_type) :
LLInventoryItem(),
- mIsComplete(FALSE)
+ mIsComplete(false)
{
mUUID = item_id;
mParentUUID = parent_id;
@@ -332,7 +334,7 @@ LLViewerInventoryItem::LLViewerInventoryItem(const LLUUID& item_id,
LLViewerInventoryItem::LLViewerInventoryItem() :
LLInventoryItem(),
- mIsComplete(FALSE)
+ mIsComplete(false)
{
}
@@ -349,7 +351,7 @@ LLViewerInventoryItem::LLViewerInventoryItem(const LLViewerInventoryItem* other)
LLViewerInventoryItem::LLViewerInventoryItem(const LLInventoryItem *other) :
LLInventoryItem(other),
- mIsComplete(TRUE)
+ mIsComplete(true)
{
}
@@ -431,48 +433,43 @@ void LLViewerInventoryItem::fetchFromServer(void) const
{
if(!mIsComplete)
{
- std::string url;
-
- LLViewerRegion* region = gAgent.getRegion();
- // we have to check region. It can be null after region was destroyed. See EXT-245
- if (region)
- {
- if (gAgent.getID() != mPermissions.getOwner())
- {
- url = region->getCapability("FetchLib2");
- }
- else
- {
- url = region->getCapability("FetchInventory2");
- }
- }
- else
- {
- LL_WARNS(LOG_INV) << "Agent Region is absent" << LL_ENDL;
- }
-
- if (!url.empty())
- {
- LLSD body;
- body["agent_id"] = gAgent.getID();
- body["items"][0]["owner_id"] = mPermissions.getOwner();
- body["items"][0]["item_id"] = mUUID;
-
- LLCore::HttpHandler::ptr_t handler(new LLInventoryModel::FetchItemHttpHandler(body));
- gInventory.requestPost(true, url, body, handler, "Inventory Item");
- }
- else
- {
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessage("FetchInventory");
- msg->nextBlock("AgentData");
- msg->addUUID("AgentID", gAgent.getID());
- msg->addUUID("SessionID", gAgent.getSessionID());
- msg->nextBlock("InventoryData");
- msg->addUUID("OwnerID", mPermissions.getOwner());
- msg->addUUID("ItemID", mUUID);
- gAgent.sendReliableMessage();
- }
+ if (AISAPI::isAvailable()) // AIS v 3
+ {
+ LLInventoryModelBackgroundFetch::getInstance()->scheduleItemFetch(mUUID);
+ }
+ else
+ {
+ std::string url;
+
+ LLViewerRegion* region = gAgent.getRegion();
+ // we have to check region. It can be null after region was destroyed. See EXT-245
+ if (region)
+ {
+ if (gAgent.getID() != mPermissions.getOwner())
+ {
+ url = region->getCapability("FetchLib2");
+ }
+ else
+ {
+ url = region->getCapability("FetchInventory2");
+ }
+ }
+ else
+ {
+ LL_WARNS(LOG_INV) << "Agent Region is absent" << LL_ENDL;
+ }
+
+ if (!url.empty())
+ {
+ LLSD body;
+ body["agent_id"] = gAgent.getID();
+ body["items"][0]["owner_id"] = mPermissions.getOwner();
+ body["items"][0]["item_id"] = mUUID;
+
+ LLCore::HttpHandler::ptr_t handler(new LLInventoryModel::FetchItemHttpHandler(body));
+ gInventory.requestPost(true, url, body, handler, "Inventory Item");
+ }
+ }
}
}
@@ -567,7 +564,8 @@ LLViewerInventoryCategory::LLViewerInventoryCategory(const LLUUID& uuid,
LLInventoryCategory(uuid, parent_uuid, pref, name),
mOwnerID(owner_id),
mVersion(LLViewerInventoryCategory::VERSION_UNKNOWN),
- mDescendentCount(LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN)
+ mDescendentCount(LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN),
+ mFetching(FETCH_NONE)
{
mDescendentsRequested.reset();
}
@@ -575,7 +573,8 @@ LLViewerInventoryCategory::LLViewerInventoryCategory(const LLUUID& uuid,
LLViewerInventoryCategory::LLViewerInventoryCategory(const LLUUID& owner_id) :
mOwnerID(owner_id),
mVersion(LLViewerInventoryCategory::VERSION_UNKNOWN),
- mDescendentCount(LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN)
+ mDescendentCount(LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN),
+ mFetching(FETCH_NONE)
{
mDescendentsRequested.reset();
}
@@ -583,6 +582,7 @@ LLViewerInventoryCategory::LLViewerInventoryCategory(const LLUUID& owner_id) :
LLViewerInventoryCategory::LLViewerInventoryCategory(const LLViewerInventoryCategory* other)
{
copyViewerCategory(other);
+ mFetching = FETCH_NONE;
}
LLViewerInventoryCategory::~LLViewerInventoryCategory()
@@ -658,7 +658,6 @@ bool LLViewerInventoryCategory::fetch()
mDescendentsRequested.reset();
mDescendentsRequested.setTimerExpirySec(FETCH_TIMER_EXPIRY);
-
std::string url;
if (gAgent.getRegion())
{
@@ -668,15 +667,52 @@ bool LLViewerInventoryCategory::fetch()
{
LL_WARNS(LOG_INV) << "agent region is null" << LL_ENDL;
}
- if (!url.empty()) //Capability found. Build up LLSD and use it.
+ if (!url.empty() || AISAPI::isAvailable())
{
- LLInventoryModelBackgroundFetch::instance().start(mUUID, false);
+ LLInventoryModelBackgroundFetch::instance().start(mUUID, false);
}
return true;
}
return false;
}
+LLViewerInventoryCategory::EFetchType LLViewerInventoryCategory::getFetching()
+{
+ // if timer hasn't expired, request was scheduled, but not in progress
+ // if mFetching request was actually started
+ if (mDescendentsRequested.hasExpired())
+ {
+ mFetching = FETCH_NONE;
+ }
+ return mFetching;
+}
+
+void LLViewerInventoryCategory::setFetching(LLViewerInventoryCategory::EFetchType fetching)
+{
+ if (fetching > mFetching) // allow a switch from normal to recursive
+ {
+ if (mDescendentsRequested.hasExpired() || (mFetching == FETCH_NONE))
+ {
+ mDescendentsRequested.reset();
+ if (AISAPI::isAvailable())
+ {
+ mDescendentsRequested.setTimerExpirySec(AISAPI::HTTP_TIMEOUT);
+ }
+ else
+ {
+ const F32 FETCH_TIMER_EXPIRY = 30.0f;
+ mDescendentsRequested.setTimerExpirySec(FETCH_TIMER_EXPIRY);
+ }
+ }
+ mFetching = fetching;
+ }
+ else if (fetching == FETCH_NONE)
+ {
+ mDescendentsRequested.stop();
+ mFetching = fetching;
+ }
+}
+
S32 LLViewerInventoryCategory::getViewerDescendentCount() const
{
LLInventoryModel::cat_array_t* cats;
@@ -1016,13 +1052,18 @@ void create_gltf_material_cb(const LLUUID& inv_item)
LLInventoryCallbackManager gInventoryCallbacks;
-void create_inventory_item(const LLUUID& agent_id, const LLUUID& session_id,
- const LLUUID& parent, const LLTransactionID& transaction_id,
- const std::string& name,
- const std::string& desc, LLAssetType::EType asset_type,
- LLInventoryType::EType inv_type, U8 subtype,
- U32 next_owner_perm,
- LLPointer<LLInventoryCallback> cb)
+void create_inventory_item(
+ const LLUUID& agent_id,
+ const LLUUID& session_id,
+ const LLUUID& parent_id,
+ const LLTransactionID& transaction_id,
+ const std::string& name,
+ const std::string& desc,
+ LLAssetType::EType asset_type,
+ LLInventoryType::EType inv_type,
+ U8 subtype,
+ U32 next_owner_perm,
+ LLPointer<LLInventoryCallback> cb)
{
//check if name is equal to one of special inventory items names
//EXT-5839
@@ -1043,6 +1084,54 @@ void create_inventory_item(const LLUUID& agent_id, const LLUUID& session_id,
}
}
+#ifdef USE_AIS_FOR_NC
+ // D567 18.03.2023 not yet implemented within AIS3
+ if (AISAPI::isAvailable())
+ {
+ LLSD new_inventory = LLSD::emptyMap();
+ new_inventory["items"] = LLSD::emptyArray();
+
+ LLPermissions perms;
+ perms.init(
+ gAgentID,
+ gAgentID,
+ LLUUID::null,
+ LLUUID::null);
+ perms.initMasks(
+ PERM_ALL,
+ PERM_ALL,
+ PERM_NONE,
+ PERM_NONE,
+ next_owner_perm);
+
+ LLUUID null_id;
+ LLPointer<LLViewerInventoryItem> item = new LLViewerInventoryItem(
+ null_id, /*don't know yet*/
+ parent_id,
+ perms,
+ null_id, /*don't know yet*/
+ asset_type,
+ inv_type,
+ server_name,
+ desc,
+ LLSaleInfo(),
+ 0,
+ 0 /*don't know yet, whenever server creates it*/);
+ LLSD item_sd = item->asLLSD();
+ new_inventory["items"].append(item_sd);
+ AISAPI::completion_t cr = boost::bind(&doInventoryCb, cb, _1);
+ AISAPI::CreateInventory(
+ parent_id,
+ new_inventory,
+ cr);
+ return;
+ }
+ else
+ {
+ LL_WARNS() << "AIS v3 not available" << LL_ENDL;
+ }
+#endif
+
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_CreateInventoryItem);
msg->nextBlock(_PREHASH_AgentData);
@@ -1050,7 +1139,7 @@ void create_inventory_item(const LLUUID& agent_id, const LLUUID& session_id,
msg->addUUIDFast(_PREHASH_SessionID, session_id);
msg->nextBlock(_PREHASH_InventoryBlock);
msg->addU32Fast(_PREHASH_CallbackID, gInventoryCallbacks.registerCB(cb));
- msg->addUUIDFast(_PREHASH_FolderID, parent);
+ msg->addUUIDFast(_PREHASH_FolderID, parent_id);
msg->addUUIDFast(_PREHASH_TransactionID, transaction_id);
msg->addU32Fast(_PREHASH_NextOwnerMask, next_owner_perm);
msg->addS8Fast(_PREHASH_Type, (S8)asset_type);
@@ -1306,17 +1395,15 @@ void update_inventory_category(
LL_DEBUGS(LOG_INV) << "cat_id: [" << cat_id << "] name " << (obj ? obj->getName() : "(NOT FOUND)") << LL_ENDL;
if(obj)
{
- if (LLFolderType::lookupIsProtectedType(obj->getPreferredType()))
+ if (LLFolderType::lookupIsProtectedType(obj->getPreferredType())
+ && (updates.size() != 1 || !updates.has("thumbnail")))
{
LLNotificationsUtil::add("CannotModifyProtectedCategories");
return;
}
- LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(obj);
- new_cat->fromLLSD(updates);
- LLSD new_llsd = new_cat->asLLSD();
AISAPI::completion_t cr = boost::bind(&doInventoryCb, cb, _1);
- AISAPI::UpdateCategory(cat_id, new_llsd, cr);
+ AISAPI::UpdateCategory(cat_id, updates, cr);
}
}
@@ -1368,25 +1455,10 @@ void remove_inventory_item(
gInventory.onObjectDeletedFromServer(item_id);
}
}
- else // no cap
- {
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessageFast(_PREHASH_RemoveInventoryItem);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_InventoryData);
- msg->addUUIDFast(_PREHASH_ItemID, item_id);
- gAgent.sendReliableMessage();
-
- // Update inventory and call callback immediately since
- // message-based system has no callback mechanism (!)
- gInventory.onObjectDeletedFromServer(item_id);
- if (cb)
- {
- cb->fire(item_id);
- }
- }
+ else
+ {
+ LL_WARNS(LOG_INV) << "Tried to use inventory without AIS API" << LL_ENDL;
+ }
}
else
{
@@ -1515,28 +1587,10 @@ void purge_descendents_of(const LLUUID& id, LLPointer<LLInventoryCallback> cb)
AISAPI::completion_t cr = (cb) ? boost::bind(&doInventoryCb, cb, _1) : AISAPI::completion_t();
AISAPI::PurgeDescendents(id, cr);
}
- else // no cap
- {
- // Fast purge
- LL_DEBUGS(LOG_INV) << "purge_descendents_of fast case " << cat->getName() << LL_ENDL;
-
- // send it upstream
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessage("PurgeInventoryDescendents");
- msg->nextBlock("AgentData");
- msg->addUUID("AgentID", gAgent.getID());
- msg->addUUID("SessionID", gAgent.getSessionID());
- msg->nextBlock("InventoryData");
- msg->addUUID("FolderID", id);
- gAgent.sendReliableMessage();
-
- // Update model immediately because there is no callback mechanism.
- gInventory.onDescendentsPurgedFromServer(id);
- if (cb)
- {
- cb->fire(id);
- }
- }
+ else
+ {
+ LL_WARNS(LOG_INV) << "Tried to use inventory without AIS API" << LL_ENDL;
+ }
}
}
@@ -1604,17 +1658,79 @@ void copy_inventory_from_notecard(const LLUUID& destination_id,
}
}
+void move_or_copy_inventory_from_object(const LLUUID& destination_id,
+ const LLUUID& object_id,
+ const LLUUID& item_id,
+ LLPointer<LLInventoryCallback> cb)
+{
+ LLViewerObject* object = gObjectList.findObject(object_id);
+ if (!object)
+ {
+ return;
+ }
+ const LLInventoryItem* item = object->getInventoryItem(item_id);
+ if (!item)
+ {
+ return;
+ }
+
+ class LLItemAddedObserver : public LLInventoryObserver
+ {
+ public:
+ LLItemAddedObserver(const LLUUID& copied_asset_id, LLPointer<LLInventoryCallback> cb)
+ : LLInventoryObserver(),
+ mAssetId(copied_asset_id),
+ mCallback(cb)
+ {
+ }
+
+ void changed(U32 mask) override
+ {
+ if((mask & (LLInventoryObserver::ADD)) == 0)
+ {
+ return;
+ }
+ for (const LLUUID& changed_id : gInventory.getChangedIDs())
+ {
+ LLViewerInventoryItem* changed_item = gInventory.getItem(changed_id);
+ if (changed_item->getAssetUUID() == mAssetId)
+ {
+ changeComplete(changed_item->getUUID());
+ return;
+ }
+ }
+ }
+
+ private:
+ void changeComplete(const LLUUID& item_id)
+ {
+ mCallback->fire(item_id);
+ gInventory.removeObserver(this);
+ delete this;
+ }
+
+ LLUUID mAssetId;
+ LLPointer<LLInventoryCallback> mCallback;
+ };
+
+ const LLUUID& asset_id = item->getAssetUUID();
+ LLItemAddedObserver* observer = new LLItemAddedObserver(asset_id, cb);
+ gInventory.addObserver(observer);
+ object->moveInventory(destination_id, item_id);
+}
+
void create_new_item(const std::string& name,
const LLUUID& parent_id,
LLAssetType::EType asset_type,
LLInventoryType::EType inv_type,
- U32 next_owner_perm)
+ U32 next_owner_perm,
+ std::function<void(const LLUUID&)> created_cb = NULL)
{
std::string desc;
LLViewerAssetType::generateDescriptionFor(asset_type, desc);
next_owner_perm = (next_owner_perm) ? next_owner_perm : PERM_MOVE | PERM_TRANSFER;
- LLPointer<LLInventoryCallback> cb = NULL;
+ LLPointer<LLBoostFuncInventoryCallback> cb = NULL;
switch (inv_type)
{
@@ -1645,9 +1761,16 @@ void create_new_item(const std::string& name,
next_owner_perm = LLFloaterPerms::getNextOwnerPerms("Materials");
break;
}
- default:
- break;
- }
+ default:
+ {
+ cb = new LLBoostFuncInventoryCallback();
+ break;
+ }
+ }
+ if (created_cb != NULL)
+ {
+ cb->addOnFireFunc(created_cb);
+ }
create_inventory_item(gAgent.getID(),
gAgent.getSessionID(),
@@ -1700,65 +1823,95 @@ const std::string NEW_MATERIAL_NAME = "New Material"; // *TODO:Translate? (proba
// ! REFACTOR ! Really need to refactor this so that it's not a bunch of if-then statements...
void menu_create_inventory_item(LLInventoryPanel* panel, LLFolderBridge *bridge, const LLSD& userdata, const LLUUID& default_parent_uuid)
{
- std::string type_name = userdata.asString();
-
- if (("inbox" == type_name) || ("category" == type_name) || ("current" == type_name) || ("outfit" == type_name) || ("my_otfts" == type_name))
- {
- LLFolderType::EType preferred_type = LLFolderType::lookup(type_name);
+ menu_create_inventory_item(panel, bridge ? bridge->getUUID() : LLUUID::null, userdata, default_parent_uuid);
+}
- LLUUID parent_id;
- if (bridge)
- {
- parent_id = bridge->getUUID();
- }
- else if (default_parent_uuid.notNull())
- {
- parent_id = default_parent_uuid;
- }
- else
- {
- parent_id = gInventory.getRootFolderID();
- }
+void menu_create_inventory_item(LLInventoryPanel* panel, LLUUID dest_id, const LLSD& userdata, const LLUUID& default_parent_uuid, std::function<void(const LLUUID&)> created_cb)
+{
+ std::string type_name = userdata.asString();
+
+ if (("inbox" == type_name) || ("category" == type_name) || ("current" == type_name) || ("outfit" == type_name) || ("my_otfts" == type_name))
+ {
+ LLFolderType::EType preferred_type = LLFolderType::lookup(type_name);
- LLUUID category = gInventory.createNewCategory(parent_id, preferred_type, LLStringUtil::null);
- gInventory.notifyObservers();
- panel->setSelectionByID(category, TRUE);
- }
- else if ("lsl" == type_name)
- {
- const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_LSL_TEXT);
- create_new_item(NEW_LSL_NAME,
- parent_id,
- LLAssetType::AT_LSL_TEXT,
- LLInventoryType::IT_LSL,
- PERM_MOVE | PERM_TRANSFER); // overridden in create_new_item
- }
- else if ("notecard" == type_name)
- {
- const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_NOTECARD);
- create_new_item(NEW_NOTECARD_NAME,
- parent_id,
- LLAssetType::AT_NOTECARD,
- LLInventoryType::IT_NOTECARD,
- PERM_ALL); // overridden in create_new_item
- }
- else if ("gesture" == type_name)
- {
- const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE);
- create_new_item(NEW_GESTURE_NAME,
- parent_id,
- LLAssetType::AT_GESTURE,
- LLInventoryType::IT_GESTURE,
- PERM_ALL); // overridden in create_new_item
- }
+ LLUUID parent_id;
+ if (dest_id.notNull())
+ {
+ parent_id = dest_id;
+ }
+ else if (default_parent_uuid.notNull())
+ {
+ parent_id = default_parent_uuid;
+ }
+ else
+ {
+ parent_id = gInventory.getRootFolderID();
+ }
+
+ std::function<void(const LLUUID&)> callback_cat_created = NULL;
+ if (panel)
+ {
+ LLHandle<LLPanel> handle = panel->getHandle();
+ callback_cat_created = [handle](const LLUUID& new_category_id)
+ {
+ gInventory.notifyObservers();
+ LLInventoryPanel* panel = static_cast<LLInventoryPanel*>(handle.get());
+ if (panel)
+ {
+ panel->setSelectionByID(new_category_id, TRUE);
+ }
+ LL_DEBUGS(LOG_INV) << "Done creating inventory: " << new_category_id << LL_ENDL;
+ };
+ }
+ else if (created_cb != NULL)
+ {
+ callback_cat_created = created_cb;
+ }
+ gInventory.createNewCategory(
+ parent_id,
+ preferred_type,
+ LLStringUtil::null,
+ callback_cat_created);
+ }
+ else if ("lsl" == type_name)
+ {
+ const LLUUID parent_id = dest_id.notNull() ? dest_id : gInventory.findCategoryUUIDForType(LLFolderType::FT_LSL_TEXT);
+ create_new_item(NEW_LSL_NAME,
+ parent_id,
+ LLAssetType::AT_LSL_TEXT,
+ LLInventoryType::IT_LSL,
+ PERM_MOVE | PERM_TRANSFER,
+ created_cb); // overridden in create_new_item
+ }
+ else if ("notecard" == type_name)
+ {
+ const LLUUID parent_id = dest_id.notNull() ? dest_id : gInventory.findCategoryUUIDForType(LLFolderType::FT_NOTECARD);
+ create_new_item(NEW_NOTECARD_NAME,
+ parent_id,
+ LLAssetType::AT_NOTECARD,
+ LLInventoryType::IT_NOTECARD,
+ PERM_ALL,
+ created_cb); // overridden in create_new_item
+ }
+ else if ("gesture" == type_name)
+ {
+ const LLUUID parent_id = dest_id.notNull() ? dest_id : gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE);
+ create_new_item(NEW_GESTURE_NAME,
+ parent_id,
+ LLAssetType::AT_GESTURE,
+ LLInventoryType::IT_GESTURE,
+ PERM_ALL,
+ created_cb); // overridden in create_new_item
+ }
else if ("material" == type_name)
{
- const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_MATERIAL);
+ const LLUUID parent_id = dest_id.notNull() ? dest_id : gInventory.findCategoryUUIDForType(LLFolderType::FT_MATERIAL);
create_new_item(NEW_MATERIAL_NAME,
parent_id,
LLAssetType::AT_MATERIAL,
LLInventoryType::IT_MATERIAL,
- PERM_ALL); // overridden in create_new_item
+ PERM_ALL,
+ created_cb); // overridden in create_new_item
}
else if (("sky" == type_name) || ("water" == type_name) || ("daycycle" == type_name))
{
@@ -1782,25 +1935,28 @@ void menu_create_inventory_item(LLInventoryPanel* panel, LLFolderBridge *bridge,
return;
}
- LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_SETTINGS);
+ LLUUID parent_id = dest_id.notNull() ? dest_id : gInventory.findCategoryUUIDForType(LLFolderType::FT_SETTINGS);
- LLSettingsVOBase::createNewInventoryItem(stype, parent_id);
+ LLSettingsVOBase::createNewInventoryItem(stype, parent_id, created_cb);
+ }
+ else
+ {
+ // Use for all clothing and body parts. Adding new wearable types requires updating LLWearableDictionary.
+ LLWearableType::EType wearable_type = LLWearableType::getInstance()->typeNameToType(type_name);
+ if (wearable_type >= LLWearableType::WT_SHAPE && wearable_type < LLWearableType::WT_COUNT)
+ {
+ const LLUUID parent_id = dest_id;
+ LLAgentWearables::createWearable(wearable_type, false, parent_id, created_cb);
+ }
+ else
+ {
+ LL_WARNS(LOG_INV) << "Can't create unrecognized type " << type_name << LL_ENDL;
+ }
+ }
+ if(panel)
+ {
+ panel->getRootFolder()->setNeedsAutoRename(TRUE);
}
- else
- {
- // Use for all clothing and body parts. Adding new wearable types requires updating LLWearableDictionary.
- LLWearableType::EType wearable_type = LLWearableType::getInstance()->typeNameToType(type_name);
- if (wearable_type >= LLWearableType::WT_SHAPE && wearable_type < LLWearableType::WT_COUNT)
- {
- const LLUUID parent_id = bridge ? bridge->getUUID() : LLUUID::null;
- LLAgentWearables::createWearable(wearable_type, false, parent_id);
- }
- else
- {
- LL_WARNS(LOG_INV) << "Can't create unrecognized type " << type_name << LL_ENDL;
- }
- }
- panel->getRootFolder()->setNeedsAutoRename(TRUE);
}
LLAssetType::EType LLViewerInventoryItem::getType() const
@@ -1926,6 +2082,25 @@ const LLSaleInfo& LLViewerInventoryItem::getSaleInfo() const
return LLInventoryItem::getSaleInfo();
}
+const LLUUID& LLViewerInventoryItem::getThumbnailUUID() const
+{
+ if (mThumbnailUUID.isNull() && mType == LLAssetType::AT_TEXTURE)
+ {
+ return mAssetUUID;
+ }
+ if (mThumbnailUUID.isNull() && mType == LLAssetType::AT_LINK)
+ {
+ LLViewerInventoryItem *linked_item = gInventory.getItem(mAssetUUID);
+ return linked_item ? linked_item->getThumbnailUUID() : LLUUID::null;
+ }
+ if (mThumbnailUUID.isNull() && mType == LLAssetType::AT_LINK_FOLDER)
+ {
+ LLViewerInventoryCategory *linked_cat = gInventory.getCategory(mAssetUUID);
+ return linked_cat ? linked_cat->getThumbnailUUID() : LLUUID::null;
+ }
+ return mThumbnailUUID;
+}
+
LLInventoryType::EType LLViewerInventoryItem::getInventoryType() const
{
if (const LLViewerInventoryItem *linked_item = getLinkedItem())
diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h
index 24b632632b..bce8da0a69 100644
--- a/indra/newview/llviewerinventory.h
+++ b/indra/newview/llviewerinventory.h
@@ -72,6 +72,7 @@ public:
virtual const LLUUID& getCreatorUUID() const;
virtual const std::string& getDescription() const;
virtual const LLSaleInfo& getSaleInfo() const;
+ virtual const LLUUID& getThumbnailUUID() const;
virtual LLInventoryType::EType getInventoryType() const;
virtual bool isWearableType() const;
virtual LLWearableType::EType getWearableType() const;
@@ -134,8 +135,8 @@ public:
virtual BOOL importLegacyStream(std::istream& input_stream);
// new methods
- BOOL isFinished() const { return mIsComplete; }
- void setComplete(BOOL complete) { mIsComplete = complete; }
+ bool isFinished() const { return mIsComplete; }
+ void setComplete(bool complete) { mIsComplete = complete; }
//void updateAssetOnServer() const;
virtual void setTransactionID(const LLTransactionID& transaction_id);
@@ -163,7 +164,7 @@ public:
BOOL regenerateLink();
public:
- BOOL mIsComplete;
+ bool mIsComplete;
LLTransactionID mTransactionID;
};
@@ -208,9 +209,18 @@ public:
S32 getVersion() const;
void setVersion(S32 version);
- // Returns true if a fetch was issued.
+ // Returns true if a fetch was issued (not nessesary in progress).
bool fetch();
+ typedef enum {
+ FETCH_NONE = 0,
+ FETCH_NORMAL,
+ FETCH_RECURSIVE,
+ } EFetchType;
+ EFetchType getFetching();
+ // marks as fetch being in progress or as done
+ void setFetching(EFetchType);
+
// used to help make caching more robust - for example, if
// someone is getting 4 packets but logs out after 3. the viewer
// may never know the cache is wrong.
@@ -239,12 +249,14 @@ protected:
LLUUID mOwnerID;
S32 mVersion;
S32 mDescendentCount;
+ EFetchType mFetching;
LLFrameTimer mDescendentsRequested;
};
class LLInventoryCallback : public LLRefCount
{
public:
+ virtual ~LLInventoryCallback() {}
virtual void fire(const LLUUID& inv_item) = 0;
};
@@ -283,17 +295,29 @@ class LLBoostFuncInventoryCallback: public LLInventoryCallback
{
public:
- LLBoostFuncInventoryCallback(inventory_func_type fire_func = no_op_inventory_func,
+ LLBoostFuncInventoryCallback(inventory_func_type fire_func,
nullary_func_type destroy_func = no_op):
- mFireFunc(fire_func),
mDestroyFunc(destroy_func)
{
+ mFireFuncs.push_back(fire_func);
}
+ LLBoostFuncInventoryCallback()
+ {
+ }
+
+ void addOnFireFunc(inventory_func_type fire_func)
+ {
+ mFireFuncs.push_back(fire_func);
+ }
+
// virtual
void fire(const LLUUID& item_id)
{
- mFireFunc(item_id);
+ for (inventory_func_type &func: mFireFuncs)
+ {
+ func(item_id);
+ }
}
// virtual
@@ -304,7 +328,7 @@ public:
private:
- inventory_func_type mFireFunc;
+ std::list<inventory_func_type> mFireFuncs;
nullary_func_type mDestroyFunc;
};
@@ -439,12 +463,18 @@ void copy_inventory_from_notecard(const LLUUID& destination_id,
const LLInventoryItem *src,
U32 callback_id = 0);
+void move_or_copy_inventory_from_object(const LLUUID& destination_id,
+ const LLUUID& object_id,
+ const LLUUID& item_id,
+ LLPointer<LLInventoryCallback> cb);
void menu_create_inventory_item(LLInventoryPanel* root,
LLFolderBridge* bridge,
const LLSD& userdata,
const LLUUID& default_parent_uuid = LLUUID::null);
+void menu_create_inventory_item(LLInventoryPanel* panel, LLUUID dest_id, const LLSD& userdata, const LLUUID& default_parent_uuid = LLUUID::null, std::function<void(const LLUUID&)> folder_created_cb = NULL);
+
void slam_inventory_folder(const LLUUID& folder_id,
const LLSD& contents,
LLPointer<LLInventoryCallback> cb);
diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp
index ba80eeb6b6..e914e2121c 100644
--- a/indra/newview/llviewermediafocus.cpp
+++ b/indra/newview/llviewermediafocus.cpp
@@ -63,6 +63,7 @@ LLViewerMediaFocus::~LLViewerMediaFocus()
{
// The destructor for LLSingletons happens at atexit() time, which is too late to do much.
// Clean up in cleanupClass() instead.
+ gFocusMgr.removeKeyboardFocusWithoutCallback(this);
}
void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 face, viewer_media_t media_impl, LLVector3 pick_normal)
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 6e5c268c00..3708ad82e8 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -120,8 +120,10 @@
#include "llviewerobjectlist.h"
#include "llviewerparcelmgr.h"
#include "llviewerstats.h"
+#include "llviewerstatsrecorder.h"
#include "llvoavatarself.h"
#include "llvoicevivox.h"
+#include "llworld.h"
#include "llworldmap.h"
#include "pipeline.h"
#include "llviewerjoystick.h"
@@ -328,6 +330,7 @@ void handle_debug_avatar_textures(void*);
void handle_grab_baked_texture(void*);
BOOL enable_grab_baked_texture(void*);
void handle_dump_region_object_cache(void*);
+void handle_reset_interest_lists(void *);
BOOL enable_save_into_task_inventory(void*);
@@ -399,14 +402,14 @@ void set_merchant_SLM_menu()
LLCommand* command = LLCommandManager::instance().getCommand("marketplacelistings");
gToolBarView->enableCommand(command->id(), true);
- const LLUUID marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
+ const LLUUID marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
if (marketplacelistings_id.isNull())
{
U32 mkt_status = LLMarketplaceData::instance().getSLMStatus();
bool is_merchant = (mkt_status == MarketplaceStatusCodes::MARKET_PLACE_MERCHANT) || (mkt_status == MarketplaceStatusCodes::MARKET_PLACE_MIGRATED_MERCHANT);
if (is_merchant)
{
- gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, true);
+ gInventory.ensureCategoryForTypeExists(LLFolderType::FT_MARKETPLACE_LISTINGS);
LL_WARNS("SLM") << "Creating the marketplace listings folder for a merchant" << LL_ENDL;
}
}
@@ -1244,49 +1247,66 @@ class LLAdvancedDumpRegionObjectCache : public view_listener_t
}
};
-class LLAdvancedInterestListFullUpdate : public view_listener_t
+class LLAdvancedToggleInterestList360Mode : public view_listener_t
+{
+public:
+ bool handleEvent(const LLSD &userdata)
+ {
+ // Toggle the mode - regions will get updated
+ if (gAgent.getInterestListMode() == LLViewerRegion::IL_MODE_360)
+ {
+ gAgent.changeInterestListMode(LLViewerRegion::IL_MODE_DEFAULT);
+ }
+ else
+ {
+ gAgent.changeInterestListMode(LLViewerRegion::IL_MODE_360);
+ }
+ return true;
+ }
+};
+
+class LLAdvancedCheckInterestList360Mode : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- LLSD request;
- LLSD body;
- static bool using_360 = false;
+ return (gAgent.getInterestListMode() == LLViewerRegion::IL_MODE_360);
+ }
+};
- if (using_360)
- {
- body["mode"] = LLSD::String("default");
+class LLAdvancedToggleStatsRecorder : public view_listener_t
+{
+ bool handleEvent(const LLSD &userdata)
+ {
+ if (LLViewerStatsRecorder::instance().isEnabled())
+ { // Turn off both recording and logging
+ LLViewerStatsRecorder::instance().enableObjectStatsRecording(false);
}
else
- {
- body["mode"] = LLSD::String("360");
+ { // Turn on both recording and logging
+ LLViewerStatsRecorder::instance().enableObjectStatsRecording(true, true);
}
- using_360 = !using_360;
+ return true;
+ }
+};
- if (gAgent.requestPostCapability("InterestList", body, [](const LLSD& response)
- {
- LL_INFOS("360Capture") <<
- "InterestList capability responded: \n" <<
- ll_pretty_print_sd(response) <<
- LL_ENDL;
- }))
- {
- LL_INFOS("360Capture") <<
- "Successfully posted an InterestList capability request with payload: \n" <<
- ll_pretty_print_sd(body) <<
- LL_ENDL;
- return true;
- }
- else
- {
- LL_INFOS("360Capture") <<
- "Unable to post an InterestList capability request with payload: \n" <<
- ll_pretty_print_sd(body) <<
- LL_ENDL;
- return false;
- }
- }
+class LLAdvancedCheckStatsRecorder : public view_listener_t
+{
+ bool handleEvent(const LLSD &userdata)
+ { // Use the logging state as the indicator of whether the stats recorder is on
+ return LLViewerStatsRecorder::instance().isLogging();
+ }
};
+class LLAdvancedResetInterestLists : public view_listener_t
+{
+ bool handleEvent(const LLSD &userdata)
+ { // Reset all region interest lists
+ handle_reset_interest_lists(NULL);
+ return true;
+ }
+};
+
+
class LLAdvancedBuyCurrencyTest : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -2800,7 +2820,12 @@ bool enable_object_inspect()
struct LLSelectedTEGetmatIdAndPermissions : public LLSelectedTEFunctor
{
- LLSelectedTEGetmatIdAndPermissions() : mCanCopy(true), mCanModify(true), mCanTransfer(true) {}
+ LLSelectedTEGetmatIdAndPermissions()
+ : mCanCopy(true)
+ , mCanModify(true)
+ , mCanTransfer(true)
+ , mHasNonPbrFaces(false)
+ {}
bool apply(LLViewerObject* objectp, S32 te_index)
{
mCanCopy &= (bool)objectp->permCopy();
@@ -2811,11 +2836,16 @@ struct LLSelectedTEGetmatIdAndPermissions : public LLSelectedTEFunctor
{
mMaterialId = mat_id;
}
+ else
+ {
+ mHasNonPbrFaces = true;
+ }
return true;
}
bool mCanCopy;
bool mCanModify;
bool mCanTransfer;
+ bool mHasNonPbrFaces;
LLUUID mMaterialId;
};
@@ -2828,7 +2858,7 @@ bool enable_object_edit_gltf_material()
LLSelectedTEGetmatIdAndPermissions func;
LLSelectMgr::getInstance()->getSelection()->applyToTEs(&func);
- return func.mCanModify && func.mMaterialId.notNull();
+ return func.mCanModify && !func.mHasNonPbrFaces;
}
bool enable_object_open()
@@ -3019,9 +3049,7 @@ void handle_object_inspect()
LLViewerObject* selected_objectp = selection->getFirstRootObject();
if (selected_objectp)
{
- LLSD key;
- key["task"] = "task";
- LLFloaterSidePanelContainer::showPanel("inventory", key);
+ LLFloaterReg::showInstance("task_properties");
}
/*
@@ -3859,6 +3887,22 @@ void handle_dump_region_object_cache(void*)
}
}
+void handle_reset_interest_lists(void *)
+{
+ // Check all regions and reset their interest list
+ for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
+ iter != LLWorld::getInstance()->getRegionList().end();
+ ++iter)
+ {
+ LLViewerRegion *regionp = *iter;
+ if (regionp && regionp->isAlive() && regionp->capabilitiesReceived())
+ {
+ regionp->resetInterestList();
+ }
+ }
+}
+
+
void handle_dump_focus()
{
LLUICtrl *ctrl = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus());
@@ -4469,33 +4513,6 @@ void handle_duplicate_in_place(void*)
LLSelectMgr::getInstance()->selectDuplicate(offset, TRUE);
}
-/* dead code 30-apr-2008
-void handle_deed_object_to_group(void*)
-{
- LLUUID group_id;
-
- LLSelectMgr::getInstance()->selectGetGroup(group_id);
- LLSelectMgr::getInstance()->sendOwner(LLUUID::null, group_id, FALSE);
- LLViewerStats::getInstance()->incStat(LLViewerStats::ST_RELEASE_COUNT);
-}
-
-BOOL enable_deed_object_to_group(void*)
-{
- if(LLSelectMgr::getInstance()->getSelection()->isEmpty()) return FALSE;
- LLPermissions perm;
- LLUUID group_id;
-
- if (LLSelectMgr::getInstance()->selectGetGroup(group_id) &&
- gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED) &&
- LLSelectMgr::getInstance()->selectGetPermissions(perm) &&
- perm.deedToGroup(gAgent.getID(), group_id))
- {
- return TRUE;
- }
- return FALSE;
-}
-
-*/
/*
@@ -8118,6 +8135,18 @@ class LLToolsSelectInvisibleObjects : public view_listener_t
}
};
+class LLToolsSelectReflectionProbes: public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ BOOL cur_val = gSavedSettings.getBOOL("SelectReflectionProbes");
+
+ gSavedSettings.setBOOL("SelectReflectionProbes", !cur_val);
+
+ return true;
+ }
+};
+
class LLToolsSelectBySurrounding : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -9060,6 +9089,25 @@ class LLWorldPostProcess : public view_listener_t
}
};
+class LLWorldCheckBanLines : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ S32 callback_data = userdata.asInteger();
+ return gSavedSettings.getS32("ShowBanLines") == callback_data;
+ }
+};
+
+class LLWorldShowBanLines : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ S32 callback_data = userdata.asInteger();
+ gSavedSettings.setS32("ShowBanLines", callback_data);
+ return true;
+ }
+};
+
void handle_flush_name_caches()
{
if (gCacheName) gCacheName->clear();
@@ -9349,12 +9397,15 @@ void initialize_menus()
view_listener_t::addMenu(new LLWorldEnvPreset(), "World.EnvPreset");
view_listener_t::addMenu(new LLWorldEnableEnvPreset(), "World.EnableEnvPreset");
view_listener_t::addMenu(new LLWorldPostProcess(), "World.PostProcess");
+ view_listener_t::addMenu(new LLWorldCheckBanLines() , "World.CheckBanLines");
+ view_listener_t::addMenu(new LLWorldShowBanLines() , "World.ShowBanLines");
// Tools menu
view_listener_t::addMenu(new LLToolsSelectTool(), "Tools.SelectTool");
view_listener_t::addMenu(new LLToolsSelectOnlyMyObjects(), "Tools.SelectOnlyMyObjects");
view_listener_t::addMenu(new LLToolsSelectOnlyMovableObjects(), "Tools.SelectOnlyMovableObjects");
view_listener_t::addMenu(new LLToolsSelectInvisibleObjects(), "Tools.SelectInvisibleObjects");
+ view_listener_t::addMenu(new LLToolsSelectReflectionProbes(), "Tools.SelectReflectionProbes");
view_listener_t::addMenu(new LLToolsSelectBySurrounding(), "Tools.SelectBySurrounding");
view_listener_t::addMenu(new LLToolsShowHiddenSelection(), "Tools.ShowHiddenSelection");
view_listener_t::addMenu(new LLToolsShowSelectionLightRadius(), "Tools.ShowSelectionLightRadius");
@@ -9443,7 +9494,11 @@ void initialize_menus()
// Advanced > World
view_listener_t::addMenu(new LLAdvancedDumpScriptedCamera(), "Advanced.DumpScriptedCamera");
view_listener_t::addMenu(new LLAdvancedDumpRegionObjectCache(), "Advanced.DumpRegionObjectCache");
- view_listener_t::addMenu(new LLAdvancedInterestListFullUpdate(), "Advanced.InterestListFullUpdate");
+ view_listener_t::addMenu(new LLAdvancedToggleStatsRecorder(), "Advanced.ToggleStatsRecorder");
+ view_listener_t::addMenu(new LLAdvancedCheckStatsRecorder(), "Advanced.CheckStatsRecorder");
+ view_listener_t::addMenu(new LLAdvancedToggleInterestList360Mode(), "Advanced.ToggleInterestList360Mode");
+ view_listener_t::addMenu(new LLAdvancedCheckInterestList360Mode(), "Advanced.CheckInterestList360Mode");
+ view_listener_t::addMenu(new LLAdvancedResetInterestLists(), "Advanced.ResetInterestLists");
// Advanced > UI
commit.add("Advanced.WebBrowserTest", boost::bind(&handle_web_browser_test, _2)); // sigh! this one opens the MEDIA browser
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index 688b77f747..e2791ba128 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -40,7 +40,7 @@
#include "llmaterialeditor.h"
#include "llfloaterperms.h"
#include "llfloatersnapshot.h"
-#include "llfloatersimpleoutfitsnapshot.h"
+#include "llfloatersimplesnapshot.h"
#include "llimage.h"
#include "llimagebmp.h"
#include "llimagepng.h"
@@ -834,9 +834,7 @@ class LLFileEnableCloseAllWindows : public view_listener_t
bool handleEvent(const LLSD& userdata)
{
LLFloaterSnapshot* floater_snapshot = LLFloaterSnapshot::findInstance();
- LLFloaterSimpleOutfitSnapshot* floater_outfit_snapshot = LLFloaterSimpleOutfitSnapshot::findInstance();
- bool is_floaters_snapshot_opened = (floater_snapshot && floater_snapshot->isInVisibleChain())
- || (floater_outfit_snapshot && floater_outfit_snapshot->isInVisibleChain());
+ bool is_floaters_snapshot_opened = (floater_snapshot && floater_snapshot->isInVisibleChain());
bool open_children = gFloaterView->allChildrenClosed() && !is_floaters_snapshot_opened;
return !open_children && !LLNotificationsUI::LLToast::isAlertToastShown();
}
@@ -851,9 +849,6 @@ class LLFileCloseAllWindows : public view_listener_t
LLFloaterSnapshot* floater_snapshot = LLFloaterSnapshot::findInstance();
if (floater_snapshot)
floater_snapshot->closeFloater(app_quitting);
- LLFloaterSimpleOutfitSnapshot* floater_outfit_snapshot = LLFloaterSimpleOutfitSnapshot::findInstance();
- if (floater_outfit_snapshot)
- floater_outfit_snapshot->closeFloater(app_quitting);
if (gMenuHolder) gMenuHolder->hideMenus();
return true;
}
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index f14e3ed737..ada898b98c 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -76,6 +76,7 @@
#include "llnotifications.h"
#include "llnotificationsutil.h"
#include "llpanelgrouplandmoney.h"
+#include "llpanelmaininventory.h"
#include "llrecentpeople.h"
#include "llscriptfloater.h"
#include "llscriptruntimeperms.h"
@@ -99,6 +100,7 @@
#include "llviewerobjectlist.h"
#include "llviewerparcelmgr.h"
#include "llviewerstats.h"
+#include "llviewerstatsrecorder.h"
#include "llviewertexteditor.h"
#include "llviewerthrottle.h"
#include "llviewerwindow.h"
@@ -1532,7 +1534,7 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam
LLFloaterReg::showInstance("preview_sound", LLSD(obj_id), take_focus);
break;
case LLAssetType::AT_MATERIAL:
- LLFloaterReg::showInstance("material editor", LLSD(obj_id), take_focus);
+ // Explicitly do nothing -- we don't want to open the material editor every time you add a material to inventory
break;
default:
LL_DEBUGS("Messaging") << "No preview method for previewable asset type : " << LLAssetType::lookupHumanReadable(asset_type) << LL_ENDL;
@@ -1542,11 +1544,35 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam
}
////////////////////////////////////////////////////////////////////////////////
+ static LLUICachedControl<bool> find_original_new_floater("FindOriginalOpenWindow", false);
+ //show in a new single-folder window
+ if(find_original_new_floater && !from_name.empty())
+ {
+ const LLInventoryObject *obj = gInventory.getObject(obj_id);
+ if (obj && obj->getParentUUID().notNull())
+ {
+ if (obj->getActualType() == LLAssetType::AT_CATEGORY)
+ {
+ LLPanelMainInventory::newFolderWindow(obj_id);
+ }
+ else
+ {
+ LLPanelMainInventory::newFolderWindow(obj->getParentUUID(), obj_id);
+ }
+ }
+ }
+ else
+ {
// Highlight item
const BOOL auto_open =
gSavedSettings.getBOOL("ShowInInventory") && // don't open if showininventory is false
!from_name.empty(); // don't open if it's not from anyone.
- LLInventoryPanel::openInventoryPanelAndSetSelection(auto_open, obj_id);
+ if(auto_open)
+ {
+ LLFloaterReg::showInstance("inventory");
+ }
+ LLInventoryPanel::openInventoryPanelAndSetSelection(auto_open, obj_id, true);
+ }
}
}
@@ -3765,31 +3791,34 @@ void process_kill_object(LLMessageSystem *mesgsys, void **user_data)
continue;
}
- LLViewerObject *objectp = gObjectList.findObject(id);
- if (objectp)
+ LLViewerObject *objectp = gObjectList.findObject(id);
+ if (objectp)
+ {
+ // Display green bubble on kill
+ if ( gShowObjectUpdates )
{
- // Display green bubble on kill
- if ( gShowObjectUpdates )
- {
- LLColor4 color(0.f,1.f,0.f,1.f);
- gPipeline.addDebugBlip(objectp->getPositionAgent(), color);
- LL_DEBUGS("MessageBlip") << "Kill blip for local " << local_id << " at " << objectp->getPositionAgent() << LL_ENDL;
- }
-
- // Do the kill
- gObjectList.killObject(objectp);
+ LLColor4 color(0.f,1.f,0.f,1.f);
+ gPipeline.addDebugBlip(objectp->getPositionAgent(), color);
+ LL_DEBUGS("MessageBlip") << "Kill blip for local " << local_id << " at " << objectp->getPositionAgent() << LL_ENDL;
}
- if(delete_object)
- {
- regionp->killCacheEntry(local_id);
+ // Do the kill
+ gObjectList.killObject(objectp);
+ }
+
+ if(delete_object)
+ {
+ regionp->killCacheEntry(local_id);
}
// We should remove the object from selection after it is marked dead by gObjectList to make LLToolGrab,
// which is using the object, release the mouse capture correctly when the object dies.
// See LLToolGrab::handleHoverActive() and LLToolGrab::handleHoverNonPhysical().
LLSelectMgr::getInstance()->removeObjectFromSelections(id);
- }
+
+ } // end for loop
+
+ LLViewerStatsRecorder::instance().recordObjectKills(num_objects);
}
void process_time_synch(LLMessageSystem *mesgsys, void **user_data)
@@ -5157,6 +5186,11 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem)
LandBuyAccessBlocked_AdultsOnlyContent
-----------------------------------------------------------------------*/
+ static LLCachedControl<S32> ban_lines_mode(gSavedSettings , "ShowBanLines" , LLViewerParcelMgr::PARCEL_BAN_LINES_ON_COLLISION);
+ if (ban_lines_mode == LLViewerParcelMgr::PARCEL_BAN_LINES_ON_COLLISION)
+ {
+ LLViewerParcelMgr::getInstance()->resetCollisionTimer();
+ }
if (handle_special_notification(notificationID, llsdBlock))
{
return true;
@@ -5325,6 +5359,13 @@ void process_alert_message(LLMessageSystem *msgsystem, void **user_data)
{
BOOL modal = FALSE;
process_alert_core(message, modal);
+
+ static LLCachedControl<S32> ban_lines_mode(gSavedSettings , "ShowBanLines" , LLViewerParcelMgr::PARCEL_BAN_LINES_ON_COLLISION);
+ if (ban_lines_mode == LLViewerParcelMgr::PARCEL_BAN_LINES_ON_COLLISION
+ && message.find("Cannot enter parcel") != std::string::npos)
+ {
+ LLViewerParcelMgr::getInstance()->resetCollisionTimer();
+ }
}
}
@@ -5908,42 +5949,47 @@ void container_inventory_arrived(LLViewerObject* object,
{
// create a new inventory category to put this in
LLUUID cat_id;
- cat_id = gInventory.createNewCategory(gInventory.getRootFolderID(),
- LLFolderType::FT_NONE,
- LLTrans::getString("AcquiredItems"));
+ gInventory.createNewCategory(
+ gInventory.getRootFolderID(),
+ LLFolderType::FT_NONE,
+ LLTrans::getString("AcquiredItems"),
+ [inventory](const LLUUID &new_cat_id)
+ {
+ LLInventoryObject::object_list_t::const_iterator it = inventory->begin();
+ LLInventoryObject::object_list_t::const_iterator end = inventory->end();
+ for (; it != end; ++it)
+ {
+ if ((*it)->getType() != LLAssetType::AT_CATEGORY)
+ {
+ LLInventoryObject* obj = (LLInventoryObject*)(*it);
+ LLInventoryItem* item = (LLInventoryItem*)(obj);
+ LLUUID item_id;
+ item_id.generate();
+ time_t creation_date_utc = time_corrected();
+ LLPointer<LLViewerInventoryItem> new_item
+ = new LLViewerInventoryItem(item_id,
+ new_cat_id,
+ item->getPermissions(),
+ item->getAssetUUID(),
+ item->getType(),
+ item->getInventoryType(),
+ item->getName(),
+ item->getDescription(),
+ LLSaleInfo::DEFAULT,
+ item->getFlags(),
+ creation_date_utc);
+ new_item->updateServer(TRUE);
+ gInventory.updateItem(new_item);
+ }
+ }
+ gInventory.notifyObservers();
- LLInventoryObject::object_list_t::const_iterator it = inventory->begin();
- LLInventoryObject::object_list_t::const_iterator end = inventory->end();
- for ( ; it != end; ++it)
- {
- if ((*it)->getType() != LLAssetType::AT_CATEGORY)
- {
- LLInventoryObject* obj = (LLInventoryObject*)(*it);
- LLInventoryItem* item = (LLInventoryItem*)(obj);
- LLUUID item_id;
- item_id.generate();
- time_t creation_date_utc = time_corrected();
- LLPointer<LLViewerInventoryItem> new_item
- = new LLViewerInventoryItem(item_id,
- cat_id,
- item->getPermissions(),
- item->getAssetUUID(),
- item->getType(),
- item->getInventoryType(),
- item->getName(),
- item->getDescription(),
- LLSaleInfo::DEFAULT,
- item->getFlags(),
- creation_date_utc);
- new_item->updateServer(TRUE);
- gInventory.updateItem(new_item);
- }
- }
- gInventory.notifyObservers();
- if(active_panel)
- {
- active_panel->setSelection(cat_id, TAKE_FOCUS_NO);
- }
+ LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
+ if (active_panel)
+ {
+ active_panel->setSelection(new_cat_id, TAKE_FOCUS_NO);
+ }
+ });
}
else if (inventory->size() == 2)
{
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index d21d6f7027..a1d068461e 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -63,7 +63,6 @@
#include "llcontrolavatar.h"
#include "lldrawable.h"
#include "llface.h"
-#include "llfloaterproperties.h"
#include "llfloatertools.h"
#include "llfollowcam.h"
#include "llhudtext.h"
@@ -3486,9 +3485,6 @@ void LLViewerObject::doInventoryCallback()
void LLViewerObject::removeInventory(const LLUUID& item_id)
{
- // close any associated floater properties
- LLFloaterReg::hideInstance("properties", item_id);
-
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_RemoveTaskInventory);
msg->nextBlockFast(_PREHASH_AgentData);
@@ -3610,6 +3606,17 @@ LLInventoryObject* LLViewerObject::getInventoryObject(const LLUUID& item_id)
return rv;
}
+LLInventoryItem* LLViewerObject::getInventoryItem(const LLUUID& item_id)
+{
+ LLInventoryObject* iobj = getInventoryObject(item_id);
+ if (!iobj || iobj->getType() == LLAssetType::AT_CATEGORY)
+ {
+ return NULL;
+ }
+ LLInventoryItem* item = dynamic_cast<LLInventoryItem*>(iobj);
+ return item;
+}
+
void LLViewerObject::getInventoryContents(LLInventoryObject::object_list_t& objects)
{
if(mInventory)
@@ -6232,8 +6239,7 @@ LLViewerObject::ExtraParameter* LLViewerObject::createNewParameterEntry(U16 para
}
default:
{
- llassert(false); // invalid parameter type
- LL_INFOS() << "Unknown param type." << LL_ENDL;
+ LL_INFOS_ONCE() << "Unknown param type: " << param_type << LL_ENDL;
break;
}
};
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index 3665c64965..898b21e1ae 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -494,6 +494,7 @@ public:
void updateInventoryLocal(LLInventoryItem* item, U8 key); // Update without messaging.
void updateMaterialInventory(LLViewerInventoryItem* item, U8 key, bool is_new);
LLInventoryObject* getInventoryObject(const LLUUID& item_id);
+ LLInventoryItem* getInventoryItem(const LLUUID& item_id);
// Get content except for root category
void getInventoryContents(LLInventoryObject::object_list_t& objects);
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index ce4f9b7e64..5bc7523be1 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -369,7 +369,7 @@ LLViewerObject* LLViewerObjectList::processObjectUpdateFromCache(LLVOCacheEntry*
if (!objectp)
{
LL_INFOS() << "createObject failure for object: " << fullid << LL_ENDL;
- recorder.objectUpdateFailure(entry->getLocalID(), OUT_FULL_CACHED, 0);
+ recorder.objectUpdateFailure();
return NULL;
}
justCreated = true;
@@ -393,7 +393,6 @@ LLViewerObject* LLViewerObjectList::processObjectUpdateFromCache(LLVOCacheEntry*
objectp->setLastUpdateType(OUT_FULL_COMPRESSED); //newly cached
objectp->setLastUpdateCached(TRUE);
}
- recorder.log(0.2f);
LLVOAvatar::cullAvatarsByPixelArea();
return objectp;
@@ -472,18 +471,14 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
for (i = 0; i < num_objects; i++)
{
- // timer is unused?
- LLTimer update_timer;
BOOL justCreated = FALSE;
- S32 msg_size = 0;
bool update_cache = false; //update object cache if it is a full-update or terse update
if (compressed)
{
- S32 uncompressed_length = 2048;
compressed_dp.reset();
- uncompressed_length = mesgsys->getSizeFast(_PREHASH_ObjectData, i, _PREHASH_Data);
+ S32 uncompressed_length = mesgsys->getSizeFast(_PREHASH_ObjectData, i, _PREHASH_Data);
LL_DEBUGS("ObjectUpdate") << "got binary data from message to compressed_dpbuffer" << LL_ENDL;
mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_Data, compressed_dpbuffer, 0, i, 2048);
compressed_dp.assignBuffer(compressed_dpbuffer, uncompressed_length);
@@ -505,7 +500,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
<< " Flags: " << flags
<< " Region: " << regionp->getName()
<< " Region id: " << regionp->getRegionID() << LL_ENDL;
- recorder.objectUpdateFailure(local_id, update_type, msg_size);
+ recorder.objectUpdateFailure();
continue;
}
else if ((flags & FLAGS_TEMPORARY_ON_REZ) == 0)
@@ -533,7 +528,6 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
else if (update_type != OUT_FULL) // !compressed, !OUT_FULL ==> OUT_FULL_CACHED only?
{
mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_ID, local_id, i);
- msg_size += sizeof(U32);
getUUIDFromLocal(fullid,
local_id,
@@ -554,8 +548,6 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
update_cache = true;
mesgsys->getUUIDFast(_PREHASH_ObjectData, _PREHASH_FullID, fullid, i);
mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_ID, local_id, i);
- msg_size += sizeof(LLUUID);
- msg_size += sizeof(U32);
LL_DEBUGS("ObjectUpdate") << "Full Update, obj " << local_id << ", global ID " << fullid << " from " << mesgsys->getSender() << LL_ENDL;
}
objectp = findObject(fullid);
@@ -616,7 +608,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
if (update_type == OUT_TERSE_IMPROVED)
{
// LL_INFOS() << "terse update for an unknown object (compressed):" << fullid << LL_ENDL;
- recorder.objectUpdateFailure(local_id, update_type, msg_size);
+ recorder.objectUpdateFailure();
continue;
}
}
@@ -625,12 +617,11 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
if (update_type != OUT_FULL)
{
//LL_INFOS() << "terse update for an unknown object:" << fullid << LL_ENDL;
- recorder.objectUpdateFailure(local_id, update_type, msg_size);
+ recorder.objectUpdateFailure();
continue;
}
mesgsys->getU8Fast(_PREHASH_ObjectData, _PREHASH_PCode, pcode, i);
- msg_size += sizeof(U8);
}
#ifdef IGNORE_DEAD
@@ -638,7 +629,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
{
mNumDeadObjectUpdates++;
//LL_INFOS() << "update for a dead object:" << fullid << LL_ENDL;
- recorder.objectUpdateFailure(local_id, update_type, msg_size);
+ recorder.objectUpdateFailure();
continue;
}
#endif
@@ -651,7 +642,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
if (!objectp)
{
LL_INFOS() << "createObject failure for object: " << fullid << LL_ENDL;
- recorder.objectUpdateFailure(local_id, update_type, msg_size);
+ recorder.objectUpdateFailure();
continue;
}
@@ -681,11 +672,11 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
if(!(flags & FLAGS_TEMPORARY_ON_REZ))
{
- bCached = true;
+ bCached = true;
LLViewerRegion::eCacheUpdateResult result = objectp->mRegionp->cacheFullUpdate(objectp, compressed_dp, flags);
- recorder.cacheFullUpdate(local_id, update_type, result, objectp, msg_size);
+ recorder.cacheFullUpdate(result);
+ }
}
- }
#endif
}
else
@@ -696,12 +687,10 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
}
processUpdateCore(objectp, user_data, i, update_type, NULL, justCreated);
}
- recorder.objectUpdateEvent(local_id, update_type, objectp, msg_size);
+ recorder.objectUpdateEvent(update_type);
objectp->setLastUpdateType(update_type);
}
- recorder.log(0.2f);
-
LLVOAvatar::cullAvatarsByPixelArea();
}
@@ -734,28 +723,26 @@ void LLViewerObjectList::processCachedObjectUpdate(LLMessageSystem *mesgsys,
for (S32 i = 0; i < num_objects; i++)
{
- S32 msg_size = 0;
U32 id;
U32 crc;
U32 flags;
mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_ID, id, i);
mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_CRC, crc, i);
mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_UpdateFlags, flags, i);
- msg_size += sizeof(U32) * 2;
LL_DEBUGS("ObjectUpdate") << "got probe for id " << id << " crc " << crc << LL_ENDL;
dumpStack("ObjectUpdateStack");
// Lookup data packer and add this id to cache miss lists if necessary.
U8 cache_miss_type = LLViewerRegion::CACHE_MISS_TYPE_NONE;
- if(!regionp->probeCache(id, crc, flags, cache_miss_type))
- {
- // Cache Miss.
+ if (regionp->probeCache(id, crc, flags, cache_miss_type))
+ { // Cache Hit
+ recorder.cacheHitEvent();
+ }
+ else
+ { // Cache Miss
LL_DEBUGS("ObjectUpdate") << "cache miss for id " << id << " crc " << crc << " miss type " << (S32) cache_miss_type << LL_ENDL;
-
- recorder.cacheMissEvent(id, update_type, cache_miss_type, msg_size);
-
- continue; // no data packer, skip this object
+ recorder.cacheMissEvent(cache_miss_type);
}
}
@@ -773,7 +760,6 @@ void LLViewerObjectList::dirtyAllObjectInventory()
void LLViewerObjectList::updateApparentAngles(LLAgent &agent)
{
S32 i;
- S32 num_objects = 0;
LLViewerObject *objectp;
S32 num_updates, max_value;
@@ -795,8 +781,6 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent)
objectp = mObjects[i];
if (!objectp->isDead())
{
- num_objects++;
-
// Update distance & gpw
objectp->setPixelAreaAndAngle(agent); // Also sets the approx. pixel area
objectp->updateTextures(); // Update the image levels of textures for this object.
diff --git a/indra/newview/llvieweroctree.cpp b/indra/newview/llvieweroctree.cpp
index a2d8d30fb2..9d63241300 100644
--- a/indra/newview/llvieweroctree.cpp
+++ b/indra/newview/llvieweroctree.cpp
@@ -627,13 +627,17 @@ void LLViewerOctreeGroup::handleRemoval(const TreeNode* node, LLViewerOctreeEntr
//virtual
void LLViewerOctreeGroup::handleDestruction(const TreeNode* node)
{
+ if (isDead())
+ {
+ return;
+ }
+ setState(DEAD);
for (OctreeNode::element_iter i = mOctreeNode->getDataBegin(); i != mOctreeNode->getDataEnd(); ++i)
{
LLViewerOctreeEntry* obj = *i;
if (obj && obj->getGroup() == this)
{
obj->nullGroup();
- //obj->setGroup(NULL);
}
}
mOctreeNode = NULL;
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index 97dc916bfe..15accd0547 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -72,12 +72,16 @@
#include "llenvironment.h"
-const F32 PARCEL_COLLISION_DRAW_SECS = 1.f;
+const F32 PARCEL_BAN_LINES_DRAW_SECS_ON_COLLISION = 10.f;
+const F32 PARCEL_COLLISION_DRAW_SECS_ON_PROXIMITY = 1.f;
// Globals
U8* LLViewerParcelMgr::sPackedOverlay = NULL;
+S32 LLViewerParcelMgr::PARCEL_BAN_LINES_HIDE = 0;
+S32 LLViewerParcelMgr::PARCEL_BAN_LINES_ON_COLLISION = 1;
+S32 LLViewerParcelMgr::PARCEL_BAN_LINES_ON_PROXIMITY = 2;
LLUUID gCurrentMovieID = LLUUID::null;
@@ -892,13 +896,18 @@ void LLViewerParcelMgr::render()
void LLViewerParcelMgr::renderParcelCollision()
{
+ static LLCachedControl<S32> ban_lines_mode(gSavedSettings , "ShowBanLines" , PARCEL_BAN_LINES_ON_COLLISION);
+
// check for expiration
- if (mCollisionTimer.getElapsedTimeF32() > PARCEL_COLLISION_DRAW_SECS)
+ F32 expiration = (ban_lines_mode == PARCEL_BAN_LINES_ON_PROXIMITY)
+ ? PARCEL_COLLISION_DRAW_SECS_ON_PROXIMITY
+ : PARCEL_BAN_LINES_DRAW_SECS_ON_COLLISION;
+ if (mCollisionTimer.getElapsedTimeF32() > expiration)
{
- mRenderCollision = FALSE;
+ mRenderCollision = false;
}
- if (mRenderCollision && gSavedSettings.getBOOL("ShowBanLines"))
+ if (mRenderCollision && ban_lines_mode != PARCEL_BAN_LINES_HIDE)
{
LLViewerRegion* regionp = gAgent.getRegion();
if (regionp)
@@ -1842,8 +1851,11 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
sequence_id == COLLISION_BANNED_PARCEL_SEQ_ID)
{
// We're about to collide with this parcel
- parcel_mgr.mRenderCollision = TRUE;
- parcel_mgr.mCollisionTimer.reset();
+ static LLCachedControl<S32> ban_lines_mode(gSavedSettings , "ShowBanLines" , PARCEL_BAN_LINES_ON_COLLISION);
+ if (ban_lines_mode == PARCEL_BAN_LINES_ON_PROXIMITY)
+ {
+ parcel_mgr.resetCollisionTimer();
+ }
// Differentiate this parcel if we are banned from it.
if (sequence_id == COLLISION_BANNED_PARCEL_SEQ_ID)
diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h
index 6ce389ab88..56dacd3efd 100644
--- a/indra/newview/llviewerparcelmgr.h
+++ b/indra/newview/llviewerparcelmgr.h
@@ -205,6 +205,11 @@ public:
void renderHighlightSegments(const U8* segments, LLViewerRegion* regionp);
void renderCollisionSegments(U8* segments, BOOL use_pass, LLViewerRegion* regionp);
+ static S32 PARCEL_BAN_LINES_HIDE;
+ static S32 PARCEL_BAN_LINES_ON_COLLISION;
+ static S32 PARCEL_BAN_LINES_ON_PROXIMITY;
+ void resetCollisionTimer(); // Ban lines visibility timer
+
void sendParcelGodForceOwner(const LLUUID& owner_id);
// make the selected parcel a content parcel.
@@ -361,7 +366,7 @@ private:
// If it's coming, draw the parcel's boundaries.
LLParcel* mCollisionParcel;
U8* mCollisionSegments;
- BOOL mRenderCollision;
+ bool mRenderCollision;
BOOL mRenderSelection;
S32 mCollisionBanned;
LLFrameTimer mCollisionTimer;
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 9d3e63333e..d54ce2234d 100755
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -105,6 +105,9 @@ S32 LLViewerRegion::sLastCameraUpdated = 0;
S32 LLViewerRegion::sNewObjectCreationThrottle = -1;
LLViewerRegion::vocache_entry_map_t LLViewerRegion::sRegionCacheCleanup;
+const std::string LLViewerRegion::IL_MODE_DEFAULT = "default";
+const std::string LLViewerRegion::IL_MODE_360 = "360";
+
typedef std::map<std::string, std::string> CapabilityMap;
static void log_capabilities(const CapabilityMap &capmap);
@@ -132,8 +135,8 @@ class LLRegionHandler : public LLCommandHandler
public:
// requests will be throttled from a non-trusted browser
LLRegionHandler() : LLCommandHandler("region", UNTRUSTED_THROTTLE) {}
-
- bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
+
+ bool handle(const LLSD& params, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web)
{
// make sure that we at least have a region name
int num_params = params.size();
@@ -144,6 +147,10 @@ public:
// build a secondlife://{PLACE} SLurl from this SLapp
std::string url = "secondlife://";
+ if (!grid.empty())
+ {
+ url += grid + "/secondlife/";
+ }
boost::regex name_rx("[A-Za-z0-9()_%]+");
boost::regex coord_rx("[0-9]+");
for (int i = 0; i < num_params; i++)
@@ -215,7 +222,7 @@ public:
LLVOCacheEntry::vocache_entry_set_t mVisibleEntries; //must-be-created visible entries wait for objects creation.
LLVOCacheEntry::vocache_entry_priority_list_t mWaitingList; //transient list storing sorted visible entries waiting for object creation.
std::set<U32> mNonCacheableCreatedList; //list of local ids of all non-cacheable objects
- LLVOCacheEntry::vocache_gltf_overrides_map_t mGLTFOverridesJson; // for materials
+ LLVOCacheEntry::vocache_gltf_overrides_map_t mGLTFOverridesLLSD; // for materials
// time?
// LRU info?
@@ -644,7 +651,8 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
mInvisibilityCheckHistory(-1),
mPaused(FALSE),
mRegionCacheHitCount(0),
- mRegionCacheMissCount(0)
+ mRegionCacheMissCount(0),
+ mInterestListMode(IL_MODE_DEFAULT)
{
mWidth = region_width_meters;
mImpl->mOriginGlobal = from_region_handle(handle);
@@ -787,7 +795,7 @@ void LLViewerRegion::loadObjectCache()
{
LLVOCache & vocache = LLVOCache::instance();
vocache.readFromCache(mHandle, mImpl->mCacheID, mImpl->mCacheMap);
- vocache.readGenericExtrasFromCache(mHandle, mImpl->mCacheID, mImpl->mGLTFOverridesJson);
+ vocache.readGenericExtrasFromCache(mHandle, mImpl->mCacheID, mImpl->mGLTFOverridesLLSD);
if (mImpl->mCacheMap.empty())
{
@@ -817,7 +825,7 @@ void LLViewerRegion::saveObjectCache()
LLVOCache & instance = LLVOCache::instance();
instance.writeToCache(mHandle, mImpl->mCacheID, mImpl->mCacheMap, mCacheDirty, removal_enabled);
- instance.writeGenericExtrasToCache(mHandle, mImpl->mCacheID, mImpl->mGLTFOverridesJson, mCacheDirty, removal_enabled);
+ instance.writeGenericExtrasToCache(mHandle, mImpl->mCacheID, mImpl->mGLTFOverridesLLSD, mCacheDirty, removal_enabled);
mCacheDirty = FALSE;
}
@@ -2656,7 +2664,7 @@ LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObjec
void LLViewerRegion::cacheFullUpdateGLTFOverride(const LLGLTFOverrideCacheEntry &override_data)
{
U32 local_id = override_data.mLocalId;
- mImpl->mGLTFOverridesJson[local_id] = override_data;
+ mImpl->mGLTFOverridesLLSD[local_id] = override_data;
}
LLVOCacheEntry* LLViewerRegion::getCacheEntryForOctree(U32 local_id)
@@ -2685,14 +2693,10 @@ LLVOCacheEntry* LLViewerRegion::getCacheEntry(U32 local_id, bool valid)
return NULL;
}
-void LLViewerRegion::addCacheMiss(U32 id, LLViewerRegion::eCacheMissType miss_type)
+void LLViewerRegion::addCacheMiss(U32 id, LLViewerRegion::eCacheMissType cache_miss_type)
{
mRegionCacheMissCount++;
-#if 0
- mCacheMissList.insert(CacheMissItem(id, miss_type));
-#else
- mCacheMissList.push_back(CacheMissItem(id, miss_type));
-#endif
+ mCacheMissList.push_back(CacheMissItem(id, cache_miss_type));
}
//check if a non-cacheable object is already created.
@@ -2771,10 +2775,10 @@ bool LLViewerRegion::probeCache(U32 local_id, U32 crc, U32 flags, U8 &cache_miss
}
}
else
- {
+ { // Total miss, don't have the object in cache
// LL_INFOS() << "Cache miss for " << local_id << LL_ENDL;
- addCacheMiss(local_id, CACHE_MISS_TYPE_FULL);
- cache_miss_type = CACHE_MISS_TYPE_FULL;
+ addCacheMiss(local_id, CACHE_MISS_TYPE_TOTAL);
+ cache_miss_type = CACHE_MISS_TYPE_TOTAL;
}
return false;
@@ -2782,7 +2786,7 @@ bool LLViewerRegion::probeCache(U32 local_id, U32 crc, U32 flags, U8 &cache_miss
void LLViewerRegion::addCacheMissFull(const U32 local_id)
{
- addCacheMiss(local_id, CACHE_MISS_TYPE_FULL);
+ addCacheMiss(local_id, CACHE_MISS_TYPE_TOTAL);
}
void LLViewerRegion::requestCacheMisses()
@@ -2833,7 +2837,6 @@ void LLViewerRegion::requestCacheMisses()
mCacheDirty = TRUE ;
// LL_INFOS() << "KILLDEBUG Sent cache miss full " << full_count << " crc " << crc_count << LL_ENDL;
LLViewerStatsRecorder::instance().requestCacheMissesEvent(mCacheMissList.size());
- LLViewerStatsRecorder::instance().log(0.2f);
mCacheMissList.clear();
}
@@ -3095,6 +3098,7 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames)
capabilityNames.append("InterestList");
+ capabilityNames.append("InventoryThumbnailUpload");
capabilityNames.append("GetDisplayNames");
capabilityNames.append("GetExperiences");
capabilityNames.append("AgentExperiences");
@@ -3358,6 +3362,9 @@ void LLViewerRegion::setCapabilitiesReceived(bool received)
// This is a single-shot signal. Forget callbacks to save resources.
mCapabilitiesReceivedSignal.disconnect_all_slots();
+
+ // Set the region to the desired interest list mode
+ setInterestListMode(gAgent.getInterestListMode());
}
}
@@ -3376,7 +3383,111 @@ void LLViewerRegion::logActiveCapabilities() const
log_capabilities(mImpl->mCapabilities);
}
-LLSpatialPartition* LLViewerRegion::getSpatialPartition(U32 type)
+
+bool LLViewerRegion::requestPostCapability(const std::string &capName, LLSD &postData, httpCallback_t cbSuccess, httpCallback_t cbFailure)
+{
+ std::string url = getCapability(capName);
+
+ if (url.empty())
+ {
+ LL_WARNS("Region") << "Could not retrieve region " << getRegionID()
+ << " POST capability \"" << capName << "\"" << LL_ENDL;
+ return false;
+ }
+
+ LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpPost(url, gAgent.getAgentPolicy(), postData, cbSuccess, cbFailure);
+ return true;
+}
+
+bool LLViewerRegion::requestGetCapability(const std::string &capName, httpCallback_t cbSuccess, httpCallback_t cbFailure)
+{
+ std::string url;
+
+ url = getCapability(capName);
+
+ if (url.empty())
+ {
+ LL_WARNS("Region") << "Could not retrieve region " << getRegionID()
+ << " GET capability \"" << capName << "\"" << LL_ENDL;
+ return false;
+ }
+
+ LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpGet(url, gAgent.getAgentPolicy(), cbSuccess, cbFailure);
+ return true;
+}
+
+bool LLViewerRegion::requestDelCapability(const std::string &capName, httpCallback_t cbSuccess, httpCallback_t cbFailure)
+{
+ std::string url;
+
+ url = getCapability(capName);
+
+ if (url.empty())
+ {
+ LL_WARNS("Region") << "Could not retrieve region " << getRegionID() << " DEL capability \"" << capName << "\"" << LL_ENDL;
+ return false;
+ }
+
+ LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpDel(url, gAgent.getAgentPolicy(), cbSuccess, cbFailure);
+ return true;
+}
+
+void LLViewerRegion::setInterestListMode(const std::string &new_mode)
+{
+ if (new_mode != mInterestListMode)
+ {
+ mInterestListMode = new_mode;
+
+ if (mInterestListMode != std::string(IL_MODE_DEFAULT) && mInterestListMode != std::string(IL_MODE_360))
+ {
+ LL_WARNS("360Capture") << "Region " << getRegionID() << " setInterestListMode() invalid interest list mode: "
+ << mInterestListMode << ", setting to default" << LL_ENDL;
+ mInterestListMode = IL_MODE_DEFAULT;
+ }
+
+ LLSD body;
+ body["mode"] = mInterestListMode;
+ if (requestPostCapability("InterestList", body,
+ [](const LLSD &response) {
+ LL_DEBUGS("360Capture") << "InterestList capability responded: \n"
+ << ll_pretty_print_sd(response) << LL_ENDL;
+ }))
+ {
+ LL_DEBUGS("360Capture") << "Region " << getRegionID()
+ << " Successfully posted an InterestList capability request with payload: \n"
+ << ll_pretty_print_sd(body) << LL_ENDL;
+ }
+ else
+ {
+ LL_WARNS("360Capture") << "Region " << getRegionID()
+ << " Unable to post an InterestList capability request with payload: \n"
+ << ll_pretty_print_sd(body) << LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_DEBUGS("360Capture") << "Region " << getRegionID() << "No change, skipping Interest List mode POST to "
+ << new_mode << " mode" << LL_ENDL;
+ }
+}
+
+
+void LLViewerRegion::resetInterestList()
+{
+ if (requestDelCapability("InterestList", [](const LLSD &response) {
+ LL_DEBUGS("360Capture") << "InterestList capability DEL responded: \n" << ll_pretty_print_sd(response) << LL_ENDL;
+ }))
+ {
+ LL_DEBUGS("360Capture") << "Region " << getRegionID() << " Successfully reset InterestList capability" << LL_ENDL;
+ }
+ else
+ {
+ LL_WARNS("360Capture") << "Region " << getRegionID() << " Unable to DEL InterestList capability request" << LL_ENDL;
+ }
+}
+
+
+LLSpatialPartition *LLViewerRegion::getSpatialPartition(U32 type)
{
if (type < mImpl->mObjectPartition.size() && type < PARTITION_VO_CACHE)
{
@@ -3546,8 +3657,8 @@ std::string LLViewerRegion::getSimHostName()
void LLViewerRegion::loadCacheMiscExtras(U32 local_id)
{
- auto iter = mImpl->mGLTFOverridesJson.find(local_id);
- if (iter != mImpl->mGLTFOverridesJson.end())
+ auto iter = mImpl->mGLTFOverridesLLSD.find(local_id);
+ if (iter != mImpl->mGLTFOverridesLLSD.end())
{
LLGLTFMaterialList::loadCacheOverrides(iter->second);
}
@@ -3559,8 +3670,8 @@ void LLViewerRegion::applyCacheMiscExtras(LLViewerObject* obj)
llassert(obj);
U32 local_id = obj->getLocalID();
- auto iter = mImpl->mGLTFOverridesJson.find(local_id);
- if (iter != mImpl->mGLTFOverridesJson.end())
+ auto iter = mImpl->mGLTFOverridesLLSD.find(local_id);
+ if (iter != mImpl->mGLTFOverridesLLSD.end())
{
llassert(iter->second.mGLTFMaterial.size() == iter->second.mSides.size());
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index fe0fdfb930..a409d837a4 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -32,6 +32,7 @@
#include <string>
#include <boost/signals2.hpp>
+#include "llcorehttputil.h"
#include "llwind.h"
#include "v3dmath.h"
#include "llstring.h"
@@ -280,6 +281,16 @@ public:
static bool isSpecialCapabilityName(const std::string &name);
void logActiveCapabilities() const;
+ // Utilities to post and get via
+ // HTTP using the agent's policy settings and headers.
+ typedef LLCoreHttpUtil::HttpCoroutineAdapter::completionCallback_t httpCallback_t;
+ bool requestPostCapability(const std::string &capName,
+ LLSD &postData,
+ httpCallback_t cbSuccess = NULL,
+ httpCallback_t cbFailure = NULL);
+ bool requestGetCapability(const std::string &capName, httpCallback_t cbSuccess = NULL, httpCallback_t cbFailure = NULL);
+ bool requestDelCapability(const std::string &capName, httpCallback_t cbSuccess = NULL, httpCallback_t cbFailure = NULL);
+
/// implements LLCapabilityProvider
/*virtual*/ const LLHost& getHost() const;
const U64 &getHandle() const { return mHandle; }
@@ -334,9 +345,9 @@ public:
typedef enum
{
- CACHE_MISS_TYPE_FULL = 0,
- CACHE_MISS_TYPE_CRC,
- CACHE_MISS_TYPE_NONE
+ CACHE_MISS_TYPE_TOTAL = 0, // total cache miss - object not in cache
+ CACHE_MISS_TYPE_CRC, // object in cache, but CRC doesn't match
+ CACHE_MISS_TYPE_NONE // not a miss: cache hit
} eCacheMissType;
typedef enum
@@ -489,7 +500,15 @@ public:
};
typedef std::set<LLViewerRegion*, CompareRegionByLastUpdate> region_priority_list_t;
-private:
+ void setInterestListMode(const std::string & new_mode);
+ const std::string & getInterestListMode() const { return mInterestListMode; }
+
+ void resetInterestList();
+
+ static const std::string IL_MODE_DEFAULT;
+ static const std::string IL_MODE_360;
+
+ private:
static S32 sNewObjectCreationThrottle;
LLViewerRegionImpl * mImpl;
LLFrameTimer mRegionTimer;
@@ -563,10 +582,10 @@ private:
class CacheMissItem
{
public:
- CacheMissItem(U32 id, LLViewerRegion::eCacheMissType miss_type) : mID(id), mType(miss_type){}
+ CacheMissItem(U32 id, LLViewerRegion::eCacheMissType miss_type) : mID(id), mType(miss_type) {}
- U32 mID; //local object id
- LLViewerRegion::eCacheMissType mType; //cache miss type
+ U32 mID; //local object id
+ LLViewerRegion::eCacheMissType mType; // cache miss type
typedef std::list<CacheMissItem> cache_miss_list_t;
};
@@ -587,6 +606,9 @@ private:
LLFrameTimer mRenderInfoRequestTimer;
LLFrameTimer mRenderInfoReportTimer;
+ // how the server interest list works
+ std::string mInterestListMode;
+
// list of reflection maps being managed by this llviewer region
std::vector<LLPointer<LLReflectionMap> > mReflectionMaps;
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index d545ef97fd..9bd5814ed4 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -420,9 +420,6 @@ void LLViewerShaderMgr::setShaders()
gViewerWindow->setCursor(UI_CURSOR_WAIT);
}
- // Lighting
- gPipeline.setLightingDetail(-1);
-
// Shaders
LL_INFOS("ShaderLoading") << "\n~~~~~~~~~~~~~~~~~~\n Loading Shaders:\n~~~~~~~~~~~~~~~~~~" << LL_ENDL;
LL_INFOS("ShaderLoading") << llformat("Using GLSL %d.%d", gGLManager.mGLSLVersionMajor, gGLManager.mGLSLVersionMinor) << LL_ENDL;
@@ -587,21 +584,6 @@ std::string LLViewerShaderMgr::loadBasicShaders()
S32 sum_lights_class = 3;
- // class one cards will get the lower sum lights
- // class zero we're not going to think about
- // since a class zero card COULD be a ridiculous new card
- // and old cards should have the features masked
- if(LLFeatureManager::getInstance()->getGPUClass() == GPU_CLASS_1)
- {
- sum_lights_class = 2;
- }
-
- // If we have sun and moon only checked, then only sum those lights.
- if (gPipeline.getLightingDetail() == 0)
- {
- sum_lights_class = 1;
- }
-
#if LL_DARWIN
// Work around driver crashes on older Macs when using deferred rendering
// NORSPEC-59
@@ -643,30 +625,12 @@ std::string LLViewerShaderMgr::loadBasicShaders()
attribs["MAX_JOINTS_PER_MESH_OBJECT"] =
boost::lexical_cast<std::string>(LLSkinningUtil::getMaxJointCount());
- BOOL ambient_kill = gSavedSettings.getBOOL("AmbientDisable");
- BOOL sunlight_kill = gSavedSettings.getBOOL("SunlightDisable");
- BOOL local_light_kill = gSavedSettings.getBOOL("LocalLightDisable");
BOOL ssr = gSavedSettings.getBOOL("RenderScreenSpaceReflections");
bool has_reflection_probes = gSavedSettings.getBOOL("RenderReflectionsEnabled") && gGLManager.mGLVersion > 3.99f;
S32 probe_level = llclamp(gSavedSettings.getS32("RenderReflectionProbeLevel"), 0, 3);
- if (ambient_kill)
- {
- attribs["AMBIENT_KILL"] = "1";
- }
-
- if (sunlight_kill)
- {
- attribs["SUNLIGHT_KILL"] = "1";
- }
-
- if (local_light_kill)
- {
- attribs["LOCAL_LIGHT_KILL"] = "1";
- }
-
S32 shadow_detail = gSavedSettings.getS32("RenderShadowDetail");
if (shadow_detail >= 1)
@@ -915,11 +879,20 @@ BOOL LLViewerShaderMgr::loadShadersEffects()
if (success)
{
- gGlowExtractProgram.mName = "Glow Extract Shader (Post)";
+ const bool use_glow_noise = gSavedSettings.getBOOL("RenderGlowNoise");
+ const std::string glow_noise_label = use_glow_noise ? " (+Noise)" : "";
+
+ gGlowExtractProgram.mName = llformat("Glow Extract Shader (Post)%s", glow_noise_label.c_str());
gGlowExtractProgram.mShaderFiles.clear();
gGlowExtractProgram.mShaderFiles.push_back(make_pair("effects/glowExtractV.glsl", GL_VERTEX_SHADER));
gGlowExtractProgram.mShaderFiles.push_back(make_pair("effects/glowExtractF.glsl", GL_FRAGMENT_SHADER));
gGlowExtractProgram.mShaderLevel = mShaderLevel[SHADER_EFFECT];
+
+ if (use_glow_noise)
+ {
+ gGlowExtractProgram.addPermutation("HAS_NOISE", "1");
+ }
+
success = gGlowExtractProgram.createShader(NULL, NULL);
if (!success)
{
@@ -937,10 +910,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
bool use_sun_shadow = mShaderLevel[SHADER_DEFERRED] > 1 &&
gSavedSettings.getS32("RenderShadowDetail") > 0;
- BOOL ambient_kill = gSavedSettings.getBOOL("AmbientDisable");
- BOOL sunlight_kill = gSavedSettings.getBOOL("SunlightDisable");
- BOOL local_light_kill = gSavedSettings.getBOOL("LocalLightDisable");
-
if (mShaderLevel[SHADER_DEFERRED] == 0)
{
gDeferredTreeProgram.unload();
@@ -1171,21 +1140,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredMaterialProgram[i].addPermutation("HAS_SPECULAR_MAP", "1");
}
- if (ambient_kill)
- {
- gDeferredMaterialProgram[i].addPermutation("AMBIENT_KILL", "1");
- }
-
- if (sunlight_kill)
- {
- gDeferredMaterialProgram[i].addPermutation("SUNLIGHT_KILL", "1");
- }
-
- if (local_light_kill)
- {
- gDeferredMaterialProgram[i].addPermutation("LOCAL_LIGHT_KILL", "1");
- }
-
gDeferredMaterialProgram[i].addPermutation("DIFFUSE_ALPHA_MODE", llformat("%d", alpha_mode));
if (alpha_mode != 0)
@@ -1274,21 +1228,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
}
gDeferredMaterialWaterProgram[i].addPermutation("WATER_FOG","1");
- if (ambient_kill)
- {
- gDeferredMaterialWaterProgram[i].addPermutation("AMBIENT_KILL", "1");
- }
-
- if (sunlight_kill)
- {
- gDeferredMaterialWaterProgram[i].addPermutation("SUNLIGHT_KILL", "1");
- }
-
- if (local_light_kill)
- {
- gDeferredMaterialWaterProgram[i].addPermutation("LOCAL_LIGHT_KILL", "1");
- }
-
gDeferredMaterialWaterProgram[i].mFeatures.hasReflectionProbes = true;
gDeferredMaterialWaterProgram[i].mFeatures.hasWaterFog = true;
gDeferredMaterialWaterProgram[i].mFeatures.hasSrgb = true;
@@ -1602,21 +1541,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredLightProgram.clearPermutations();
- if (ambient_kill)
- {
- gDeferredLightProgram.addPermutation("AMBIENT_KILL", "1");
- }
-
- if (sunlight_kill)
- {
- gDeferredLightProgram.addPermutation("SUNLIGHT_KILL", "1");
- }
-
- if (local_light_kill)
- {
- gDeferredLightProgram.addPermutation("LOCAL_LIGHT_KILL", "1");
- }
-
success = gDeferredLightProgram.createShader(NULL, NULL);
llassert(success);
}
@@ -1637,21 +1561,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredMultiLightProgram[i].mShaderLevel = mShaderLevel[SHADER_DEFERRED];
gDeferredMultiLightProgram[i].addPermutation("LIGHT_COUNT", llformat("%d", i+1));
- if (ambient_kill)
- {
- gDeferredMultiLightProgram[i].addPermutation("AMBIENT_KILL", "1");
- }
-
- if (sunlight_kill)
- {
- gDeferredMultiLightProgram[i].addPermutation("SUNLIGHT_KILL", "1");
- }
-
- if (local_light_kill)
- {
- gDeferredMultiLightProgram[i].addPermutation("LOCAL_LIGHT_KILL", "1");
- }
-
success = gDeferredMultiLightProgram[i].createShader(NULL, NULL);
llassert(success);
}
@@ -1670,21 +1579,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/spotLightF.glsl", GL_FRAGMENT_SHADER));
gDeferredSpotLightProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
- if (ambient_kill)
- {
- gDeferredSpotLightProgram.addPermutation("AMBIENT_KILL", "1");
- }
-
- if (sunlight_kill)
- {
- gDeferredSpotLightProgram.addPermutation("SUNLIGHT_KILL", "1");
- }
-
- if (local_light_kill)
- {
- gDeferredSpotLightProgram.addPermutation("LOCAL_LIGHT_KILL", "1");
- }
-
success = gDeferredSpotLightProgram.createShader(NULL, NULL);
llassert(success);
}
@@ -1697,16 +1591,12 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredMultiSpotLightProgram.mFeatures.hasShadows = true;
gDeferredMultiSpotLightProgram.clearPermutations();
+ gDeferredMultiSpotLightProgram.addPermutation("MULTI_SPOTLIGHT", "1");
gDeferredMultiSpotLightProgram.mShaderFiles.clear();
gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/multiPointLightV.glsl", GL_VERTEX_SHADER));
- gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/multiSpotLightF.glsl", GL_FRAGMENT_SHADER));
+ gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/spotLightF.glsl", GL_FRAGMENT_SHADER));
gDeferredMultiSpotLightProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
- if (local_light_kill)
- {
- gDeferredMultiSpotLightProgram.addPermutation("LOCAL_LIGHT_KILL", "1");
- }
-
success = gDeferredMultiSpotLightProgram.createShader(NULL, NULL);
llassert(success);
}
@@ -1812,21 +1702,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
shader->addPermutation("HAS_SUN_SHADOW", "1");
}
- if (ambient_kill)
- {
- shader->addPermutation("AMBIENT_KILL", "1");
- }
-
- if (sunlight_kill)
- {
- shader->addPermutation("SUNLIGHT_KILL", "1");
- }
-
- if (local_light_kill)
- {
- shader->addPermutation("LOCAL_LIGHT_KILL", "1");
- }
-
if (rigged)
{
shader->addPermutation("HAS_SKIN", "1");
@@ -1950,21 +1825,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
shader[i]->addPermutation("HAS_SUN_SHADOW", "1");
}
- if (ambient_kill)
- {
- shader[i]->addPermutation("AMBIENT_KILL", "1");
- }
-
- if (sunlight_kill)
- {
- shader[i]->addPermutation("SUNLIGHT_KILL", "1");
- }
-
- if (local_light_kill)
- {
- shader[i]->addPermutation("LOCAL_LIGHT_KILL", "1");
- }
-
if (i == 1)
{ // rigged variant
shader[i]->mFeatures.hasObjectSkinning = true;
@@ -2260,21 +2120,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredSoftenProgram.addPermutation("HAS_SUN_SHADOW", "1");
}
- if (ambient_kill)
- {
- gDeferredSoftenProgram.addPermutation("AMBIENT_KILL", "1");
- }
-
- if (sunlight_kill)
- {
- gDeferredSoftenProgram.addPermutation("SUNLIGHT_KILL", "1");
- }
-
- if (local_light_kill)
- {
- gDeferredSoftenProgram.addPermutation("LOCAL_LIGHT_KILL", "1");
- }
-
if (gSavedSettings.getBOOL("RenderDeferredSSAO"))
{ //if using SSAO, take screen space light map into account as if shadows are enabled
gDeferredSoftenProgram.mShaderLevel = llmax(gDeferredSoftenProgram.mShaderLevel, 2);
@@ -2310,25 +2155,10 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredSoftenWaterProgram.addPermutation("HAS_SUN_SHADOW", "1");
}
- if (ambient_kill)
- {
- gDeferredSoftenWaterProgram.addPermutation("AMBIENT_KILL", "1");
- }
-
- if (sunlight_kill)
- {
- gDeferredSoftenWaterProgram.addPermutation("SUNLIGHT_KILL", "1");
- }
-
- if (local_light_kill)
- {
- gDeferredSoftenWaterProgram.addPermutation("LOCAL_LIGHT_KILL", "1");
- gDeferredSoftenWaterProgram.addPermutation("HAS_SSAO", "1");
- }
-
if (gSavedSettings.getBOOL("RenderDeferredSSAO"))
{ //if using SSAO, take screen space light map into account as if shadows are enabled
gDeferredSoftenWaterProgram.mShaderLevel = llmax(gDeferredSoftenWaterProgram.mShaderLevel, 2);
+ gDeferredSoftenWaterProgram.addPermutation("HAS_SSAO", "1");
}
success = gDeferredSoftenWaterProgram.createShader(NULL, NULL);
@@ -2533,20 +2363,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
gDeferredAvatarAlphaProgram.addPermutation("HAS_SUN_SHADOW", "1");
}
- if (ambient_kill)
- {
- gDeferredAvatarAlphaProgram.addPermutation("AMBIENT_KILL", "1");
- }
-
- if (sunlight_kill)
- {
- gDeferredAvatarAlphaProgram.addPermutation("SUNLIGHT_KILL", "1");
- }
-
- if (local_light_kill)
- {
- gDeferredAvatarAlphaProgram.addPermutation("LOCAL_LIGHT_KILL", "1");
- }
gDeferredAvatarAlphaProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
success = gDeferredAvatarAlphaProgram.createShader(NULL, NULL);
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index 37999e58ff..6ac94fe4c4 100644
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -171,7 +171,7 @@ SimMeasurement<> SIM_TIME_DILATION("simtimedilation", "Simulator time scale",
SIM_MAIN_AGENTS("simmainagents", "Number of avatars in current region", LL_SIM_STAT_NUMAGENTMAIN),
SIM_CHILD_AGENTS("simchildagents", "Number of avatars in neighboring regions", LL_SIM_STAT_NUMAGENTCHILD),
SIM_OBJECTS("simobjects", "", LL_SIM_STAT_NUMTASKS),
- SIM_ACTIVE_OBJECTS("simactiveobjects", "Number of scripted and/or mocing objects", LL_SIM_STAT_NUMTASKSACTIVE),
+ SIM_ACTIVE_OBJECTS("simactiveobjects", "Number of scripted and/or moving objects", LL_SIM_STAT_NUMTASKSACTIVE),
SIM_ACTIVE_SCRIPTS("simactivescripts", "Number of scripted objects", LL_SIM_STAT_NUMSCRIPTSACTIVE),
SIM_IN_PACKETS_PER_SEC("siminpps", "", LL_SIM_STAT_INPPS),
SIM_OUT_PACKETS_PER_SEC("simoutpps", "", LL_SIM_STAT_OUTPPS),
@@ -192,7 +192,6 @@ LLTrace::SampleStatHandle<> FPS_SAMPLE("fpssample"),
NUM_OBJECTS("numobjectsstat"),
NUM_ACTIVE_OBJECTS("numactiveobjectsstat"),
ENABLE_VBO("enablevbo", "Vertex Buffers Enabled"),
- LIGHTING_DETAIL("lightingdetail", "Lighting Detail"),
VISIBLE_AVATARS("visibleavatars", "Visible Avatars"),
SHADER_OBJECTS("shaderobjects", "Object Shaders"),
DRAW_DISTANCE("drawdistance", "Draw Distance"),
@@ -402,7 +401,6 @@ void update_statistics()
record(LLStatViewer::TRIANGLES_DRAWN_PER_FRAME, last_frame_recording.getSum(LLStatViewer::TRIANGLES_DRAWN));
sample(LLStatViewer::ENABLE_VBO, (F64)gSavedSettings.getBOOL("RenderVBOEnable"));
- sample(LLStatViewer::LIGHTING_DETAIL, (F64)gPipeline.getLightingDetail());
sample(LLStatViewer::DRAW_DISTANCE, (F64)gSavedSettings.getF32("RenderFarClip"));
sample(LLStatViewer::CHAT_BUBBLES, gSavedSettings.getBOOL("UseChatBubbles"));
diff --git a/indra/newview/llviewerstatsrecorder.cpp b/indra/newview/llviewerstatsrecorder.cpp
index b5ccf4ffa0..6372679a07 100644
--- a/indra/newview/llviewerstatsrecorder.cpp
+++ b/indra/newview/llviewerstatsrecorder.cpp
@@ -28,24 +28,25 @@
#include "llviewerstatsrecorder.h"
+#include "llcontrol.h"
#include "llfile.h"
#include "llviewerregion.h"
#include "llviewerobject.h"
+#include "llworld.h"
-
-// To do - something using region name or global position
-#if LL_WINDOWS
- static const std::string STATS_FILE_NAME("C:\\ViewerObjectCacheStats.csv");
-#else
- static const std::string STATS_FILE_NAME("/tmp/viewerstats.csv");
-#endif
+extern LLControlGroup gSavedSettings;
LLViewerStatsRecorder* LLViewerStatsRecorder::sInstance = NULL;
LLViewerStatsRecorder::LLViewerStatsRecorder() :
- mObjectCacheFile(NULL),
+ mStatsFile(NULL),
mTimer(),
- mStartTime(0.0),
- mLastSnapshotTime(0.0)
+ mFileOpenTime(0.0),
+ mLastSnapshotTime(0.0),
+ mEnableStatsRecording(false),
+ mEnableStatsLogging(false),
+ mInterval(0.2),
+ mMaxDuration(300.f),
+ mSkipSaveIfZeros(false)
{
if (NULL != sInstance)
{
@@ -57,79 +58,70 @@ LLViewerStatsRecorder::LLViewerStatsRecorder() :
LLViewerStatsRecorder::~LLViewerStatsRecorder()
{
- if (mObjectCacheFile != NULL)
+ if (mStatsFile)
{
- // last chance snapshot
- writeToLog(0.f);
- LLFile::close(mObjectCacheFile);
- mObjectCacheFile = NULL;
+ writeToLog(0.f); // Save last data
+ closeStatsFile();
}
}
void LLViewerStatsRecorder::clearStats()
{
mObjectCacheHitCount = 0;
- mObjectCacheHitSize = 0;
mObjectCacheMissFullCount = 0;
- mObjectCacheMissFullSize = 0;
mObjectCacheMissCrcCount = 0;
- mObjectCacheMissCrcSize = 0;
mObjectFullUpdates = 0;
- mObjectFullUpdatesSize = 0;
mObjectTerseUpdates = 0;
- mObjectTerseUpdatesSize = 0;
mObjectCacheMissRequests = 0;
- mObjectCacheMissResponses = 0;
- mObjectCacheMissResponsesSize = 0;
mObjectCacheUpdateDupes = 0;
mObjectCacheUpdateChanges = 0;
mObjectCacheUpdateAdds = 0;
mObjectCacheUpdateReplacements = 0;
mObjectUpdateFailures = 0;
- mObjectUpdateFailuresSize = 0;
- mTextureFetchSize = 0;
+ mTextureFetchCount = 0;
+ mMeshLoadedCount = 0;
+ mObjectKills = 0;
}
-void LLViewerStatsRecorder::recordObjectUpdateFailure(U32 local_id, const EObjectUpdateType update_type, S32 msg_size)
+void LLViewerStatsRecorder::enableObjectStatsRecording(bool enable, bool logging /* false */)
{
- mObjectUpdateFailures++;
- mObjectUpdateFailuresSize += msg_size;
+ mEnableStatsRecording = enable;
+
+ // if logging is stopping, close the file
+ if (mStatsFile && !logging)
+ {
+ writeToLog(0.f); // Save last data
+ closeStatsFile();
+ }
+ mEnableStatsLogging = logging;
}
-void LLViewerStatsRecorder::recordCacheMissEvent(U32 local_id, const EObjectUpdateType update_type, U8 cache_miss_type, S32 msg_size)
+
+
+void LLViewerStatsRecorder::recordCacheMissEvent(U8 cache_miss_type)
{
- if (LLViewerRegion::CACHE_MISS_TYPE_FULL == cache_miss_type)
+ if (LLViewerRegion::CACHE_MISS_TYPE_TOTAL == cache_miss_type)
{
mObjectCacheMissFullCount++;
- mObjectCacheMissFullSize += msg_size;
}
else
{
mObjectCacheMissCrcCount++;
- mObjectCacheMissCrcSize += msg_size;
}
}
-void LLViewerStatsRecorder::recordObjectUpdateEvent(U32 local_id, const EObjectUpdateType update_type, LLViewerObject * objectp, S32 msg_size)
+
+void LLViewerStatsRecorder::recordObjectUpdateEvent(const EObjectUpdateType update_type)
{
- switch (update_type)
+ switch (update_type)
{
case OUT_FULL:
- mObjectFullUpdates++;
- mObjectFullUpdatesSize += msg_size;
+ case OUT_FULL_COMPRESSED:
+ mObjectFullUpdates++;
break;
case OUT_TERSE_IMPROVED:
mObjectTerseUpdates++;
- mObjectTerseUpdatesSize += msg_size;
- break;
- case OUT_FULL_COMPRESSED:
- mObjectCacheMissResponses++;
- mObjectCacheMissResponsesSize += msg_size;
- break;
- case OUT_FULL_CACHED:
- mObjectCacheHitCount++;
- mObjectCacheHitSize += msg_size;
break;
default:
LL_WARNS() << "Unknown update_type" << LL_ENDL;
@@ -137,9 +129,9 @@ void LLViewerStatsRecorder::recordObjectUpdateEvent(U32 local_id, const EObjectU
};
}
-void LLViewerStatsRecorder::recordCacheFullUpdate(U32 local_id, const EObjectUpdateType update_type, LLViewerRegion::eCacheUpdateResult update_result, LLViewerObject* objectp, S32 msg_size)
+void LLViewerStatsRecorder::recordCacheFullUpdate(LLViewerRegion::eCacheUpdateResult update_result)
{
- switch (update_result)
+ switch (update_result)
{
case LLViewerRegion::CACHE_UPDATE_DUPE:
mObjectCacheUpdateDupes++;
@@ -154,124 +146,176 @@ void LLViewerStatsRecorder::recordCacheFullUpdate(U32 local_id, const EObjectUpd
mObjectCacheUpdateReplacements++;
break;
default:
- LL_WARNS() << "Unknown update_result type" << LL_ENDL;
+ LL_WARNS() << "Unknown update_result type " << (S32) update_result << LL_ENDL;
break;
};
}
-void LLViewerStatsRecorder::recordRequestCacheMissesEvent(S32 count)
-{
- mObjectCacheMissRequests += count;
-}
-
void LLViewerStatsRecorder::writeToLog( F32 interval )
{
+ if (!mEnableStatsLogging || !mEnableStatsRecording)
+ {
+ return;
+ }
+
size_t data_size = 0;
- F64 delta_time = LLTimer::getTotalSeconds() - mLastSnapshotTime;
- S32 total_objects = mObjectCacheHitCount + mObjectCacheMissCrcCount + mObjectCacheMissFullCount + mObjectFullUpdates + mObjectTerseUpdates + mObjectCacheMissRequests + mObjectCacheMissResponses + mObjectCacheUpdateDupes + mObjectCacheUpdateChanges + mObjectCacheUpdateAdds + mObjectCacheUpdateReplacements + mObjectUpdateFailures;
+ F64 delta_time = LLFrameTimer::getTotalSeconds() - mLastSnapshotTime;
+ if (delta_time < interval)
+ return;
- if ( delta_time < interval || total_objects == 0) return;
+ if (mSkipSaveIfZeros)
+ {
+ S32 total_events = mObjectCacheHitCount + mObjectCacheMissCrcCount + mObjectCacheMissFullCount + mObjectFullUpdates +
+ mObjectTerseUpdates + mObjectCacheMissRequests + mObjectCacheUpdateDupes +
+ mObjectCacheUpdateChanges + mObjectCacheUpdateAdds + mObjectCacheUpdateReplacements + mObjectUpdateFailures;
+ if (total_events == 0)
+ {
+ LL_DEBUGS("ILXZeroData") << "ILX: not saving zero data" << LL_ENDL;
+ return;
+ }
+ }
- mLastSnapshotTime = LLTimer::getTotalSeconds();
- LL_DEBUGS() << "ILX: "
+ mLastSnapshotTime = LLFrameTimer::getTotalSeconds();
+ LL_DEBUGS("ILX") << "ILX: "
<< mObjectCacheHitCount << " hits, "
<< mObjectCacheMissFullCount << " full misses, "
<< mObjectCacheMissCrcCount << " crc misses, "
<< mObjectFullUpdates << " full updates, "
<< mObjectTerseUpdates << " terse updates, "
<< mObjectCacheMissRequests << " cache miss requests, "
- << mObjectCacheMissResponses << " cache miss responses, "
<< mObjectCacheUpdateDupes << " cache update dupes, "
<< mObjectCacheUpdateChanges << " cache update changes, "
<< mObjectCacheUpdateAdds << " cache update adds, "
- << mObjectCacheUpdateReplacements << " cache update replacements, "
- << mObjectUpdateFailures << " update failures"
+ << mObjectCacheUpdateReplacements << " cache update replacements,"
+ << mObjectUpdateFailures << " update failures,"
+ << mTextureFetchCount << " texture fetches, "
+ << mMeshLoadedCount << " mesh loads, "
+ << mObjectKills << " object kills"
<< LL_ENDL;
-
- if (mObjectCacheFile == NULL)
+
+ if (mStatsFile == NULL)
{
- mStartTime = LLTimer::getTotalSeconds();
- mObjectCacheFile = LLFile::fopen(STATS_FILE_NAME, "wb");
- if (mObjectCacheFile)
- { // Write column headers
- std::ostringstream data_msg;
- data_msg << "EventTime(ms)\t"
- << "Cache Hits\t"
- << "Cache Full Misses\t"
- << "Cache Crc Misses\t"
- << "Full Updates\t"
- << "Terse Updates\t"
- << "Cache Miss Requests\t"
- << "Cache Miss Responses\t"
- << "Cache Update Dupes\t"
- << "Cache Update Changes\t"
- << "Cache Update Adds\t"
- << "Cache Update Replacements\t"
- << "Update Failures\t"
- << "Cache Hits bps\t"
- << "Cache Full Misses bps\t"
- << "Cache Crc Misses bps\t"
- << "Full Updates bps\t"
- << "Terse Updates bps\t"
- << "Cache Miss Responses bps\t"
- << "Texture Fetch bps\t"
- << "\n";
-
- data_size = data_msg.str().size();
- if (fwrite(data_msg.str().c_str(), 1, data_size, mObjectCacheFile ) != data_size)
+ // Refresh settings
+ mInterval = gSavedSettings.getF32("StatsReportFileInterval");
+ mSkipSaveIfZeros = gSavedSettings.getBOOL("StatsReportSkipZeroDataSaves");
+ mMaxDuration = gSavedSettings.getF32("StatsReportMaxDuration");
+
+ // Open the data file
+ makeStatsFileName();
+ mStatsFile = LLFile::fopen(mStatsFileName, "wb");
+
+ if (mStatsFile)
+ {
+ LL_INFOS("ILX") << "ILX: Writing update information to " << mStatsFileName << LL_ENDL;
+
+ mFileOpenTime = LLFrameTimer::getTotalSeconds();
+
+ // Write column headers
+ std::ostringstream col_headers;
+ col_headers << "Time (sec),"
+ << "Regions,"
+ << "Active Cached Objects,"
+ << "Cache Hits,"
+ << "Cache Full Misses,"
+ << "Cache Crc Misses,"
+ << "Full Updates,"
+ << "Terse Updates,"
+ << "Cache Miss Requests," // Normally results in a Full Update from simulator
+ << "Cache Update Dupes,"
+ << "Cache Update Changes,"
+ << "Cache Update Adds,"
+ << "Cache Update Replacements,"
+ << "Update Failures,"
+ << "Texture Count,"
+ << "Mesh Load Count,"
+ << "Object Kills"
+ << "\n";
+
+ data_size = col_headers.str().size();
+ if (fwrite(col_headers.str().c_str(), 1, data_size, mStatsFile ) != data_size)
{
- LL_WARNS() << "failed to write full headers to " << STATS_FILE_NAME << LL_ENDL;
+ LL_WARNS() << "failed to write full headers to " << mStatsFileName << LL_ENDL;
+ // Close the file and turn off stats logging
+ closeStatsFile();
+ return;
}
}
else
- {
- //LL_WARNS() << "Couldn't open " << STATS_FILE_NAME << " for logging." << LL_ENDL;
+ { // Failed to open file
+ LL_WARNS() << "Couldn't open " << mStatsFileName << " for logging, turning off stats recording." << LL_ENDL;
+ mEnableStatsLogging = false;
return;
}
}
- std::ostringstream data_msg;
-
- data_msg << getTimeSinceStart()
- << "\t " << mObjectCacheHitCount
- << "\t" << mObjectCacheMissFullCount
- << "\t" << mObjectCacheMissCrcCount
- << "\t" << mObjectFullUpdates
- << "\t" << mObjectTerseUpdates
- << "\t" << mObjectCacheMissRequests
- << "\t" << mObjectCacheMissResponses
- << "\t" << mObjectCacheUpdateDupes
- << "\t" << mObjectCacheUpdateChanges
- << "\t" << mObjectCacheUpdateAdds
- << "\t" << mObjectCacheUpdateReplacements
- << "\t" << mObjectUpdateFailures
- << "\t" << (mObjectCacheHitSize * 8 / delta_time)
- << "\t" << (mObjectCacheMissFullSize * 8 / delta_time)
- << "\t" << (mObjectCacheMissCrcSize * 8 / delta_time)
- << "\t" << (mObjectFullUpdatesSize * 8 / delta_time)
- << "\t" << (mObjectTerseUpdatesSize * 8 / delta_time)
- << "\t" << (mObjectCacheMissResponsesSize * 8 / delta_time)
- << "\t" << (mTextureFetchSize * 8 / delta_time)
+ std::ostringstream stats_data;
+
+ stats_data << getTimeSinceStart()
+ << "," << LLWorld::getInstance()->getRegionList().size()
+ << "," << LLWorld::getInstance()->getNumOfActiveCachedObjects()
+ << "," << mObjectCacheHitCount
+ << "," << mObjectCacheMissFullCount
+ << "," << mObjectCacheMissCrcCount
+ << "," << mObjectFullUpdates
+ << "," << mObjectTerseUpdates
+ << "," << mObjectCacheMissRequests
+ << "," << mObjectCacheUpdateDupes
+ << "," << mObjectCacheUpdateChanges
+ << "," << mObjectCacheUpdateAdds
+ << "," << mObjectCacheUpdateReplacements
+ << "," << mObjectUpdateFailures
+ << "," << mTextureFetchCount
+ << "," << mMeshLoadedCount
+ << "," << mObjectKills
<< "\n";
- data_size = data_msg.str().size();
- if ( data_size != fwrite(data_msg.str().c_str(), 1, data_size, mObjectCacheFile ))
+ data_size = stats_data.str().size();
+ if ( data_size != fwrite(stats_data.str().c_str(), 1, data_size, mStatsFile ))
{
- LL_WARNS() << "Unable to write complete column data to " << STATS_FILE_NAME << LL_ENDL;
- }
+ LL_WARNS() << "Unable to write complete column data to " << mStatsFileName << LL_ENDL;
+ closeStatsFile();
+ }
clearStats();
+
+ if (getTimeSinceStart() >= mMaxDuration)
+ { // If file recording has been running for too long, stop it.
+ closeStatsFile();
+ }
}
-F32 LLViewerStatsRecorder::getTimeSinceStart()
+void LLViewerStatsRecorder::closeStatsFile()
{
- return (F32) (LLTimer::getTotalSeconds() - mStartTime);
+ if (mStatsFile)
+ {
+ LL_INFOS("ILX") << "ILX: Stopped writing update information to " << mStatsFileName << " after " << getTimeSinceStart()
+ << " seconds." << LL_ENDL;
+ LLFile::close(mStatsFile);
+ mStatsFile = NULL;
+ }
+ mEnableStatsLogging = false;
}
-void LLViewerStatsRecorder::recordTextureFetch( S32 msg_size )
+void LLViewerStatsRecorder::makeStatsFileName()
{
- mTextureFetchSize += msg_size;
+ // Create filename - tbd: use pid?
+#if LL_WINDOWS
+ std::string stats_file_name("SLViewerStats-");
+#else
+ std::string stats_file_name("slviewerstats-");
+#endif
+
+ F64 now = LLFrameTimer::getTotalSeconds();
+ std::string date_str = LLDate(now).asString();
+ std::replace(date_str.begin(), date_str.end(), ':', '-'); // Make it valid for a filename
+ stats_file_name.append(date_str);
+ stats_file_name.append(".csv");
+ mStatsFileName = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, stats_file_name);
}
+F32 LLViewerStatsRecorder::getTimeSinceStart()
+{
+ return (F32) (LLFrameTimer::getTotalSeconds() - mFileOpenTime);
+}
diff --git a/indra/newview/llviewerstatsrecorder.h b/indra/newview/llviewerstatsrecorder.h
index c974bea49d..b9fe02e54d 100644
--- a/indra/newview/llviewerstatsrecorder.h
+++ b/indra/newview/llviewerstatsrecorder.h
@@ -31,10 +31,6 @@
// This is a diagnostic class used to record information from the viewer
// for analysis.
-// This is normally 0. Set to 1 to enable viewer stats recording
-#define LL_RECORD_VIEWER_STATS 0
-
-
#include "llframetimer.h"
#include "llviewerobject.h"
#include "llviewerregion.h"
@@ -49,97 +45,132 @@ class LLViewerStatsRecorder : public LLSingleton<LLViewerStatsRecorder>
~LLViewerStatsRecorder();
public:
- void objectUpdateFailure(U32 local_id, const EObjectUpdateType update_type, S32 msg_size)
- {
-#if LL_RECORD_VIEWER_STATS
- recordObjectUpdateFailure(local_id, update_type, msg_size);
-#endif
+ // Enable/disable stats recording. This is broken down into two
+ // flags so we can record stats without writing them to the log
+ // file. This is useful to analyzing updates for scene loading.
+ void enableObjectStatsRecording(bool enable, bool logging = false);
+
+ bool isEnabled() const { return mEnableStatsRecording; }
+ bool isLogging() const { return mEnableStatsLogging; }
+
+ void objectUpdateFailure()
+ {
+ if (mEnableStatsRecording)
+ {
+ mObjectUpdateFailures++;
+ }
}
- void cacheMissEvent(U32 local_id, const EObjectUpdateType update_type, U8 cache_miss_type, S32 msg_size)
+ void cacheMissEvent(U8 cache_miss_type)
{
-#if LL_RECORD_VIEWER_STATS
- recordCacheMissEvent(local_id, update_type, cache_miss_type, msg_size);
-#endif
+ if (mEnableStatsRecording)
+ {
+ recordCacheMissEvent(cache_miss_type);
+ }
+ }
+
+ void cacheHitEvent()
+ {
+ if (mEnableStatsRecording)
+ {
+ mObjectCacheHitCount++;
+ }
+ }
+
+ void objectUpdateEvent(const EObjectUpdateType update_type)
+ {
+ if (mEnableStatsRecording)
+ {
+ recordObjectUpdateEvent(update_type);
+ }
}
- void objectUpdateEvent(U32 local_id, const EObjectUpdateType update_type, LLViewerObject * objectp, S32 msg_size)
- {
-#if LL_RECORD_VIEWER_STATS
- recordObjectUpdateEvent(local_id, update_type, objectp, msg_size);
-#endif
+ void cacheFullUpdate(LLViewerRegion::eCacheUpdateResult update_result)
+ {
+ if (mEnableStatsRecording)
+ {
+ recordCacheFullUpdate(update_result);
+ }
}
- void cacheFullUpdate(U32 local_id, const EObjectUpdateType update_type, LLViewerRegion::eCacheUpdateResult update_result, LLViewerObject* objectp, S32 msg_size)
+ void requestCacheMissesEvent(S32 count)
{
-#if LL_RECORD_VIEWER_STATS
- recordCacheFullUpdate(local_id, update_type, update_result, objectp, msg_size);
-#endif
+ if (mEnableStatsRecording)
+ {
+ mObjectCacheMissRequests += count;
+ }
}
- void requestCacheMissesEvent(S32 count)
+ void textureFetch()
{
-#if LL_RECORD_VIEWER_STATS
- recordRequestCacheMissesEvent(count);
-#endif
+ if (mEnableStatsRecording)
+ {
+ mTextureFetchCount += 1;
+ }
}
- void textureFetch(S32 msg_size)
+ void meshLoaded()
{
-#if LL_RECORD_VIEWER_STATS
- recordTextureFetch(msg_size);
-#endif
+ if (mEnableStatsRecording)
+ {
+ mMeshLoadedCount += 1;
+ }
}
- void log(F32 interval)
+ void recordObjectKills(S32 num_objects)
+ {
+ if (mEnableStatsRecording)
+ {
+ mObjectKills += num_objects;
+ }
+ }
+
+ void idle()
{
-#if LL_RECORD_VIEWER_STATS
- writeToLog(interval);
-#endif
+ writeToLog(mInterval);
}
F32 getTimeSinceStart();
private:
- void recordObjectUpdateFailure(U32 local_id, const EObjectUpdateType update_type, S32 msg_size);
- void recordCacheMissEvent(U32 local_id, const EObjectUpdateType update_type, U8 cache_miss_type, S32 msg_size);
- void recordObjectUpdateEvent(U32 local_id, const EObjectUpdateType update_type, LLViewerObject * objectp, S32 msg_size);
- void recordCacheFullUpdate(U32 local_id, const EObjectUpdateType update_type, LLViewerRegion::eCacheUpdateResult update_result, LLViewerObject* objectp, S32 msg_size);
- void recordRequestCacheMissesEvent(S32 count);
- void recordTextureFetch(S32 msg_size);
+ void recordCacheMissEvent(U8 cache_miss_type);
+ void recordObjectUpdateEvent(const EObjectUpdateType update_type);
+ void recordCacheFullUpdate(LLViewerRegion::eCacheUpdateResult update_result);
void writeToLog(F32 interval);
+ void closeStatsFile();
+ void makeStatsFileName();
static LLViewerStatsRecorder* sInstance;
- LLFILE * mObjectCacheFile; // File to write data into
+ LLFILE * mStatsFile; // File to write data into
+ std::string mStatsFileName;
+
LLFrameTimer mTimer;
- F64 mStartTime;
+ F64 mFileOpenTime;
F64 mLastSnapshotTime;
+ F32 mInterval; // Interval between data log writes
+ F32 mMaxDuration; // Time limit on file
+
+ bool mEnableStatsRecording; // Set to true to enable recording stats data
+ bool mEnableStatsLogging; // Set true to write stats to log file
+ bool mSkipSaveIfZeros; // Set true to skip saving stats if all values are zero
S32 mObjectCacheHitCount;
- S32 mObjectCacheHitSize;
S32 mObjectCacheMissFullCount;
- S32 mObjectCacheMissFullSize;
S32 mObjectCacheMissCrcCount;
- S32 mObjectCacheMissCrcSize;
S32 mObjectFullUpdates;
- S32 mObjectFullUpdatesSize;
S32 mObjectTerseUpdates;
- S32 mObjectTerseUpdatesSize;
S32 mObjectCacheMissRequests;
- S32 mObjectCacheMissResponses;
- S32 mObjectCacheMissResponsesSize;
S32 mObjectCacheUpdateDupes;
S32 mObjectCacheUpdateChanges;
S32 mObjectCacheUpdateAdds;
S32 mObjectCacheUpdateReplacements;
S32 mObjectUpdateFailures;
- S32 mObjectUpdateFailuresSize;
- S32 mTextureFetchSize;
-
+ S32 mTextureFetchCount;
+ S32 mMeshLoadedCount;
+ S32 mObjectKills;
void clearStats();
};
#endif // LLVIEWERSTATSRECORDER_H
-
diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp
index 1353eea2f2..fa6b6dc156 100644
--- a/indra/newview/llviewertexteditor.cpp
+++ b/indra/newview/llviewertexteditor.cpp
@@ -36,6 +36,7 @@
#include "llfloatersidepanelcontainer.h"
#include "llfloaterworldmap.h"
#include "llfocusmgr.h"
+#include "llinspecttexture.h"
#include "llinventorybridge.h"
#include "llinventorydefines.h"
#include "llinventorymodel.h"
@@ -246,6 +247,21 @@ public:
}
virtual BOOL handleToolTip(S32 x, S32 y, MASK mask )
{
+ if (mItem->getThumbnailUUID().notNull())
+ {
+ LLSD params;
+ params["inv_type"] = mItem->getInventoryType();
+ params["thumbnail_id"] = mItem->getThumbnailUUID();
+ params["asset_id"] = mItem->getAssetUUID();
+
+ LLToolTipMgr::instance().show(LLToolTip::Params()
+ .message(mToolTip)
+ .create_callback(boost::bind(&LLInspectTextureUtil::createInventoryToolTip, _1))
+ .create_params(params));
+
+ return TRUE;
+ }
+
if (!mToolTip.empty())
{
LLToolTipMgr::instance().show(mToolTip);
@@ -1200,7 +1216,11 @@ void LLViewerTextEditor::openEmbeddedLandmark( LLPointer<LLInventoryItem> item_p
void LLViewerTextEditor::openEmbeddedCallingcard( LLInventoryItem* item, llwchar wc )
{
- if(item && !item->getCreatorUUID().isNull())
+ if (item && !item->getDescription().empty())
+ {
+ LLAvatarActions::showProfile(LLUUID(item->getDescription()));
+ }
+ else if (item && !item->getCreatorUUID().isNull())
{
LLAvatarActions::showProfile(item->getCreatorUUID());
}
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index cb58588848..9336d99555 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -534,9 +534,12 @@ void LLViewerTexture::updateClass()
static LLCachedControl<U32> max_vram_budget(gSavedSettings, "RenderMaxVRAMBudget", 0);
+ F64 texture_bytes_alloc = LLImageGL::getTextureBytesAllocated() / 1024.0 / 512.0;
+ F64 vertex_bytes_alloc = LLVertexBuffer::getBytesAllocated() / 1024.0 / 512.0;
+
// get an estimate of how much video memory we're using
// NOTE: our metrics miss about half the vram we use, so this biases high but turns out to typically be within 5% of the real number
- F32 used = (LLImageGL::getTextureBytesAllocated() + LLVertexBuffer::getBytesAllocated()) / 1024 / 512;
+ F32 used = (F32)ll_round(texture_bytes_alloc + vertex_bytes_alloc);
F32 budget = max_vram_budget == 0 ? gGLManager.mVRAM : max_vram_budget;
@@ -2096,7 +2099,8 @@ bool LLViewerFetchedTexture::updateFetch()
}
}
- llassert_always(mRawImage.notNull() || (!mNeedsCreateTexture && !mIsRawImageValid));
+ llassert_always(mRawImage.notNull() || !mIsRawImageValid);
+ llassert_always(mRawImage.notNull() || !mNeedsCreateTexture);
return mIsFetching ? true : false;
}
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index 9c4474f1d3..9ee6f88183 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -222,6 +222,8 @@ void LLViewerTextureList::doPrefetchImages()
LLViewerTextureManager::getFetchedTexture(IMG_SHOT);
LLViewerTextureManager::getFetchedTexture(IMG_SMOKE_POOF);
+ LLViewerFetchedTexture::sSmokeImagep = LLViewerTextureManager::getFetchedTexture(IMG_SMOKE, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_UI);
+ LLViewerFetchedTexture::sSmokeImagep->setNoDelete();
LLStandardBumpmap::addstandard();
@@ -1241,11 +1243,52 @@ void LLViewerTextureList::decodeAllImages(F32 max_time)
<< LL_ENDL;
}
+bool LLViewerTextureList::createUploadFile(LLPointer<LLImageRaw> raw_image,
+ const std::string& out_filename,
+ const S32 max_image_dimentions,
+ const S32 min_image_dimentions)
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
+
+ // make a copy, since convertToUploadFile scales raw image
+ LLPointer<LLImageRaw> scale_image = new LLImageRaw(
+ raw_image->getData(),
+ raw_image->getWidth(),
+ raw_image->getHeight(),
+ raw_image->getComponents());
+
+ LLPointer<LLImageJ2C> compressedImage = LLViewerTextureList::convertToUploadFile(scale_image, max_image_dimentions);
+ if (compressedImage->getWidth() < min_image_dimentions || compressedImage->getHeight() < min_image_dimentions)
+ {
+ std::string reason = llformat("Images below %d x %d pixels are not allowed. Actual size: %d x %dpx",
+ min_image_dimentions,
+ min_image_dimentions,
+ compressedImage->getWidth(),
+ compressedImage->getHeight());
+ compressedImage->setLastError(reason);
+ return false;
+ }
+ if (compressedImage.isNull())
+ {
+ compressedImage->setLastError("Couldn't convert the image to jpeg2000.");
+ LL_INFOS() << "Couldn't convert to j2c, file : " << out_filename << LL_ENDL;
+ return false;
+ }
+ if (!compressedImage->save(out_filename))
+ {
+ compressedImage->setLastError("Couldn't create the jpeg2000 image for upload.");
+ LL_INFOS() << "Couldn't create output file : " << out_filename << LL_ENDL;
+ return false;
+ }
+ return true;
+}
BOOL LLViewerTextureList::createUploadFile(const std::string& filename,
const std::string& out_filename,
const U8 codec,
- const S32 max_image_dimentions)
+ const S32 max_image_dimentions,
+ const S32 min_image_dimentions,
+ bool force_square)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
// Load the image
@@ -1273,8 +1316,18 @@ BOOL LLViewerTextureList::createUploadFile(const std::string& filename,
image->setLastError("Image files with less than 3 or more than 4 components are not supported.");
return FALSE;
}
+ if (image->getWidth() < min_image_dimentions || image->getHeight() < min_image_dimentions)
+ {
+ std::string reason = llformat("Images below %d x %d pixels are not allowed. Actual size: %d x %dpx",
+ min_image_dimentions,
+ min_image_dimentions,
+ image->getWidth(),
+ image->getHeight());
+ image->setLastError(reason);
+ return FALSE;
+ }
// Convert to j2c (JPEG2000) and save the file locally
- LLPointer<LLImageJ2C> compressedImage = convertToUploadFile(raw_image, max_image_dimentions);
+ LLPointer<LLImageJ2C> compressedImage = convertToUploadFile(raw_image, max_image_dimentions, force_square);
if (compressedImage.isNull())
{
image->setLastError("Couldn't convert the image to jpeg2000.");
@@ -1299,10 +1352,20 @@ BOOL LLViewerTextureList::createUploadFile(const std::string& filename,
}
// note: modifies the argument raw_image!!!!
-LLPointer<LLImageJ2C> LLViewerTextureList::convertToUploadFile(LLPointer<LLImageRaw> raw_image, const S32 max_image_dimentions, bool force_lossless)
+LLPointer<LLImageJ2C> LLViewerTextureList::convertToUploadFile(LLPointer<LLImageRaw> raw_image, const S32 max_image_dimentions, bool force_square, bool force_lossless)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
- raw_image->biasedScaleToPowerOfTwo(max_image_dimentions);
+ if (force_square)
+ {
+ S32 biggest_side = llmax(raw_image->getWidth(), raw_image->getHeight());
+ S32 square_size = raw_image->biasedDimToPowerOfTwo(biggest_side, max_image_dimentions);
+
+ raw_image->scale(square_size, square_size);
+ }
+ else
+ {
+ raw_image->biasedScaleToPowerOfTwo(max_image_dimentions);
+ }
LLPointer<LLImageJ2C> compressedImage = new LLImageJ2C();
if (force_lossless ||
diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h
index 1b740d8c76..e8dd96daee 100644
--- a/indra/newview/llviewertexturelist.h
+++ b/indra/newview/llviewertexturelist.h
@@ -92,11 +92,20 @@ class LLViewerTextureList
friend class LLLocalBitmap;
public:
+ static bool createUploadFile(LLPointer<LLImageRaw> raw_image,
+ const std::string& out_filename,
+ const S32 max_image_dimentions = LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT,
+ const S32 min_image_dimentions = 0);
static BOOL createUploadFile(const std::string& filename,
const std::string& out_filename,
const U8 codec,
- const S32 max_image_dimentions = LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT);
- static LLPointer<LLImageJ2C> convertToUploadFile(LLPointer<LLImageRaw> raw_image, const S32 max_image_dimentions = LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT, bool force_lossless = false);
+ const S32 max_image_dimentions = LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT,
+ const S32 min_image_dimentions = 0,
+ bool force_square = false);
+ static LLPointer<LLImageJ2C> convertToUploadFile(LLPointer<LLImageRaw> raw_image,
+ const S32 max_image_dimentions = LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT,
+ bool force_square = false,
+ bool force_lossless = false);
static void processImageNotInDatabase( LLMessageSystem *msg, void **user_data );
public:
diff --git a/indra/newview/llviewerthrottle.cpp b/indra/newview/llviewerthrottle.cpp
index 2729253d18..20390a316a 100644
--- a/indra/newview/llviewerthrottle.cpp
+++ b/indra/newview/llviewerthrottle.cpp
@@ -84,7 +84,7 @@ LLViewerThrottleGroup::LLViewerThrottleGroup()
}
-LLViewerThrottleGroup::LLViewerThrottleGroup(const F32 settings[])
+LLViewerThrottleGroup::LLViewerThrottleGroup(const F32 settings[TC_EOF])
{
mThrottleTotal = 0.f;
S32 i;
diff --git a/indra/newview/llviewerwearable.h b/indra/newview/llviewerwearable.h
index cc99f6af2f..24b1323b2b 100644
--- a/indra/newview/llviewerwearable.h
+++ b/indra/newview/llviewerwearable.h
@@ -93,7 +93,6 @@ public:
// the wearable was worn. make sure the name of the wearable object matches the LLViewerInventoryItem,
// not the wearable asset itself.
void refreshName();
- /*virtual*/void addToBakedTextureHash(LLMD5& hash) const {}
protected:
LLAssetID mAssetID;
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 8516bbc7ec..ba2b6e1c7c 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -996,7 +996,7 @@ void LLViewerWindow::handlePieMenu(S32 x, S32 y, MASK mask)
}
}
-BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK mask, EMouseClickType clicktype, BOOL down)
+BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK mask, EMouseClickType clicktype, BOOL down, bool& is_toolmgr_action)
{
const char* buttonname = "";
const char* buttonstatestr = "";
@@ -1145,6 +1145,7 @@ BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK m
if(!gDisconnected && LLToolMgr::getInstance()->getCurrentTool()->handleAnyMouseClick( x, y, mask, clicktype, down ) )
{
LLViewerEventRecorder::instance().clear_xui();
+ is_toolmgr_action = true;
return TRUE;
}
@@ -3343,7 +3344,7 @@ void LLViewerWindow::updateUI()
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_RAYCAST))
{
gDebugRaycastFaceHit = -1;
- gDebugRaycastObject = cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE, FALSE, TRUE,
+ gDebugRaycastObject = cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE, FALSE, TRUE, FALSE,
&gDebugRaycastFaceHit,
&gDebugRaycastIntersection,
&gDebugRaycastTexCoord,
@@ -4218,7 +4219,8 @@ void LLViewerWindow::pickAsync( S32 x,
void (*callback)(const LLPickInfo& info),
BOOL pick_transparent,
BOOL pick_rigged,
- BOOL pick_unselectable)
+ BOOL pick_unselectable,
+ BOOL pick_reflection_probes)
{
// "Show Debug Alpha" means no object actually transparent
BOOL in_build_mode = LLFloaterReg::instanceVisible("build");
@@ -4228,7 +4230,7 @@ void LLViewerWindow::pickAsync( S32 x,
pick_transparent = TRUE;
}
- LLPickInfo pick_info(LLCoordGL(x, y_from_bot), mask, pick_transparent, pick_rigged, FALSE, TRUE, pick_unselectable, callback);
+ LLPickInfo pick_info(LLCoordGL(x, y_from_bot), mask, pick_transparent, pick_rigged, FALSE, pick_reflection_probes, pick_unselectable, TRUE, callback);
schedulePick(pick_info);
}
@@ -4284,7 +4286,7 @@ void LLViewerWindow::returnEmptyPicks()
}
// Performs the GL object/land pick.
-LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot, BOOL pick_transparent, BOOL pick_rigged, BOOL pick_particle, BOOL pick_unselectable)
+LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot, BOOL pick_transparent, BOOL pick_rigged, BOOL pick_particle, BOOL pick_unselectable, BOOL pick_reflection_probe)
{
BOOL in_build_mode = LLFloaterReg::instanceVisible("build");
if ((in_build_mode && gSavedSettings.getBOOL("SelectInvisibleObjects")) || LLDrawPoolAlpha::sShowDebugAlpha)
@@ -4296,7 +4298,7 @@ LLPickInfo LLViewerWindow::pickImmediate(S32 x, S32 y_from_bot, BOOL pick_transp
// shortcut queueing in mPicks and just update mLastPick in place
MASK key_mask = gKeyboard->currentMask(TRUE);
- mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), key_mask, pick_transparent, pick_rigged, pick_particle, TRUE, FALSE, NULL);
+ mLastPick = LLPickInfo(LLCoordGL(x, y_from_bot), key_mask, pick_transparent, pick_rigged, pick_particle, pick_reflection_probe, TRUE, FALSE, NULL);
mLastPick.fetchResults();
return mLastPick;
@@ -4334,6 +4336,7 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de
BOOL pick_transparent,
BOOL pick_rigged,
BOOL pick_unselectable,
+ BOOL pick_reflection_probe,
S32* face_hit,
LLVector4a *intersection,
LLVector2 *uv,
@@ -4412,7 +4415,8 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de
}
else // is a world object
{
- if (this_object->lineSegmentIntersect(mw_start, mw_end, this_face, pick_transparent, pick_rigged, pick_unselectable,
+ if ((pick_reflection_probe || !this_object->isReflectionProbe())
+ && this_object->lineSegmentIntersect(mw_start, mw_end, this_face, pick_transparent, pick_rigged, pick_unselectable,
face_hit, intersection, uv, normal, tangent))
{
found = this_object;
@@ -4426,7 +4430,7 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de
if (!found) // if not found in HUD, look in world:
{
- found = gPipeline.lineSegmentIntersectInWorld(mw_start, mw_end, pick_transparent, pick_rigged, pick_unselectable,
+ found = gPipeline.lineSegmentIntersectInWorld(mw_start, mw_end, pick_transparent, pick_rigged, pick_unselectable, pick_reflection_probe,
face_hit, intersection, uv, normal, tangent);
if (found && !pick_transparent)
{
@@ -6084,30 +6088,32 @@ LLPickInfo::LLPickInfo()
{
}
-LLPickInfo::LLPickInfo(const LLCoordGL& mouse_pos,
- MASK keyboard_mask,
- BOOL pick_transparent,
- BOOL pick_rigged,
- BOOL pick_particle,
- BOOL pick_uv_coords,
- BOOL pick_unselectable,
- void (*pick_callback)(const LLPickInfo& pick_info))
- : mMousePt(mouse_pos),
- mKeyMask(keyboard_mask),
- mPickCallback(pick_callback),
- mPickType(PICK_INVALID),
- mWantSurfaceInfo(pick_uv_coords),
- mObjectFace(-1),
- mUVCoords(-1.f, -1.f),
- mSTCoords(-1.f, -1.f),
- mXYCoords(-1, -1),
- mNormal(),
- mTangent(),
- mBinormal(),
- mHUDIcon(NULL),
- mPickTransparent(pick_transparent),
- mPickRigged(pick_rigged),
- mPickParticle(pick_particle),
+LLPickInfo::LLPickInfo(const LLCoordGL& mouse_pos,
+ MASK keyboard_mask,
+ BOOL pick_transparent,
+ BOOL pick_rigged,
+ BOOL pick_particle,
+ BOOL pick_reflection_probe,
+ BOOL pick_uv_coords,
+ BOOL pick_unselectable,
+ void (*pick_callback)(const LLPickInfo& pick_info))
+ : mMousePt(mouse_pos),
+ mKeyMask(keyboard_mask),
+ mPickCallback(pick_callback),
+ mPickType(PICK_INVALID),
+ mWantSurfaceInfo(pick_uv_coords),
+ mObjectFace(-1),
+ mUVCoords(-1.f, -1.f),
+ mSTCoords(-1.f, -1.f),
+ mXYCoords(-1, -1),
+ mNormal(),
+ mTangent(),
+ mBinormal(),
+ mHUDIcon(NULL),
+ mPickTransparent(pick_transparent),
+ mPickRigged(pick_rigged),
+ mPickParticle(pick_particle),
+ mPickReflectionProbe(pick_reflection_probe),
mPickUnselectable(pick_unselectable)
{
}
@@ -6138,7 +6144,7 @@ void LLPickInfo::fetchResults()
}
LLViewerObject* hit_object = gViewerWindow->cursorIntersect(mMousePt.mX, mMousePt.mY, 512.f,
- NULL, -1, mPickTransparent, mPickRigged, mPickUnselectable, &face_hit,
+ NULL, -1, mPickTransparent, mPickRigged, mPickUnselectable, mPickReflectionProbe, &face_hit,
&intersection, &uv, &normal, &tangent, &start, &end);
mPickPt = mMousePt;
@@ -6283,7 +6289,7 @@ void LLPickInfo::getSurfaceInfo()
if (objectp)
{
if (gViewerWindow->cursorIntersect(ll_round((F32)mMousePt.mX), ll_round((F32)mMousePt.mY), 1024.f,
- objectp, -1, mPickTransparent, mPickRigged, mPickUnselectable,
+ objectp, -1, mPickTransparent, mPickRigged, mPickUnselectable, mPickReflectionProbe,
&mObjectFace,
&intersection,
&mSTCoords,
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index 586ea2bee7..6e8a5b2f4e 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -94,6 +94,7 @@ public:
BOOL pick_transparent,
BOOL pick_rigged,
BOOL pick_particle,
+ BOOL pick_reflection_probe,
BOOL pick_surface_info,
BOOL pick_unselectable,
void (*pick_callback)(const LLPickInfo& pick_info));
@@ -130,6 +131,7 @@ public:
BOOL mPickRigged;
BOOL mPickParticle;
BOOL mPickUnselectable;
+ BOOL mPickReflectionProbe = FALSE;
void getSurfaceInfo();
private:
@@ -181,7 +183,7 @@ public:
void reshapeStatusBarContainer();
- BOOL handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK mask, EMouseClickType clicktype, BOOL down);
+ BOOL handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK mask, EMouseClickType clicktype, BOOL down, bool &is_toolmgr_action);
//
// LLWindowCallback interface implementation
@@ -406,8 +408,9 @@ public:
void (*callback)(const LLPickInfo& pick_info),
BOOL pick_transparent = FALSE,
BOOL pick_rigged = FALSE,
- BOOL pick_unselectable = FALSE);
- LLPickInfo pickImmediate(S32 x, S32 y, BOOL pick_transparent, BOOL pick_rigged = FALSE, BOOL pick_particle = FALSE, BOOL pick_unselectable = TRUE);
+ BOOL pick_unselectable = FALSE,
+ BOOL pick_reflection_probes = FALSE);
+ LLPickInfo pickImmediate(S32 x, S32 y, BOOL pick_transparent, BOOL pick_rigged = FALSE, BOOL pick_particle = FALSE, BOOL pick_unselectable = TRUE, BOOL pick_reflection_probe = FALSE);
LLHUDIcon* cursorIntersectIcon(S32 mouse_x, S32 mouse_y, F32 depth,
LLVector4a* intersection);
@@ -417,6 +420,7 @@ public:
BOOL pick_transparent = FALSE,
BOOL pick_rigged = FALSE,
BOOL pick_unselectable = TRUE,
+ BOOL pick_reflection_probe = TRUE,
S32* face_hit = NULL,
LLVector4a *intersection = NULL,
LLVector2 *uv = NULL,
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 22cd9f71b3..35e45c6cd9 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -5232,11 +5232,6 @@ U32 LLVOAvatar::renderRigid()
{
return 0;
}
-
- if (!mIsBuilt)
- {
- return 0;
- }
if (isTextureVisible(TEX_EYES_BAKED) || (getOverallAppearance() == AOA_JELLYDOLL && !isControlAvatar()) || isUIAvatar())
{
@@ -9469,7 +9464,14 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
// RequestAgentUpdateAppearanceResponder::onRequestRequested()
// assumes that cof version is only updated with server-bake
// appearance messages.
- LL_INFOS("Avatar") << "Processing appearance message version " << thisAppearanceVersion << LL_ENDL;
+ if (isSelf())
+ {
+ LL_INFOS("Avatar") << "Processing appearance message version " << thisAppearanceVersion << LL_ENDL;
+ }
+ else
+ {
+ LL_INFOS("Avatar") << "Processing appearance message for " << getID() << ", version " << thisAppearanceVersion << LL_ENDL;
+ }
// Note:
// locally the COF is maintained via LLInventoryModel::accountForUpdate
diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp
index a4070a513c..dd5b9f9fd5 100644
--- a/indra/newview/llvocache.cpp
+++ b/indra/newview/llvocache.cpp
@@ -85,40 +85,24 @@ bool LLGLTFOverrideCacheEntry::fromLLSD(const LLSD& data)
// message should be interpreted thusly:
/// sides is a list of face indices
- // gltf_json is a list of corresponding json
+ // gltf_llsd is a list of corresponding GLTF override LLSD
// any side not represented in "sides" has no override
- if (data.has("sides") && data.has("gltf_json"))
+ if (data.has("sides") && data.has("gltf_llsd"))
{
LLSD const& sides = data.get("sides");
- LLSD const& gltf_json = data.get("gltf_json");
+ LLSD const& gltf_llsd = data.get("gltf_llsd");
- if (sides.isArray() && gltf_json.isArray() &&
+ if (sides.isArray() && gltf_llsd.isArray() &&
sides.size() != 0 &&
- sides.size() == gltf_json.size())
+ sides.size() == gltf_llsd.size())
{
for (int i = 0; i < sides.size(); ++i)
{
S32 side_idx = sides[i].asInteger();
- std::string gltf_json_str = gltf_json[i].asString();
- mSides[side_idx] = gltf_json_str;
+ mSides[side_idx] = gltf_llsd[i];
LLGLTFMaterial* override_mat = new LLGLTFMaterial();
- std::string error, warn;
- if (override_mat->fromJSON(gltf_json_str, warn, error))
- {
- mGLTFMaterial[side_idx] = override_mat;
- }
- else
- {
- LL_WARNS() << "Invalid GLTF string: \n" << gltf_json_str << LL_ENDL;
- if (!error.empty())
- {
- LL_WARNS() << "Error: " << error << LL_ENDL;
- }
- if (!warn.empty())
- {
- LL_WARNS() << "Warning: " << warn << LL_ENDL;
- }
- }
+ override_mat->applyOverrideLLSD(gltf_llsd[i]);
+ mGLTFMaterial[side_idx] = override_mat;
}
}
else
@@ -157,7 +141,7 @@ LLSD LLGLTFOverrideCacheEntry::toLLSD() const
// check that mSides and mGLTFMaterial have exactly the same keys present
llassert(mGLTFMaterial.count(side.first) == 1);
data["sides"].append(LLSD::Integer(side.first));
- data["gltf_json"].append(side.second);
+ data["gltf_llsd"].append(side.second);
}
return data;
@@ -1199,6 +1183,8 @@ void LLVOCache::initCache(ELLPath location, U32 size, U32 cache_version)
readCacheHeader();
+ LL_INFOS() << "Viewer Object Cache Versions - expected: " << cache_version << " found: " << mMetaInfo.mVersion << LL_ENDL;
+
if( mMetaInfo.mVersion != cache_version
|| mMetaInfo.mAddressSize != expected_address)
{
@@ -1209,7 +1195,8 @@ void LLVOCache::initCache(ELLPath location, U32 size, U32 cache_version)
clearCacheInMemory();
}
else //delete the current cache if the format does not match.
- {
+ {
+ LL_INFOS() << "Viewer Object Cache Versions unmatched. clearing cache." << LL_ENDL;
removeCache();
}
}
diff --git a/indra/newview/llvocache.h b/indra/newview/llvocache.h
index ec0df31828..8525edd121 100644
--- a/indra/newview/llvocache.h
+++ b/indra/newview/llvocache.h
@@ -48,7 +48,7 @@ public:
LLUUID mObjectId;
U32 mLocalId = 0;
- std::unordered_map<S32, std::string> mSides; //json per side
+ std::unordered_map<S32, LLSD> mSides; //override LLSD per side
std::unordered_map<S32, LLPointer<LLGLTFMaterial> > mGLTFMaterial; //GLTF material per side
U64 mRegionHandle = 0;
};
diff --git a/indra/newview/llvoicecallhandler.cpp b/indra/newview/llvoicecallhandler.cpp
index 1e993d1384..95e11abd82 100644
--- a/indra/newview/llvoicecallhandler.cpp
+++ b/indra/newview/llvoicecallhandler.cpp
@@ -38,7 +38,7 @@ public:
{
}
- bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
+ bool handle(const LLSD& params, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web)
{
if (!LLUI::getInstance()->mSettingGroups["config"]->getBOOL("EnableVoiceCall"))
{
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index 150b556284..68d9f4ffab 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -53,7 +53,7 @@ public:
// requests will be throttled from a non-trusted browser
LLVoiceHandler() : LLCommandHandler("voice", UNTRUSTED_THROTTLE) {}
- bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
+ bool handle(const LLSD& params, const LLSD& query_map, const std::string& grid, LLMediaCtrl* web)
{
if (params[0].asString() == "effects")
{
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index c73f96da2d..3725510b6a 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -276,13 +276,13 @@ static void killGateway()
///////////////////////////////////////////////////////////////////////////////////////////////
bool LLVivoxVoiceClient::sShuttingDown = false;
+bool LLVivoxVoiceClient::sConnected = false;
+LLPumpIO *LLVivoxVoiceClient::sPump = nullptr;
LLVivoxVoiceClient::LLVivoxVoiceClient() :
mSessionTerminateRequested(false),
mRelogRequested(false),
- mConnected(false),
mTerminateDaemon(false),
- mPump(NULL),
mSpatialJoiningNum(0),
mTuningMode(false),
@@ -350,7 +350,11 @@ LLVivoxVoiceClient::LLVivoxVoiceClient() :
mIsProcessingChannels(false),
mIsCoroutineActive(false),
mVivoxPump("vivoxClientPump")
-{
+{
+ sShuttingDown = false;
+ sConnected = false;
+ sPump = nullptr;
+
mSpeakerVolume = scale_speaker_volume(0);
mVoiceVersion.serverVersion = "";
@@ -392,7 +396,7 @@ LLVivoxVoiceClient::~LLVivoxVoiceClient()
void LLVivoxVoiceClient::init(LLPumpIO *pump)
{
// constructor will set up LLVoiceClient::getInstance()
- mPump = pump;
+ sPump = pump;
// LLCoros::instance().launch("LLVivoxVoiceClient::voiceControlCoro",
// boost::bind(&LLVivoxVoiceClient::voiceControlCoro, LLVivoxVoiceClient::getInstance()));
@@ -413,10 +417,10 @@ void LLVivoxVoiceClient::terminate()
logoutOfVivox(false);
}
- if(mConnected)
+ if(sConnected)
{
breakVoiceConnection(false);
- mConnected = false;
+ sConnected = false;
}
else
{
@@ -425,7 +429,7 @@ void LLVivoxVoiceClient::terminate()
}
sShuttingDown = true;
- mPump = NULL;
+ sPump = NULL;
}
//---------------------------------------------------
@@ -471,7 +475,7 @@ bool LLVivoxVoiceClient::writeString(const std::string &str)
bool result = false;
LL_DEBUGS("LowVoice") << "sending:\n" << str << LL_ENDL;
- if(mConnected)
+ if(sConnected)
{
apr_status_t err;
apr_size_t size = (apr_size_t)str.size();
@@ -1051,7 +1055,7 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
int retryCount(0);
LLVoiceVivoxStats::getInstance()->reset();
- while (!mConnected && !sShuttingDown && retryCount++ <= DAEMON_CONNECT_RETRY_MAX)
+ while (!sConnected && !sShuttingDown && retryCount++ <= DAEMON_CONNECT_RETRY_MAX)
{
LLVoiceVivoxStats::getInstance()->connectionAttemptStart();
LL_DEBUGS("Voice") << "Attempting to connect to vivox daemon: " << mDaemonHost << LL_ENDL;
@@ -1061,23 +1065,23 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
mSocket = LLSocket::create(gAPRPoolp, LLSocket::STREAM_TCP);
}
- mConnected = mSocket->blockingConnect(mDaemonHost);
- LLVoiceVivoxStats::getInstance()->connectionAttemptEnd(mConnected);
- if (!mConnected)
+ sConnected = mSocket->blockingConnect(mDaemonHost);
+ LLVoiceVivoxStats::getInstance()->connectionAttemptEnd(sConnected);
+ if (!sConnected)
{
llcoro::suspendUntilTimeout(DAEMON_CONNECT_THROTTLE_SECONDS);
}
}
//---------------------------------------------------------------------
- if (sShuttingDown && !mConnected)
+ if (sShuttingDown && !sConnected)
{
return false;
}
llcoro::suspendUntilTimeout(UPDATE_THROTTLE_SECONDS);
- while (!mPump && !sShuttingDown)
+ while (!sPump && !sShuttingDown)
{ // Can't use the pump until we have it available.
llcoro::suspend();
}
@@ -1099,7 +1103,7 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
readChain.push_back(LLIOPipe::ptr_t(new LLVivoxProtocolParser()));
- mPump->addChain(readChain, NEVER_CHAIN_EXPIRY_SECS);
+ sPump->addChain(readChain, NEVER_CHAIN_EXPIRY_SECS);
//---------------------------------------------------------------------
@@ -1321,9 +1325,9 @@ bool LLVivoxVoiceClient::breakVoiceConnection(bool corowait)
// the message, yet we need to receive "connector shutdown response".
// Either wait a bit and emulate it or check gMessageSystem for specific message
_sleep(1000);
- if (mConnected)
+ if (sConnected)
{
- mConnected = false;
+ sConnected = false;
LLSD vivoxevent(LLSDMap("connector", LLSD::Boolean(false)));
mVivoxPump.post(vivoxevent);
}
@@ -1335,7 +1339,7 @@ bool LLVivoxVoiceClient::breakVoiceConnection(bool corowait)
LL_DEBUGS("Voice") << "closing SLVoice socket" << LL_ENDL;
closeSocket(); // Need to do this now -- bad things happen if the destructor does it later.
cleanUp();
- mConnected = false;
+ sConnected = false;
return retval;
}
@@ -2516,7 +2520,7 @@ bool LLVivoxVoiceClient::performMicTuning()
void LLVivoxVoiceClient::closeSocket(void)
{
mSocket.reset();
- mConnected = false;
+ sConnected = false;
mConnectorEstablished = false;
mAccountLoggedIn = false;
}
@@ -3017,7 +3021,7 @@ bool LLVivoxVoiceClient::deviceSettingsAvailable()
{
bool result = true;
- if(!mConnected)
+ if(!sConnected)
result = false;
if(mRenderDevices.empty())
@@ -3816,7 +3820,7 @@ void LLVivoxVoiceClient::connectorShutdownResponse(int statusCode, std::string &
// Should this ever fail? do we care if it does?
}
- mConnected = false;
+ sConnected = false;
mShutdownComplete = true;
LLSD vivoxevent(LLSDMap("connector", LLSD::Boolean(false)));
@@ -7389,7 +7393,7 @@ LLIOPipe::EStatus LLVivoxProtocolParser::process_impl(
LL_DEBUGS("VivoxProtocolParser") << "at end, mInput is: " << mInput << LL_ENDL;
- if(!LLVivoxVoiceClient::getInstance()->mConnected)
+ if(!LLVivoxVoiceClient::sConnected)
{
// If voice has been disabled, we just want to close the socket. This does so.
LL_INFOS("Voice") << "returning STATUS_STOP" << LL_ENDL;
diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h
index 0a785401c1..e3ab99c675 100644
--- a/indra/newview/llvoicevivox.h
+++ b/indra/newview/llvoicevivox.h
@@ -666,12 +666,10 @@ private:
LLHost mDaemonHost;
LLSocket::ptr_t mSocket;
- bool mConnected;
// We should kill the voice daemon in case of connection alert
bool mTerminateDaemon;
- LLPumpIO *mPump;
friend class LLVivoxProtocolParser;
std::string mAccountName;
@@ -916,7 +914,10 @@ private:
bool mIsProcessingChannels;
bool mIsCoroutineActive;
- static bool sShuttingDown; // corutines can last longer than vivox so we need a static variable as a shutdown flag
+ // This variables can last longer than vivox in coroutines so we need them as static
+ static bool sShuttingDown;
+ static bool sConnected;
+ static LLPumpIO* sPump;
LLEventMailDrop mVivoxPump;
};
diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp
index 3ac04cf665..99874b8185 100644
--- a/indra/newview/llvopartgroup.cpp
+++ b/indra/newview/llvopartgroup.cpp
@@ -572,7 +572,7 @@ void LLVOPartGroup::getGeometry(const LLViewerPart& part,
up.setCross3(right, at);
up.normalize3fast();
- if (part.mFlags & LLPartData::LL_PART_FOLLOW_VELOCITY_MASK)
+ if (part.mFlags & LLPartData::LL_PART_FOLLOW_VELOCITY_MASK && !part.mVelocity.isExactlyZero())
{
LLVector4a normvel;
normvel.load3(part.mVelocity.mV);
diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp
index feb1e26d57..9544450a69 100644
--- a/indra/newview/llvosurfacepatch.cpp
+++ b/indra/newview/llvosurfacepatch.cpp
@@ -391,7 +391,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
LLStrider<U16> &indicesp,
U32 &index_offset)
{
- S32 vertex_count = 0;
S32 i, x, y;
S32 num_vertices;
@@ -426,7 +425,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
normalsp++;
texCoords0p++;
texCoords1p++;
- vertex_count++;
}
// North patch
@@ -439,7 +437,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
normalsp++;
texCoords0p++;
texCoords1p++;
- vertex_count++;
}
@@ -476,7 +473,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
normalsp++;
texCoords0p++;
texCoords1p++;
- vertex_count++;
}
// Iterate through the north patch's points
@@ -490,7 +486,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
normalsp++;
texCoords0p++;
texCoords1p++;
- vertex_count++;
}
@@ -534,7 +529,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
normalsp++;
texCoords0p++;
texCoords1p++;
- vertex_count++;
}
// Iterate through the north patch's points
@@ -548,7 +542,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep,
normalsp++;
texCoords0p++;
texCoords1p++;
- vertex_count++;
}
for (i = 0; i < length; i++)
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 08d2e99c40..ec2f490742 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -619,8 +619,18 @@ void LLVOVolume::animateTextures()
continue;
}
- LLGLTFMaterial *gltf_mat = te->getGLTFRenderMaterial();
- const bool is_pbr = gltf_mat != nullptr;
+ if (!(result & LLViewerTextureAnim::ROTATE))
+ {
+ te->getRotation(&rot);
+ }
+ if (!(result & LLViewerTextureAnim::TRANSLATE))
+ {
+ te->getOffset(&off_s,&off_t);
+ }
+ if (!(result & LLViewerTextureAnim::SCALE))
+ {
+ te->getScale(&scale_s, &scale_t);
+ }
if (!facep->mTextureMatrix)
{
@@ -629,80 +639,22 @@ void LLVOVolume::animateTextures()
LLMatrix4& tex_mat = *facep->mTextureMatrix;
tex_mat.setIdentity();
+ LLVector3 trans ;
- if (!is_pbr)
- {
- if (!(result & LLViewerTextureAnim::ROTATE))
- {
- te->getRotation(&rot);
- }
- if (!(result & LLViewerTextureAnim::TRANSLATE))
- {
- te->getOffset(&off_s,&off_t);
- }
- if (!(result & LLViewerTextureAnim::SCALE))
- {
- te->getScale(&scale_s, &scale_t);
- }
-
- LLVector3 trans ;
-
- trans.set(LLVector3(off_s+0.5f, off_t+0.5f, 0.f));
- tex_mat.translate(LLVector3(-0.5f, -0.5f, 0.f));
-
- LLVector3 scale(scale_s, scale_t, 1.f);
- LLQuaternion quat;
- quat.setQuat(rot, 0, 0, -1.f);
-
- tex_mat.rotate(quat);
-
- LLMatrix4 mat;
- mat.initAll(scale, LLQuaternion(), LLVector3());
- tex_mat *= mat;
-
- tex_mat.translate(trans);
- }
- else
- {
- if (!(result & LLViewerTextureAnim::ROTATE))
- {
- rot = 0.0f;
- }
- if (!(result & LLViewerTextureAnim::TRANSLATE))
- {
- off_s = 0.0f;
- off_t = 0.0f;
- }
- if (!(result & LLViewerTextureAnim::SCALE))
- {
- scale_s = 1.0f;
- scale_t = 1.0f;
- }
-
- // For PBR materials, use Blinn-Phong rotation as hint for
- // translation direction. In a Blinn-Phong material, the
- // translation direction would be a byproduct the texture
- // transform.
- F32 rot_frame;
- te->getRotation(&rot_frame);
+ trans.set(LLVector3(off_s+0.5f, off_t+0.5f, 0.f));
+ tex_mat.translate(LLVector3(-0.5f, -0.5f, 0.f));
- tex_mat.translate(LLVector3(-0.5f, -0.5f, 0.f));
-
- LLQuaternion quat;
- quat.setQuat(rot, 0, 0, -1.f);
- tex_mat.rotate(quat);
-
- LLMatrix4 mat;
- LLVector3 scale(scale_s, scale_t, 1.f);
- mat.initAll(scale, LLQuaternion(), LLVector3());
- tex_mat *= mat;
-
- LLVector3 off(off_s, off_t, 0.f);
- off.rotVec(rot_frame, 0, 0, 1.f);
- tex_mat.translate(off);
+ LLVector3 scale(scale_s, scale_t, 1.f);
+ LLQuaternion quat;
+ quat.setQuat(rot, 0, 0, -1.f);
+
+ tex_mat.rotate(quat);
- tex_mat.translate(LLVector3(0.5f, 0.5f, 0.f));
- }
+ LLMatrix4 mat;
+ mat.initAll(scale, LLQuaternion(), LLVector3());
+ tex_mat *= mat;
+
+ tex_mat.translate(trans);
}
}
else
@@ -4617,7 +4569,7 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector4a& start, const LLVector4a&
if (!pick_unselectable)
{
- if (!LLSelectMgr::instance().canSelectObject(this))
+ if (!LLSelectMgr::instance().canSelectObject(this, TRUE))
{
return FALSE;
}
@@ -5102,6 +5054,30 @@ LLControlAVBridge::LLControlAVBridge(LLDrawable* drawablep, LLViewerRegion* regi
mPartitionType = LLViewerRegion::PARTITION_CONTROL_AV;
}
+void LLControlAVBridge::updateSpatialExtents()
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWABLE
+
+ LLSpatialGroup* root = (LLSpatialGroup*)mOctree->getListener(0);
+
+ bool rootWasDirty = root->isDirty();
+
+ super::updateSpatialExtents(); // root becomes non-dirty here
+
+ // SL-18251 "On-screen animesh characters using pelvis offset animations
+ // disappear when root goes off-screen"
+ //
+ // Expand extents to include Control Avatar placed outside of the bounds
+ LLControlAvatar* controlAvatar = getVObj() ? getVObj()->getControlAvatar() : NULL;
+ if (controlAvatar
+ && controlAvatar->mDrawable
+ && controlAvatar->mDrawable->getEntry()
+ && (rootWasDirty || controlAvatar->mPlaying))
+ {
+ root->expandExtents(controlAvatar->mDrawable->getSpatialExtents(), *mDrawable->getXform());
+ }
+}
+
bool can_batch_texture(LLFace* facep)
{
if (facep->getTextureEntry()->getBumpmap())
@@ -5322,13 +5298,14 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
if (mat)
{
+ BOOL is_alpha = (facep->getPoolType() == LLDrawPool::POOL_ALPHA) || (facep->getTextureEntry()->getColor().mV[3] < 0.999f) ? TRUE : FALSE;
if (type == LLRenderPass::PASS_ALPHA)
{
- shader_mask = mat->getShaderMask(LLMaterial::DIFFUSE_ALPHA_MODE_BLEND);
+ shader_mask = mat->getShaderMask(LLMaterial::DIFFUSE_ALPHA_MODE_BLEND, is_alpha);
}
else
{
- shader_mask = mat->getShaderMask();
+ shader_mask = mat->getShaderMask(LLMaterial::DIFFUSE_ALPHA_MODE_DEFAULT, is_alpha);
}
}
@@ -5831,15 +5808,29 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
}
else
{
- if (te->getColor().mV[3] > 0.f || te->getGlow() > 0.f)
- { //only treat as alpha in the pipeline if < 100% transparent
- drawablep->setState(LLDrawable::HAS_ALPHA);
- add_face(sAlphaFaces, alpha_count, facep);
+ F32 alpha;
+ if (is_pbr)
+ {
+ alpha = gltf_mat ? gltf_mat->mBaseColor.mV[3] : 1.0;
}
- else if (LLDrawPoolAlpha::sShowDebugAlpha)
+ else
{
- add_face(sAlphaFaces, alpha_count, facep);
+ alpha = te->getColor().mV[3];
}
+ if (alpha > 0.f || te->getGlow() > 0.f)
+ { //only treat as alpha in the pipeline if < 100% transparent
+ drawablep->setState(LLDrawable::HAS_ALPHA);
+ add_face(sAlphaFaces, alpha_count, facep);
+ }
+ else if (LLDrawPoolAlpha::sShowDebugAlpha ||
+ (gPipeline.sRenderHighlight && !drawablep->getParent() &&
+ //only root objects are highlighted with red color in this case
+ drawablep->getVObj() && drawablep->getVObj()->flagScripted() &&
+ (LLPipeline::getRenderScriptedBeacons() ||
+ (LLPipeline::getRenderScriptedTouchBeacons() && drawablep->getVObj()->flagHandleTouch()))))
+ { //draw the transparent face for debugging purposes using a custom texture
+ add_face(sAlphaFaces, alpha_count, facep);
+ }
}
}
else
@@ -6052,12 +6043,18 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
LLVertexBuffer* buff = face->getVertexBuffer();
if (buff)
{
- if (!face->getGeometryVolume(*volume, face->getTEOffset(),
- vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), face->getGeomIndex()))
- { //something's gone wrong with the vertex buffer accounting, rebuild this group
- group->dirtyGeom();
- gPipeline.markRebuild(group);
- }
+ if (!face->getGeometryVolume(*volume, // volume
+ face->getTEOffset(), // face_index
+ vobj->getRelativeXform(), // mat_vert_in
+ vobj->getRelativeXformInvTrans(), // mat_norm_in
+ face->getGeomIndex(), // index_offset
+ false, // force_rebuild
+ true)) // no_debug_assert
+ { // Something's gone wrong with the vertex buffer accounting,
+ // rebuild this group with no debug assert because MESH_DIRTY
+ group->dirtyGeom();
+ gPipeline.markRebuild(group);
+ }
buff->unmapBuffer();
}
@@ -6190,7 +6187,6 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
LLSpatialGroup::buffer_map_t buffer_map;
LLViewerTexture* last_tex = NULL;
- S32 buffer_index = 0;
S32 texture_index_channels = 1;
@@ -6202,8 +6198,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
if (distance_sort)
{
texture_index_channels = gDeferredAlphaProgram.mFeatures.mIndexedTextureChannels;
- buffer_index = -1;
- }
+ }
texture_index_channels = LLGLSLShader::sIndexedTextureChannels;
@@ -6223,14 +6218,9 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
tex = NULL;
}
- if (last_tex == tex)
- {
- buffer_index++;
- }
- else
+ if (last_tex != tex)
{
last_tex = tex;
- buffer_index = 0;
}
bool bake_sunlight = LLPipeline::sBakeSunlight && facep->getDrawable()->isStatic();
@@ -6484,12 +6474,15 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
}
}
- F32 te_alpha = te->getColor().mV[3];
+ F32 blinn_phong_alpha = te->getColor().mV[3];
bool use_legacy_bump = te->getBumpmap() && (te->getBumpmap() < 18) && (!mat || mat->getNormalID().isNull());
- bool opaque = te_alpha >= 0.999f;
- bool transparent = te_alpha < 0.999f;
+ bool blinn_phong_opaque = blinn_phong_alpha >= 0.999f;
+ bool blinn_phong_transparent = blinn_phong_alpha < 0.999f;
- is_alpha = (is_alpha || transparent) ? TRUE : FALSE;
+ if (!gltf_mat)
+ {
+ is_alpha = (is_alpha || blinn_phong_transparent) ? TRUE : FALSE;
+ }
if (gltf_mat || (mat && !hud_group))
{
@@ -6519,7 +6512,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
{
if (mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK)
{
- if (opaque)
+ if (blinn_phong_opaque)
{
registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK);
}
@@ -6540,7 +6533,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
}
else
{
- if (opaque)
+ if (blinn_phong_opaque)
{
registerFace(group, facep, LLRenderPass::PASS_FULLBRIGHT);
}
@@ -6551,7 +6544,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
}
}
}
- else if (transparent)
+ else if (blinn_phong_transparent)
{
registerFace(group, facep, LLRenderPass::PASS_ALPHA);
}
@@ -6593,7 +6586,7 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
{ // HACK - this should never happen, but sometimes we get a material that thinks it has alpha blending when it ought not
alpha_mode = LLMaterial::DIFFUSE_ALPHA_MODE_NONE;
}
- U32 mask = mat->getShaderMask(alpha_mode);
+ U32 mask = mat->getShaderMask(alpha_mode, is_alpha);
U32 vb_mask = facep->getVertexBuffer()->getTypeMask();
diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp
index 89b74ae962..8681f7c14e 100644
--- a/indra/newview/llwearableitemslist.cpp
+++ b/indra/newview/llwearableitemslist.cpp
@@ -104,8 +104,6 @@ BOOL LLPanelWearableOutfitItem::postBuild()
{
LLPanelWearableListItem::postBuild();
- LLViewerInventoryItem* inv_item = getItem();
- mShowWidgets &= (inv_item->getType() != LLAssetType::AT_BODYPART);
if(mShowWidgets)
{
addWidgetToRightSide("add_wearable");
@@ -208,7 +206,12 @@ void LLPanelWearableOutfitItem::updateItem(const std::string& name,
if(mShowWidgets)
{
setShowWidget("add_wearable", !is_worn);
- setShowWidget("remove_wearable", is_worn);
+
+ // Body parts can't be removed, only replaced
+ LLViewerInventoryItem* inv_item = getItem();
+ bool show_remove = is_worn && inv_item && (inv_item->getType() != LLAssetType::AT_BODYPART);
+ setShowWidget("remove_wearable", show_remove);
+
if(mHovered)
{
setWidgetsVisible(true);
diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index 7a8f97fa68..cc947c87d5 100755
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -50,6 +50,7 @@
#include "lltextureview.h"
#include "lltracker.h"
#include "llviewercamera.h"
+#include "llviewernetwork.h"
#include "llviewertexture.h"
#include "llviewertexturelist.h"
#include "llviewerregion.h"
@@ -1779,7 +1780,7 @@ BOOL LLWorldMapView::handleDoubleClick( S32 x, S32 y, MASK mask )
// Invoke the event details floater if someone is clicking on an event.
LLSD params(LLSD::emptyArray());
params.append(event_id);
- LLCommandDispatcher::dispatch("event", params, LLSD(), NULL, LLCommandHandler::NAV_TYPE_CLICKED, true);
+ LLCommandDispatcher::dispatch("event", params, LLSD(), LLGridManager::getInstance()->getGrid(), NULL, LLCommandHandler::NAV_TYPE_CLICKED, true);
break;
}
case MAP_ITEM_LAND_FOR_SALE:
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 0c767e7767..9266c84540 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -130,7 +130,6 @@ S32 LLPipeline::RenderShadowDetail;
S32 LLPipeline::RenderShadowSplits;
bool LLPipeline::RenderDeferredSSAO;
F32 LLPipeline::RenderShadowResolutionScale;
-bool LLPipeline::RenderLocalLights;
bool LLPipeline::RenderDelayCreation;
bool LLPipeline::RenderAnimateRes;
bool LLPipeline::FreezeTime;
@@ -157,6 +156,7 @@ S32 LLPipeline::RenderGlowResolutionPow;
S32 LLPipeline::RenderGlowIterations;
F32 LLPipeline::RenderGlowWidth;
F32 LLPipeline::RenderGlowStrength;
+bool LLPipeline::RenderGlowNoise;
bool LLPipeline::RenderDepthOfField;
bool LLPipeline::RenderDepthOfFieldInEditMode;
F32 LLPipeline::CameraFocusTransitionTime;
@@ -348,8 +348,7 @@ LLPipeline::LLPipeline() :
mResetVertexBuffers(false),
mLastRebuildPool(NULL),
mLightMask(0),
- mLightMovingMask(0),
- mLightingDetail(0)
+ mLightMovingMask(0)
{
mNoiseMap = 0;
mTrueNoiseMap = 0;
@@ -470,8 +469,6 @@ void LLPipeline::init()
mScreenTriangleVB->unmapBuffer();
}
- setLightingDetail(-1);
-
//
// Update all settings to trigger a cached settings refresh
//
@@ -490,7 +487,6 @@ void LLPipeline::init()
connectRefreshCachedSettingsSafe("RenderShadowSplits");
connectRefreshCachedSettingsSafe("RenderDeferredSSAO");
connectRefreshCachedSettingsSafe("RenderShadowResolutionScale");
- connectRefreshCachedSettingsSafe("RenderLocalLights");
connectRefreshCachedSettingsSafe("RenderDelayCreation");
connectRefreshCachedSettingsSafe("RenderAnimateRes");
connectRefreshCachedSettingsSafe("FreezeTime");
@@ -517,6 +513,7 @@ void LLPipeline::init()
connectRefreshCachedSettingsSafe("RenderGlowIterations");
connectRefreshCachedSettingsSafe("RenderGlowWidth");
connectRefreshCachedSettingsSafe("RenderGlowStrength");
+ connectRefreshCachedSettingsSafe("RenderGlowNoise");
connectRefreshCachedSettingsSafe("RenderDepthOfField");
connectRefreshCachedSettingsSafe("RenderDepthOfFieldInEditMode");
connectRefreshCachedSettingsSafe("CameraFocusTransitionTime");
@@ -840,7 +837,9 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
mSceneMap.allocate(resX, resY, GL_RGB, true);
}
- mPostMap.allocate(resX, resY, GL_RGBA);
+ const bool post_hdr = gSavedSettings.getBOOL("RenderPostProcessingHDR");
+ const U32 post_color_fmt = post_hdr ? GL_RGBA16F : GL_RGBA;
+ mPostMap.allocate(resX, resY, post_color_fmt);
//HACK make screenbuffer allocations start failing after 30 seconds
if (gSavedSettings.getBOOL("SimulateFBOFailure"))
@@ -978,7 +977,6 @@ void LLPipeline::refreshCachedSettings()
RenderShadowSplits = gSavedSettings.getS32("RenderShadowSplits");
RenderDeferredSSAO = gSavedSettings.getBOOL("RenderDeferredSSAO");
RenderShadowResolutionScale = gSavedSettings.getF32("RenderShadowResolutionScale");
- RenderLocalLights = gSavedSettings.getBOOL("RenderLocalLights");
RenderDelayCreation = gSavedSettings.getBOOL("RenderDelayCreation");
RenderAnimateRes = gSavedSettings.getBOOL("RenderAnimateRes");
FreezeTime = gSavedSettings.getBOOL("FreezeTime");
@@ -1005,6 +1003,7 @@ void LLPipeline::refreshCachedSettings()
RenderGlowIterations = gSavedSettings.getS32("RenderGlowIterations");
RenderGlowWidth = gSavedSettings.getF32("RenderGlowWidth");
RenderGlowStrength = gSavedSettings.getF32("RenderGlowStrength");
+ RenderGlowNoise = gSavedSettings.getBOOL("RenderGlowNoise");
RenderDepthOfField = gSavedSettings.getBOOL("RenderDepthOfField");
RenderDepthOfFieldInEditMode = gSavedSettings.getBOOL("RenderDepthOfFieldInEditMode");
CameraFocusTransitionTime = gSavedSettings.getF32("CameraFocusTransitionTime");
@@ -1163,9 +1162,11 @@ void LLPipeline::createGLBuffers()
// allocate screen space glow buffers
const U32 glow_res = llmax(1, llmin(512, 1 << gSavedSettings.getS32("RenderGlowResolutionPow")));
+ const bool glow_hdr = gSavedSettings.getBOOL("RenderGlowHDR");
+ const U32 glow_color_fmt = glow_hdr ? GL_RGBA16F : GL_RGBA;
for (U32 i = 0; i < 3; i++)
{
- mGlow[i].allocate(512, glow_res, GL_RGBA);
+ mGlow[i].allocate(512, glow_res, glow_color_fmt);
}
allocateScreenBuffer(resX, resY);
@@ -1349,39 +1350,6 @@ void LLPipeline::enableShadows(const bool enable_shadows)
//should probably do something here to wrangle shadows....
}
-S32 LLPipeline::getMaxLightingDetail() const
-{
- /*if (mShaderLevel[SHADER_OBJECT] >= LLDrawPoolSimple::SHADER_LEVEL_LOCAL_LIGHTS)
- {
- return 3;
- }
- else*/
- {
- return 1;
- }
-}
-
-S32 LLPipeline::setLightingDetail(S32 level)
-{
- refreshCachedSettings();
-
- if (level < 0)
- {
- if (RenderLocalLights)
- {
- level = 1;
- }
- else
- {
- level = 0;
- }
- }
- level = llclamp(level, 0, getMaxLightingDetail());
- mLightingDetail = level;
-
- return mLightingDetail;
-}
-
class LLOctreeDirtyTexture : public OctreeTraveler
{
public:
@@ -2459,8 +2427,11 @@ void LLPipeline::doOcclusion(LLCamera& camera)
for (LLCullResult::sg_iterator iter = sCull->beginOcclusionGroups(); iter != sCull->endOcclusionGroups(); ++iter)
{
LLSpatialGroup* group = *iter;
- group->doOcclusion(&camera);
- group->clearOcclusionState(LLSpatialGroup::ACTIVE_OCCLUSION);
+ if (!group->isDead())
+ {
+ group->doOcclusion(&camera);
+ group->clearOcclusionState(LLSpatialGroup::ACTIVE_OCCLUSION);
+ }
}
//apply occlusion culling to object cache tree
@@ -2905,6 +2876,10 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
for (LLCullResult::sg_iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)
{
LLSpatialGroup* group = *iter;
+ if (group->isDead())
+ {
+ continue;
+ }
group->checkOcclusion();
if (sUseOcclusion > 1 && group->isOcclusionState(LLSpatialGroup::OCCLUDED))
{
@@ -2964,6 +2939,10 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
for (LLCullResult::sg_iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
{
LLSpatialGroup* group = *iter;
+ if (group->isDead())
+ {
+ continue;
+ }
group->checkOcclusion();
if (sUseOcclusion > 1 && group->isOcclusionState(LLSpatialGroup::OCCLUDED))
{
@@ -3123,7 +3102,12 @@ void forAllDrawables(LLCullResult::sg_iterator begin,
{
for (LLCullResult::sg_iterator i = begin; i != end; ++i)
{
- for (LLSpatialGroup::element_iter j = (*i)->getDataBegin(); j != (*i)->getDataEnd(); ++j)
+ LLSpatialGroup* group = *i;
+ if (group->isDead())
+ {
+ continue;
+ }
+ for (LLSpatialGroup::element_iter j = group->getDataBegin(); j != group->getDataEnd(); ++j)
{
if((*j)->hasDrawable())
{
@@ -3332,6 +3316,10 @@ void LLPipeline::postSort(LLCamera &camera)
for (LLCullResult::sg_iterator i = sCull->beginDrawableGroups(); i != sCull->endDrawableGroups(); ++i)
{
LLSpatialGroup *group = *i;
+ if (group->isDead())
+ {
+ continue;
+ }
if (!sUseOcclusion || !group->isOcclusionState(LLSpatialGroup::OCCLUDED))
{
group->rebuildGeom();
@@ -3350,6 +3338,12 @@ void LLPipeline::postSort(LLCamera &camera)
for (LLCullResult::sg_iterator i = sCull->beginVisibleGroups(); i != sCull->endVisibleGroups(); ++i)
{
LLSpatialGroup *group = *i;
+
+ if (group->isDead())
+ {
+ continue;
+ }
+
if ((sUseOcclusion && group->isOcclusionState(LLSpatialGroup::OCCLUDED)) ||
(RenderAutoHideSurfaceAreaLimit > 0.f &&
group->mSurfaceArea > RenderAutoHideSurfaceAreaLimit * llmax(group->mObjectBoxSize, 10.f)))
@@ -5218,7 +5212,9 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
return;
}
- if (mLightingDetail >= 1)
+ static LLCachedControl<S32> local_light_count(gSavedSettings, "RenderLocalLightCount", 256);
+
+ if (local_light_count >= 1)
{
// mNearbyLight (and all light_set_t's) are sorted such that
// begin() == the closest light and rbegin() == the farthest light
@@ -5485,7 +5481,9 @@ void LLPipeline::setupHWLights()
mLightMovingMask = 0;
- if (mLightingDetail >= 1)
+ static LLCachedControl<S32> local_light_count(gSavedSettings, "RenderLocalLightCount", 256);
+
+ if (local_light_count >= 1)
{
for (light_set_t::iterator iter = mNearbyLights.begin();
iter != mNearbyLights.end(); ++iter)
@@ -5628,10 +5626,6 @@ void LLPipeline::enableLights(U32 mask)
{
assertInitialized();
- if (mLightingDetail == 0)
- {
- mask &= 0xf003; // sun and backlight only (and fullbright bit)
- }
if (mLightMask != mask)
{
stop_glerror();
@@ -5659,28 +5653,13 @@ void LLPipeline::enableLights(U32 mask)
}
}
-void LLPipeline::enableLightsStatic()
-{
- assertInitialized();
- U32 mask = 0x01; // Sun
- if (mLightingDetail >= 2)
- {
- mask |= mLightMovingMask; // Hardware moving lights
- }
- else
- {
- mask |= 0xff & (~2); // Hardware local lights
- }
- enableLights(mask);
-}
-
void LLPipeline::enableLightsDynamic()
{
assertInitialized();
U32 mask = 0xff & (~2); // Local lights
enableLights(mask);
- if (isAgentAvatarValid() && getLightingDetail() <= 0)
+ if (isAgentAvatarValid())
{
if (gAgentAvatarp->mSpecialRenderMode == 0) // normal
{
@@ -6216,7 +6195,7 @@ LLVOPartGroup* LLPipeline::lineSegmentIntersectParticle(const LLVector4a& start,
LLSpatialPartition* part = region->getSpatialPartition(LLViewerRegion::PARTITION_PARTICLE);
if (part && hasRenderType(part->mDrawableType))
{
- LLDrawable* hit = part->lineSegmentIntersect(start, local_end, TRUE, FALSE, TRUE, face_hit, &position, NULL, NULL, NULL);
+ LLDrawable* hit = part->lineSegmentIntersect(start, local_end, TRUE, FALSE, TRUE, FALSE, face_hit, &position, NULL, NULL, NULL);
if (hit)
{
drawable = hit;
@@ -6245,6 +6224,7 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector4a& start,
bool pick_transparent,
bool pick_rigged,
bool pick_unselectable,
+ bool pick_reflection_probe,
S32* face_hit,
LLVector4a* intersection, // return the intersection point
LLVector2* tex_coord, // return the texture coordinates of the intersection point
@@ -6278,7 +6258,7 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector4a& start,
LLSpatialPartition* part = region->getSpatialPartition(j);
if (part && hasRenderType(part->mDrawableType))
{
- LLDrawable* hit = part->lineSegmentIntersect(start, local_end, pick_transparent, pick_rigged, pick_unselectable, face_hit, &position, tex_coord, normal, tangent);
+ LLDrawable* hit = part->lineSegmentIntersect(start, local_end, pick_transparent, pick_rigged, pick_unselectable, pick_reflection_probe, face_hit, &position, tex_coord, normal, tangent);
if (hit)
{
drawable = hit;
@@ -6335,7 +6315,7 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector4a& start,
LLSpatialPartition* part = region->getSpatialPartition(LLViewerRegion::PARTITION_AVATAR);
if (part && hasRenderType(part->mDrawableType))
{
- LLDrawable* hit = part->lineSegmentIntersect(start, local_end, pick_transparent, pick_rigged, pick_unselectable, face_hit, &position, tex_coord, normal, tangent);
+ LLDrawable* hit = part->lineSegmentIntersect(start, local_end, pick_transparent, pick_rigged, pick_unselectable, pick_reflection_probe, face_hit, &position, tex_coord, normal, tangent);
if (hit)
{
LLVector4a delta;
@@ -6423,7 +6403,7 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInHUD(const LLVector4a& start, c
LLSpatialPartition* part = region->getSpatialPartition(LLViewerRegion::PARTITION_HUD);
if (part)
{
- LLDrawable* hit = part->lineSegmentIntersect(start, end, pick_transparent, FALSE, TRUE, face_hit, intersection, tex_coord, normal, tangent);
+ LLDrawable* hit = part->lineSegmentIntersect(start, end, pick_transparent, FALSE, TRUE, FALSE, face_hit, intersection, tex_coord, normal, tangent);
if (hit)
{
drawable = hit;
@@ -6487,6 +6467,25 @@ void LLPipeline::renderObjects(U32 type, bool texture, bool batch_texture, bool
gGLLastMatrix = NULL;
}
+void LLPipeline::renderGLTFObjects(U32 type, bool texture, bool rigged)
+{
+ assertInitialized();
+ gGL.loadMatrix(gGLModelView);
+ gGLLastMatrix = NULL;
+
+ if (rigged)
+ {
+ mSimplePool->pushRiggedGLTFBatches(type + 1, texture);
+ }
+ else
+ {
+ mSimplePool->pushGLTFBatches(type, texture);
+ }
+
+ gGL.loadMatrix(gGLModelView);
+ gGLLastMatrix = NULL;
+}
+
// Currently only used for shadows -Cosmic,2023-04-19
void LLPipeline::renderAlphaObjects(bool rigged)
{
@@ -6882,6 +6881,19 @@ void LLPipeline::generateGlow(LLRenderTarget* src)
warmthWeights.mV[2]);
gGlowExtractProgram.uniform1f(LLShaderMgr::GLOW_WARMTH_AMOUNT, warmthAmount);
+ if (RenderGlowNoise)
+ {
+ S32 channel = gGlowExtractProgram.enableTexture(LLShaderMgr::GLOW_NOISE_MAP);
+ if (channel > -1)
+ {
+ gGL.getTexUnit(channel)->bindManual(LLTexUnit::TT_TEXTURE, mTrueNoiseMap);
+ gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_POINT);
+ }
+ gGlowExtractProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES,
+ mGlow[2].getWidth(),
+ mGlow[2].getHeight());
+ }
+
{
LLGLEnable blend_on(GL_BLEND);
@@ -7126,7 +7138,7 @@ void LLPipeline::renderDoF(LLRenderTarget* src, LLRenderTarget* dst)
LLVector4a result;
result.clear();
- gViewerWindow->cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE, FALSE, TRUE, NULL, &result);
+ gViewerWindow->cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE, FALSE, TRUE, TRUE, NULL, &result);
focus_point.set(result.getF32ptr());
}
@@ -7664,7 +7676,17 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_
shader.uniformMatrix4fv(LLShaderMgr::DEFERRED_NORM_MATRIX, 1, FALSE, norm_mat.m);
}
- shader.uniform3fv(LLShaderMgr::SUNLIGHT_COLOR, 1, mSunDiffuse.mV);
+ // auto adjust legacy sun color if needed
+ static LLCachedControl<bool> should_auto_adjust(gSavedSettings, "RenderSkyAutoAdjustLegacy", true);
+ static LLCachedControl<F32> auto_adjust_sun_color_scale(gSavedSettings, "RenderSkyAutoAdjustSunColorScale", 1.f);
+ LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
+ LLColor3 sun_diffuse(mSunDiffuse.mV);
+ if (should_auto_adjust && psky->canAutoAdjust())
+ {
+ sun_diffuse *= auto_adjust_sun_color_scale;
+ }
+
+ shader.uniform3fv(LLShaderMgr::SUNLIGHT_COLOR, 1, sun_diffuse.mV);
shader.uniform3fv(LLShaderMgr::MOONLIGHT_COLOR, 1, mMoonDiffuse.mV);
shader.uniform1f(LLShaderMgr::REFLECTION_PROBE_MAX_LOD, mReflectionMapManager.mMaxProbeLOD);
@@ -7885,9 +7907,9 @@ void LLPipeline::renderDeferredLighting()
unbindDeferredShader(LLPipeline::sUnderWaterRender ? gDeferredSoftenWaterProgram : gDeferredSoftenProgram);
}
- bool render_local = RenderLocalLights; // && !gCubeSnapshot;
+ static LLCachedControl<S32> local_light_count(gSavedSettings, "RenderLocalLightCount", 256);
- if (render_local)
+ if (local_light_count > 0)
{
gGL.setSceneBlendType(LLRender::BT_ADD);
std::list<LLVector4> fullscreen_lights;
@@ -7922,8 +7944,15 @@ void LLPipeline::renderDeferredLighting()
// mNearbyLights already includes distance calculation and excludes muted avatars.
// It is calculated from mLights
// mNearbyLights also provides fade value to gracefully fade-out out of range lights
+ S32 count = 0;
for (light_set_t::iterator iter = mNearbyLights.begin(); iter != mNearbyLights.end(); ++iter)
{
+ count++;
+ if (count > local_light_count)
+ { //stop collecting lights once we hit the limit
+ break;
+ }
+
LLDrawable * drawablep = iter->drawable;
LLVOVolume * volume = drawablep->getVOVolume();
if (!volume)
@@ -7970,24 +7999,20 @@ void LLPipeline::renderDeferredLighting()
camera->getOrigin().mV[1] > c[1] + s + 0.2f || camera->getOrigin().mV[1] < c[1] - s - 0.2f ||
camera->getOrigin().mV[2] > c[2] + s + 0.2f || camera->getOrigin().mV[2] < c[2] - s - 0.2f)
{ // draw box if camera is outside box
- if (render_local)
+ if (volume->isLightSpotlight())
{
- if (volume->isLightSpotlight())
- {
- drawablep->getVOVolume()->updateSpotLightPriority();
- spot_lights.push_back(drawablep);
- continue;
- }
+ drawablep->getVOVolume()->updateSpotLightPriority();
+ spot_lights.push_back(drawablep);
+ continue;
+ }
- gDeferredLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, c);
- gDeferredLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s);
- gDeferredLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV);
- gDeferredLightProgram.uniform1f(LLShaderMgr::LIGHT_FALLOFF, volume->getLightFalloff(DEFERRED_LIGHT_FALLOFF));
- gGL.syncMatrices();
+ gDeferredLightProgram.uniform3fv(LLShaderMgr::LIGHT_CENTER, 1, c);
+ gDeferredLightProgram.uniform1f(LLShaderMgr::LIGHT_SIZE, s);
+ gDeferredLightProgram.uniform3fv(LLShaderMgr::DIFFUSE_COLOR, 1, col.mV);
+ gDeferredLightProgram.uniform1f(LLShaderMgr::LIGHT_FALLOFF, volume->getLightFalloff(DEFERRED_LIGHT_FALLOFF));
+ gGL.syncMatrices();
- mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, center));
- stop_glerror();
- }
+ mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, center));
}
else
{
@@ -8581,8 +8606,7 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
LLRenderPass::PASS_NORMMAP,
LLRenderPass::PASS_NORMMAP_EMISSIVE,
LLRenderPass::PASS_NORMSPEC,
- LLRenderPass::PASS_NORMSPEC_EMISSIVE,
- LLRenderPass::PASS_GLTF_PBR
+ LLRenderPass::PASS_NORMSPEC_EMISSIVE
};
LLGLEnable cull(GL_CULL_FACE);
@@ -8645,6 +8669,8 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
renderObjects(type, false, false, rigged);
}
+ renderGLTFObjects(LLRenderPass::PASS_GLTF_PBR, false, rigged);
+
gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
}
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 961a55330a..d4c6432e55 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -205,6 +205,7 @@ public:
bool pick_transparent,
bool pick_rigged,
bool pick_unselectable,
+ bool pick_reflection_probe,
S32* face_hit, // return the face hit
LLVector4a* intersection = NULL, // return the intersection point
LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point
@@ -238,12 +239,6 @@ public:
void releaseSunShadowTargets();
void releaseSunShadowTarget(U32 index);
-// void setLocalLighting(const bool local_lighting);
-// bool isLocalLightingEnabled() const;
- S32 setLightingDetail(S32 level);
- S32 getLightingDetail() const { return mLightingDetail; }
- S32 getMaxLightingDetail() const;
-
bool shadersLoaded();
bool canUseWindLightShaders() const;
bool canUseAntiAliasing() const;
@@ -284,7 +279,8 @@ public:
void forAllVisibleDrawables(void (*func)(LLDrawable*));
void renderObjects(U32 type, bool texture = true, bool batch_texture = false, bool rigged = false);
-
+ void renderGLTFObjects(U32 type, bool texture = true, bool rigged = false);
+
void renderAlphaObjects(bool rigged = false);
void renderMaskedObjects(U32 type, bool texture = true, bool batch_texture = false, bool rigged = false);
void renderFullbrightMaskedObjects(U32 type, bool texture = true, bool batch_texture = false, bool rigged = false);
@@ -346,7 +342,6 @@ public:
void setupHWLights();
void setupAvatarLights(bool for_edit = false);
void enableLights(U32 mask);
- void enableLightsStatic();
void enableLightsDynamic();
void enableLightsAvatar();
void enableLightsPreview();
@@ -943,7 +938,6 @@ protected:
U32 mLightMask;
U32 mLightMovingMask;
- S32 mLightingDetail;
static bool sRenderPhysicalBeacons;
static bool sRenderMOAPBeacons;
@@ -973,7 +967,6 @@ public:
static S32 RenderShadowSplits;
static bool RenderDeferredSSAO;
static F32 RenderShadowResolutionScale;
- static bool RenderLocalLights;
static bool RenderDelayCreation;
static bool RenderAnimateRes;
static bool FreezeTime;
@@ -1001,6 +994,7 @@ public:
static S32 RenderGlowIterations;
static F32 RenderGlowWidth;
static F32 RenderGlowStrength;
+ static bool RenderGlowNoise;
static bool RenderDepthOfField;
static bool RenderDepthOfFieldInEditMode;
static F32 CameraFocusTransitionTime;
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index 6efe302f30..92f63a1820 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -407,7 +407,7 @@
value="0.43 0.06 0.06 1" />
<color
name="HTMLLinkColor"
- reference="EmphasisColor" />
+ value="0.3 0.82 1 1" />
<color
name="HealthTextColor"
reference="White" />
diff --git a/indra/newview/skins/default/html/ja/help-offline/index.html b/indra/newview/skins/default/html/ja/help-offline/index.html
new file mode 100644
index 0000000000..aeaafe8216
--- /dev/null
+++ b/indra/newview/skins/default/html/ja/help-offline/index.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html lang="ja" xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta encoding="utf-8" />
+ <title>オフラインヘルプ</title>
+ <style>
+ body {
+ background-color: #000000;
+ font-family: '游ゴシック体', YuGothic, '游ゴシック', 'Yu Gothic',
+ sans-serif;
+ font-size: 62.5%;
+ color: #e9f1f8;
+ width: 100%;
+ padding: 0px;
+ margin: 0px;
+ }
+ #infobox {
+ position: absolute;
+ top: 40%;
+ left: 50%;
+ z-index: 1;
+ padding: 0;
+ width: 592px;
+ margin-left: -296px;
+ margin-top: -150px;
+ text-align: center;
+ font-size: 1.2em;
+ color: #ccc;
+ }
+ </style>
+ </head>
+ <body>
+ <div id="infobox">
+ <p>Second Lifeオフラインヘルプ</p>
+ <p>
+ オンラインではなく、リモートでヘルプを取得しないように構成されています。
+ <br />
+ これは、さらに作業が完了するまで利用できるすべてのヘルプです。うん。
+ </p>
+ </div>
+ </body>
+</html>
diff --git a/indra/newview/skins/default/html/ja/loading-error/index.html b/indra/newview/skins/default/html/ja/loading-error/index.html
index d969c03098..27d4425016 100644
--- a/indra/newview/skins/default/html/ja/loading-error/index.html
+++ b/indra/newview/skins/default/html/ja/loading-error/index.html
@@ -1,25 +1,99 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>接続できません</title>
-<style>
-body {background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;width:100%;padding:0px;margin:0px;}
-a {color:#93a9d5;}
-a:active {color:#50607C;text-decoration:underline;}
-a:hover {color:#ff7900;text-decoration:underline;}
-#infobox{position:absolute;top:40%;left:50%;z-index:1;padding:0;width:592px;margin-left:-296px;margin-top:-150px;text-align:center;font-size:1.2em; color:#ccc;}
-#infobox #submitbtn {padding:15px 3px 5px 15px;height:28px;width:127px;margin-left:244px;}
-#infobox #submitbtn input {text-transform:capitalize;color:#fff;font-size:1.0em;height:28px;width:127px;border:none;font-weight:normal;background:url(../../btn_purplepill_bg.png) bottom left no-repeat;vertical-align:text-bottom;font-weight:bold;}
-#infobox #submitbtn input:hover.input_over, #login_box #submitbtn input:hover.input_off {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) bottom right no-repeat;}
-#infobox #submitbtn input:active.input_over {color:#fff;border:none;background:url(../../btn_purplepill_bg.png) top left no-repeat;}
-#infobox #submitbtn input.pressed {color:#888;border:none;background:url(../../btn_purplepill_bg.png) top right no-repeat;}
-</style>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body> <div id="infobox"> <img src="../../unabletoconnect.png"><br/>
- <p> Second Lifeによるログインサーバーへの接続が確立できません。
- </p>
- <p> インターネット接続を確認してください。 お使いのコンピュータやネットワークがファイヤウォールまたはプロキシにより保護されている場合は、Second Lifeによるネットワークへのアクセスが許可されていることを確認してください。
- </p> <div id="submitbtn">
- <input class="input_over" type="submit" value="もう一度試す" onclick="document.location='secondlife:///app/login_refresh'; this.className='pressed';" onmouseover="this.className='input_over';" onmouseout="this.className='input_off';" /> </div> </div>
-</div>
-</body>
+<!DOCTYPE html>
+<html lang="ja" xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta encoding="utf-8" />
+ <title>接続できません</title>
+ <style>
+ body {
+ background-color: #000000;
+ font-family: '游ゴシック体', YuGothic, '游ゴシック', 'Yu Gothic',
+ sans-serif;
+ font-size: 62.5%;
+ color: #e9f1f8;
+ width: 100%;
+ padding: 0px;
+ margin: 0px;
+ }
+ a {
+ color: #93a9d5;
+ }
+ a:active {
+ color: #50607c;
+ text-decoration: underline;
+ }
+ a:hover {
+ color: #ff7900;
+ text-decoration: underline;
+ }
+ #infobox {
+ position: absolute;
+ top: 40%;
+ left: 50%;
+ z-index: 1;
+ padding: 0;
+ width: 592px;
+ margin-left: -296px;
+ margin-top: -150px;
+ text-align: center;
+ font-size: 1.2em;
+ color: #ccc;
+ }
+ #infobox #submitbtn {
+ padding: 15px 3px 5px 15px;
+ height: 28px;
+ width: 127px;
+ margin-left: 244px;
+ }
+ #infobox #submitbtn input {
+ text-transform: capitalize;
+ color: #fff;
+ font-size: 1em;
+ height: 28px;
+ width: 127px;
+ border: none;
+ font-weight: normal;
+ background: url(../../btn_purplepill_bg.png) bottom left no-repeat;
+ vertical-align: text-bottom;
+ }
+ #infobox #submitbtn input:hover.input_over,
+ #login_box #submitbtn input:hover.input_off {
+ color: #fff;
+ border: none;
+ background: url(../../btn_purplepill_bg.png) bottom right no-repeat;
+ }
+ #infobox #submitbtn input:active.input_over {
+ color: #fff;
+ border: none;
+ background: url(../../btn_purplepill_bg.png) top left no-repeat;
+ }
+ #infobox #submitbtn input.pressed {
+ color: #888;
+ border: none;
+ background: url(../../btn_purplepill_bg.png) top right no-repeat;
+ }
+ </style>
+ </head>
+ <body>
+ <div id="infobox">
+ <img src="../../unabletoconnect.png" alt="unabletoconnect" />
+ <br />
+ <p>Second Lifeによるログインサーバーへの接続が確立できません。</p>
+ <p>
+ インターネット接続を確認してください。
+ お使いのコンピュータやネットワークがファイヤウォールまたはプロキシにより保護されている場合は、
+ Second
+ Lifeによるネットワークへのアクセスが許可されていることを確認してください。
+ </p>
+ <div id="submitbtn">
+ <input
+ class="input_over"
+ type="submit"
+ value="もう一度試す"
+ onclick="document.location='secondlife:\/\/\/app/login_refresh'; this.className='pressed';"
+ onmouseover="this.className='input_over';"
+ onmouseout="this.className='input_off';"
+ />
+ </div>
+ </div>
+ </body>
+</html>
diff --git a/indra/newview/skins/default/html/ja/loading/loading.html b/indra/newview/skins/default/html/ja/loading/loading.html
index 35cf74a35f..ea576ed082 100644
--- a/indra/newview/skins/default/html/ja/loading/loading.html
+++ b/indra/newview/skins/default/html/ja/loading/loading.html
@@ -1,10 +1,22 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;ロード中...
- </td>
- </tr>
-</table>
-</body>
+<!DOCTYPE html>
+<html lang="ja" xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta charset="utf-8" />
+ <title>読み込んでいます…</title>
+ <style>
+ body {
+ background-color: #000000;
+ font-family: '游ゴシック体', YuGothic, '游ゴシック', 'Yu Gothic',
+ sans-serif;
+ font-size: 62.5%;
+ color: #e9f1f8;
+ text-align: center;
+ }
+ </style>
+ </head>
+ <body>
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" alt="loading" />
+ <br />
+ <p>&nbsp;&nbsp;&nbsp;読み込んでいます…</p>
+ </body>
+</html>
diff --git a/indra/newview/skins/default/textures/icons/copy_clipboard.png b/indra/newview/skins/default/textures/icons/copy_clipboard.png
new file mode 100644
index 0000000000..bb1ceff1ce
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/copy_clipboard.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/delete_icon.png b/indra/newview/skins/default/textures/icons/delete_icon.png
new file mode 100644
index 0000000000..37ce374653
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/delete_icon.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/file_upload.png b/indra/newview/skins/default/textures/icons/file_upload.png
new file mode 100644
index 0000000000..58f2757136
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/file_upload.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/multi_folder_mode.png b/indra/newview/skins/default/textures/icons/multi_folder_mode.png
new file mode 100644
index 0000000000..8cda3efc36
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/multi_folder_mode.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/paste_clipboard.png b/indra/newview/skins/default/textures/icons/paste_clipboard.png
new file mode 100644
index 0000000000..e1589ab098
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/paste_clipboard.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/profile_badge_beta.png b/indra/newview/skins/default/textures/icons/profile_badge_beta.png
new file mode 100644
index 0000000000..7c8a723c47
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/profile_badge_beta.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/profile_badge_beta_lifetime.png b/indra/newview/skins/default/textures/icons/profile_badge_beta_lifetime.png
new file mode 100644
index 0000000000..7c38e9e2ae
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/profile_badge_beta_lifetime.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/profile_badge_lifetime.png b/indra/newview/skins/default/textures/icons/profile_badge_lifetime.png
new file mode 100644
index 0000000000..475edd080e
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/profile_badge_lifetime.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/profile_badge_linden.png b/indra/newview/skins/default/textures/icons/profile_badge_linden.png
new file mode 100644
index 0000000000..1b6ac03e86
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/profile_badge_linden.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/profile_badge_pplus_lifetime.png b/indra/newview/skins/default/textures/icons/profile_badge_pplus_lifetime.png
new file mode 100644
index 0000000000..4286995202
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/profile_badge_pplus_lifetime.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/profile_badge_premium_lifetime.png b/indra/newview/skins/default/textures/icons/profile_badge_premium_lifetime.png
new file mode 100644
index 0000000000..47e93c4fac
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/profile_badge_premium_lifetime.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/single_folder_back.png b/indra/newview/skins/default/textures/icons/single_folder_back.png
new file mode 100644
index 0000000000..b614e9ef9b
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/single_folder_back.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/single_folder_forward.png b/indra/newview/skins/default/textures/icons/single_folder_forward.png
new file mode 100644
index 0000000000..c7bee3522d
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/single_folder_forward.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/single_folder_mode.png b/indra/newview/skins/default/textures/icons/single_folder_mode.png
new file mode 100644
index 0000000000..f70b754123
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/single_folder_mode.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/single_folder_up.png b/indra/newview/skins/default/textures/icons/single_folder_up.png
new file mode 100644
index 0000000000..651b2b1af1
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/single_folder_up.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/snapshot_icon.png b/indra/newview/skins/default/textures/icons/snapshot_icon.png
new file mode 100644
index 0000000000..41d524678f
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/snapshot_icon.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/texture_icon.png b/indra/newview/skins/default/textures/icons/texture_icon.png
new file mode 100644
index 0000000000..278760a5b0
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/texture_icon.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/thumbnail_fallback_icon.png b/indra/newview/skins/default/textures/icons/thumbnail_fallback_icon.png
new file mode 100644
index 0000000000..8d5ca624af
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/thumbnail_fallback_icon.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 61257466aa..2126db32df 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -253,10 +253,16 @@ with the same filename but different name
<texture name="Icon_Close_Foreground" file_name="windows/Icon_Close_Foreground.png" preload="true" />
<texture name="Icon_Close_Press" file_name="windows/Icon_Close_Press.png" preload="true" />
<texture name="Icon_Close_Toast" file_name="windows/Icon_Close_Toast.png" preload="true" />
+
+ <texture name="Icon_Copy" file_name="icons/copy_clipboard.png" preload="true" />
+
+ <texture name="Icon_Delete" file_name="icons/delete_icon.png" preload="true" />
<texture name="Icon_Dock_Foreground" file_name="windows/Icon_Dock_Foreground.png" preload="true" />
<texture name="Icon_Dock_Press" file_name="windows/Icon_Dock_Press.png" preload="true" />
+ <texture name="Icon_File_Upload" file_name="icons/file_upload.png" preload="true" />
+
<texture name="Icon_For_Sale" file_name="icons/Icon_For_Sale.png" preload="false" />
<texture name="Icon_Gear_Background" file_name="windows/Icon_Gear_Background.png" preload="false" />
@@ -269,10 +275,16 @@ with the same filename but different name
<texture name="Icon_Minimize_Foreground" file_name="windows/Icon_Minimize_Foreground.png" preload="true" />
<texture name="Icon_Minimize_Press" file_name="windows/Icon_Minimize_Press.png" preload="true" />
+
+ <texture name="Icon_Paste" file_name="icons/paste_clipboard.png" preload="true" />
<texture name="Icon_Restore_Foreground" file_name="windows/Icon_Restore_Foreground.png" preload="false" />
<texture name="Icon_Restore_Press" file_name="windows/Icon_Restore_Press.png" preload="false" />
+ <texture name="Icon_Snapshot" file_name="icons/snapshot_icon.png" preload="true" />
+
+ <texture name="Icon_Use_Texture" file_name="icons/texture_icon.png" preload="true" />
+
<texture name="Info" file_name="icons/Info.png" preload="false" />
<texture name="Info_Small" file_name="icons/Info_Small.png" preload="false" />
<texture name="Info_Off" file_name="navbar/Info_Off.png" preload="false" />
@@ -512,7 +524,13 @@ with the same filename but different name
<texture name="Play_Off" file_name="icons/Play_Off.png" preload="false" />
<texture name="Play_Over" file_name="icons/Play_Over.png" preload="false" />
<texture name="Play_Press" file_name="icons/Play_Press.png" preload="false" />
-
+
+ <texture name="Profile_Badge_Beta" file_name="icons/profile_badge_beta.png" preload="true"/>
+ <texture name="Profile_Badge_Beta_Lifetime" file_name="icons/profile_badge_beta_lifetime.png" preload="true"/>
+ <texture name="Profile_Badge_Lifetime" file_name="icons/profile_badge_lifetime.png" preload="true"/>
+ <texture name="Profile_Badge_Linden" file_name="icons/profile_badge_linden.png" preload="true"/>
+ <texture name="Profile_Badge_Pplus_Lifetime" file_name="icons/profile_badge_pplus_lifetime.png" preload="true"/>
+ <texture name="Profile_Badge_Premium_Lifetime" file_name="icons/profile_badge_premium_lifetime.png" preload="true"/>
<texture name="Profile_Group_Visibility_Off" file_name="icons/profile_group_visibility_eye_off.png" preload="true"/>
<texture name="Profile_Group_Visibility_Off_Pressed" file_name="icons/profile_group_visibility_eye_off_pressed.png" preload="true"/>
<texture name="Profile_Group_Visibility_On" file_name="icons/profile_group_visibility_eye_on.png" preload="true"/>
@@ -680,6 +698,7 @@ with the same filename but different name
<texture name="TextField_Active" file_name="widgets/TextField_Active.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
<texture name="TextField_Search_Highlight" file_name="widgets/TextField_Search_Highlight.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
+ <texture name="Thumbnail_Fallback" file_name="icons/thumbnail_fallback_icon.png" preload="true" />
<texture name="Toast_CloseBtn" file_name="windows/Toast_CloseBtn.png" preload="true" />
<texture name="Toast_Background" file_name="windows/Toast_Background.png" preload="true"
@@ -876,4 +895,10 @@ with the same filename but different name
<texture name="System_Notification" file_name="icons/SL_Logo.png" preload="true"/>
<texture name="Icon_Attachment_Small" file_name="icons/Icon_Attachment_Small.png" preload="true"/>
<texture name="Icon_Attachment_Large" file_name="icons/Icon_Attachment_Large.png" preload="true"/>
+
+ <texture name="Single_Folder_Mode" file_name="icons/single_folder_mode.png" preload="true"/>
+ <texture name="Multi_Folder_Mode" file_name="icons/multi_folder_mode.png" preload="true"/>
+ <texture name="Single_Folder_Back" file_name="icons/single_folder_back.png" preload="true"/>
+ <texture name="Single_Folder_Forward" file_name="icons/single_folder_forward.png" preload="true"/>
+ <texture name="Single_Folder_Up" file_name="icons/single_folder_up.png" preload="true"/>
</textures>
diff --git a/indra/newview/skins/default/xui/da/floater_animation_preview.xml b/indra/newview/skins/default/xui/da/floater_animation_preview.xml
deleted file mode 100644
index adf96841c0..0000000000
--- a/indra/newview/skins/default/xui/da/floater_animation_preview.xml
+++ /dev/null
@@ -1,187 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Animation Preview" title="">
- <floater.string name="failed_to_initialize">
- Fejlede at starte bevægelse
- </floater.string>
- <floater.string name="anim_too_long">
- Animations filen er [LENGTH] sekunder lang.
-
-Maksimal animations længde er [MAX_LENGTH] sekunder.
- </floater.string>
- <floater.string name="failed_file_read">
- Kan ikke læse animations fil.
-
-[STATUS]
- </floater.string>
- <floater.string name="E_ST_OK">
- OK
- </floater.string>
- <floater.string name="E_ST_EOF">
- Fil afsluttet for tidligt.
- </floater.string>
- <floater.string name="E_ST_NO_CONSTRAINT">
- Kan ikke læse &quot;constraint definition&quot;.
- </floater.string>
- <floater.string name="E_ST_NO_FILE">
- Kan ikke åbne BVH fil.
- </floater.string>
- <floater.string name="E_ST_NO_HIER">
- Ugyldig header i HIERARCHY.
- </floater.string>
- <floater.string name="E_ST_NO_JOINT">
- Kan ikke finde &quot;ROOT&quot; eller &quot;JOINT&quot;.
- </floater.string>
- <floater.string name="E_ST_NO_NAME">
- Kan ikke finde JOINT navn.
- </floater.string>
- <floater.string name="E_ST_NO_OFFSET">
- Kan ikke finde OFFSET.
- </floater.string>
- <floater.string name="E_ST_NO_CHANNELS">
- Kan ikke finde CHANNELS.
- </floater.string>
- <floater.string name="E_ST_NO_ROTATION">
- Kan ikke læse &quot;rotation order&quot;.
- </floater.string>
- <floater.string name="E_ST_NO_AXIS">
- Kan ikke finde rotationsakser.
- </floater.string>
- <floater.string name="E_ST_NO_MOTION">
- Kan ikke finde MOTION.
- </floater.string>
- <floater.string name="E_ST_NO_FRAMES">
- Kan ikke læse antal &quot;frames&quot;.
- </floater.string>
- <floater.string name="E_ST_NO_FRAME_TIME">
- Kan ikke læse &quot;frame time&quot;.
- </floater.string>
- <floater.string name="E_ST_NO_POS">
- Kan ikke læse positionsværdier.
- </floater.string>
- <floater.string name="E_ST_NO_ROT">
- Kan ikke læse rotationsværdier.
- </floater.string>
- <floater.string name="E_ST_NO_XLT_FILE">
- kan ikke åbne &quot;translation file&quot;.
- </floater.string>
- <floater.string name="E_ST_NO_XLT_HEADER">
- Kan ikke læse &quot;translation header.
- </floater.string>
- <floater.string name="E_ST_NO_XLT_NAME">
- Kan ikke aflæse &quot;translation&quot; navne.
- </floater.string>
- <floater.string name="E_ST_NO_XLT_IGNORE">
- Kan ikke læse &quot;translation ignore&quot; værdi.
- </floater.string>
- <floater.string name="E_ST_NO_XLT_RELATIVE">
- Kan ikke læse &quot;translation relative&quot; værdi.
- </floater.string>
- <floater.string name="E_ST_NO_XLT_OUTNAME">
- Kan ikke læse &quot;translation outname&quot; værdi.
- </floater.string>
- <floater.string name="E_ST_NO_XLT_MATRIX">
- Kan ikke læse &quot;translation matrix&quot;.
- </floater.string>
- <floater.string name="E_ST_NO_XLT_MERGECHILD">
- Kan ikke læse &quot;mergechild&quot; navn.
- </floater.string>
- <floater.string name="E_ST_NO_XLT_MERGEPARENT">
- Kan ikke læse &quot;mergeparent&quot; navn.
- </floater.string>
- <floater.string name="E_ST_NO_XLT_PRIORITY">
- Kan ikke finde prioritetsværdi.
- </floater.string>
- <floater.string name="E_ST_NO_XLT_LOOP">
- Kan ikke læse &quot;loop&quot; værdi.
- </floater.string>
- <floater.string name="E_ST_NO_XLT_EASEIN">
- kan ikke læse &quot;easeIn&quot; værdier.
- </floater.string>
- <floater.string name="E_ST_NO_XLT_EASEOUT">
- Kan ikke læse &quot;easeOut&quot; værdier.
- </floater.string>
- <floater.string name="E_ST_NO_XLT_HAND">
- Kan ikke læse &quot;hand morph&quot; værdi.
- </floater.string>
- <floater.string name="E_ST_NO_XLT_EMOTE">
- kan ikke læse &quot;emote&quot; navn.
- </floater.string>
- <floater.string name="E_ST_BAD_ROOT">
- Incorrect root joint name, use &quot;hip&quot;.
- </floater.string>
- <text name="name_label">
- Navn:
- </text>
- <text name="description_label">
- Beskrivelse:
- </text>
- <spinner label="Prioritet" name="priority" tool_tip="Vælg hvilke andre animationer der &quot;overstyres&quot; af denne"/>
- <check_box label="Gentag" name="loop_check" tool_tip="Gentager animationen konstant"/>
- <spinner label="Ind(%)" label_width="40" left="76" name="loop_in_point" tool_tip="Sætter punktet hvor gentagelsen genstarter fra" width="105"/>
- <spinner label="Ud (%)" name="loop_out_point" tool_tip="Sætter punktet i animationen der afslutter gentagelsen"/>
- <text name="hand_label">
- Hånd posering
- </text>
- <combo_box label="" name="hand_pose_combo" tool_tip="Kontrollerer hvad hænderne går i løbet af animationen" width="140">
- <combo_box.item label="Spredt" name="Spread"/>
- <combo_box.item label="Afslappet" name="Relaxed"/>
- <combo_box.item label="Peg begge" name="PointBoth"/>
- <combo_box.item label="Knytnæver" name="Fist"/>
- <combo_box.item label="Afslappet venstre" name="RelaxedLeft"/>
- <combo_box.item label="Peg venstre" name="PointLeft"/>
- <combo_box.item label="Knytnæve venstre" name="FistLeft"/>
- <combo_box.item label="Afslappet højre" name="RelaxedRight"/>
- <combo_box.item label="peg højre" name="PointRight"/>
- <combo_box.item label="knytnæve højre" name="FistRight"/>
- <combo_box.item label="Honnør højre" name="SaluteRight"/>
- <combo_box.item label="Skrivende" name="Typing"/>
- <combo_box.item label="Fredstegn højre" name="PeaceRight"/>
- </combo_box>
- <text name="emote_label">
- Ansigtsudtryk
- </text>
- <combo_box label="" name="emote_combo" tool_tip="Angiver hvad ansigtet gør under animationen" width="140">
- <item label="(Intet)" name="[None]" value=""/>
- <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/>
- <item label="Bange" name="Afraid" value="Bange"/>
- <item label="Vred" name="Angry" value="Vred"/>
- <item label="Stort smil" name="BigSmile" value="Stort smil"/>
- <item label="Keder sig" name="Bored" value="Keder sig"/>
- <item label="Græder" name="Cry" value="Grædende"/>
- <item label="Forarget" name="Disdain" value="Foragt"/>
- <item label="Flov" name="Embarrassed" value="Embarrassed"/>
- <item label="Skuler" name="Frown" value="Alvorlig"/>
- <item label="Kysser" name="Kiss" value="Kys"/>
- <item label="Griner" name="Laugh" value="Leende"/>
- <item label="Plllppt" name="Plllppt" value="Plllppt"/>
- <item label="Frastødt" name="Repulsed" value="Frastødt"/>
- <item label="Ked af det" name="Sad" value="Ked af det"/>
- <item label="Skuldertræk" name="Shrug" value="Skuldertræk"/>
- <item label="Smil" name="Smile" value="Smilende"/>
- <item label="Overrasket" name="Surprise" value="Overrasket"/>
- <item label="Blinker" name="Wink" value="Blink"/>
- <item label="Bekymret" name="Worry" value="Bekymret"/>
- </combo_box>
- <text name="preview_label">
- Vis mens
- </text>
- <combo_box label="" name="preview_base_anim" tool_tip="Se hvordan animation ser ud i forskellige typiske avatar-situationer." width="140">
- <item label="Stående" name="Standing" value="Stående"/>
- <item label="Gående" name="Walking" value="Gående"/>
- <item label="Sidder" name="Sitting" value="Siddende"/>
- <item label="Flyver" name="Flying" value="Flyvende"/>
- </combo_box>
- <spinner label="start (sec)" name="ease_in_time" tool_tip="Tid (i sekunder) animationen bruger på at komme i gang."/>
- <spinner label="Afslut (sec)" name="ease_out_time" tool_tip="Tid (i sekunder) animationen bruger på at afslutte"/>
- <button label="" name="play_btn" tool_tip="Start din animation"/>
- <button name="pause_btn" tool_tip="Pause din animation"/>
- <button label="" name="stop_btn" tool_tip="Stop afspilning af animation"/>
- <slider label="" name="playback_slider"/>
- <text name="bad_animation_text">
- Kan ikke læse animations fil.
-
-Vi anbefaler BVH filer der er exporteret fra Poser 4.
- </text>
- <button label="Hent (L$[AMOUNT])" name="ok_btn"/>
- <button label="Annullér" name="cancel_btn"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_inventory.xml b/indra/newview/skins/default/xui/da/floater_inventory.xml
deleted file mode 100644
index 3a4b0fbd6b..0000000000
--- a/indra/newview/skins/default/xui/da/floater_inventory.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Inventory" title="MIN BEHOLDNING">
- <floater.string name="Title">
- MIN BEHOLDNING
- </floater.string>
- <floater.string name="TitleFetching">
- MIN BEHOLDNING (Henter [ITEM_COUNT] genstande...) [FILTER]
- </floater.string>
- <floater.string name="TitleCompleted">
- MIN BEHOLDNING ([ITEM_COUNT] genstande) [FILTER]
- </floater.string>
- <floater.string name="Fetched">
- Hentet
- </floater.string>
- <panel label="Beholdningspanel" name="Inventory Panel"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/da/floater_inventory_item_properties.xml
deleted file mode 100644
index 59dcc87140..0000000000
--- a/indra/newview/skins/default/xui/da/floater_inventory_item_properties.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="item properties" title="OPLYSNINGER OM BEHOLDNINGSGENSTAND">
- <floater.string name="unknown">
- (ukendt)
- </floater.string>
- <floater.string name="public">
- (offentlig)
- </floater.string>
- <floater.string name="you_can">
- Du kan:
- </floater.string>
- <floater.string name="owner_can">
- Ejer kan:
- </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">
- Navn:
- </text>
- <text name="LabelItemDescTitle">
- Beskrivelse:
- </text>
- <text name="LabelCreatorTitle">
- Skaber:
- </text>
- <button label="Profil..." label_selected="" name="BtnCreator"/>
- <text name="LabelOwnerTitle">
- Ejer:
- </text>
- <button label="Profil..." label_selected="" name="BtnOwner"/>
- <text name="LabelAcquiredTitle">
- Erhvervet:
- </text>
- <text name="LabelAcquiredDate">
- Wed May 24 12:50:46 2006
- </text>
- <text name="OwnerLabel">
- Dig:
- </text>
- <check_box label="Redigér" name="CheckOwnerModify"/>
- <check_box label="Kopiere" name="CheckOwnerCopy"/>
- <check_box label="Sælg" name="CheckOwnerTransfer"/>
- <text name="AnyoneLabel">
- Enhver:
- </text>
- <check_box label="Kopiér" name="CheckEveryoneCopy"/>
- <text name="GroupLabel">
- Gruppe:
- </text>
- <check_box label="Del" name="CheckShareWithGroup"/>
- <text name="NextOwnerLabel">
- Næste ejer:
- </text>
- <check_box label="Redigér" name="CheckNextOwnerModify"/>
- <check_box label="Kopiere" name="CheckNextOwnerCopy"/>
- <check_box label="Sælg" name="CheckNextOwnerTransfer"/>
- <check_box label="Til salg" name="CheckPurchase"/>
- <combo_box name="combobox sale copy">
- <combo_box.item label="Kopiér" name="Copy"/>
- <combo_box.item label="Original" name="Original"/>
- </combo_box>
- <spinner label="Pris:" name="Edit Cost"/>
- <text name="CurrencySymbol">
- L$
- </text>
-</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_nearby_chat.xml b/indra/newview/skins/default/xui/da/floater_nearby_chat.xml
deleted file mode 100644
index 76bc40edac..0000000000
--- a/indra/newview/skins/default/xui/da/floater_nearby_chat.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="nearby_chat" title="CHAT NÆRVED">
- <check_box label="Oversæt chat" name="translate_chat_checkbox"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_perm_prefs.xml b/indra/newview/skins/default/xui/da/floater_perm_prefs.xml
deleted file mode 100644
index eecddbcdb0..0000000000
--- a/indra/newview/skins/default/xui/da/floater_perm_prefs.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="perm prefs" title="STANDARD RETTIGHEDER">
- <panel label="Tilladelser" name="permissions">
- <button label="?" label_selected="?" name="help"/>
- <check_box label="Del med gruppe" name="share_with_group"/>
- <check_box label="Tillad enhver at kopiere" name="everyone_copy"/>
- <text name="NextOwnerLabel">
- Næste ejer kan:
- </text>
- <check_box label="Redigere" name="next_owner_modify"/>
- <check_box label="Kopiére" name="next_owner_copy"/>
- <check_box label="Sælge/Give væk" name="next_owner_transfer"/>
- </panel>
- <button label="OK" label_selected="OK" name="ok"/>
- <button label="Annullér" label_selected="Annullér" name="cancel"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_postcard.xml b/indra/newview/skins/default/xui/da/floater_postcard.xml
deleted file mode 100644
index 44b0fd4faa..0000000000
--- a/indra/newview/skins/default/xui/da/floater_postcard.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Postcard" title="EMAIL FOTO">
- <text name="to_label">
- Send til:
- </text>
- <text name="from_label">
- Din e-mail:
- </text>
- <text name="name_label">
- Dit navn:
- </text>
- <text name="subject_label">
- Emne:
- </text>
- <line_editor label="Skriv dit emne her." name="subject_form"/>
- <text name="msg_label">
- Besked:
- </text>
- <text_editor name="msg_form">
- Skriv din besked her.
- </text_editor>
- <text name="fine_print">
- Hvis din modtager opretter en konto i SL, vil du få en henvisnings bonus.
- </text>
- <button label="Annullér" name="cancel_btn"/>
- <button label="Send" name="send_btn"/>
- <string name="default_subject">
- Postkort fra [SECOND_LIFE].
- </string>
- <string name="default_message">
- Tjek det her ud!
- </string>
- <string name="upload_message">
- Sender...
- </string>
-</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_voice_controls.xml b/indra/newview/skins/default/xui/da/floater_voice_controls.xml
deleted file mode 100644
index 69de696bf5..0000000000
--- a/indra/newview/skins/default/xui/da/floater_voice_controls.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_voice_controls" title="Stemme opsætning">
- <string name="title_nearby">
- STEMMER NÆR
- </string>
- <string name="title_group">
- Gruppe opkald med [GROUP]
- </string>
- <string name="title_adhoc">
- Konference kald
- </string>
- <string name="title_peer_2_peer">
- Opkald med [NAME]
- </string>
- <string name="no_one_near">
- Ingen i nærheden har aktiveret stemmer
- </string>
- <layout_stack name="my_call_stack">
- <layout_panel name="my_panel">
- <text name="user_text" value="Min 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="Forlad samtale" name="leave_call_btn"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/da/menu_bottomtray.xml b/indra/newview/skins/default/xui/da/menu_bottomtray.xml
deleted file mode 100644
index a0d74db36d..0000000000
--- a/indra/newview/skins/default/xui/da/menu_bottomtray.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="hide_camera_move_controls_menu">
- <menu_item_check label="Tal knap" name="EnableVoiceChat"/>
- <menu_item_check label="Faste bevægelser" name="ShowGestureButton"/>
- <menu_item_check label="Bevægelse knap" name="ShowMoveButton"/>
- <menu_item_check label="Vis knap" name="ShowCameraButton"/>
- <menu_item_check label="Foto knap" name="ShowSnapshotButton"/>
- <menu_item_check label="Bygge knap" name="ShowBuildButton"/>
- <menu_item_check label="Søge knap" name="ShowSearchButton"/>
- <menu_item_check label="Kort knap" name="ShowWorldMapButton"/>
- <menu_item_check label="Mini-Map button" name="ShowMiniMapButton"/>
- <menu_item_call label="Klip" name="NearbyChatBar_Cut"/>
- <menu_item_call label="Kopiér" name="NearbyChatBar_Copy"/>
- <menu_item_call label="Sæt ind" name="NearbyChatBar_Paste"/>
- <menu_item_call label="Slet" name="NearbyChatBar_Delete"/>
- <menu_item_call label="Vælg alt" name="NearbyChatBar_Select_All"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml
deleted file mode 100644
index 8da35adb1b..0000000000
--- a/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="Profil" name="view_profile"/>
- <menu_item_call label="Tilføj ven" name="add_friend"/>
- <menu_item_call label="Besked" name="im"/>
- <menu_item_call label="Opkald" name="call"/>
- <menu_item_call label="Teleportér" name="teleport"/>
- <menu_item_call label="Invitér til gruppe" name="invite_to_group"/>
- <menu_item_call label="Blokér" name="block"/>
- <menu_item_call label="Fjern blokering" name="unblock"/>
- <menu_item_call label="Rapportér" name="report"/>
- <menu_item_call label="Frys" name="freeze"/>
- <menu_item_call label="Smid ud" name="eject"/>
- <menu_item_call label="Spark" name="kick"/>
- <menu_item_call label="CSR" name="csr"/>
- <menu_item_call label="Debug teksturer" name="debug"/>
- <menu_item_call label="Find på kort" name="find_on_map"/>
- <menu_item_call label="Zoom ind" name="zoom_in"/>
- <menu_item_call label="Betal" name="pay"/>
- <menu_item_call label="Del" name="share"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml
deleted file mode 100644
index 887c6484bc..0000000000
--- a/indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="Sid ned" name="Sit Down Here"/>
- <menu_item_call label="Stå op" name="Stand Up"/>
- <context_menu label="Tag af" name="Take Off &gt;">
- <context_menu label="Tøj" name="Clothes &gt;">
- <menu_item_call label="Trøje" name="Shirt"/>
- <menu_item_call label="Bukser" name="Pants"/>
- <menu_item_call label="Nederdel" name="Skirt"/>
- <menu_item_call label="Sko" name="Shoes"/>
- <menu_item_call label="Strømper" name="Socks"/>
- <menu_item_call label="Jakke" name="Jacket"/>
- <menu_item_call label="Handsker" name="Gloves"/>
- <menu_item_call label="Undertrøje" name="Self Undershirt"/>
- <menu_item_call label="Underbukser" name="Self Underpants"/>
- <menu_item_call label="Tatovering" name="Self Tattoo"/>
- <menu_item_call label="Alpha" name="Self Alpha"/>
- <menu_item_call label="Alt tøj" name="All Clothes"/>
- </context_menu>
- <context_menu label="HUD" name="Object Detach HUD"/>
- <context_menu label="Tag af" name="Object Detach"/>
- <menu_item_call label="Tag alt af" name="Detach All"/>
- </context_menu>
- <menu_item_call label="Skift sæt" name="Chenge Outfit"/>
- <menu_item_call label="Redigér sæt" name="Edit Outfit"/>
- <menu_item_call label="Redigér min figur" name="Edit My Shape"/>
- <menu_item_call label="Mine venner" name="Friends..."/>
- <menu_item_call label="Mine grupper" name="Groups..."/>
- <menu_item_call label="Min profil" name="Profile..."/>
- <menu_item_call label="Debug teksturer" name="Debug..."/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/da/menu_people_friends_view_sort.xml
deleted file mode 100644
index 32c5e6a6c7..0000000000
--- a/indra/newview/skins/default/xui/da/menu_people_friends_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Sortér efter navn" name="sort_name"/>
- <menu_item_check label="Sortér efter status" name="sort_status"/>
- <menu_item_check label="Vis person ikoner" name="view_icons"/>
- <menu_item_check label="Vis tildelte rettigheder" name="view_permissions"/>
- <menu_item_call label="Vis blokerede beboere og objekter" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/da/menu_people_groups_view_sort.xml
deleted file mode 100644
index 0b9a791530..0000000000
--- a/indra/newview/skins/default/xui/da/menu_people_groups_view_sort.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Vis gruppe ikoner" name="Display Group Icons"/>
- <menu_item_call label="Forlad valgte gruppe" name="Leave Selected Group"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/da/menu_people_nearby_view_sort.xml
deleted file mode 100644
index 2f35ff3c92..0000000000
--- a/indra/newview/skins/default/xui/da/menu_people_nearby_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Sortér efter tidligere talere" name="sort_by_recent_speakers"/>
- <menu_item_check label="Sortér efter navn" name="sort_name"/>
- <menu_item_check label="Sortér efter afstand" name="sort_distance"/>
- <menu_item_check label="Se ikoner for personer" name="view_icons"/>
- <menu_item_call label="Vis blokerede beboere og objekter" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/da/menu_people_recent_view_sort.xml
deleted file mode 100644
index d081f637f2..0000000000
--- a/indra/newview/skins/default/xui/da/menu_people_recent_view_sort.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Sortér efter nyeste" name="sort_most"/>
- <menu_item_check label="Sortér efter navn" name="sort_name"/>
- <menu_item_check label="Vis person ikoner" name="view_icons"/>
- <menu_item_call label="Vis blokerede beboere og objekter" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/da/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/da/panel_adhoc_control_panel.xml
deleted file mode 100644
index 1953fad31f..0000000000
--- a/indra/newview/skins/default/xui/da/panel_adhoc_control_panel.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?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="Opkald" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Forlad opkald" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Stemmekontroller" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_bottomtray.xml b/indra/newview/skins/default/xui/da/panel_bottomtray.xml
deleted file mode 100644
index 3cd9d55dd0..0000000000
--- a/indra/newview/skins/default/xui/da/panel_bottomtray.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="bottom_tray">
- <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/>
- <string name="SpeakBtnToolTip" value="Slå mikrofon til/fra"/>
- <string name="VoiceControlBtnToolTip" value="Vis/skjul stemme kontrolpanel"/>
- <layout_stack name="toolbar_stack">
- <layout_panel name="speak_panel">
- <talk_button name="talk">
- <speak_button label="Tal" label_selected="Tal" name="speak_btn"/>
- </talk_button>
- </layout_panel>
- <layout_panel name="gesture_panel">
- <gesture_combo_list label="Bevægelse" name="Gesture" tool_tip="Skjuler/viser bevægelser"/>
- </layout_panel>
- <layout_panel name="movement_panel">
- <bottomtray_button label="Flyt" name="movement_btn" tool_tip="Vis/skjul bevægelseskontroller"/>
- </layout_panel>
- <layout_panel name="cam_panel">
- <bottomtray_button label="Vis" name="camera_btn" tool_tip="Vis/Skjul kamerakontroller"/>
- </layout_panel>
- <layout_panel name="snapshot_panel">
- <bottomtray_button label="" name="snapshots" tool_tip="Tag foto"/>
- </layout_panel>
- <layout_panel name="build_btn_panel">
- <bottomtray_button label="Byg" name="build_btn" tool_tip="Vis/skjul byggeværktøjer"/>
- </layout_panel>
- <layout_panel name="search_btn_panel">
- <bottomtray_button label="Søg" name="search_btn" tool_tip="Vis/skjul søgning"/>
- </layout_panel>
- <layout_panel name="world_map_btn_panel">
- <bottomtray_button label="Kort" name="world_map_btn" tool_tip="Vis/skjul verdenskort"/>
- </layout_panel>
- <layout_panel name="mini_map_btn_panel">
- <bottomtray_button label="Mini-kort" name="mini_map_btn" tool_tip="Vis/skjul Mini-kort"/>
- </layout_panel>
- <layout_panel name="im_well_panel">
- <chiclet_im_well name="im_well">
- <button name="Unread IM messages" tool_tip="Konversationer"/>
- </chiclet_im_well>
- </layout_panel>
- <layout_panel name="notification_well_panel">
- <chiclet_notification name="notification_well">
- <button name="Unread" tool_tip="Notifikationer"/>
- </chiclet_notification>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_group_control_panel.xml b/indra/newview/skins/default/xui/da/panel_group_control_panel.xml
deleted file mode 100644
index 26fe4f6ebe..0000000000
--- a/indra/newview/skins/default/xui/da/panel_group_control_panel.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?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="Gruppe profil" name="group_info_btn"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="Opkald gruppe" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Forlad opkald" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Åben stemmekontroller" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_im_control_panel.xml b/indra/newview/skins/default/xui/da/panel_im_control_panel.xml
deleted file mode 100644
index 5cecb93d40..0000000000
--- a/indra/newview/skins/default/xui/da/panel_im_control_panel.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?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="Profil" name="view_profile_btn"/>
- </layout_panel>
- <layout_panel name="add_friend_btn_panel">
- <button label="Tilføj ven" name="add_friend_btn"/>
- </layout_panel>
- <layout_panel name="teleport_btn_panel">
- <button label="Teleport" name="teleport_btn" tool_tip="Tilbyd teleport til denne person"/>
- </layout_panel>
- <layout_panel name="share_btn_panel">
- <button label="Del" name="share_btn"/>
- </layout_panel>
- <layout_panel name="pay_btn_panel">
- <button label="Betal" name="pay_btn"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="Opkald" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Afslut kald" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Stemme kontroller" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_region_texture.xml b/indra/newview/skins/default/xui/da/panel_region_texture.xml
deleted file mode 100644
index c8a3ad328e..0000000000
--- a/indra/newview/skins/default/xui/da/panel_region_texture.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Terræn textures" name="Textures">
- <text name="region_text_lbl">
- Region:
- </text>
- <text name="region_text">
- ukendt
- </text>
- <text name="detail_texture_text">
- Terræn teksturer (kræver 1024x1024, 24 bit .tga filer)
- </text>
- <text name="height_text_lbl">
- 1 (Lav)
- </text>
- <text name="height_text_lbl2">
- 2
- </text>
- <text name="height_text_lbl3">
- 3
- </text>
- <text name="height_text_lbl4">
- 4 (Høj)
- </text>
- <text name="height_text_lbl5">
- Texture højde intervaller
- </text>
- <text name="height_text_lbl6">
- Nordvest
- </text>
- <text name="height_text_lbl7">
- Nordøst
- </text>
- <text name="height_text_lbl8">
- Sydvest
- </text>
- <text name="height_text_lbl9">
- Sydøst
- </text>
- <spinner label="Lav" name="height_start_spin_0"/>
- <spinner label="Lav" name="height_start_spin_1"/>
- <spinner label="Lav" name="height_start_spin_2"/>
- <spinner label="Lav" name="height_start_spin_3"/>
- <spinner label="Høj" name="height_range_spin_0"/>
- <spinner label="Høj" name="height_range_spin_1"/>
- <spinner label="Høj" name="height_range_spin_2"/>
- <spinner label="Høj" name="height_range_spin_3"/>
- <text name="height_text_lbl10">
- Disse værdier repræsenterer blandingsforhold for teksturer ovenfor.
- </text>
- <text name="height_text_lbl11">
- Målt i meter, angiver LAV værdien MAKSIMUM højden for tekstur 1 og HØJ værdien er MINIMUMSshøjden for tekstur 4.
- </text>
- <text name="height_text_lbl12">
- og HØJ værdien er MIMIMUM højde for texture nummer 4.
- </text>
- <button label="Gem" name="apply_btn"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/de/floater_chat_bar.xml b/indra/newview/skins/default/xui/de/floater_chat_bar.xml
deleted file mode 100644
index ab77d4dae5..0000000000
--- a/indra/newview/skins/default/xui/de/floater_chat_bar.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="nearby_chat" title="CHAT IN DER NÄHE">
- <panel name="bottom_panel">
- <line_editor label="Zum Chatten hier klicken." name="chat_box" tool_tip="Eingabetaste zum Sprechen, Strg+Eingabe zum Rufen"/>
- <button name="show_nearby_chat" tool_tip="Chatprotokoll in der Nähe ein-/ausblenden"/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
deleted file mode 100644
index 92c038057f..0000000000
--- a/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="item properties" title="EIGENSCHAFTEN: INVENTAROBJEKT">
- <floater.string name="unknown">(unbekannt)</floater.string>
- <floater.string name="public">(öffentlich)</floater.string>
- <floater.string name="you_can">Sie können:</floater.string>
- <floater.string name="owner_can">Eigentümer kann:</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">Name:</text>
- <text name="LabelItemDescTitle">Beschreibung:</text>
- <text name="LabelCreatorTitle">Ersteller:</text>
- <button label="Profil..." label_selected="" name="BtnCreator"/>
- <text name="LabelOwnerTitle">Eigentümer:</text>
- <button label="Profil..." label_selected="" name="BtnOwner"/>
- <text name="LabelAcquiredTitle">Erworben:</text>
- <text name="LabelAcquiredDate">Mittwoch, 24. Mai 2006, 12:50:46</text>
- <text name="OwnerLabel">Sie:</text>
- <check_box label="Bearbeiten" name="CheckOwnerModify"/>
- <check_box label="Kopieren" left_delta="85" name="CheckOwnerCopy"/>
- <check_box label="Wiederverkaufen" name="CheckOwnerTransfer"/>
- <text name="AnyoneLabel">Jeder:</text>
- <check_box label="Kopieren" name="CheckEveryoneCopy"/>
- <text name="GroupLabel">Gruppe:</text>
- <check_box label="Teilen" name="CheckShareWithGroup"/>
- <text name="NextOwnerLabel" width="150">Nächster Eigentümer:</text>
- <check_box label="Bearbeiten" name="CheckNextOwnerModify"/>
- <check_box label="Kopieren" left_delta="55" name="CheckNextOwnerCopy"/>
- <check_box label="Wiederverkaufen" name="CheckNextOwnerTransfer"/>
- <check_box label="Zum Verkauf" name="CheckPurchase"/>
- <combo_box name="ComboBoxSaleType">
- <combo_box.item label="Kopie" name="Copy"/>
- <combo_box.item label="Inhalt" name="Contents"/>
- <combo_box.item label="Original" name="Original"/>
- </combo_box>
- <spinner label="Preis:" name="Edit Cost"/>
- <text name="CurrencySymbol">L$</text>
-</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_perm_prefs.xml b/indra/newview/skins/default/xui/de/floater_perm_prefs.xml
deleted file mode 100644
index 9be22f3ccb..0000000000
--- a/indra/newview/skins/default/xui/de/floater_perm_prefs.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="perm prefs" title="STANDARD-BERECHTIGUNGEN FÜR HOCHLADEN">
- <panel label="Berechtigungen" name="permissions">
- <button label="?" label_selected="?" name="help"/>
- <check_box label="Mit Gruppe teilen" name="share_with_group"/>
- <check_box label="Kopieren allen erlauben" name="everyone_copy"/>
- <text name="NextOwnerLabel">
- Nächster Eigentümer kann:
- </text>
- <check_box label="Bearbeiten" name="next_owner_modify"/>
- <check_box label="Kopieren" name="next_owner_copy"/>
- <check_box label="Verkaufen/Weggeben" name="next_owner_transfer"/>
- </panel>
- <button label="OK" label_selected="OK" name="ok"/>
- <button label="Abbrechen" label_selected="Abbrechen" name="cancel"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_voice_controls.xml b/indra/newview/skins/default/xui/de/floater_voice_controls.xml
deleted file mode 100644
index 5efda4136e..0000000000
--- a/indra/newview/skins/default/xui/de/floater_voice_controls.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_voice_controls" title="SPRACHSTEUERUNGEN">
- <string name="title_nearby">
- VOICE-EINSTELLUNGEN
- </string>
- <string name="title_group">
- GRUPPENGESPRÄCH MIT [GROUP]
- </string>
- <string name="title_adhoc">
- KONFERENZGESPRÄCH
- </string>
- <string name="title_peer_2_peer">
- GESPRÄCH MIT [NAME]
- </string>
- <string name="no_one_near">
- Es ist niemand in der Nähe, der Voice aktiviert hat.
- </string>
- <layout_stack name="my_call_stack">
- <layout_panel name="my_panel">
- <text name="user_text" value="Mein 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="Anruf beenden" name="leave_call_btn"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml
deleted file mode 100644
index 641a0ceebe..0000000000
--- a/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="Profil anzeigen" name="view_profile"/>
- <menu_item_call label="Freund hinzufügen" name="add_friend"/>
- <menu_item_call label="IM" name="im"/>
- <menu_item_call label="Anrufen" name="call"/>
- <menu_item_call label="Teleportieren" name="teleport"/>
- <menu_item_call label="In Gruppe einladen" name="invite_to_group"/>
- <menu_item_call label="Ignorieren" name="block"/>
- <menu_item_call label="Freischalten" name="unblock"/>
- <menu_item_call label="Melden" name="report"/>
- <menu_item_call label="Einfrieren" name="freeze"/>
- <menu_item_call label="Hinauswerfen" name="eject"/>
- <menu_item_call label="Hinauswerfen" name="kick"/>
- <menu_item_call label="CSR" name="csr"/>
- <menu_item_call label="Fehler in Texturen beseitigen" name="debug"/>
- <menu_item_call label="Auf Karte anzeigen" name="find_on_map"/>
- <menu_item_call label="Hineinzoomen" name="zoom_in"/>
- <menu_item_call label="Bezahlen" name="pay"/>
- <menu_item_call label="Teilen" name="share"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml
deleted file mode 100644
index 5979194bfb..0000000000
--- a/indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="Hinsetzen" name="Sit Down Here"/>
- <menu_item_call label="Aufstehen" name="Stand Up"/>
- <context_menu label="Ausziehen" name="Take Off &gt;">
- <context_menu label="Kleidung" name="Clothes &gt;">
- <menu_item_call label="Hemd" name="Shirt"/>
- <menu_item_call label="Hose" name="Pants"/>
- <menu_item_call label="Rock" name="Skirt"/>
- <menu_item_call label="Schuhe" name="Shoes"/>
- <menu_item_call label="Strümpfe" name="Socks"/>
- <menu_item_call label="Jacke" name="Jacket"/>
- <menu_item_call label="Handschuhe" name="Gloves"/>
- <menu_item_call label="Unterhemd" name="Self Undershirt"/>
- <menu_item_call label="Unterhose" name="Self Underpants"/>
- <menu_item_call label="Tätowierung" name="Self Tattoo"/>
- <menu_item_call label="Alpha" name="Self Alpha"/>
- <menu_item_call label="Alle Kleider" name="All Clothes"/>
- </context_menu>
- <context_menu label="HUD" name="Object Detach HUD"/>
- <context_menu label="Abnehmen" name="Object Detach"/>
- <menu_item_call label="Alles abnehmen" name="Detach All"/>
- </context_menu>
- <menu_item_call label="Outfit ändern" name="Chenge Outfit"/>
- <menu_item_call label="Mein Outfit bearbeiten" name="Edit Outfit"/>
- <menu_item_call label="Meine Form bearbeiten" name="Edit My Shape"/>
- <menu_item_call label="Meine Freunde" name="Friends..."/>
- <menu_item_call label="Meine Gruppen" name="Groups..."/>
- <menu_item_call label="Mein Profil" name="Profile..."/>
- <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_name_field.xml b/indra/newview/skins/default/xui/de/menu_name_field.xml
deleted file mode 100644
index 1d293c9361..0000000000
--- a/indra/newview/skins/default/xui/de/menu_name_field.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="CopyMenu">
- <menu_item_call label="Anzeigenamen kopieren" name="copy_display"/>
- <menu_item_call label="Agent-Namen kopieren" name="copy_name"/>
- <menu_item_call label="Agent-ID kopieren" name="copy_id"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/de/menu_people_friends_view_sort.xml
deleted file mode 100644
index 84d9d8938c..0000000000
--- a/indra/newview/skins/default/xui/de/menu_people_friends_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Nach Name sortieren" name="sort_name"/>
- <menu_item_check label="Nach Status sortieren" name="sort_status"/>
- <menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/>
- <menu_item_check label="Erteilte Genehmigungen anzeigen" name="view_permissions"/>
- <menu_item_call label="Ignorierte Einwohner &amp; Objekte anzeigen" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/de/menu_people_groups_view_sort.xml
deleted file mode 100644
index b68597d8aa..0000000000
--- a/indra/newview/skins/default/xui/de/menu_people_groups_view_sort.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Gruppensymbole anzeigen" name="Display Group Icons"/>
- <menu_item_call label="Ausgewählte Gruppe verlassen" name="Leave Selected Group"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml
deleted file mode 100644
index a001544f3e..0000000000
--- a/indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_group_plus">
- <menu_item_check label="Nach letzten Sprechern sortieren" name="sort_by_recent_speakers"/>
- <menu_item_check label="Nach Name sortieren" name="sort_name"/>
- <menu_item_check label="Nach Entfernung sortieren" name="sort_distance"/>
- <menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/>
- <menu_item_check label="Karte anzeigen" name="view_map"/>
- <menu_item_call label="Ignorierte Einwohner &amp; Objekte anzeigen" name="show_blocked_list"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/de/menu_people_recent_view_sort.xml
deleted file mode 100644
index 1ef020f5e1..0000000000
--- a/indra/newview/skins/default/xui/de/menu_people_recent_view_sort.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Nach aktuellesten Sprechern sortieren" name="sort_most"/>
- <menu_item_check label="Nach Name sortieren" name="sort_name"/>
- <menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/>
- <menu_item_call label="Ignorierte Einwohner &amp; Objekte anzeigen" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/de/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/de/panel_adhoc_control_panel.xml
deleted file mode 100644
index 6ad18781f5..0000000000
--- a/indra/newview/skins/default/xui/de/panel_adhoc_control_panel.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?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="Anrufen" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Anruf beenden" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Voice-Steuerung" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_facebook_account.xml b/indra/newview/skins/default/xui/de/panel_facebook_account.xml
deleted file mode 100644
index caa5f55186..0000000000
--- a/indra/newview/skins/default/xui/de/panel_facebook_account.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<panel name="panel_facebook_account">
- <string name="facebook_connected" value="Sie sind mit Facebook verbunden als:"/>
- <string name="facebook_disconnected" value="Nicht mit Facebook verbunden"/>
- <text name="account_caption_label">
- Nicht mit Facebook verbunden.
- </text>
- <panel name="panel_buttons">
- <button label="Verbinden..." name="connect_btn"/>
- <button label="Trennen" name="disconnect_btn"/>
- <text name="account_learn_more_label">
- [http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Share-Facebook/ta-p/2149711 Anweisungen zum Posten auf Facebook]
- </text>
- </panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_group_control_panel.xml b/indra/newview/skins/default/xui/de/panel_group_control_panel.xml
deleted file mode 100644
index 9cb72fafff..0000000000
--- a/indra/newview/skins/default/xui/de/panel_group_control_panel.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?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="Gruppenprofil" name="group_info_btn"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="Gruppe anrufen" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Anruf beenden" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Voice-Steuerung öffnen" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_im_control_panel.xml b/indra/newview/skins/default/xui/de/panel_im_control_panel.xml
deleted file mode 100644
index abf8011d9d..0000000000
--- a/indra/newview/skins/default/xui/de/panel_im_control_panel.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <text name="avatar_name" value="Unbekannt"/>
- <layout_stack name="button_stack">
- <layout_panel name="view_profile_btn_panel">
- <button label="Profil" name="view_profile_btn"/>
- </layout_panel>
- <layout_panel name="add_friend_btn_panel">
- <button label="Freund hinzufügen" name="add_friend_btn"/>
- </layout_panel>
- <layout_panel name="teleport_btn_panel">
- <button label="Teleportieren" name="teleport_btn" tool_tip="Dieser Person einen Teleport anbieten."/>
- </layout_panel>
- <layout_panel name="share_btn_panel">
- <button label="Teilen" name="share_btn"/>
- </layout_panel>
- <layout_panel name="pay_btn_panel">
- <button label="Bezahlen" name="pay_btn"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="Anrufen" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Anruf beenden" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Voice-Steuerung" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_main_inventory.xml b/indra/newview/skins/default/xui/de/panel_main_inventory.xml
index a3adea9fa2..175f6e1003 100644
--- a/indra/newview/skins/default/xui/de/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/de/panel_main_inventory.xml
@@ -9,6 +9,7 @@
<panel.string name="ItemcountUnknown">
Geholte [ITEM_COUNT] Bestellungen und [CATEGORY_COUNT] Ordner [FILTER]
</panel.string>
+ <panel.string name="inventory_title">INVENTAR</panel.string>
<text name="ItemcountText">
Objekte:
</text>
diff --git a/indra/newview/skins/default/xui/de/panel_profile_interests.xml b/indra/newview/skins/default/xui/de/panel_profile_interests.xml
deleted file mode 100644
index 0f36f76aa0..0000000000
--- a/indra/newview/skins/default/xui/de/panel_profile_interests.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Interessen" name="panel_profile_interests">
- <text name="I Want To:">
- Ich möchte:
- </text>
- <check_box label="Erstellen" name="chk0"/>
- <check_box label="Erkunden" name="chk1"/>
- <check_box label="Treffen" name="chk2"/>
- <check_box label="Angestellt werden" name="chk6"/>
- <check_box label="Gruppe" name="chk3"/>
- <check_box label="Kaufen" name="chk4"/>
- <check_box label="Verkaufen" name="chk5"/>
- <check_box label="Anstellen" name="chk7"/>
- <line_editor name="want_to_edit">
- (wird geladen...)
- </line_editor>
- <text name="Skills:">
- Fähigkeiten:
- </text>
- <check_box label="Texturen" name="schk0"/>
- <check_box label="Architektur" name="schk1"/>
- <check_box label="Modellierung" name="schk3"/>
- <check_box label="Eventplanung" name="schk2"/>
- <check_box label="Scripting" name="schk4"/>
- <check_box label="Benutzerdefinierte Charaktere" name="schk5"/>
- <line_editor name="skills_edit">
- (wird geladen...)
- </line_editor>
- <text name="Languages:">
- Sprachen:
- </text>
- <line_editor name="languages_edit">
- (wird geladen...)
- </line_editor>
-</panel>
diff --git a/indra/newview/skins/default/xui/en/floater_adjust_environment.xml b/indra/newview/skins/default/xui/en/floater_adjust_environment.xml
index 518a83f846..91a1dffcb5 100644
--- a/indra/newview/skins/default/xui/en/floater_adjust_environment.xml
+++ b/indra/newview/skins/default/xui/en/floater_adjust_environment.xml
@@ -12,6 +12,7 @@
can_resize="false">
<string name="hdr_string">HDR Scale:</string>
<string name="brightness_string">Brightness:</string>
+ <string name="hdr_tooltip">Intensity of lightning effects such as realistically bright skies and dynamic exposure. 1.0 is the default, 0 is off, values between 0 and 1 are mixing Ambient with HDR.</string>
<layout_stack name="outer_stack"
width="845"
height="275"
@@ -263,6 +264,7 @@
min_val="0"
max_val="10"
name="probe_ambiance"
+ tool_tip="Intensity of environment based indirect lighting. At zero HDR scale becomes Brightness"
top_pad="5"
width="185"
can_edit_text="true"/>
diff --git a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml
index 431c33a339..7aa31bed71 100644
--- a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml
@@ -170,6 +170,20 @@
name="icon_setting"
tool_tip="Environment settings"
left_pad="2" />
+ <check_box
+ control_name="BulkChangeIncludeMaterials"
+ height="16"
+ name="check_materials"
+ top_pad="5"
+ left="245"
+ width="16" />
+ <icon
+ height="16"
+ image_name="Inv_Material"
+ mouse_opaque="true"
+ name="icon_materials"
+ tool_tip="Materials"
+ left_pad="2" />
<button
height="23"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_change_item_thumbnail.xml b/indra/newview/skins/default/xui/en/floater_change_item_thumbnail.xml
new file mode 100644
index 0000000000..726cb38481
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_change_item_thumbnail.xml
@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ can_resize="false"
+ height="366"
+ layout="topleft"
+ name="change_item_thumbnail"
+ help_topic="change_item_thumbnail"
+ title="CHANGE ITEM IMAGE"
+ width="319">
+
+ <floater.string
+ name="title_item_thumbnail">
+ CHANGE ITEM IMAGE
+ </floater.string>
+ <floater.string
+ name="title_folder_thumbnail">
+ CHANGE FOLDER IMAGE
+ </floater.string>
+ <floater.string
+ name="tooltip_upload_local">
+ Upload from computer
+ </floater.string>
+ <floater.string
+ name="tooltip_upload_snapshot">
+ Use snapshot tool
+ </floater.string>
+ <floater.string
+ name="tooltip_use_texture">
+ Choose texture
+ </floater.string>
+ <floater.string
+ name="tooltip_copy_to_clipboard">
+ Copy to clipboard
+ </floater.string>
+ <floater.string
+ name="tooltip_paste_from_clipboard">
+ Paste from clipboard
+ </floater.string>
+ <floater.string
+ name="tooltip_remove_image">
+ Remove image
+ </floater.string>
+
+ <icon
+ follows="top|left"
+ height="16"
+ image_name="Inv_Object"
+ layout="topleft"
+ left="10"
+ mouse_opaque="true"
+ name="item_type_icon"
+ top="4"
+ width="16" />
+ <text
+ name="item_name"
+ font="SansSerif"
+ use_ellipses="true"
+ follows="left|top|right"
+ layout="topleft"
+ height="19"
+ top_delta="1"
+ left_pad="3"
+ width="286"/>
+
+ <thumbnail
+ name="item_thumbnail"
+ fallback_image="Thumbnail_Fallback"
+ follows="top|left"
+ layout="topleft"
+ left="32"
+ top_pad="9"
+ height="256"
+ width="256"
+ />
+
+ <button
+ follows="right|bottom"
+ layout="topleft"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Icon_File_Upload"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ name="upload_local"
+ left="38"
+ top_pad="9"
+ height="32"
+ width="32" />
+ <button
+ follows="right|bottom"
+ layout="topleft"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Icon_Snapshot"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ name="upload_snapshot"
+ left_pad="10"
+ top_delta="0"
+ height="32"
+ width="32" />
+ <button
+ follows="right|bottom"
+ layout="topleft"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Icon_Use_Texture"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ name="use_texture"
+ left_pad="10"
+ top_delta="0"
+ height="32"
+ width="32" />
+ <button
+ follows="right|bottom"
+ layout="topleft"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Icon_Copy"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ name="copy_to_clipboard"
+ left_pad="10"
+ top_delta="0"
+ height="32"
+ width="32" />
+ <button
+ follows="right|bottom"
+ layout="topleft"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Icon_Paste"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ name="paste_from_clipboard"
+ left_pad="10"
+ top_delta="0"
+ height="32"
+ width="32" />
+ <button
+ follows="right|bottom"
+ layout="topleft"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Icon_Delete"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ name="remove_image"
+ left_pad="10"
+ top_delta="0"
+ height="32"
+ width="32" />
+
+ <text
+ type="string"
+ halign="center"
+ length="1"
+ follows="left|top"
+ height="17"
+ layout="topleft"
+ left="5"
+ right="-5"
+ name="tooltip_text"
+ top_pad="12"
+ width="78">
+ tooltip
+ </text>
+
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_inventory_settings.xml b/indra/newview/skins/default/xui/en/floater_inventory_settings.xml
new file mode 100644
index 0000000000..2e619d91fb
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_inventory_settings.xml
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ can_close="true"
+ can_minimize="true"
+ can_resize="false"
+ save_rect="true"
+ height="370"
+ width="370"
+ name="inventory_settings"
+ title="INVENTORY SETTINGS">
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="Multi_Folder_Mode"
+ layout="topleft"
+ left="18"
+ mouse_opaque="true"
+ name="multi_folder_icon"
+ top="25"
+ width="18" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ height="13"
+ layout="topleft"
+ left_pad="12"
+ top_delta="2"
+ name="multi_folder_txt"
+ font="SansSerifMedium"
+ text_color="White"
+ width="300">
+ Double-click on folder in multi-folder view:
+ </text>
+ <radio_group
+ control_name="MultiModeDoubleClickFolder"
+ follows="left|top"
+ top_pad="8"
+ layout="topleft"
+ font="SansSerifMedium"
+ left="60"
+ width="300"
+ height="70"
+ name="multi_double_click_setting">
+ <radio_item
+ height="20"
+ label="Expands &amp; collapses folder"
+ label_text.text_color="White"
+ follows="left|top"
+ layout="topleft"
+ name="0"
+ width="200"/>
+ <radio_item
+ height="20"
+ follows="left|top"
+ label="Opens a new window"
+ label_text.text_color="White"
+ layout="topleft"
+ left_delta="0"
+ name="1"
+ top_pad ="5"
+ width="200" />
+ <radio_item
+ height="20"
+ follows="left|top"
+ label="Switches view"
+ label_text.text_color="White"
+ layout="topleft"
+ left_delta="0"
+ name="2"
+ top_pad ="5"
+ width="200" />
+ </radio_group>
+ <icon
+ follows="top|left"
+ height="18"
+ image_name="Single_Folder_Mode"
+ layout="topleft"
+ left="18"
+ mouse_opaque="true"
+ name="single_folder_icon"
+ top_pad="30"
+ width="18" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ height="13"
+ layout="topleft"
+ left_pad="12"
+ top_delta="2"
+ name="single_folder_txt"
+ font="SansSerifMedium"
+ text_color="White"
+ width="300">
+ Double-click on folder in single-folder view:
+ </text>
+ <radio_group
+ control_name="SingleModeDoubleClickOpenWindow"
+ follows="left|top"
+ top_pad="8"
+ layout="topleft"
+ font="SansSerifMedium"
+ left="60"
+ width="300"
+ height="45"
+ name="single_double_click_setting">
+ <radio_item
+ height="20"
+ label="Stays in current window"
+ label_text.text_color="White"
+ follows="left|top"
+ layout="topleft"
+ name="false"
+ width="200"/>
+ <radio_item
+ height="20"
+ follows="left|top"
+ label="Opens a new window"
+ label_text.text_color="White"
+ layout="topleft"
+ left_delta="0"
+ name="true"
+ top_pad ="5"
+ width="200" />
+ </radio_group>
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ height="13"
+ layout="topleft"
+ left="48"
+ name="find_original_txt"
+ font="SansSerifMedium"
+ text_color="White"
+ top_pad="30"
+ width="300">
+ Clicking on "Show in inventory" or "Find original"
+ </text>
+ <radio_group
+ control_name="FindOriginalOpenWindow"
+ follows="left|top"
+ top_pad="8"
+ layout="topleft"
+ font="SansSerifMedium"
+ left="60"
+ width="300"
+ height="45"
+ name="find_original_settings">
+ <radio_item
+ height="20"
+ label="Shows item in main inventory window"
+ label_text.text_color="White"
+ follows="left|top"
+ layout="topleft"
+ name="false"
+ width="200"/>
+ <radio_item
+ height="20"
+ follows="left|top"
+ label="Opens a new single-folder window"
+ label_text.text_color="White"
+ layout="topleft"
+ left_delta="0"
+ name="true"
+ top_pad ="5"
+ width="200" />
+ </radio_group>
+ <button
+ height="20"
+ label="OK"
+ layout="topleft"
+ left="140"
+ bottom="-20"
+ name="ok_btn"
+ label_color="White"
+ width="90" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_item_properties.xml b/indra/newview/skins/default/xui/en/floater_item_properties.xml
index 0fc54a9c8b..336bb902ca 100644
--- a/indra/newview/skins/default/xui/en/floater_item_properties.xml
+++ b/indra/newview/skins/default/xui/en/floater_item_properties.xml
@@ -13,7 +13,7 @@
left="0"
class="sidepanel_item_info"
filename="sidepanel_item_info.xml"
- name="item_panel"
+ name="sidepanel"
top="20"
label=""
height="570"
diff --git a/indra/newview/skins/default/xui/en/floater_my_inventory.xml b/indra/newview/skins/default/xui/en/floater_my_inventory.xml
index f182d27da8..a9900f05b7 100644
--- a/indra/newview/skins/default/xui/en/floater_my_inventory.xml
+++ b/indra/newview/skins/default/xui/en/floater_my_inventory.xml
@@ -5,14 +5,14 @@
can_resize="true"
height="570"
help_topic="sidebar_inventory"
- min_width="333"
- min_height="590"
+ min_width="363"
+ min_height="270"
name="floater_my_inventory"
save_rect="true"
save_visibility="true"
reuse_instance="true"
title="INVENTORY"
- width="333" >
+ width="363" >
<panel
class="sidepanel_inventory"
name="main_panel"
diff --git a/indra/newview/skins/default/xui/en/floater_new_feature_notification.xml b/indra/newview/skins/default/xui/en/floater_new_feature_notification.xml
new file mode 100644
index 0000000000..c8726d36b4
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_new_feature_notification.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ height="130"
+ width="300"
+ layout="topleft"
+ name="floater_new_feature_notification"
+ title="NEW FEATURE"
+ show_title="false"
+ header_height="0"
+ bg_opaque_image="Window_NoTitle_Foreground"
+ bg_alpha_image="Window_NoTitle_Background"
+ can_resize="false"
+ can_drag_on_left="false"
+ can_minimize="false"
+ can_close="false">
+ <floater.string name="title_txt_inventory">
+New inventory features
+ </floater.string>
+ <floater.string name="description_txt_inventory">
+You can now add preview images to inventory items and view a folder in its own window.
+Learn more in this [https://community.secondlife.com/blogs/entry/13637-new-features-inventory-item-preview-and-single-folder-view/ blogpost]
+ </floater.string>
+ <floater.string name="title_txt_gltf">
+New GLTF PBR materials support
+ </floater.string>
+ <floater.string name="description_txt_gltf">
+You can now use expanded material support with the ability to import and edit GLTF Physically Based Rendering (PBR) Materials.
+In order to support the addition of the GLTF format, some areas in the viewer may appear darker than usual.
+
+Learn more about [https://wiki.secondlife.com/wiki/PBR_Materials Physically Based Rendering (PBR)]
+ </floater.string>
+ <text
+ type="string"
+ length="1"
+ follows="top|left|right"
+ font="SansSerifLargeBold"
+ text_color="White"
+ layout="topleft"
+ left="10"
+ height="14"
+ top="10"
+ right="-10"
+ name="title_txt">
+New feature
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="top|left|right|bottom"
+ text_color="White"
+ layout="topleft"
+ left="10"
+ height="40"
+ top_pad="14"
+ right="-10"
+ word_wrap="true"
+ name="description_txt">
+Feature description
+ </text>
+ <button
+ follows="bottom|left|right"
+ layout="topleft"
+ height="24"
+ label="Got it!"
+ left="104"
+ bottom="-10"
+ name="close_btn"
+ width="90"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_outfit_photo_preview.xml b/indra/newview/skins/default/xui/en/floater_outfit_photo_preview.xml
deleted file mode 100644
index bfc1c39e9d..0000000000
--- a/indra/newview/skins/default/xui/en/floater_outfit_photo_preview.xml
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- legacy_header_height="18"
- can_resize="false"
- height="325"
- layout="topleft"
- name="outfit_photo_preview"
- help_topic="preview_texture"
- width="410">
- <floater.string
- name="Title">
- Texture: [NAME]
- </floater.string>
- <floater.string
- name="exceed_limits">
- Max outfit photo size is [MAX_WIDTH]*[MAX_HEIGHT]. Please select another texture.
- </floater.string>
- <floater.string
- name="photo_confirmation">
- Set this as Outfit Photo for [OUTFIT]?
- </floater.string>
- <text
- type="string"
- halign="right"
- length="1"
- follows="right|bottom"
- height="16"
- layout="topleft"
- left="110"
- name="dimensions"
- top="255"
- width="200">
- [WIDTH]px x [HEIGHT]px
- </text>
- <text
- type="string"
- follows="left|top"
- height="16"
- layout="topleft"
- name="notification"
- left="25"
- halign="center"
- top_pad="5"
- width="360">
- </text>
- <button
- follows="right|bottom"
- height="22"
- label="OK"
- layout="topleft"
- name="ok_btn"
- top_pad="5"
- right="-115"
- top_delta="0"
- width="90" />
- <button
- follows="right|bottom"
- height="22"
- label="Cancel"
- layout="topleft"
- name="cancel_btn"
- right="-20"
- top_delta="0"
- width="90" />
-</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml
index fd80673903..bc237322af 100644
--- a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml
+++ b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml
@@ -540,17 +540,6 @@
function="Pref.RenderOptionUpdate" />
</check_box>
- <check_box
- control_name="RenderLocalLights"
- height="16"
- initial_value="true"
- label="Local Lights"
- layout="topleft"
- left="420"
- name="LocalLights"
- top_delta="16"
- width="300" />
-
<slider
control_name="WLSkyDetail"
decimal_digits="0"
diff --git a/indra/newview/skins/default/xui/en/floater_scene_load_stats.xml b/indra/newview/skins/default/xui/en/floater_scene_load_stats.xml
index 37efbe654e..b757f4eab8 100644
--- a/indra/newview/skins/default/xui/en/floater_scene_load_stats.xml
+++ b/indra/newview/skins/default/xui/en/floater_scene_load_stats.xml
@@ -414,7 +414,7 @@
name="frame_stats"
label="Frame breakdown"
show_label="true">
- <stat_bar name="packet_loss"
+ <stat_bar name="scenery_frame_pct"
label="Scenery"
orientation="horizontal"
unit_label=" %"
@@ -422,7 +422,7 @@
bar_max="100"
tick_spacing="0.5"
show_bar="false"/>
- <stat_bar name="packet_loss"
+ <stat_bar name="avatar_frame_pct"
label="Avatar"
orientation="horizontal"
unit_label=" %"
@@ -430,7 +430,7 @@
bar_max="100"
tick_spacing="0.5"
show_bar="false"/>
- <stat_bar name="packet_loss"
+ <stat_bar name="ui_frame_pct"
label="UI"
orientation="horizontal"
unit_label=" %"
@@ -438,7 +438,7 @@
bar_max="100"
tick_spacing="0.5"
show_bar="false"/>
- <stat_bar name="packet_loss"
+ <stat_bar name="huds_frame_pct"
label="HUDs"
orientation="horizontal"
unit_label=" %"
@@ -446,7 +446,7 @@
bar_max="100"
tick_spacing="0.5"
show_bar="false"/>
- <stat_bar name="packet_loss"
+ <stat_bar name="swap_frame_pct"
label="Swap"
orientation="horizontal"
unit_label=" %"
@@ -454,7 +454,7 @@
bar_max="100"
tick_spacing="0.5"
show_bar="false"/>
- <stat_bar name="packet_loss"
+ <stat_bar name="idle_frame_pct"
label="Tasks"
orientation="horizontal"
unit_label=" %"
diff --git a/indra/newview/skins/default/xui/en/floater_simple_outfit_snapshot.xml b/indra/newview/skins/default/xui/en/floater_simple_snapshot.xml
index 5ece7b85d5..484ad159d1 100644
--- a/indra/newview/skins/default/xui/en/floater_simple_outfit_snapshot.xml
+++ b/indra/newview/skins/default/xui/en/floater_simple_snapshot.xml
@@ -2,17 +2,17 @@
<floater
positioning="cascading"
legacy_header_height="18"
- can_minimize="true"
+ can_minimize="false"
can_resize="false"
can_close="true"
height="305"
layout="topleft"
- name="simple_outfit_snapshot"
- single_instance="true"
+ name="simple_snapshot"
+ single_instance="false"
help_topic="snapshot"
save_rect="true"
save_visibility="false"
- title="OUTFIT SNAPSHOT"
+ title="ITEM SNAPSHOT"
width="351">
<ui_ctrl
layout="topleft"
@@ -36,7 +36,7 @@
height="22"
layout="topleft"
left_pad="10"
- label="Save (L$[UPLOAD_COST])"
+ label="Save"
name="save_btn"
width="90" />
<button
diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml
index f441e3cbd7..fcd24d83bb 100644
--- a/indra/newview/skins/default/xui/en/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml
@@ -440,7 +440,7 @@
length="1"
halign="right"
name="360_label"
- text_color="0.3 0.82 1 1"
+ text_color="HTMLLinkColor"
top_delta="0"
type="string"
width="115">
diff --git a/indra/newview/skins/default/xui/en/floater_task_properties.xml b/indra/newview/skins/default/xui/en/floater_task_properties.xml
new file mode 100644
index 0000000000..56c236eab4
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_task_properties.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ height="590"
+ layout="topleft"
+ name="Task Properties"
+ help_topic="item+properties"
+ title="ITEM PROPERTIES"
+ single_instance="true"
+ width="330">
+ <panel
+ follows="all"
+ layout="topleft"
+ left="0"
+ class="sidepanel_task_info"
+ filename="sidepanel_task_info.xml"
+ name="sidepanel"
+ top="20"
+ label=""
+ height="570"
+ visible="true"
+ width="330">
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
index 47de3b7576..2d3321bb2f 100644
--- a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
@@ -91,6 +91,22 @@ PICK: TEXTURE
top_pad="4">
[DIMENSIONS]
</text>
+ <text
+ type="string"
+ text_color="Yellow"
+ length="1"
+ word_wrap="true"
+ follows="left|top"
+ height="56"
+ width="164"
+ layout="topleft"
+ left="8"
+ name="over_limit_lbl"
+ visible="false"
+ top_delta="0">
+ Selected texture is [TEXDIM]. Inventory image must be square, no less than [MINTEXDIM].
+ </text>
+
<!-- middle: inventory mode -->
<button
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index 5e999ed245..9966fe0b56 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -1114,11 +1114,15 @@
label="Open"
name="Open"
value="Open" />
- <combo_box.item
+ <combo_box.item
label="Zoom"
name="Zoom"
value="Zoom" />
<combo_box.item
+ label="Ignore object"
+ name="Ignoreobject"
+ value="Ignore" />
+ <combo_box.item
label="None"
name="None"
value="None" />
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 b82fe43e74..a8b4b84ab7 100644
--- a/indra/newview/skins/default/xui/en/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/en/floater_top_objects.xml
@@ -273,4 +273,17 @@
<button.commit_callback
function="TopObjects.ReturnAll" />
</button>
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Teleport to selected"
+ layout="topleft"
+ left_pad="10"
+ name="teleport_btn"
+ enabled="false"
+ top_delta="0"
+ width="160">
+ <button.commit_callback
+ function="TopObjects.TeleportToSelected" />
+</button>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_translation_settings.xml b/indra/newview/skins/default/xui/en/floater_translation_settings.xml
index a212ce7889..3f3331b468 100644
--- a/indra/newview/skins/default/xui/en/floater_translation_settings.xml
+++ b/indra/newview/skins/default/xui/en/floater_translation_settings.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- height="310"
+ height="470"
layout="topleft"
name="floater_translation_settings"
help_topic="translation_settings"
@@ -9,11 +9,13 @@
title="CHAT TRANSLATION SETTINGS"
width="485">
- <string name="bing_api_key_not_verified">Bing appID not verified. Please try again.</string>
- <string name="google_api_key_not_verified">Google API key not verified. Please try again.</string>
+ <string name="azure_api_key_not_verified">Azure service identifier not verified. Status: [STATUS]. Please check your settings and try again.</string>
+ <string name="google_api_key_not_verified">Google API key not verified. Status: [STATUS]. Please check your key and try again.</string>
+ <string name="deepl_api_key_not_verified">DeepL Auth Key key not verified. Status: [STATUS]. Please check your key and try again.</string>
- <string name="bing_api_key_verified">Bing appID verified.</string>
+ <string name="azure_api_key_verified">Azure service identifier verified.</string>
<string name="google_api_key_verified">Google API key verified.</string>
+ <string name="deepl_api_key_verified">DeepL API key verified.</string>
<check_box
height="16"
@@ -128,25 +130,86 @@
<radio_group
follows="top|left"
- height="80"
+ height="260"
layout="topleft"
left_delta="10"
name="translation_service_rg"
top_pad="20"
width="320">
<radio_item
- initial_value="bing"
- label="Bing Translator"
+ initial_value="azure"
+ label="Azure Translator"
layout="topleft"
- name="bing" />
+ name="azure" />
<radio_item
initial_value="google"
label="Google Translate"
layout="topleft"
name="google"
- top_pad="55" />
+ top_pad="115" />
+ <radio_item
+ initial_value="deepl"
+ label="DeepL Translator"
+ layout="topleft"
+ name="deepl"
+ top_pad="61" />
</radio_group>
+ <text
+ follows="top|right"
+ height="20"
+ layout="topleft"
+ left="185"
+ length="1"
+ name="google_links_text"
+ top_pad="-262"
+ type="string"
+ width="100">
+ [https://learn.microsoft.com/en-us/azure/cognitive-services/translator/create-translator-resource Setup]
+ </text>
+
+ <text
+ type="string"
+ length="1"
+ follows="top|right"
+ height="20"
+ layout="topleft"
+ left="70"
+ name="azure_api_endoint_label"
+ top_pad="8"
+ width="85">
+ Endpoint:
+ </text>
+
+ <combo_box
+ allow_text_entry="true"
+ follows="left|top"
+ name="azure_api_endpoint_combo"
+ height="23"
+ left_pad="10"
+ right="-10"
+ top_delta="-4"
+ max_chars="512"
+ value="https://api.cognitive.microsofttranslator.com"
+ combo_button.scale_image="true">
+ <combo_box.item
+ label="https://api.cognitive.microsofttranslator.com"
+ name="global"
+ value="https://api.cognitive.microsofttranslator.com" />
+ <combo_box.item
+ label="https://api-apc.cognitive.microsofttranslator.com"
+ name="api-apc"
+ value="https://api-apc.cognitive.microsofttranslator.com" />
+ <combo_box.item
+ label="https://api-eur.cognitive.microsofttranslator.com"
+ name="api-eur"
+ value="https://api-eur.cognitive.microsofttranslator.com" />
+ <combo_box.item
+ label="https://api-nam.cognitive.microsofttranslator.com"
+ name="api-nam"
+ value="https://api-nam.cognitive.microsofttranslator.com" />
+ </combo_box>
+
<text
type="string"
length="1"
@@ -154,30 +217,52 @@
height="20"
layout="topleft"
left="70"
- name="bing_api_key_label"
- top_pad="-55"
+ name="azure_api_key_label"
+ top_pad="10"
width="85">
- Bing [http://www.bing.com/developers/createapp.aspx AppID]:
+ Azure Key:
</text>
<line_editor
- default_text="Enter Bing AppID and click &quot;Verify&quot;"
+ default_text="Enter Translator Key and click &quot;Verify&quot;"
follows="top|left"
height="20"
layout="topleft"
left_pad="10"
max_length_chars="50"
top_delta="-4"
- name="bing_api_key"
+ name="azure_api_key"
width="210" />
- <button
- follows="left|top"
- height="23"
- label="Verify"
- layout="topleft"
- left_pad="10"
- name="verify_bing_api_key_btn"
- top_delta="-2"
- width="90" />
+ <text
+ type="string"
+ length="1"
+ follows="top|right"
+ height="20"
+ layout="topleft"
+ left="70"
+ name="azure_api_region_label"
+ top_pad="11"
+ width="85">
+ Region:
+ </text>
+ <line_editor
+ default_text="Can be left empty for global services"
+ follows="top|left"
+ height="20"
+ layout="topleft"
+ left_pad="10"
+ max_length_chars="50"
+ top_delta="-4"
+ name="azure_api_region"
+ width="210" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Verify"
+ layout="topleft"
+ left_pad="10"
+ name="verify_azure_api_key_btn"
+ top_delta="-2"
+ width="90" />
<text
follows="top|right"
@@ -186,7 +271,7 @@
left="70"
length="1"
name="google_api_key_label"
- top_pad="50"
+ top_pad="53"
type="string"
width="85">
Google [http://code.google.com/apis/language/translate/v2/getting_started.html#auth API key]:
@@ -209,7 +294,7 @@
left_pad="10"
name="verify_google_api_key_btn"
top_delta="-2"
- width="90" />
+ width="90" />
<text
follows="top|right"
@@ -224,6 +309,87 @@
[http://code.google.com/apis/language/translate/v2/pricing.html Pricing] | [https://code.google.com/apis/console Stats]
</text>
+ <text
+ type="string"
+ length="1"
+ follows="top|right"
+ height="20"
+ layout="topleft"
+ left="70"
+ name="deepl_api_domain_label"
+ top_pad="80"
+ width="85">
+ Endpoint:
+ </text>
+
+ <combo_box
+ allow_text_entry="false"
+ follows="left|top"
+ name="deepl_api_domain_combo"
+ height="23"
+ left_pad="10"
+ width="140"
+ top_delta="-4"
+ max_chars="512"
+ value="https://api-free.deepl.com"
+ combo_button.scale_image="true">
+ <combo_box.item
+ label="DeepL Free"
+ name="global"
+ value="https://api-free.deepl.com" />
+ <combo_box.item
+ label="DeepL Pro"
+ name="api-apc"
+ value="https://api.deepl.com" />
+ </combo_box>
+
+ <text
+ follows="top|right"
+ height="20"
+ layout="topleft"
+ left="70"
+ length="1"
+ name="deepl_api_key_label"
+ top_pad="11"
+ type="string"
+ width="85">
+ DeepL API key:
+ </text>
+
+ <line_editor
+ default_text="Enter DeepL API key and click &quot;Verify&quot;"
+ follows="top|left"
+ height="20"
+ layout="topleft"
+ left_pad="10"
+ max_length_chars="50"
+ top_delta="-4"
+ name="deepl_api_key"
+ width="210" />
+
+ <button
+ follows="left|top"
+ height="23"
+ label="Verify"
+ layout="topleft"
+ left_pad="10"
+ name="verify_deepl_api_key_btn"
+ top_delta="-2"
+ width="90" />
+
+ <text
+ follows="top|right"
+ height="20"
+ layout="topleft"
+ left="185"
+ length="1"
+ name="deepl_links_text"
+ top_delta="-53"
+ type="string"
+ width="100">
+ [https://www.deepl.com/pro/select-country?cta=header-prices Pricing]
+ </text>
+
<button
follows="left|top"
height="23"
diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
index 943bfb8122..8e041f8de3 100644
--- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
@@ -17,7 +17,7 @@
name="EditGLTFMaterial">
<menu_item_call.on_click
function="Object.EditGLTFMaterial" />
- <menu_item_call.on_enable
+ <menu_item_call.on_visible
function="Object.EnableEditGLTFMaterial"/>
</menu_item_call>
<menu_item_call
diff --git a/indra/newview/skins/default/xui/en/menu_gallery_inventory.xml b/indra/newview/skins/default/xui/en/menu_gallery_inventory.xml
new file mode 100644
index 0000000000..d82c453e5f
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_gallery_inventory.xml
@@ -0,0 +1,515 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Gallery">
+ <menu_item_call
+ label="Share"
+ layout="topleft"
+ name="Share">
+ <menu_item_call.on_click
+ function="Inventory.Share" />
+ </menu_item_call>
+ <menu_item_call
+ label="Empty Trash"
+ layout="topleft"
+ name="Empty Trash">
+ <menu_item_call.on_click
+ function="Inventory.EmptyTrash"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Empty Lost And Found"
+ layout="topleft"
+ name="Empty Lost And Found">
+ <menu_item_call.on_click
+ function="Inventory.EmptyLostAndFound"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Teleport"
+ layout="topleft"
+ name="Landmark Open">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="open" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="Folder Wearables Separator" />
+ <menu_item_call
+ label="Replace Current Outfit"
+ layout="topleft"
+ name="Replace Outfit">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="replaceoutfit" />
+ </menu_item_call>
+ <menu_item_call
+ label="Add To Current Outfit"
+ layout="topleft"
+ name="Add To Outfit">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="addtooutfit" />
+ </menu_item_call>
+ <menu_item_call
+ label="Remove From Current Outfit"
+ layout="topleft"
+ name="Remove From Outfit">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="removefromoutfit" />
+ </menu_item_call>
+ <menu_item_call
+ label="Copy outfit list to clipboard"
+ layout="topleft"
+ name="Copy outfit list to clipboard">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="copyoutfittoclipboard" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="Outfit Separator" />
+ <menu_item_call
+ label="Find Original"
+ layout="topleft"
+ name="Find Original">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="goto" />
+ </menu_item_call>
+ <menu_item_call
+ label="Purge Item"
+ layout="topleft"
+ name="Purge Item">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="purge"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Restore Item"
+ layout="topleft"
+ name="Restore Item">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="restore" />
+ </menu_item_call>
+ <menu_item_call
+ label="Open"
+ layout="topleft"
+ name="Open">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="open" />
+ </menu_item_call>
+ <menu_item_call
+ label="Open Original"
+ layout="topleft"
+ name="Open Original">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="open_original" />
+ </menu_item_call>
+ <menu_item_call
+ label="Properties"
+ layout="topleft"
+ name="Properties">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="properties" />
+ </menu_item_call>
+ <menu_item_call
+ label="Image..."
+ layout="topleft"
+ name="thumbnail">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="thumbnail" />
+ </menu_item_call>
+ <menu_item_call
+ label="Copy Asset UUID"
+ layout="topleft"
+ name="Copy Asset UUID">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="copy_uuid" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="Copy Separator" />
+ <menu_item_call
+ label="Open"
+ layout="topleft"
+ name="open_in_current_window">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="open_selected_folder" />
+ </menu_item_call>
+ <menu_item_call
+ label="Open in new window"
+ layout="topleft"
+ name="open_in_new_window">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="open_in_new_window" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="Open Folder Separator" />
+ <menu_item_call
+ label="Rename"
+ layout="topleft"
+ name="Rename">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="rename" />
+ </menu_item_call>
+ <menu_item_call
+ label="Cut"
+ layout="topleft"
+ name="Cut">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="cut" />
+ </menu_item_call>
+ <menu_item_call
+ label="Copy"
+ layout="topleft"
+ name="Copy">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="copy" />
+ </menu_item_call>
+ <menu_item_call
+ label="Paste"
+ layout="topleft"
+ name="Paste">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="paste" />
+ </menu_item_call>
+ <menu_item_call
+ label="Paste As Link"
+ layout="topleft"
+ name="Paste As Link">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="paste_link" />
+ </menu_item_call>
+ <menu_item_call
+ label="Replace Links"
+ layout="topleft"
+ name="Replace Links">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="replace_links" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="Paste Separator" />
+ <menu_item_call
+ label="Delete"
+ layout="topleft"
+ name="Delete">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="delete" />
+ </menu_item_call>
+ <menu_item_call
+ label="Delete System Folder"
+ layout="topleft"
+ name="Delete System Folder">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="delete_system_folder" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
+ label="Play"
+ layout="topleft"
+ name="Sound Play">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="sound_play" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="Landmark Separator" />
+ <menu_item_call
+ label="Copy SLurl"
+ layout="topleft"
+ name="url_copy">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="copy_slurl" />
+ </menu_item_call>
+ <menu_item_call
+ label="About Landmark"
+ layout="topleft"
+ name="About Landmark">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="about" />
+ </menu_item_call>
+ <menu_item_call
+ label="Show on Map"
+ layout="topleft"
+ name="show_on_map">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="show_on_map" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="Animation Separator" />
+ <menu_item_call
+ label="Play Inworld"
+ layout="topleft"
+ name="Animation Play">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="playworld" />
+ </menu_item_call>
+ <menu_item_call
+ label="Play Locally"
+ layout="topleft"
+ name="Animation Audition">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="playlocal" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="Send Instant Message Separator" />
+ <menu_item_call
+ label="Send Instant Message"
+ layout="topleft"
+ name="Send Instant Message">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="begin_im" />
+ </menu_item_call>
+ <menu_item_call
+ label="Offer Teleport..."
+ layout="topleft"
+ name="Offer Teleport...">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="lure" />
+ </menu_item_call>
+ <menu_item_call
+ label="Request Teleport..."
+ layout="topleft"
+ name="Request Teleport...">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="request_lure" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="Gesture Separator" />
+ <menu_item_call
+ label="Activate"
+ layout="topleft"
+ name="Activate">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="activate" />
+ </menu_item_call>
+ <menu_item_call
+ label="Deactivate"
+ layout="topleft"
+ name="Deactivate">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="deactivate" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="Texture Separator" />
+ <menu_item_call
+ label="Save As"
+ layout="topleft"
+ name="Save As">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="save_as" />
+ </menu_item_call>
+ <menu_item_call
+ label="Save Selected As"
+ layout="topleft"
+ name="Save Selected As">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="save_selected_as" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="Wearable And Object Separator"/>
+ <menu_item_call
+ label="Wear"
+ layout="topleft"
+ name="Wearable And Object Wear">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="wear" />
+ </menu_item_call>
+ <menu
+ label="Attach To"
+ layout="topleft"
+ name="Attach To" />
+ <menu
+ label="Attach To HUD"
+ layout="topleft"
+ name="Attach To HUD" />
+ <menu_item_call
+ label="Touch"
+ layout="topleft"
+ name="Attachment Touch">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="touch" />
+ </menu_item_call>
+ <menu_item_call
+ label="Edit"
+ layout="topleft"
+ name="Wearable Edit">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="edit" />
+ </menu_item_call>
+ <menu_item_call
+ label="Add"
+ layout="topleft"
+ name="Wearable Add">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="wear_add" />
+ </menu_item_call>
+ <menu_item_call
+ label="Detach From Yourself"
+ layout="topleft"
+ name="Detach From Yourself">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="detach" />
+ </menu_item_call>
+ <menu_item_call
+ label="Take Off"
+ layout="topleft"
+ name="Take Off">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="take_off" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="Settings Separator" />
+ <menu_item_call
+ name="Settings Apply Local"
+ layout="topleft"
+ label="Apply Only To Myself">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="apply_settings_local" />
+ </menu_item_call>
+ <menu_item_call
+ name="Settings Apply Parcel"
+ layout="topleft"
+ label="Apply To Parcel">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="apply_settings_parcel" />
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="Subfolder Separator" />
+ <menu_item_call
+ label="Create folder from selected"
+ layout="topleft"
+ name="New folder from selected">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="new_folder_from_selected" />
+ </menu_item_call>
+ <menu_item_call
+ label="Ungroup folder items"
+ layout="topleft"
+ name="Ungroup folder items">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="ungroup_folder_items" />
+ </menu_item_call>
+ <menu
+ label="Use as default for"
+ layout="topleft"
+ name="upload_def">
+ <menu_item_call
+ label="Image uploads"
+ layout="topleft"
+ name="Image uploads">
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="texture" />
+ <menu_item_call.on_visible
+ function="Inventory.CanSetUploadLocation" />
+ </menu_item_call>
+ <menu_item_call
+ label="Sound uploads"
+ layout="topleft"
+ name="Sound uploads">
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="sound" />
+ <menu_item_call.on_visible
+ function="Inventory.CanSetUploadLocation" />
+ </menu_item_call>
+ <menu_item_call
+ label="Animation uploads"
+ layout="topleft"
+ name="Animation uploads">
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="animation" />
+ <menu_item_call.on_visible
+ function="Inventory.CanSetUploadLocation" />
+ </menu_item_call>
+ <menu_item_call
+ label="Model uploads"
+ layout="topleft"
+ name="Model uploads">
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="model" />
+ <menu_item_call.on_visible
+ function="Inventory.CanSetUploadLocation" />
+ </menu_item_call>
+ </menu>
+ <menu_item_separator
+ layout="topleft"
+ name="Marketplace Separator" />
+ <menu_item_call
+ label="Copy to Marketplace Listings"
+ layout="topleft"
+ name="Marketplace Copy">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="copy_to_marketplace_listings" />
+ </menu_item_call>
+ <menu_item_call
+ label="Move to Marketplace Listings"
+ layout="topleft"
+ name="Marketplace Move">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="move_to_marketplace_listings" />
+ </menu_item_call>
+ <menu_item_call
+ label="--no options--"
+ layout="topleft"
+ name="--no options--" />
+ <menu_item_separator
+ layout="topleft" />
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_gallery_outfit_tab.xml b/indra/newview/skins/default/xui/en/menu_gallery_outfit_tab.xml
index 99ca910062..0ca505dd5d 100755
--- a/indra/newview/skins/default/xui/en/menu_gallery_outfit_tab.xml
+++ b/indra/newview/skins/default/xui/en/menu_gallery_outfit_tab.xml
@@ -42,35 +42,11 @@
parameter="take_off" />
</menu_item_call>
<menu_item_call
- label="Upload Photo (L$[UPLOAD_COST])"
- layout="topleft"
- name="upload_photo">
- <on_click
- function="Outfit.UploadPhoto" />
- </menu_item_call>
- <menu_item_call
- label="Select Photo"
- layout="topleft"
- name="select_photo">
+ label="Image..."
+ layout="topleft"
+ name="thumbnail">
<on_click
- function="Outfit.SelectPhoto" />
- </menu_item_call>
- <menu_item_call
- label="Take a Snapshot"
- layout="topleft"
- name="take_snapshot">
- <on_click
- function="Outfit.TakeSnapshot" />
- </menu_item_call>
- <menu_item_call
- label="Remove Photo"
- layout="topleft"
- name="remove_photo">
- <on_click
- function="Outfit.RemovePhoto" />
- <on_visible
- function="Outfit.OnVisible"
- parameter="remove_photo" />
+ function="Outfit.Thumbnail" />
</menu_item_call>
<menu_item_separator name="sepatator1" />
<menu
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index 5e2fd31301..1907dc2438 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -143,6 +143,22 @@
function="Inventory.EmptyLostAndFound"
parameter="rename" />
</menu_item_call>
+ <menu_item_call
+ label="New Folder"
+ layout="topleft"
+ name="New Folder">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="category" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Outfit"
+ layout="topleft"
+ name="New Outfit">
+ <menu_item_call.on_click
+ function="Inventory.DoCreate"
+ parameter="outfit" />
+ </menu_item_call>
<menu
label="Change Type"
layout="topleft"
@@ -339,12 +355,12 @@
parameter="properties" />
</menu_item_call>
<menu_item_call
- label="Rename"
+ label="Image..."
layout="topleft"
- name="Rename">
+ name="thumbnail">
<menu_item_call.on_click
function="Inventory.DoToSelected"
- parameter="rename" />
+ parameter="thumbnail" />
</menu_item_call>
<menu_item_call
label="Copy Asset UUID"
@@ -366,6 +382,32 @@
layout="topleft"
name="Copy Separator" />
<menu_item_call
+ label="Open"
+ layout="topleft"
+ name="open_in_current_window">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="open_in_current_window" />
+ </menu_item_call>
+ <menu_item_call
+ label="Open in new window"
+ layout="topleft"
+ name="open_in_new_window">
+ <menu_item_call.on_click
+ function="Inventory.OpenNewFolderWindow"/>
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft"
+ name="Open Folder Separator" />
+ <menu_item_call
+ label="Rename"
+ layout="topleft"
+ name="Rename">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="rename" />
+ </menu_item_call>
+ <menu_item_call
label="Cut"
layout="topleft"
name="Cut">
@@ -425,285 +467,6 @@
parameter="delete_system_folder" />
</menu_item_call>
<menu_item_separator
- layout="topleft"
- name="Create Separator" />
- <menu_item_call
- label="New Folder"
- layout="topleft"
- name="New Folder">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="category" />
- </menu_item_call>
- <menu_item_call
- label="New Outfit"
- layout="topleft"
- name="New Outfit">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="outfit" />
- </menu_item_call>
- <menu_item_call
- label="New Script"
- layout="topleft"
- name="New Script">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="lsl" />
- </menu_item_call>
- <menu_item_call
- label="New Notecard"
- layout="topleft"
- name="New Note">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="notecard" />
- </menu_item_call>
- <menu_item_call
- label="New Gesture"
- layout="topleft"
- name="New Gesture">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="gesture" />
- </menu_item_call>
- <menu_item_call
- label="New Material"
- layout="topleft"
- name="New Material">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="material" />
- <menu_item_call.on_enable
- function="Inventory.MaterialsEnabled" />
- </menu_item_call>
- <menu
- label="New Clothes"
- layout="topleft"
- name="New Clothes">
- <menu_item_call
- label="New Shirt"
- layout="topleft"
- name="New Shirt">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="shirt" />
- </menu_item_call>
- <menu_item_call
- label="New Pants"
- layout="topleft"
- name="New Pants">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="pants" />
- </menu_item_call>
- <menu_item_call
- label="New Shoes"
- layout="topleft"
- name="New Shoes">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="shoes" />
- </menu_item_call>
- <menu_item_call
- label="New Socks"
- layout="topleft"
- name="New Socks">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="socks" />
- </menu_item_call>
- <menu_item_call
- label="New Jacket"
- layout="topleft"
- name="New Jacket">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="jacket" />
- </menu_item_call>
- <menu_item_call
- label="New Skirt"
- layout="topleft"
- name="New Skirt">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="skirt" />
- </menu_item_call>
- <menu_item_call
- label="New Gloves"
- layout="topleft"
- name="New Gloves">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="gloves" />
- </menu_item_call>
- <menu_item_call
- label="New Undershirt"
- layout="topleft"
- name="New Undershirt">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="undershirt" />
- </menu_item_call>
- <menu_item_call
- label="New Underpants"
- layout="topleft"
- name="New Underpants">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="underpants" />
- </menu_item_call>
- <menu_item_call
- label="New Alpha Mask"
- layout="topleft"
- name="New Alpha Mask">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="alpha" />
- </menu_item_call>
- <menu_item_call
- label="New Tattoo"
- layout="topleft"
- name="New Tattoo">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="tattoo" />
- </menu_item_call>
- <menu_item_call
- label="New Universal"
- layout="topleft"
- name="New Universal">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="universal" />
- </menu_item_call>
- <menu_item_call
- label="New Physics"
- layout="topleft"
- name="New Physics">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="physics" />
- </menu_item_call>
- </menu>
- <menu
- label="New Body Parts"
- layout="topleft"
- name="New Body Parts">
- <menu_item_call
- label="New Shape"
- layout="topleft"
- name="New Shape">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="shape" />
- </menu_item_call>
- <menu_item_call
- label="New Skin"
- layout="topleft"
- name="New Skin">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="skin" />
- </menu_item_call>
- <menu_item_call
- label="New Hair"
- layout="topleft"
- name="New Hair">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="hair" />
- </menu_item_call>
- <menu_item_call
- label="New Eyes"
- layout="topleft"
- name="New Eyes">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="eyes" />
- </menu_item_call>
- </menu>
- <menu
- label="New Settings"
- layout="topleft"
- name="New Settings">
- <menu_item_call
- label="New Sky"
- layout="topleft"
- name="New Sky">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="sky"/>
- <menu_item_call.on_enable
- function="Inventory.EnvironmentEnabled" />
- </menu_item_call>
- <menu_item_call
- label="New Water"
- layout="topleft"
- name="New Water">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="water"/>
- <menu_item_call.on_enable
- function="Inventory.EnvironmentEnabled" />
- </menu_item_call>
- <menu_item_call
- label="New Day Cycle"
- layout="topleft"
- name="New Day Cycle">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="daycycle"/>
- <menu_item_call.on_enable
- function="Inventory.EnvironmentEnabled" />
- </menu_item_call>
- </menu>
- <menu
- label="Use as default for"
- layout="topleft"
- name="upload_def">
- <menu_item_call
- label="Image uploads"
- layout="topleft"
- name="Image uploads">
- <menu_item_call.on_click
- function="Inventory.FileUploadLocation"
- parameter="texture" />
- </menu_item_call>
- <menu_item_call
- label="Sound uploads"
- layout="topleft"
- name="Sound uploads">
- <menu_item_call.on_click
- function="Inventory.FileUploadLocation"
- parameter="sound" />
- </menu_item_call>
- <menu_item_call
- label="Animation uploads"
- layout="topleft"
- name="Animation uploads">
- <menu_item_call.on_click
- function="Inventory.FileUploadLocation"
- parameter="animation" />
- </menu_item_call>
- <menu_item_call
- label="Model uploads"
- layout="topleft"
- name="Model uploads">
- <menu_item_call.on_click
- function="Inventory.FileUploadLocation"
- parameter="model" />
- </menu_item_call>
- <menu_item_call
- label="PBR material uploads"
- layout="topleft"
- name="PBR uploads">
- <menu_item_call.on_click
- function="Inventory.FileUploadLocation"
- parameter="pbr_material" />
- </menu_item_call>
- </menu>
- <menu_item_separator
layout="topleft" />
<menu_item_separator
layout="topleft" />
@@ -952,6 +715,51 @@
function="Inventory.DoToSelected"
parameter="ungroup_folder_items" />
</menu_item_call>
+ <menu
+ label="Use as default for"
+ layout="topleft"
+ name="upload_def">
+ <menu_item_call
+ label="Image uploads"
+ layout="topleft"
+ name="Image uploads">
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="texture" />
+ </menu_item_call>
+ <menu_item_call
+ label="Sound uploads"
+ layout="topleft"
+ name="Sound uploads">
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="sound" />
+ </menu_item_call>
+ <menu_item_call
+ label="Animation uploads"
+ layout="topleft"
+ name="Animation uploads">
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="animation" />
+ </menu_item_call>
+ <menu_item_call
+ label="Model uploads"
+ layout="topleft"
+ name="Model uploads">
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="model" />
+ </menu_item_call>
+ <menu_item_call
+ label="PBR material uploads"
+ layout="topleft"
+ name="PBR uploads">
+ <menu_item_call.on_click
+ function="Inventory.FileUploadLocation"
+ parameter="pbr_material" />
+ </menu_item_call>
+ </menu>
<menu_item_separator
layout="topleft"
name="Marketplace Separator" />
diff --git a/indra/newview/skins/default/xui/en/menu_inventory_add.xml b/indra/newview/skins/default/xui/en/menu_inventory_add.xml
index b04215872c..284dd8d9fc 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory_add.xml
@@ -310,4 +310,13 @@
function="Inventory.EnvironmentEnabled" />
</menu_item_call>
</menu>
-</menu> \ No newline at end of file
+ <menu_item_separator/>
+ <menu_item_call
+ label="Shop..."
+ layout="topleft"
+ name="Shop">
+ <menu_item_call.on_click
+ function="Inventory.GearDefault.Custom.Action"
+ parameter="shop" />
+ </menu_item_call>
+</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml
index 3eacdbc781..2c630880c2 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml
@@ -15,52 +15,25 @@
function="Inventory.GearDefault.Custom.Action"
parameter="new_window" />
</menu_item_call>
- <menu_item_separator
- layout="topleft" />
- <menu_item_check
- label="Sort by Name"
- layout="topleft"
- name="sort_by_name">
- <on_click
- function="Inventory.GearDefault.Custom.Action"
- parameter="sort_by_name" />
- <on_check
- function="Inventory.GearDefault.Check"
- parameter="sort_by_name" />
- </menu_item_check>
- <menu_item_check
- label="Sort by Most Recent"
- layout="topleft"
- name="sort_by_recent">
- <on_click
- function="Inventory.GearDefault.Custom.Action"
- parameter="sort_by_recent" />
- <on_check
- function="Inventory.GearDefault.Check"
- parameter="sort_by_recent" />
- </menu_item_check>
- <menu_item_check
- label="Sort Folders Always by Name"
+ <menu_item_call
+ label="Collapse All Folders"
layout="topleft"
- name="sort_folders_by_name">
+ name="close_folders">
<on_click
function="Inventory.GearDefault.Custom.Action"
- parameter="sort_folders_by_name" />
- <on_check
- function="Inventory.GearDefault.Check"
- parameter="sort_folders_by_name" />
- </menu_item_check>
- <menu_item_check
- label="Sort System Folders to Top"
+ parameter="close_folders" />
+ <on_visible
+ function="Inventory.GearDefault.Visible"
+ parameter="multi_folder_view" />
+ </menu_item_call>
+ <menu_item_call
+ label="Close All Windows"
layout="topleft"
- name="sort_system_folders_to_top">
+ name="close_windows">
<on_click
function="Inventory.GearDefault.Custom.Action"
- parameter="sort_system_folders_to_top" />
- <on_check
- function="Inventory.GearDefault.Check"
- parameter="sort_system_folders_to_top" />
- </menu_item_check>
+ parameter="close_inv_windows" />
+ </menu_item_call>
<menu_item_separator
layout="topleft" />
<menu_item_call
@@ -79,29 +52,6 @@
function="Inventory.GearDefault.Custom.Action"
parameter="reset_filters" />
</menu_item_call>
- <menu_item_call
- label="Close All Folders"
- layout="topleft"
- name="close_folders">
- <on_click
- function="Inventory.GearDefault.Custom.Action"
- parameter="close_folders" />
- </menu_item_call>
- <menu_item_separator
- layout="topleft" />
- <menu_item_call
- label="Empty Lost and Found"
- layout="topleft"
- name="empty_lostnfound">
- <on_click
- function="Inventory.GearDefault.Custom.Action"
- parameter="empty_lostnfound" />
- <on_enable
- function="Inventory.GearDefault.Enable"
- parameter="empty_lostnfound" />
- </menu_item_call>
- <menu_item_separator
- layout="topleft" />
<menu_item_call
label="Save Texture As"
layout="topleft"
@@ -119,7 +69,8 @@
name="Share"
visible="true">
<on_click
- function="Inventory.Share" />
+ function="Inventory.GearDefault.Custom.Action"
+ parameter="share" />
<on_enable
function="Inventory.GearDefault.Enable"
parameter="share" />
@@ -154,9 +105,25 @@
function="Inventory.GearDefault.Custom.Action"
parameter="replace_links" />
</menu_item_call>
- <menu_item_separator
- layout="topleft" />
-
+ <menu_item_separator>
+ <menu_item_separator.on_visible
+ function="Inventory.GearDefault.Visible"
+ parameter="multi_folder_view" />
+ </menu_item_separator>
+ <menu_item_call
+ label="Empty Lost and Found"
+ layout="topleft"
+ name="empty_lostnfound">
+ <on_click
+ function="Inventory.GearDefault.Custom.Action"
+ parameter="empty_lostnfound" />
+ <on_enable
+ function="Inventory.GearDefault.Enable"
+ parameter="empty_lostnfound" />
+ <on_visible
+ function="Inventory.GearDefault.Visible"
+ parameter="multi_folder_view" />
+ </menu_item_call>
<menu_item_call
label="Empty Trash"
layout="topleft"
@@ -167,5 +134,8 @@
<on_enable
function="Inventory.GearDefault.Enable"
parameter="empty_trash" />
+ <on_visible
+ function="Inventory.GearDefault.Visible"
+ parameter="multi_folder_view" />
</menu_item_call>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_inventory_search_visibility.xml b/indra/newview/skins/default/xui/en/menu_inventory_search_visibility.xml
index 46193f4a7a..8e34f52f3a 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory_search_visibility.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory_search_visibility.xml
@@ -7,6 +7,17 @@
name="menu_search_visibility"
visible="false">
<menu_item_check
+ label="Search outfit folders"
+ layout="topleft"
+ name="search_outfits">
+ <on_click
+ function="Inventory.GearDefault.Custom.Action"
+ parameter="toggle_search_outfits" />
+ <on_check
+ function="Inventory.GearDefault.Check"
+ parameter="toggle_search_outfits" />
+ </menu_item_check>
+ <menu_item_check
label="Search Trash"
layout="topleft"
name="search_trash">
diff --git a/indra/newview/skins/default/xui/en/menu_inventory_view_default.xml b/indra/newview/skins/default/xui/en/menu_inventory_view_default.xml
new file mode 100644
index 0000000000..c7f9822e41
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_inventory_view_default.xml
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu
+ bottom="806"
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ name="menu_view_default"
+ visible="false">
+ <menu_item_check
+ label="Sort by Name"
+ layout="topleft"
+ name="sort_by_name">
+ <on_click
+ function="Inventory.GearDefault.Custom.Action"
+ parameter="sort_by_name" />
+ <on_check
+ function="Inventory.GearDefault.Check"
+ parameter="sort_by_name" />
+ </menu_item_check>
+ <menu_item_check
+ label="Sort by Most Recent"
+ layout="topleft"
+ name="sort_by_recent">
+ <on_click
+ function="Inventory.GearDefault.Custom.Action"
+ parameter="sort_by_recent" />
+ <on_check
+ function="Inventory.GearDefault.Check"
+ parameter="sort_by_recent" />
+ </menu_item_check>
+ <menu_item_check
+ label="Sort Folders Always by Name"
+ layout="topleft"
+ name="sort_folders_by_name">
+ <on_click
+ function="Inventory.GearDefault.Custom.Action"
+ parameter="sort_folders_by_name" />
+ <on_check
+ function="Inventory.GearDefault.Check"
+ parameter="sort_folders_by_name" />
+ </menu_item_check>
+ <menu_item_check
+ label="Sort System Folders to Top"
+ layout="topleft"
+ name="sort_system_folders_to_top">
+ <on_click
+ function="Inventory.GearDefault.Custom.Action"
+ parameter="sort_system_folders_to_top" />
+ <on_check
+ function="Inventory.GearDefault.Check"
+ parameter="sort_system_folders_to_top" />
+ <on_visible
+ function="Inventory.GearDefault.Visible"
+ parameter="multi_folder_view" />
+ </menu_item_check>
+ <menu_item_separator>
+ <menu_item_separator.on_visible
+ function="Inventory.GearDefault.Visible"
+ parameter="single_folder_view" />
+ </menu_item_separator>
+ <menu_item_check
+ label="List view"
+ layout="topleft"
+ name="list_view">
+ <on_click
+ function="Inventory.GearDefault.Custom.Action"
+ parameter="list_view" />
+ <on_check
+ function="Inventory.GearDefault.Check"
+ parameter="list_view" />
+ <on_visible
+ function="Inventory.GearDefault.Visible"
+ parameter="single_folder_view" />
+ </menu_item_check>
+ <menu_item_check
+ label="Gallery view"
+ layout="topleft"
+ name="gallery_view">
+ <on_click
+ function="Inventory.GearDefault.Custom.Action"
+ parameter="gallery_view" />
+ <on_check
+ function="Inventory.GearDefault.Check"
+ parameter="gallery_view" />
+ <on_visible
+ function="Inventory.GearDefault.Visible"
+ parameter="single_folder_view" />
+ </menu_item_check>
+ <menu_item_check
+ label="Combination view"
+ layout="topleft"
+ name="combination_view">
+ <on_click
+ function="Inventory.GearDefault.Custom.Action"
+ parameter="combination_view" />
+ <on_check
+ function="Inventory.GearDefault.Check"
+ parameter="combination_view" />
+ <on_visible
+ function="Inventory.GearDefault.Visible"
+ parameter="single_folder_view" />
+ </menu_item_check>
+ <menu_item_separator/>
+ <menu_item_check
+ label="Inventory settings..."
+ name="inv_settings">
+ <menu_item_check.on_check
+ function="Floater.Visible"
+ parameter="inventory_settings" />
+ <menu_item_check.on_click
+ function="Floater.Toggle"
+ parameter="inventory_settings" />
+ </menu_item_check>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
index 32d9d28434..e216962d12 100644
--- a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
@@ -40,32 +40,11 @@
parameter="take_off" />
</menu_item_call>
<menu_item_call
- label="Upload Photo (L$[UPLOAD_COST])"
+ label="Image..."
layout="topleft"
- name="upload_photo">
+ name="thumbnail">
<on_click
- function="Gear.UploadPhoto" />
- </menu_item_call>
- <menu_item_call
- label="Select Photo"
- layout="topleft"
- name="select_photo">
- <on_click
- function="Gear.SelectPhoto" />
- </menu_item_call>
- <menu_item_call
- label="Take a Snapshot"
- layout="topleft"
- name="take_snapshot">
- <on_click
- function="Gear.TakeSnapshot" />
- </menu_item_call>
- <menu_item_call
- label="Remove Photo"
- layout="topleft"
- name="remove_photo">
- <on_click
- function="Gear.RemovePhoto" />
+ function="Gear.Thumbnail" />
</menu_item_call>
<menu_item_separator name="sepatator1" />
<!-- copied (with minor modifications) from menu_inventory_add.xml -->
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby.xml b/indra/newview/skins/default/xui/en/menu_people_nearby.xml
index c1500d4e7c..425de6cab8 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby.xml
@@ -75,7 +75,7 @@
name="remove_friend">
<menu_item_call.on_click
function="Avatar.RemoveFriend" />
- <menu_item_call.on_enable
+ <menu_item_call.on_visible
function="Avatar.EnableItem"
parameter="can_delete" />
</menu_item_call>
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 7a29d68a4c..8b39ea192b 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -794,14 +794,36 @@
name="LandShow"
tear_off="true">
<menu_item_check
- label="Ban Lines"
- name="Ban Lines">
+ label="Hide Ban Lines"
+ name="Hide Ban Lines">
<menu_item_check.on_check
- control="ShowBanLines" />
+ function="World.CheckBanLines"
+ parameter="0" />
<menu_item_check.on_click
- function="ToggleControl"
- parameter="ShowBanLines" />
+ function="World.ShowBanLines"
+ parameter="0" />
</menu_item_check>
+ <menu_item_check
+ label="Show Ban Lines On Collision"
+ name="Show Ban Lines On Collision">
+ <menu_item_check.on_check
+ function="World.CheckBanLines"
+ parameter="1" />
+ <menu_item_check.on_click
+ function="World.ShowBanLines"
+ parameter="1" />
+ </menu_item_check>
+ <menu_item_check
+ label="Show Ban Lines On Proximity"
+ name="Show Ban Lines On Proximity">
+ <menu_item_check.on_check
+ function="World.CheckBanLines"
+ parameter="2" />
+ <menu_item_check.on_click
+ function="World.ShowBanLines"
+ parameter="2" />
+ </menu_item_check>
+ <menu_item_separator />
<menu_item_check
label="Beacons"
name="beacons"
@@ -1446,6 +1468,15 @@ function="World.EnvPreset"
function="Tools.SelectInvisibleObjects"
parameter="invisible" />
</menu_item_check>
+ <menu_item_check
+ label="Select Reflection Probes"
+ name="Select Reflection Probes">
+ <menu_item_check.on_check
+ control="SelectReflectionProbes" />
+ <menu_item_check.on_click
+ function="Tools.SelectReflectionProbes"
+ parameter="reflection_probes" />
+ </menu_item_check>
<menu_item_check
label="Select By Surrounding"
name="Select By Surrounding">
@@ -3199,36 +3230,6 @@ function="World.EnvPreset"
parameter="TextureDisable" />
</menu_item_check>
<menu_item_check
- label="Disable Ambient"
- name="Disable Ambient">
- <menu_item_check.on_check
- function="CheckControl"
- parameter="AmbientDisable" />
- <menu_item_check.on_click
- function="ToggleShaderControl"
- parameter="AmbientDisable" />
- </menu_item_check>
- <menu_item_check
- label="Disable Sunlight"
- name="Disable Sunlight">
- <menu_item_check.on_check
- function="CheckControl"
- parameter="SunlightDisable" />
- <menu_item_check.on_click
- function="ToggleShaderControl"
- parameter="SunlightDisable" />
- </menu_item_check>
- <menu_item_check
- label="Disable Local Lights"
- name="Disable Local Lights">
- <menu_item_check.on_check
- function="CheckControl"
- parameter="LocalLightDisable" />
- <menu_item_check.on_click
- function="ToggleShaderControl"
- parameter="LocalLightDisable" />
- </menu_item_check>
- <menu_item_check
label="Full Res Textures"
name="Rull Res Textures">
<menu_item_check.on_check
@@ -3472,15 +3473,30 @@ function="World.EnvPreset"
<menu_item_call.on_click
function="Advanced.DumpRegionObjectCache" />
</menu_item_call>
-
-<menu_item_call
- label="Interest List: Full Update"
- name="Interest List: Full Update"
+ <menu_item_check
+ label="Record Stats to File"
+ name="Stats Recorder File">
+ <menu_item_check.on_check
+ function="Advanced.CheckStatsRecorder" />
+ <menu_item_check.on_click
+ function="Advanced.ToggleStatsRecorder" />
+ </menu_item_check>
+ <menu_item_check
+ label="Interest Lists 360 Mode"
+ name="Interest List: 360 Mode"
shortcut="alt|shift|I">
- <menu_item_call.on_click
- function="Advanced.InterestListFullUpdate" />
- </menu_item_call>
- </menu>
+ <menu_item_check.on_check
+ function="Advanced.CheckInterestList360Mode" />
+ <menu_item_check.on_click
+ function="Advanced.ToggleInterestList360Mode" />
+ </menu_item_check>
+ <menu_item_call
+ label="Reset Interest Lists"
+ name="Reset Interest Lists">
+ <menu_item_call.on_click
+ function="Advanced.ResetInterestLists" />
+ </menu_item_call>
+ </menu>
<menu
create_jump_keys="true"
label="UI"
@@ -3495,13 +3511,6 @@ function="World.EnvPreset"
parameter="http://duckduckgo.com"/>
</menu_item_call>
<menu_item_call
- label="FB Connect Test"
- name="FB Connect Test">
- <menu_item_call.on_click
- function="Advanced.WebContentTest"
- parameter="https://cryptic-ridge-1632.herokuapp.com/"/>
- </menu_item_call>
- <menu_item_call
label="Dump SelectMgr"
name="Dump SelectMgr">
<menu_item_call.on_click
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 5404ece6b4..96f9c64b1c 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -3284,6 +3284,30 @@ See https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries
<notification
icon="alertmodal.tga"
+ label="Rename Selected Item"
+ name="RenameItem"
+ type="alertmodal">
+ Choose a new name for:
+[NAME]
+ <tag>confirm</tag>
+ <form name="form">
+ <input name="new_name" type="text" width="300">
+ [NAME]
+ </input>
+ <button
+ default="true"
+ index="0"
+ name="OK"
+ text="OK"/>
+ <button
+ index="1"
+ name="Cancel"
+ text="Cancel"/>
+ </form>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="RemoveFromFriends"
type="alertmodal">
<tag>friendship</tag>
@@ -6129,7 +6153,54 @@ Are you sure you want to delete them?
notext="Cancel"
yestext="OK"/>
</notification>
-
+
+ <notification
+ icon="alertmodal.tga"
+ name="DeleteThumbnail"
+ type="alertmodal">
+ <unique/>
+ Delete the image for this item? There is no undo.
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Don't show me this again"
+ name="okcancelignore"
+ notext="Cancel"
+ yestext="Delete"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="ThumbnailDimentionsLimit"
+ type="alertmodal">
+ <unique/>
+ Only square images from 64 to 256 pixels per side are allowed.
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="ThumbnailInsufficientPermissions"
+ type="alertmodal">
+ <unique/>
+ Only copy and transfer free images can be assigned as thumbnails.
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="ThumbnailOutfitPhoto"
+ type="alertmodal">
+ <unique/>
+ To add an image to an outfit, use the Outfit Gallery window, or right-click on the outfit folder and select "Image..."
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
<notification
icon="alertmodal.tga"
name="ConfirmUnlink"
@@ -6370,6 +6441,30 @@ Your trash is overflowing. This may cause problems logging in.
</notification>
<notification
+ icon="notifytip.tga"
+ name="InventoryLimitReachedAIS"
+ type="notifytip">
+Your inventory is experiencing issues. Please, contact support.
+ <tag>fail</tag>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="InventoryLimitReachedAISAlert"
+ type="alertmodal">
+Your inventory is experiencing issues. Please, contact support.
+ <tag>fail</tag>
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="InventoryLimitReachedAIS"
+ type="notifytip">
+Your inventory is experiencing issues. Please, contact support.
+ <tag>fail</tag>
+ </notification>
+
+ <notification
icon="alertmodal.tga"
name="ConfirmClearBrowserCache"
type="alertmodal">
@@ -6883,12 +6978,15 @@ Please try again.
</notification>
<notification
- icon="notifytip.tga"
+ icon="alertmodal.tga"
name="UnableToLoadMaterial"
- type="notifytip">
- Unable to load material.
- Please try again.
+ type="alertmodal">
+Unable to load material.
+Please try again.
<tag>fail</tag>
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
</notification>
<notification
@@ -9203,6 +9301,18 @@ We cannot display a preview of this texture because it is no-copy and/or no-tran
<notification
icon="alertmodal.tga"
+ name="LivePreviewUnavailablePBR"
+ type="alert">
+
+We cannot display a preview of this material because it is no-copy, no-transfer, and/or no-modify.
+ <usetemplate
+ ignoretext="Warn me that Live Preview mode is not available for no-copy, no-transfer, and/or no-modify materials"
+ name="okignore"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="FacePasteFailed"
type="alertmodal">
Paste failed. [REASON]
@@ -9213,6 +9323,26 @@ Paste failed. [REASON]
<notification
icon="alertmodal.tga"
+ name="FailedToApplyTextureNoCopyToMultiple"
+ type="alertmodal">
+Failed to apply texture. You can not apply a no-copy texture to multiple objects.
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="FailedToApplyGLTFNoCopyToMultiple"
+ type="alertmodal">
+Failed to apply GLTF material. You can not apply a no-copy material to multiple objects.
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="FacePasteTexturePermissions"
type="alertmodal">
You applied a texture with limited permissions, object will inherit permissions from texture.
@@ -11992,16 +12122,41 @@ Packing: [PACK_TIME]s [PSIZE]KB
Unpacking: [UNPACK_TIME]s [USIZE]KB
<tag>fail</tag>
</notification>
-
+
+ <notification
+ icon="alertmodal.tga"
+ label="Prompt for MFA Token"
+ name="PromptMFAToken"
+ type="alertmodal">
+ [MESSAGE]
+ <tag>confirm</tag>
+ <form name="form">
+ <input name="token" type="text" width="400" />
+ <button
+ default="true"
+ index="0"
+ name="continue"
+ text="Continue"/>
+ <button
+ index="1"
+ name="cancel"
+ text="Cancel"/>
+ </form>
+ </notification>
+
<notification
icon="alertmodal.tga"
label="Prompt for MFA Token"
- name="PromptMFAToken"
+ name="PromptMFATokenWithSave"
type="alertmodal">
[MESSAGE]
<tag>confirm</tag>
<form name="form">
<input name="token" type="text" width="400" />
+ <ignore
+ name="ignore"
+ checkbox_only="true"
+ text="Remember this computer for 30 days."/>
<button
default="true"
index="0"
@@ -12078,13 +12233,6 @@ Would you like to save them first?
yestext="Yes"/>
</notification>
-<notification
- icon="notifytip.tga"
- name="MaterialCreated"
- type="notifytip">
-Material successfully created. Asset ID: [ASSET_ID]
-</notification>
-
<notification
icon="notifytip.tga"
name="ReflectionProbeApplied"
@@ -12101,9 +12249,8 @@ Material successfully created. Asset ID: [ASSET_ID]
<notification
icon="notifytip.tga"
name="AutoAdjustHDRSky"
- persist="true"
type="alertmodal">
- You are editing a non-HDR sky that has been automatically converted to HDR. To remove HDR and tone mapping, set Reflection Probe Ambiance to zero.
+ You are editing a non-HDR sky that has been automatically converted to HDR. To remove HDR and tone mapping, set Reflection Probe Ambiance to zero.
<usetemplate
ignoretext="HDR Sky adjustment warning"
name="okignore"
diff --git a/indra/newview/skins/default/xui/en/panel_gltf_material.xml b/indra/newview/skins/default/xui/en/panel_gltf_material.xml
index 6975525b3d..45df40bc05 100644
--- a/indra/newview/skins/default/xui/en/panel_gltf_material.xml
+++ b/indra/newview/skins/default/xui/en/panel_gltf_material.xml
@@ -98,7 +98,7 @@
top_pad="5"
width="96"
name="base_color_transparency_lbl">
- Transparency
+ Alpha
</text>
<spinner
decimal_digits="3"
diff --git a/indra/newview/skins/default/xui/en/panel_inventory_gallery.xml b/indra/newview/skins/default/xui/en/panel_inventory_gallery.xml
new file mode 100644
index 0000000000..ed04e12193
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_inventory_gallery.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ bg_alpha_color="InventoryBackgroundColor"
+ border="false"
+ follows="all"
+ height="390"
+ name="Inventory Gallery"
+ layout="topleft">
+ <text
+ type="string"
+ clip_partial="false"
+ follows="all"
+ layout="topleft"
+ name="empty_txt"
+ height="390"
+ halign="center"
+ valign="center"
+ parse_urls="true"
+ wrap="true">
+ Folder is empty.
+ </text>
+ <scroll_container
+ follows="all"
+ height="390"
+ layout="topleft"
+ left="0"
+ top="0"
+ tab_stop="true"
+ name="gallery_scroll_panel"
+ opaque="false">
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_inventory_gallery_item.xml b/indra/newview/skins/default/xui/en/panel_inventory_gallery_item.xml
new file mode 100644
index 0000000000..574872a870
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_inventory_gallery_item.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="false"
+ background_opaque="false"
+ bg_alpha_color="FrogGreen"
+ bg_opaque_color="FrogGreen"
+ border="false"
+ bevel_style="none"
+ follows="left|top"
+ height="149"
+ width="130"
+ name="gallery_item_panel"
+ layout="topleft"
+ left="0"
+ top="0">
+ <thumbnail
+ name="preview_thumbnail"
+ fallback_image="Thumbnail_Fallback"
+ layout="topleft"
+ follows="left|top"
+ interactable="false"
+ height="128"
+ width="128"
+ top="0"
+ left="1"/>
+ <icon
+ left="5"
+ top_pad="-21"
+ layout="topleft"
+ name="item_type"
+ height="16"
+ width="16"
+ follows="left|top"
+ visible="true"
+ image_name="Inv_Eye"/>
+ <icon
+ left="5"
+ top_pad="-8"
+ layout="topleft"
+ name="link_overlay"
+ height="8"
+ width="6"
+ follows="left|top"
+ visible="false"
+ image_name="Inv_Link"/>
+ <panel
+ background_visible="false"
+ background_opaque="true"
+ bg_opaque_color="MenuItemHighlightBgColor"
+ border="false"
+ bevel_style="none"
+ follows="left|top"
+ left="0"
+ top="129"
+ height="25"
+ width="130"
+ name="text_bg_panel">
+ <text
+ read_only="true"
+ length="1"
+ follows="left|top"
+ left="1"
+ height="23"
+ layout="topleft"
+ name="item_name"
+ parse_urls="false"
+ text_readonly_color="White"
+ word_wrap="true"
+ top="2"
+ width="127"
+ use_ellipses="true">
+ Item name, folder name.
+ </text>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
index 2ff58035ed..f7a9c552cc 100644
--- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
@@ -6,8 +6,7 @@
layout="topleft"
min_height="300"
min_width="240"
- name="main inventory panel"
- width="330">
+ name="main inventory panel">
<panel.string
name="Itemcount">
</panel.string>
@@ -23,211 +22,325 @@
name="ItemcountUnknown">
Fetched [ITEM_COUNT] Items and [CATEGORY_COUNT] Folders [FILTER]
</panel.string>
+ <panel.string name="inventory_title">INVENTORY</panel.string>
+ <panel.string name="default_mode_btn">Multi_Folder_Mode</panel.string>
+ <panel.string name="single_folder_mode_btn">Single_Folder_Mode</panel.string>
<text
- type="string"
- length="1"
- follows="left|top|right"
- height="13"
- layout="topleft"
- left="12"
- name="ItemcountText"
- font="SansSerifMedium"
- text_color="InventoryItemLinkColor"
- use_ellipses="true"
- top_pad="0"
- width="300">
+ type="string"
+ length="1"
+ follows="left|top|right"
+ height="13"
+ layout="topleft"
+ left="12"
+ right="-12"
+ name="ItemcountText"
+ font="SansSerifMedium"
+ text_color="InventoryItemLinkColor"
+ use_ellipses="true"
+ top_pad="0">
Items:
</text>
- <combo_box
- height="23"
- layout="topleft"
- left="10"
- top="18"
- name="search_type"
- follows="top|left"
- width="88">
- <item
- label="Name"
- name="Name"
- value="search_by_name"/>
- <item
- label="Creator"
- name="Creator"
- value="search_by_creator"/>
- <item
- label="Description"
- name="Description"
- value="search_by_description"/>
- <item
- label="UUID"
- name="UUID"
- value="search_by_UUID"/>
- </combo_box>
- <menu_button
- follows="top|left"
- tool_tip="Show search visibility options"
- height="23"
- image_overlay="Inv_Toolbar_SearchVisibility"
- layout="topleft"
- left_pad="3"
- name="options_visibility_btn"
- width="31" />
- <filter_editor
- text_pad_left="10"
+ <layout_stack
follows="left|top|right"
- height="23"
- label="Enter search text"
- layout="topleft"
- left_pad="3"
- max_length_chars="300"
- highlight_text_field="true"
- name="inventory search editor"
- width="177" />
- <tab_container
- follows="all"
- halign="center"
- height="339"
- layout="topleft"
- left="7"
- name="inventory filter tabs"
- tab_height="30"
- tab_position="top"
- tab_min_width="100"
- top_pad="10"
- width="312">
- <inventory_panel
- bg_opaque_color="DkGray2"
- bg_alpha_color="DkGray2"
- background_visible="true"
- border="false"
- bevel_style="none"
- follows="all"
- height="338"
- label="MY INVENTORY"
- help_topic="my_inventory_tab"
- layout="topleft"
- left="0"
- name="All Items"
- sort_order_setting="InventorySortOrder"
- show_item_link_overlays="true"
- top="16"
- width="288" />
- <recent_inventory_panel
- bg_opaque_color="DkGray2"
- bg_alpha_color="DkGray2"
- background_visible="true"
+ height="25"
+ animate="false"
+ top_pad="10"
+ left="2"
+ right="-4"
+ orientation="horizontal">
+ <layout_panel
border="false"
- bevel_style="none"
- follows="all"
- height="338"
- label="RECENT"
- help_topic="recent_inventory_tab"
- layout="topleft"
- left_delta="0"
- name="Recent Items"
- show_item_link_overlays="true"
- width="290" />
- <inventory_panel
- name="Worn Items"
- label="WORN"
- show_empty_message="false"
- follows="all"
+ bevel_style="in"
+ user_resize="false"
+ auto_resize="false"
+ height="25"
+ width="65"
+ name="nav_buttons"
+ visible="false">
+ <button
+ follows="top|left"
+ height="23"
+ image_selected="Single_Folder_Back"
+ image_pressed="Single_Folder_Back"
+ image_unselected="Single_Folder_Back"
+ scale_image="false"
+ layout="topleft"
+ left="3"
+ top="2"
+ name="back_btn"
+ tool_tip="Back"
+ width="20" />
+ <button
+ follows="top|left"
+ height="23"
+ image_selected="Single_Folder_Forward"
+ image_pressed="Single_Folder_Forward"
+ image_unselected="Single_Folder_Forward"
+ scale_image="false"
+ layout="topleft"
+ left_pad="1"
+ name="forward_btn"
+ tool_tip="Forward"
+ width="20" />
+ <button
+ follows="top|left"
+ height="23"
+ image_selected="Single_Folder_Up"
+ image_pressed="Single_Folder_Up"
+ image_unselected="Single_Folder_Up"
+ scale_image="false"
layout="topleft"
- width="290"
- bg_opaque_color="DkGray2"
- bg_alpha_color="DkGray2"
- background_visible="true"
+ left_pad="1"
+ name="up_btn"
+ tool_tip="Go up one level"
+ width="20" />
+ </layout_panel>
+ <layout_panel
border="false"
- bevel_style="none"
- scroll.reserve_scroll_corner="false">
- </inventory_panel>
- </tab_container>
- <layout_stack
- animate="false"
- border_size="0"
- follows="left|right|bottom"
- height="25"
- layout="topleft"
- orientation="horizontal"
- top_pad="0"
- left="10"
- name="bottom_panel"
- width="307">
- <layout_panel
- auto_resize="false"
- height="25"
+ bevel_style="in"
+ user_resize="false"
+ height="25"
+ width="381"
+ visible="true">
+ <combo_box
+ height="23"
+ layout="topleft"
+ left="2"
+ top="0"
+ name="search_type"
+ tool_tip="Search by"
+ follows="top|left"
+ width="67">
+ <item
+ label="Name"
+ name="Name"
+ value="search_by_name"/>
+ <item
+ label="Creator"
+ name="Creator"
+ value="search_by_creator"/>
+ <item
+ label="Description"
+ name="Description"
+ value="search_by_description"/>
+ <item
+ label="UUID"
+ name="UUID"
+ value="search_by_UUID"/>
+ </combo_box>
+ <menu_button
+ follows="top|left"
+ tool_tip="Search visibility options"
+ height="23"
+ image_overlay="Inv_Toolbar_SearchVisibility"
layout="topleft"
- name="options_gear_btn_panel"
- width="32">
- <menu_button
- follows="bottom|left"
- tool_tip="Show additional options"
- height="25"
- image_hover_unselected="Toolbar_Left_Over"
- image_overlay="OptionsMenu_Off"
- image_selected="Toolbar_Left_Selected"
- image_unselected="Toolbar_Left_Off"
- layout="topleft"
- left="0"
- name="options_gear_btn"
- top="0"
- width="31" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- height="25"
+ left_pad="1"
+ name="options_visibility_btn"
+ width="31" />
+ <filter_editor
+ text_pad_left="10"
+ follows="left|top|right"
+ height="23"
+ label="Enter search text"
layout="topleft"
- name="add_btn_panel"
- width="32">
- <button
- follows="bottom|left"
- height="25"
- image_hover_unselected="Toolbar_Middle_Over"
- image_overlay="AddItem_Off"
- image_selected="Toolbar_Middle_Selected"
- image_unselected="Toolbar_Middle_Off"
- layout="topleft"
- left="0"
- name="add_btn"
- tool_tip="Add new item"
- top="0"
- width="31" />
- </layout_panel>
- <layout_panel
- auto_resize="true"
- height="25"
+ left_pad="1"
+ max_length_chars="300"
+ highlight_text_field="true"
+ name="inventory search editor"
+ width="150" />
+ <menu_button
+ follows="top|right"
+ tool_tip="Actions"
+ height="23"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="OptionsMenu_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
layout="topleft"
- name="dummy_panel"
- width="212">
- <icon
- follows="bottom|left|right"
- height="25"
- image_name="Toolbar_Middle_Off"
- layout="topleft"
- left="0"
- top="0"
- name="dummy_icon"
- width="211" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- height="25"
+ left_pad="1"
+ name="options_gear_btn"
+ width="31" />
+ <menu_button
+ follows="top|right"
+ tool_tip="View &amp; sort options"
+ height="23"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Conv_toolbar_sort"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="1"
+ name="view_btn"
+ width="31" />
+ <button
+ follows="top|right"
+ height="23"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="AddItem_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="1"
+ name="add_btn"
+ tool_tip="Create new item"
+ width="31" />
+ <button
+ follows="top|right"
+ tool_tip="Switch between views"
+ height="23"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Single_Folder_Mode"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="1"
+ name="view_mode_btn"
+ width="31" />
+ </layout_panel>
+ </layout_stack>
+ <panel
+ follows="all"
+ halign="center"
+ height="372"
+ layout="topleft"
+ left="3"
+ right="-3"
+ name="default_inventory_panel"
+ top_pad="5">
+ <tab_container
+ follows="all"
+ halign="center"
+ height="372"
layout="topleft"
- name="trash_btn_panel"
- width="31">
- <dnd_button
- follows="bottom|left"
- height="25"
- image_hover_unselected="Toolbar_Right_Over"
- image_overlay="TrashItem_Off"
- image_selected="Toolbar_Right_Selected"
- image_unselected="Toolbar_Right_Off"
- left="0"
- layout="topleft"
- name="trash_btn"
- tool_tip="Remove selected item"
- top="0"
- width="31"/>
- </layout_panel>
- </layout_stack>
+ left="0"
+ name="inventory filter tabs"
+ tab_height="30"
+ tab_position="top"
+ tab_min_width="100"
+ top="0">
+ <inventory_panel
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ border="false"
+ bevel_style="none"
+ follows="all"
+ label="MY INVENTORY"
+ help_topic="my_inventory_tab"
+ layout="topleft"
+ name="All Items"
+ sort_order_setting="InventorySortOrder"
+ show_item_link_overlays="true"
+ preinitialize_views="false"
+ scroll.reserve_scroll_corner="false">
+ <folder double_click_override="true"/>
+ </inventory_panel>
+ <recent_inventory_panel
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ border="false"
+ bevel_style="none"
+ follows="all"
+ label="RECENT"
+ help_topic="recent_inventory_tab"
+ layout="topleft"
+ name="Recent Items"
+ show_item_link_overlays="true"
+ preinitialize_views="false"
+ scroll.reserve_scroll_corner="false">
+ <folder double_click_override="true"/>
+ </recent_inventory_panel>
+ <inventory_panel
+ name="Worn Items"
+ label="WORN"
+ show_empty_message="false"
+ follows="all"
+ layout="topleft"
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ preinitialize_views="false"
+ border="false"
+ bevel_style="none"
+ scroll.reserve_scroll_corner="false">
+ <folder double_click_override="true"/>
+ </inventory_panel>
+ </tab_container>
+ </panel>
+ <panel
+ follows="all"
+ halign="center"
+ height="375"
+ layout="topleft"
+ left="7"
+ name="combination_view_inventory"
+ top_delta="0"
+ visible="false">
+ <layout_stack
+ follows="all"
+ layout="topleft"
+ height="375"
+ name="combination_view_stack"
+ animate="false"
+ drag_handle_thickness="6"
+ drag_handle_first_indent="18"
+ drag_handle_second_indent="18"
+ drag_handle_shift="5"
+ show_drag_handle="true"
+ top="0"
+ left="0"
+ orientation="vertical">
+ <layout_panel
+ border="false"
+ bevel_style="in"
+ user_resize="true"
+ auto_resize="true"
+ height="248"
+ min_width="150"
+ name="comb_gallery_layout">
+ <panel
+ class="inventory_gallery"
+ filename="panel_inventory_gallery.xml"
+ left="0"
+ top="1"
+ height="248"
+ name="comb_gallery_view_inv"
+ background_visible="true"
+ follows="all"
+ layout="topleft">
+ </panel>
+ </layout_panel>
+ <layout_panel
+ border="false"
+ bevel_style="in"
+ user_resize="true"
+ auto_resize="true"
+ height="127"
+ min_height="100"
+ name="comb_inventory_layout">
+ <single_folder_inventory_panel
+ name="comb_single_folder_inv"
+ follows="all"
+ left="0"
+ top="1"
+ height="127"
+ layout="topleft"
+ show_item_link_overlays="true"
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ border="false"
+ bevel_style="none"
+ scroll.reserve_scroll_corner="false">
+ <item
+ single_folder_mode="true"
+ folder_indentation="-8"/>
+ <folder
+ single_folder_mode="true"
+ folder_indentation="-8"/>
+ </single_folder_inventory_panel>
+ </layout_panel>
+ </layout_stack>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_outfit_gallery.xml b/indra/newview/skins/default/xui/en/panel_outfit_gallery.xml
index e3790ae09b..e951d25391 100644
--- a/indra/newview/skins/default/xui/en/panel_outfit_gallery.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfit_gallery.xml
@@ -40,50 +40,10 @@
layout="topleft"
left="4"
top="0"
+ tab_stop="true"
name="gallery_scroll_panel"
opaque="false"
top_pad="0">
- <!--outfit_gallery_item
- layout="topleft"
- left="10"
- name="preview_outfit1"
- height="175"
- width="150"
- follows="left|top"/-->
- <!--layout_stack follows="left|right" height="180" width="498" layout="topleft" left="0" animate="false" top="0" name="top_gallery_stack" orientation="horizontal">
- <layout_panel follows="left|top" height="175" width="166" layout="topleft" left="0" top="0" auto_resize="false" visible="true" name="top_gallery_panel">
- <outfit_gallery_item layout="topleft" left="10" name="preview_outfit1" height="175" width="150" follows="left|top"/>
- </layout_panel>
- <layout_panel follows="left|top" height="175" width="166" layout="topleft" left="0" top="0" auto_resize="false" visible="true" name="top panel">
- <outfit_gallery_item layout="topleft" left="10" name="preview_outfit2" height="175" width="150" follows="left|top"/>
- </layout_panel>
- <layout_panel follows="left|top" height="175" width="166" layout="topleft" left="0" top="0" auto_resize="false" visible="true" name="top panel">
- <outfit_gallery_item layout="topleft" left="10" name="preview_outfit2" height="175" width="150" follows="left|top"/>
- </layout_panel>
- </layout_stack>
- <layout_stack follows="left|right" height="180" width="498" layout="topleft" left="0" animate="false" top="190" name="top_gallery_stack" orientation="horizontal">
- <layout_panel follows="left|top" height="175" width="166" layout="topleft" left="0" top="0" auto_resize="false" visible="true" name="top_gallery_panel">
- <outfit_gallery_item layout="topleft" left="10" name="preview_outfit1" height="175" width="150" follows="left|top"/>
- </layout_panel>
- <layout_panel follows="left|top" height="175" width="166" layout="topleft" left="0" top="0" auto_resize="false" visible="true" name="top panel">
- <outfit_gallery_item layout="topleft" left="10" name="preview_outfit2" height="175" width="150" follows="left|top"/>
- </layout_panel>
- <layout_panel follows="left|top" height="175" width="166" layout="topleft" left="0" top="0" auto_resize="false" visible="true" name="top panel">
- <outfit_gallery_item layout="topleft" left="10" name="preview_outfit2" height="175" width="150" follows="left|top"/>
- </layout_panel>
- </layout_stack>
- <layout_stack follows="left|right" height="180" width="498" layout="topleft" left="0" animate="false" top="380" name="top_gallery_stack" orientation="horizontal">
- <layout_panel follows="left|top" height="175" width="166" layout="topleft" left="0" top="0" auto_resize="false" visible="true" name="top_gallery_panel">
- <outfit_gallery_item layout="topleft" left="10" name="preview_outfit1" height="175" width="150" follows="left|top"/>
- </layout_panel>
- <layout_panel follows="left|top" height="175" width="166" layout="topleft" left="0" top="0" auto_resize="false" visible="true" name="top panel">
- <outfit_gallery_item layout="topleft" left="10" name="preview_outfit2" height="175" width="150" follows="left|top"/>
- </layout_panel>
- <layout_panel follows="left|top" height="175" width="166" layout="topleft" left="0" top="0" auto_resize="false" visible="true" name="top panel">
- <outfit_gallery_item layout="topleft" left="10" name="preview_outfit2" height="175" width="150" follows="left|top"/>
- </layout_panel>
- </layout_stack-->
- <!--</panel>-->
</scroll_container>
<panel
background_visible="true"
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml b/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml
index b2dc975c6e..ceaff0ea69 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml
@@ -18,7 +18,7 @@
follows="all"
height="400"
layout="topleft"
- left="0"
+ left="3"
single_expansion="true"
top="0"
name="wearables_accordion"
diff --git a/indra/newview/skins/default/xui/en/panel_profile_firstlife.xml b/indra/newview/skins/default/xui/en/panel_profile_firstlife.xml
index ca1e405a62..f899f83ad4 100644
--- a/indra/newview/skins/default/xui/en/panel_profile_firstlife.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile_firstlife.xml
@@ -19,7 +19,7 @@
layout="topleft"
visible="false"
/>
- <icon
+ <thumbnail
name="real_world_pic"
image_name="Generic_Person_Large"
follows="top|left"
diff --git a/indra/newview/skins/default/xui/en/panel_profile_secondlife.xml b/indra/newview/skins/default/xui/en/panel_profile_secondlife.xml
index 777b37d666..fea7d1bcb8 100644
--- a/indra/newview/skins/default/xui/en/panel_profile_secondlife.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile_secondlife.xml
@@ -27,6 +27,26 @@
Account: [ACCTTYPE]
[PAYMENTINFO]
</string>
+
+ <!--Badges-->
+ <string
+ name="BadgeBeta"
+ value="Original Beta Tester" />
+ <string
+ name="BadgeBetaLifetime"
+ value="Beta Lifetime member" />
+ <string
+ name="BadgeLifetime"
+ value="Lifetime member" />
+ <string
+ name="BadgeLinden"
+ value="Linden Lab employee" />
+ <string
+ name="BadgePremiumLifetime"
+ value="Premium lifetime" />
+ <string
+ name="BadgePremiumPlusLifetime"
+ value="Premium Plus lifetime" />
<layout_stack
name="image_stack"
@@ -48,7 +68,7 @@ Account: [ACCTTYPE]
auto_resize="false"
user_resize="false">
- <icon
+ <thumbnail
name="2nd_life_pic"
image_name="Generic_Person_Large"
layout="topleft"
@@ -156,9 +176,39 @@ Account: [ACCTTYPE]
user_resize="false"
visible="true">
</layout_panel>
-
+
+ <layout_panel
+ name="badge_layout"
+ follows="all"
+ layout="topleft"
+ height="40"
+ auto_resize="false"
+ user_resize="false"
+ visible="false">
+ <icon
+ name="badge_icon"
+ image_name="Beta_Tester"
+ layout="topleft"
+ follows="left|top"
+ top="10"
+ left="5"
+ height="18"
+ width="18"/>
+ <text
+ name="badge_text"
+ value="Badge Tester"
+ top="13"
+ left_pad="3"
+ right="-1"
+ height="16"
+ follows="left|top|right"
+ layout="topleft"
+ translate="false"
+ visible="true"/>
+ </layout_panel>
+
<layout_panel
- name="frind_layout"
+ name="friend_layout"
follows="all"
layout="topleft"
height="16"
@@ -166,7 +216,7 @@ Account: [ACCTTYPE]
user_resize="false"
visible="false">
<text
- name="frind_text"
+ name="friend_text"
value="You are friends"
text_color="ConversationFriendColor"
top="0"
diff --git a/indra/newview/skins/default/xui/en/panel_script_experience.xml b/indra/newview/skins/default/xui/en/panel_script_experience.xml
index e798638751..9ae5b201a6 100644
--- a/indra/newview/skins/default/xui/en/panel_script_experience.xml
+++ b/indra/newview/skins/default/xui/en/panel_script_experience.xml
@@ -48,23 +48,28 @@
layout="topleft"
visible="false">
<layout_panel width="120"
- height="140">
- <text >
+ height="140"
+ name="xp_layout_panel">
+ <text name="lbl_script">
Script:
</text>
- <text bottom_delta="25">
+ <text bottom_delta="25"
+ name="lbl_associated">
Associated with:
</text>
- <text bottom_delta="25">
+ <text bottom_delta="25"
+ name="lbl_contribute">
You can contribute:
</text>
- <text bottom_delta="25">
+ <text bottom_delta="25"
+ name="lbl_associate">
Associate with:
</text>
</layout_panel>
<layout_panel width="250"
- height="140">
+ height="140"
+ name="xp_choose_panel">
<text >
EasySit Animator 1.2.4
</text>
diff --git a/indra/newview/skins/default/xui/en/panel_settings_sky_atmos.xml b/indra/newview/skins/default/xui/en/panel_settings_sky_atmos.xml
index 36a485e498..da82c95c83 100644
--- a/indra/newview/skins/default/xui/en/panel_settings_sky_atmos.xml
+++ b/indra/newview/skins/default/xui/en/panel_settings_sky_atmos.xml
@@ -9,6 +9,7 @@
top="0">
<string name="hdr_string">HDR Scale:</string>
<string name="brightness_string">Brightness:</string>
+ <string name="hdr_tooltip">Intensity of lightning effects such as realistically bright skies and dynamic exposure. 1.0 is the default, 0 is off, values between 0 and 1 are mixing Ambient with HDR.</string>
<layout_stack
name="main_ls"
follows="all"
@@ -298,7 +299,7 @@
Maximum Altitude:
</text>
<slider
- decimal_digits="1"
+ decimal_digits="2"
follows="left|top"
height="16"
increment="0.01"
@@ -332,6 +333,7 @@
min_val="0"
max_val="10"
name="probe_ambiance"
+ tool_tip="Intensity of environment based indirect lighting. At zero HDR scale becomes Brightness"
top_delta="20"
width="219"
can_edit_text="true"/>
diff --git a/indra/newview/skins/default/xui/en/panel_tools_texture.xml b/indra/newview/skins/default/xui/en/panel_tools_texture.xml
index 51e6099ceb..5b15752eb7 100644
--- a/indra/newview/skins/default/xui/en/panel_tools_texture.xml
+++ b/indra/newview/skins/default/xui/en/panel_tools_texture.xml
@@ -284,12 +284,26 @@
name="pbr_from_inventory"
label="Choose from inventory"
width="140"/>
+ <text
+ visible="false"
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ top_pad="4"
+ left_delta="0"
+ name="material_permissions_loading_label"
+ text_readonly_color="LabelDisabledColor"
+ width="160">
+ Loading contents...
+ </text>
<button
follows="left|top"
height="23"
layout="topleft"
left_delta="0"
- top_pad="4"
+ top_delta="0"
name="edit_selected_pbr"
label="Edit Selected"
width="140"/>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
index 9995523e61..76d0ffcb8e 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
@@ -6,8 +6,7 @@
layout="topleft"
min_height="350"
min_width="240"
- name="objects panel"
- width="333">
+ name="objects panel">
<panel
follows="all"
layout="topleft"
@@ -17,25 +16,22 @@
label=""
height="570"
visible="true"
- default_tab_group="1"
- width="330">
+ default_tab_group="1">
<layout_stack
follows="left|right|top|bottom"
layout="topleft"
left="0"
top="0"
- tab_group="1"
+ tab_group="1"
orientation="vertical"
name="inventory_layout_stack"
- height="535"
- width="330">
+ height="560">
<layout_panel
name="main_inventory_layout_panel"
layout="topleft"
auto_resize="true"
user_resize="true"
min_dim="150"
- width="330"
follows="bottom|left|right"
height="300">
<panel
@@ -47,17 +43,15 @@
name="panel_main_inventory"
top="0"
label=""
- height="300"
- width="330" />
+ height="300" />
</layout_panel>
<layout_panel
- width="330"
layout="topleft"
auto_resize="false"
user_resize="true"
follows="left|right|top"
name="inbox_layout_panel"
- visible="false"
+ visible="true"
min_dim="35"
expanded_min_dim="90"
height="235">
@@ -69,17 +63,15 @@
class="panel_marketplace_inbox"
top="0"
label=""
- height="235"
- width="330">
+ height="235">
<string name="InboxLabelWithArg">Received items ([NUM])</string>
<string name="InboxLabelNoArg">Received items</string>
<button
control_name="InventoryInboxToggleState"
label="Received items"
- font="SansSerifMedium"
+ font="SansSerifMedium"
name="inbox_btn"
height="35"
- width="308"
image_unselected="MarketplaceBtn_Off"
image_selected="MarketplaceBtn_Selected"
halign="left"
@@ -89,7 +81,8 @@
tab_stop="false"
pad_left="35"
top="0"
- left="10" />
+ left="5"
+ right="-5" />
<text
type="string"
length="1"
@@ -101,174 +94,35 @@
name="inbox_fresh_new_count"
font="SansSerifMedium"
halign="right"
- top_pad="0"
- width="300">
+ top_pad="0">
[NUM] new
</text>
<panel
name="inbox_inventory_placeholder_panel"
follows="all"
- left="10"
- bottom="235"
- width="308"
+ left="5"
+ right="-5"
top="35"
+ height="200"
bg_opaque_color="InventoryBackgroundColor"
background_visible="true"
background_opaque="true"
tool_tip="Drag and drop items to your inventory to use them"
>
<text name="inbox_inventory_placeholder"
- type="string"
- follows="all"
- layout="topleft"
- top="0"
- left="0"
- width="308"
- height="200"
- wrap="true"
- halign="center">
-Purchases from the marketplace will be delivered here.
- </text>
+ type="string"
+ follows="all"
+ layout="topleft"
+ top="0"
+ height="200"
+ wrap="true"
+ halign="center"
+ valign="center">
+ Purchases from the marketplace will be delivered here.
+ </text>
</panel>
</panel>
</layout_panel>
</layout_stack>
- <panel follows="bottom|left|right"
- height="30"
- layout="topleft"
- name="button_panel"
- left="9"
- top_pad="7"
- width="308">
- <layout_stack follows="bottom|left|right"
- height="23"
- layout="topleft"
- mouse_opaque="false"
- name="button_panel_ls"
- left="0"
- orientation="horizontal"
- top="0"
- width="308">
- <layout_panel follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left="0"
- mouse_opaque="false"
- name="info_btn_lp"
- auto_resize="true"
- width="101">
- <button enabled="true"
- follows="bottom|left|right"
- height="23"
- label="Profile"
- layout="topleft"
- left="1"
- name="info_btn"
- tool_tip="Show object profile"
- top="0"
- width="100" />
- </layout_panel>
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="1"
- mouse_opaque="false"
- name="share_btn_lp"
- auto_resize="true"
- width="100">
- <button
- enabled="true"
- follows="bottom|left|right"
- height="23"
- label="Share"
- layout="topleft"
- left="1"
- name="share_btn"
- tool_tip="Share an inventory item"
- top="0"
- width="99" />
- </layout_panel>
- <layout_panel
- follows="bottom|left|right"
- height="23"
- layout="bottomleft"
- left_pad="1"
- mouse_opaque="false"
- name="shop_btn_lp"
- auto_resize="true"
- width="100">
- <button
- enabled="true"
- follows="bottom|left|right"
- height="23"
- label="Shop"
- layout="topleft"
- left="1"
- name="shop_btn"
- tool_tip="Open Marketplace webpage"
- top="0"
- width="99" />
- <button
- enabled="false"
- follows="bottom|left|right"
- height="23"
- label="Wear"
- layout="topleft"
- left="1"
- name="wear_btn"
- tool_tip="Wear seleceted outfit"
- top="0"
- width="99" />
- <button
- enabled="false"
- follows="bottom|left|right"
- height="23"
- label="Play"
- layout="topleft"
- name="play_btn"
- left="1"
- top="0"
- width="99" />
- <button
- enabled="false"
- follows="bottom|left|right"
- height="23"
- label="Teleport"
- layout="topleft"
- left="1"
- name="teleport_btn"
- tool_tip="Teleport to the selected area"
- top="0"
- width="99" />
- </layout_panel>
- </layout_stack>
- </panel>
- </panel>
- <panel
- follows="all"
- layout="topleft"
- left="0"
- class="sidepanel_item_info"
- filename="sidepanel_item_info.xml"
- name="sidepanel__item_panel"
- top="0"
- label=""
- height="570"
- visible="false"
- width="330">
- </panel>
- <panel
- follows="all"
- layout="topleft"
- left="0"
- class="sidepanel_task_info"
- filename="sidepanel_task_info.xml"
- name="sidepanel__task_panel"
- top="0"
- label=""
- height="570"
- visible="false"
- width="330">
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
index 35d14251c7..ad521cb1af 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
@@ -43,214 +43,126 @@
name="origin_inworld">
(Inworld)
</panel.string>
- <icon
- follows="top|right"
- height="18"
- image_name="Lock"
- layout="topleft"
- right="-15"
- mouse_opaque="true"
- name="IconLocked"
- top="8"
- width="18" />
- <button
- follows="top|left"
- height="24"
- image_hover_unselected="BackButton_Over"
- image_pressed="BackButton_Press"
- image_unselected="BackButton_Off"
- layout="topleft"
- left="12"
- name="back_btn"
- tab_stop="false"
- top="2"
- width="30"
- use_draw_context_alpha="false" />
- <text
- follows="top|left|right"
- font="SansSerifHugeBold"
- height="26"
- layout="topleft"
- left_pad="3"
- name="title"
- text_color="LtGray"
- top="2"
- use_ellipses="true"
- value="Item Profile"
- width="275" />
- <text
- follows="top|left|right"
- height="13"
- layout="topleft"
- left="45"
- name="origin"
- text_color="LtGray_50"
- use_ellipses="true"
- value="(Inventory)"
- width="275" />
- <scroll_container
- color="DkGray2"
- follows="all"
- layout="topleft"
- left="9"
- name="item_profile_scroll"
- opaque="true"
- height="493"
- width="313"
- top="45">
- <panel
- follows="left|top|right"
- height="390"
- help_topic=""
- label=""
+
+<layout_stack
+ animate="false"
+ name="main_stack"
+ layout="topleft"
+ follows="all"
+ orientation="vertical"
+ left="0"
+ top="0"
+ right="-1"
+ bottom="-1">
+ <layout_panel
+ auto_resize="false"
+ name="layout_item_name"
layout="topleft"
- left="0"
- name="item_profile"
- top="0"
- width="295">
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
+ follows="all"
+ height="25">
+ <icon
+ follows="top|left"
+ height="16"
+ image_name="Inv_Object"
layout="topleft"
left="5"
- name="LabelItemNameTitle"
- top="10"
- width="78">
- Name:
- </text>
+ mouse_opaque="true"
+ name="item_type_icon"
+ top="3"
+ width="16" />
<line_editor
border_style="line"
border_thickness="1"
follows="left|top|right"
- height="20"
layout="topleft"
- left_delta="78"
+ left_pad="5"
+ top="1"
+ right="-5"
+ height="20"
max_length_bytes="63"
name="LabelItemName"
- top_delta="0"
- width="210"
tool_tip="The name is limited to 63 characters. Longer prim names are cut short. Names can only consist of printable characters found in the ASCII-7 (non-extended) character set, with the exception of the vertical bar/pipe &apos;|&apos;." />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
+ </layout_panel>
+
+ <layout_panel
+ auto_resize="false"
+ name="layout_item_details"
+ layout="topleft"
+ follows="all"
+ height="133">
+
+ <thumbnail
+ name="item_thumbnail"
+ fallback_image="Thumbnail_Fallback"
+ follows="top|left"
layout="topleft"
left="5"
- name="LabelItemDescTitle"
- top_pad="10"
- width="78">
- Description:
- </text>
- <line_editor
- border_style="line"
- border_thickness="1"
- follows="left|top|right"
- height="23"
- layout="topleft"
- left_delta="78"
- max_length_bytes="127"
- name="LabelItemDesc"
- top_delta="-5"
- width="210"
- tool_tip="When people have &apos;Hover Tips on All Objects&apos; selected in the viewer's settings, they'll see the object description pop-up for any object under their mouse pointer. The prim description is limited to 127 bytes any string longer then that will be truncated." />
+ top="2"
+ height="128"
+ width="128"
+ />
+
<text
type="string"
length="1"
follows="left|top"
- height="23"
+ height="16"
layout="topleft"
- left="5"
- name="LabelCreatorTitle"
- top_pad="10"
+ left_pad="5"
+ name="LabelOwnerTitle"
+ top="0"
width="78">
- Creator:
+ Owner:
</text>
- <avatar_icon
- follows="top|left"
- height="20"
- default_icon_name="Generic_Person"
- layout="topleft"
- left_pad="0"
- top_delta="-6"
- mouse_opaque="true"
- width="20" />
<text
type="string"
- follows="left|right|top"
font="SansSerifSmall"
- height="15"
+ follows="left|right|top"
layout="topleft"
- left_pad="5"
- name="LabelCreatorName"
- top_delta="6"
+ height="15"
+ width="187"
+ left_delta="0"
+ top_pad="0"
+ name="LabelOwnerName"
use_ellipses="true"
- width="165">
+ translate="false">
+TestString PleaseIgnore
</text>
- <button
- follows="top|right"
- height="16"
- image_selected="Inspector_I"
- image_unselected="Inspector_I"
- layout="topleft"
- right="-5"
- name="BtnCreator"
- top_delta="-6"
- width="16" />
<text
type="string"
length="1"
follows="left|top"
- height="23"
+ height="16"
layout="topleft"
- left="5"
- name="LabelOwnerTitle"
- top_pad="10"
+ left_delta="0"
+ name="LabelCreatorTitle"
+ top_pad="7"
width="78">
- Owner:
+ Creator:
</text>
- <avatar_icon
- follows="top|left"
- height="20"
- default_icon_name="Generic_Person"
- layout="topleft"
- left_pad="0"
- top_delta="-6"
- mouse_opaque="true"
- width="20" />
<text
type="string"
- follows="left|right|top"
font="SansSerifSmall"
- height="15"
+ follows="left|right|top"
layout="topleft"
- left_pad="5"
- name="LabelOwnerName"
- top_delta="6"
+ left_delta="0"
+ top_pad="0"
+ width="187"
+ height="15"
+ name="LabelCreatorName"
use_ellipses="true"
- width="165">
+ translate="false">
+TestString PleaseIgnore
</text>
- <button
- follows="top|right"
- height="16"
- image_selected="Inspector_I"
- image_unselected="Inspector_I"
- layout="topleft"
- right="-5"
- name="BtnOwner"
- top_delta="-3"
- width="16" />
<text
type="string"
length="1"
follows="left|top"
- height="23"
+ height="16"
layout="topleft"
- left="5"
+ left_delta="0"
name="LabelAcquiredTitle"
- top_pad="10"
+ top_pad="7"
width="78">
Acquired:
</text>
@@ -258,171 +170,247 @@
type="string"
length="1"
follows="left|top|right"
- height="23"
+ height="18"
layout="topleft"
- left_delta="78"
+ left_delta="0"
name="LabelAcquiredDate"
- top_delta="0"
- width="210">
+ top_pad="0"
+ width="187">
+ 00/00/00
</text>
- <text
- type="string"
- length="1"
+ <button
follows="left|top"
- height="10"
+ height="21"
+ label="Image..."
layout="topleft"
- left="5"
- name="LabelItemExperienceTitle"
+ left_delta="0"
+ name="change_thumbnail_btn"
top_pad="0"
- width="78"
- visible="true">
- Experience:
- </text>
+ width="120" />
+ </layout_panel>
+
+ <layout_panel
+ auto_resize="false"
+ name="layout_item_description"
+ layout="topleft"
+ follows="all"
+ height="84">
<text
type="string"
length="1"
- follows="left|top|right"
+ follows="left|top"
height="10"
layout="topleft"
- left_delta="78"
- name="LabelItemExperience"
- top_delta="0"
- width="210"
- visible="true"
- />
- <panel
- border="false"
- follows="left|top|right"
+ left="5"
+ name="LabelItemDescTitle"
+ top="0"
+ width="78">
+ Description:
+ </text>
+ <text_editor
+ text_type="ascii_printable_no_pipe"
+ commit_on_focus_lost="true"
+ border_style="line"
+ border_thickness="1"
+ word_wrap="true"
+ use_ellipses="false"
+ follows="all"
layout="topleft"
- mouse_opaque="false"
- name="perms_inv"
- left="0"
- top_pad="25"
- height="155"
- width="313">
- <text
- type="string"
- length="1"
- left="10"
- top_pad="13"
- text_color="EmphasisColor"
- height="15"
- follows="left|top|right"
- layout="topleft"
- name="perm_modify"
- width="200">
- You can:
- </text>
- <check_box
- height="18"
- label="Modify"
- layout="topleft"
- left="20"
- name="CheckOwnerModify"
- top_pad="0"
- width="90" />
- <check_box
- height="18"
- label="Copy"
- layout="topleft"
- left_pad="0"
- name="CheckOwnerCopy"
- width="90" />
- <check_box
- height="18"
- label="Transfer"
- layout="topleft"
- left_pad="0"
- name="CheckOwnerTransfer"
- width="106" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="10"
- name="AnyoneLabel"
- top_pad="8"
- width="100">
- Anyone:
- </text>
- <check_box
- height="18"
- label="Copy"
- layout="topleft"
- left_pad="0"
- name="CheckEveryoneCopy"
- tool_tip="Anyone can take a copy of the object . Object and all of its contents must be copy and transfer permissive."
- top_delta="-2"
- width="150" />
+ left="5"
+ top_pad="5"
+ right="-5"
+ height="46"
+ max_length="127"
+ name="LabelItemDesc"
+ tool_tip="When people have &apos;Hover Tips on All Objects&apos; selected in the viewer's settings, they'll see the object description pop-up for any object under their mouse pointer. The prim description is limited to 127 bytes any string longer then that will be truncated." />
+
<text
type="string"
length="1"
follows="left|top"
- height="16"
+ height="10"
layout="topleft"
- left="10"
- name="GroupLabel"
- top_pad="8"
- width="100">
- Group:
+ left="5"
+ name="LabelItemExperienceTitle"
+ top_pad="7"
+ width="78"
+ visible="true">
+ Experience:
</text>
- <check_box
- height="18"
- label="Share"
- layout="topleft"
- left_pad="0"
- top_delta="-2"
- 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."
- width="150" />
<text
type="string"
length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="10"
- name="NextOwnerLabel"
- top_pad="8"
- width="200"
- word_wrap="true">
- Next owner:
- </text>
- <check_box
- height="18"
- label="Modify"
- layout="topleft"
- left="20"
- top_pad="0"
- name="CheckNextOwnerModify"
- tool_tip="Next owner can edit properties like item name or scale of this object."
- width="90" />
- <check_box
- height="18"
- label="Copy"
- layout="topleft"
- left_pad="0"
- name="CheckNextOwnerCopy"
- tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied."
- width="90" />
- <check_box
- height="18"
- label="Transfer"
+ follows="left|top|right"
+ height="10"
layout="topleft"
- left_pad="0"
- name="CheckNextOwnerTransfer"
- tool_tip="Next owner can give away or resell this object."
- width="106" />
- </panel>
+ left_delta="78"
+ name="LabelItemExperience"
+ top_delta="0"
+ width="210"
+ visible="true"
+ />
+ </layout_panel>
+
+ <layout_panel
+ auto_resize="false"
+ name="layout_item_permissions_sale"
+ layout="topleft"
+ follows="all"
+ height="235">
+
+ <view_border
+ bevel_style="none"
+ height="0"
+ layout="topleft"
+ left="5"
+ right="-5"
+ name="cost_text_border"
+ top="1"/>
+
+ <text
+ type="string"
+ length="1"
+ left="10"
+ top_pad="7"
+ height="15"
+ follows="left|top"
+ layout="topleft"
+ name="perm_modify"
+ width="200">
+ Permissions
+ </text>
+
+ <text
+ type="string"
+ length="1"
+ left="10"
+ top_pad="5"
+ height="15"
+ follows="left|top"
+ layout="topleft"
+ name="perm_modify"
+ width="200">
+ You can:
+ </text>
+ <check_box
+ height="18"
+ label="Modify"
+ layout="topleft"
+ left="20"
+ name="CheckOwnerModify"
+ top_pad="0"
+ width="90" />
+ <check_box
+ height="18"
+ label="Copy"
+ layout="topleft"
+ left_pad="0"
+ name="CheckOwnerCopy"
+ width="90" />
+ <check_box
+ height="18"
+ label="Transfer"
+ layout="topleft"
+ left_pad="0"
+ name="CheckOwnerTransfer"
+ width="106" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="AnyoneLabel"
+ top_pad="8"
+ width="100">
+ Anyone:
+ </text>
+ <check_box
+ height="18"
+ label="Copy"
+ layout="topleft"
+ left_pad="0"
+ name="CheckEveryoneCopy"
+ tool_tip="Anyone can take a copy of the object . Object and all of its contents must be copy and transfer permissive."
+ top_delta="-2"
+ width="150" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="GroupLabel"
+ top_pad="8"
+ width="100">
+ Group:
+ </text>
+ <check_box
+ height="18"
+ label="Share"
+ layout="topleft"
+ left_pad="0"
+ top_delta="-2"
+ 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."
+ width="150" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="NextOwnerLabel"
+ top_pad="8"
+ width="200"
+ word_wrap="true">
+ Next owner:
+ </text>
+ <check_box
+ height="18"
+ label="Modify"
+ layout="topleft"
+ left="20"
+ top_pad="0"
+ name="CheckNextOwnerModify"
+ tool_tip="Next owner can edit properties like item name or scale of this object."
+ width="90" />
+ <check_box
+ height="18"
+ label="Copy"
+ layout="topleft"
+ left_pad="0"
+ name="CheckNextOwnerCopy"
+ tool_tip="Next owner can make unlimited copies of this object. Copies maintain creator information, and can never be more permissive than the item being copied."
+ width="90" />
+ <check_box
+ height="18"
+ label="Transfer"
+ layout="topleft"
+ left_pad="0"
+ name="CheckNextOwnerTransfer"
+ tool_tip="Next owner can give away or resell this object."
+ width="106" />
+
+ <view_border
+ bevel_style="none"
+ height="0"
+ layout="topleft"
+ left="5"
+ right="-5"
+ name="cost_text_border"
+ top_pad="9"/>
+
<check_box
height="18"
label="For Sale"
layout="topleft"
left="20"
name="CheckPurchase"
- top_pad="20"
+ top_pad="15"
width="100"
tool_tip="Lets people buy this object, its content or it copy inworld for specified price." />
<combo_box
@@ -450,6 +438,7 @@
follows="left|top"
decimal_digits="0"
increment="1"
+ control_name="Edit Cost"
name="Edit Cost"
label="Price: L$"
label_width="75"
@@ -460,88 +449,80 @@
max_val="999999999"
top_pad="10"
tool_tip="Object cost." />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="10"
- name="BaseMaskDebug"
- text_color="White"
- top_pad="30"
- width="130">
- B:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_delta="60"
- name="OwnerMaskDebug"
- text_color="White"
- top_delta="0"
- width="270">
- O:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_delta="60"
- name="GroupMaskDebug"
- text_color="White"
- top_delta="0"
- width="210">
- G:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_delta="60"
- name="EveryoneMaskDebug"
- text_color="White"
- top_delta="0"
- width="150">
- E:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_delta="60"
- name="NextMaskDebug"
- text_color="White"
- top_delta="0"
- width="90">
- N:
- </text>
- </panel>
- </scroll_container>
- <panel
- height="30"
- layout="topleft"
- name="button_panel"
- left="5"
- top_pad="0"
- width="313"
- follows="top|right|left">
- <button
- follows="top|right"
- height="23"
- label="Cancel"
- layout="topleft"
- name="cancel_btn"
- right="-1"
- width="100" />
- </panel>
+
+ </layout_panel>
+
+ <layout_panel
+ auto_resize="false"
+ name="layout_debug_permissions"
+ layout="topleft"
+ follows="all"
+ height="30">
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="10"
+ name="BaseMaskDebug"
+ text_color="White"
+ top="2"
+ width="130">
+ B:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_delta="60"
+ name="OwnerMaskDebug"
+ text_color="White"
+ top_delta="0"
+ width="270">
+ O:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_delta="60"
+ name="GroupMaskDebug"
+ text_color="White"
+ top_delta="0"
+ width="210">
+ G:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_delta="60"
+ name="EveryoneMaskDebug"
+ text_color="White"
+ top_delta="0"
+ width="150">
+ E:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_delta="60"
+ name="NextMaskDebug"
+ text_color="White"
+ top_delta="0"
+ width="90">
+ N:
+ </text>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
index 0b32215964..faff6185ab 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
@@ -62,25 +62,12 @@
name="Sale Mixed">
Mixed Sale
</panel.string>
- <button
- follows="top|left"
- height="24"
- image_hover_unselected="BackButton_Over"
- image_pressed="BackButton_Press"
- image_unselected="BackButton_Off"
- layout="topleft"
- left="8"
- name="back_btn"
- tab_stop="false"
- top="0"
- width="30"
- use_draw_context_alpha="false" />
- <text
+ <text
follows="top|left|right"
font="SansSerifHuge"
height="26"
layout="topleft"
- left_pad="10"
+ left="48"
name="title"
text_color="LtGray"
top="0"
@@ -181,7 +168,6 @@
translate="false"
use_ellipses="true"
width="225">
- TestString PleaseIgnore
</text>
<text
type="string"
@@ -300,6 +286,10 @@
name="Zoom"
value="Zoom" />
<combo_box.item
+ label="Ignore object"
+ name="Ignoreobject"
+ value="Ignore" />
+ <combo_box.item
label="None"
name="None"
value="None" />
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 9c634b661a..896120c6c0 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -233,7 +233,7 @@ If you feel this is an error, please contact support@secondlife.com</string>
<string name="TooltipForSaleL$">For Sale: L$[AMOUNT]</string> <!-- L$ version -->
<string name="TooltipFlagGroupBuild">Group Build</string>
<string name="TooltipFlagNoBuild">No Build</string>
- <string name="TooltipFlagNoEdit">Group Build</string>
+ <string name="TooltipFlagNoEdit">No Edit</string>
<string name="TooltipFlagNotSafe">Not Safe</string><!-- damage area -->
<string name="TooltipFlagNoFly">No Fly</string>
<string name="TooltipFlagGroupScripts">Group Scripts</string>
@@ -2312,6 +2312,8 @@ For AI Character: Get the closest navigable point to the point provided.
<string name="FavoritesNoMatchingItems">To add a place to your favorites, click the star to the right of the location name, then save the landmark to "Favorites bar".</string>
<string name="MarketplaceNoListing">You have no listings yet.</string>
<string name="MarketplaceNoMatchingItems">No items found. Check the spelling of your search string and try again.</string>
+ <string name="InventorySingleFolderEmpty">Folder is empty.</string>
+ <string name="InventorySingleFolderNoMatches">No matches.</string>
<string name="InventoryNoTexture">You do not have a copy of this texture in your inventory</string>
<string name="InventoryInboxNoItems">Your Marketplace purchases will appear here. You may then drag them into your inventory to use them.</string>
<string name="MarketplaceURL">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/</string>
@@ -2359,6 +2361,7 @@ If you continue to receive this message, please contact Second Life support for
<string name="InventoryMarketplaceListingsNoItems">
Drag folders to this area to list them for sale on the [[MARKETPLACE_DASHBOARD_URL] Marketplace].
</string>
+ <string name="InventoryFolderDebug">( F:[FOLDER_COUNT] I:[ITEMS_COUNT] V:[VERSION] DC:[VIEWER_DESCENDANT_COUNT]/[SERVER_DESCENDANT_COUNT] )</string>
<string name="InventoryItemsCount">( [ITEMS_COUNT] Items )</string>
<string name="Marketplace Validation Log"></string>
<string name="Marketplace Validation Warning Stock">stock folder must be contained by a version folder</string>
@@ -2397,12 +2400,16 @@ If you continue to receive this message, please contact Second Life support for
<string name="Unconstrained">Unconstrained</string>
<!-- use value="" because they have preceding spaces -->
+ <string name="active" value=" (active)"/>
<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="link" value=" link" />
+ <string name="broken_link" value=" broken_link" />
+ <string name="no_transfer_lbl" value=" no transfer" />
+ <string name="no_modify_lbl" value=" no modify" />
+ <string name="no_copy_lbl" value=" no copy" />
<string name="LoadingContents">Loading contents...</string>
<string name="NoContents">No contents</string>
<string name="WornOnAttachmentPoint" value=" (worn on [ATTACHMENT_POINT])" />
diff --git a/indra/newview/skins/default/xui/es/floater_chat_bar.xml b/indra/newview/skins/default/xui/es/floater_chat_bar.xml
deleted file mode 100644
index 02369c9a43..0000000000
--- a/indra/newview/skins/default/xui/es/floater_chat_bar.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="nearby_chat" title="CHAT">
- <panel name="bottom_panel">
- <line_editor label="Pulsa aquí para chatear." name="chat_box" tool_tip="Pulsa Enter para decirlo o Ctrl+Enter para gritarlo"/>
- <button name="show_nearby_chat" tool_tip="Muestra o esconde el registro del chat"/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml
deleted file mode 100644
index a8a3ad08f8..0000000000
--- a/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="item properties" title="PROPIEDADES DEL ÍTEM DEL INVENTARIO">
- <floater.string name="unknown">(desconocido)</floater.string>
- <floater.string name="public">(público)</floater.string>
- <floater.string name="you_can">Usted puede:</floater.string>
- <floater.string name="owner_can">El propietario puede:</floater.string>
- <floater.string name="acquiredDate">[wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local]</floater.string>
- <text name="LabelItemNameTitle">Nombre:</text>
- <text name="LabelItemDescTitle">Descripción:</text>
- <text name="LabelCreatorTitle">Creador:</text>
- <button label="Perfil..." label_selected="" name="BtnCreator"/>
- <text name="LabelOwnerTitle">Propietario:</text>
- <button label="Perfil..." label_selected="" name="BtnOwner"/>
- <text name="LabelAcquiredTitle">Adquirido:</text>
- <text name="LabelAcquiredDate">May Mié 24 12:50:46 2006</text>
- <text name="OwnerLabel">Tú:</text>
- <check_box label="Editar" name="CheckOwnerModify"/>
- <check_box label="Copiarlo" left_delta="88" name="CheckOwnerCopy"/>
- <check_box label="Revender" name="CheckOwnerTransfer"/>
- <text name="AnyoneLabel">Cualquiera:</text>
- <check_box label="Copiar" name="CheckEveryoneCopy"/>
- <text name="GroupLabel">Grupo:</text>
- <check_box label="Compartir" name="CheckShareWithGroup"/>
- <text name="NextOwnerLabel" width="230">Próximo propietario:</text>
- <check_box label="Editar" name="CheckNextOwnerModify"/>
- <check_box label="Copiarlo" left_delta="88" name="CheckNextOwnerCopy"/>
- <check_box label="Revender" name="CheckNextOwnerTransfer"/>
- <check_box label="En venta" name="CheckPurchase"/>
- <combo_box name="ComboBoxSaleType">
- <combo_box.item label="Copiar" name="Copy"/>
- <combo_box.item label="Contenidos" name="Contents"/>
- <combo_box.item label="Original" name="Original"/>
- </combo_box>
- <spinner label="Precio:" name="Edit Cost"/>
- <text name="CurrencySymbol">L$</text>
-</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_perm_prefs.xml b/indra/newview/skins/default/xui/es/floater_perm_prefs.xml
deleted file mode 100644
index 93e2088aba..0000000000
--- a/indra/newview/skins/default/xui/es/floater_perm_prefs.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="perm prefs" title="PERMISOS POR DEFECTO DE SUBIDA">
- <panel label="Permisos" name="permissions">
- <button label="?" label_selected="?" name="help"/>
- <check_box label="Compartir con el grupo" name="share_with_group"/>
- <check_box label="Permitir a cualquiera que lo copie" name="everyone_copy"/>
- <text name="NextOwnerLabel">
- El próximo propietario puede:
- </text>
- <check_box label="Modificarlo" name="next_owner_modify"/>
- <check_box label="Copiarlo" name="next_owner_copy"/>
- <check_box label="Revenderlo/Darlo" name="next_owner_transfer"/>
- </panel>
- <button label="OK" label_selected="OK" name="ok"/>
- <button label="Cancelar" label_selected="Cancelar" name="cancel"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_voice_controls.xml b/indra/newview/skins/default/xui/es/floater_voice_controls.xml
deleted file mode 100644
index eff21239be..0000000000
--- a/indra/newview/skins/default/xui/es/floater_voice_controls.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_voice_controls" title="CONTROLES DE LA VOZ">
- <string name="title_nearby">
- CONFIGURACIÓN DE VOZ
- </string>
- <string name="title_group">
- MULTICONFERENCIA DE VOZ CON [GROUP]
- </string>
- <string name="title_adhoc">
- MULTICONFERENCIA DE VOZ
- </string>
- <string name="title_peer_2_peer">
- LLAMADA A [NAME]
- </string>
- <string name="no_one_near">
- Nadie cercano tiene activada la voz
- </string>
- <layout_stack name="my_call_stack">
- <layout_panel name="my_panel">
- <text name="user_text" value="Mi 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="Colgar" name="leave_call_btn"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml
deleted file mode 100644
index 82fc8ddd39..0000000000
--- a/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="Ver el perfil" name="view_profile"/>
- <menu_item_call label="Añadir como amigo" name="add_friend"/>
- <menu_item_call label="MI" name="im"/>
- <menu_item_call label="Llamada" name="call"/>
- <menu_item_call label="Teleportar" name="teleport"/>
- <menu_item_call label="Invitar al grupo" name="invite_to_group"/>
- <menu_item_call label="Ignorar" name="block"/>
- <menu_item_call label="Designorar" name="unblock"/>
- <menu_item_call label="Denunciar" name="report"/>
- <menu_item_call label="Congelar" name="freeze"/>
- <menu_item_call label="Expulsar" name="eject"/>
- <menu_item_call label="Expulsar" name="kick"/>
- <menu_item_call label="CSR" name="csr"/>
- <menu_item_call label="Depurar las texturas" name="debug"/>
- <menu_item_call label="Encontrar en el mapa" name="find_on_map"/>
- <menu_item_call label="Acercar el zoom" name="zoom_in"/>
- <menu_item_call label="Pagar" name="pay"/>
- <menu_item_call label="Compartir" name="share"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml
deleted file mode 100644
index 29ad718fdd..0000000000
--- a/indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="Sentarme" name="Sit Down Here"/>
- <menu_item_call label="Levantarme" name="Stand Up"/>
- <context_menu label="Quitarme" name="Take Off &gt;">
- <context_menu label="Ropas" name="Clothes &gt;">
- <menu_item_call label="Camisa" name="Shirt"/>
- <menu_item_call label="Pantalones" name="Pants"/>
- <menu_item_call label="Falda" name="Skirt"/>
- <menu_item_call label="Zapatos" name="Shoes"/>
- <menu_item_call label="Calcetines" name="Socks"/>
- <menu_item_call label="Chaqueta" name="Jacket"/>
- <menu_item_call label="Guantes" name="Gloves"/>
- <menu_item_call label="Camiseta" name="Self Undershirt"/>
- <menu_item_call label="Ropa interior" name="Self Underpants"/>
- <menu_item_call label="Tatuaje" name="Self Tattoo"/>
- <menu_item_call label="Alfa" name="Self Alpha"/>
- <menu_item_call label="Toda la ropa" name="All Clothes"/>
- </context_menu>
- <context_menu label="HUD" name="Object Detach HUD"/>
- <context_menu label="Quitar" name="Object Detach"/>
- <menu_item_call label="Quitarse todo" name="Detach All"/>
- </context_menu>
- <menu_item_call label="Cambiar vestuario" name="Chenge Outfit"/>
- <menu_item_call label="Editar mi vestuario" name="Edit Outfit"/>
- <menu_item_call label="Editar mi anatomía" name="Edit My Shape"/>
- <menu_item_call label="Mis amigos" name="Friends..."/>
- <menu_item_call label="Mis grupos" name="Groups..."/>
- <menu_item_call label="Mi perfil" name="Profile..."/>
- <menu_item_call label="Depurar las texturas" name="Debug..."/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_name_field.xml b/indra/newview/skins/default/xui/es/menu_name_field.xml
deleted file mode 100644
index 0d51fbffeb..0000000000
--- a/indra/newview/skins/default/xui/es/menu_name_field.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="CopyMenu">
- <menu_item_call label="Copiar Nombre mostrado" name="copy_display"/>
- <menu_item_call label="Copiar Nombre de agente" name="copy_name"/>
- <menu_item_call label="Copiar ID de agente" name="copy_id"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/es/menu_people_friends_view_sort.xml
deleted file mode 100644
index 3899ad9e96..0000000000
--- a/indra/newview/skins/default/xui/es/menu_people_friends_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/>
- <menu_item_check label="Ordenar por estatus" name="sort_status"/>
- <menu_item_check label="Ver los iconos de la gente" name="view_icons"/>
- <menu_item_check label="Ver permisos concedidos" name="view_permissions"/>
- <menu_item_call label="Ver la lista de Residentes y Objetos ignorados" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/es/menu_people_groups_view_sort.xml
deleted file mode 100644
index 1bd3efb611..0000000000
--- a/indra/newview/skins/default/xui/es/menu_people_groups_view_sort.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Mostrar los iconos de grupo" name="Display Group Icons"/>
- <menu_item_call label="Dejar el grupo seleccionado" name="Leave Selected Group"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/es/menu_people_nearby_view_sort.xml
deleted file mode 100644
index 1403e4db01..0000000000
--- a/indra/newview/skins/default/xui/es/menu_people_nearby_view_sort.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_group_plus">
- <menu_item_check label="Ordenar según las intervenciones recientes" name="sort_by_recent_speakers"/>
- <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/>
- <menu_item_check label="Ordenar según distancia" name="sort_distance"/>
- <menu_item_check label="Ver los iconos de la gente" name="view_icons"/>
- <menu_item_check label="Ver mapa" name="view_map"/>
- <menu_item_call label="Ver la lista de Residentes y Objetos ignorados" name="show_blocked_list"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/es/menu_people_recent_view_sort.xml
deleted file mode 100644
index e4aaa89110..0000000000
--- a/indra/newview/skins/default/xui/es/menu_people_recent_view_sort.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Ordenar por los más recientes" name="sort_most"/>
- <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/>
- <menu_item_check label="Ver los iconos de la gente" name="view_icons"/>
- <menu_item_call label="Ver la lista de Residentes y Objetos ignorados" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/es/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/es/panel_adhoc_control_panel.xml
deleted file mode 100644
index c64a93e0e5..0000000000
--- a/indra/newview/skins/default/xui/es/panel_adhoc_control_panel.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?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="Llamar" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Colgar" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Controles de la voz" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_facebook_account.xml b/indra/newview/skins/default/xui/es/panel_facebook_account.xml
deleted file mode 100644
index 2b6d407ad7..0000000000
--- a/indra/newview/skins/default/xui/es/panel_facebook_account.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<panel name="panel_facebook_account">
- <string name="facebook_connected" value="Estás conectado a Facebook como:"/>
- <string name="facebook_disconnected" value="No conectado a Facebook"/>
- <text name="account_caption_label">
- No conectado a Facebook.
- </text>
- <panel name="panel_buttons">
- <button label="Conectar..." name="connect_btn"/>
- <button label="Desconectar" name="disconnect_btn"/>
- <text name="account_learn_more_label">
- [http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Share-Facebook/ta-p/2149711 Aprende a publicar en Facebook]
- </text>
- </panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_group_control_panel.xml b/indra/newview/skins/default/xui/es/panel_group_control_panel.xml
deleted file mode 100644
index b398293175..0000000000
--- a/indra/newview/skins/default/xui/es/panel_group_control_panel.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?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="Perfil del grupo" name="group_info_btn"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="Llamar al grupo" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Colgar" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Abrir los controles de la voz" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_im_control_panel.xml b/indra/newview/skins/default/xui/es/panel_im_control_panel.xml
deleted file mode 100644
index f218324d50..0000000000
--- a/indra/newview/skins/default/xui/es/panel_im_control_panel.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?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="Perfil" name="view_profile_btn"/>
- </layout_panel>
- <layout_panel name="add_friend_btn_panel">
- <button label="Añadir como amigo" name="add_friend_btn"/>
- </layout_panel>
- <layout_panel name="teleport_btn_panel">
- <button label="Teleportar" name="teleport_btn" tool_tip="Ofrecer teleporte a esta persona"/>
- </layout_panel>
- <layout_panel name="share_btn_panel">
- <button label="Compartir" name="share_btn"/>
- </layout_panel>
- <layout_panel name="pay_btn_panel">
- <button label="Pagar" name="pay_btn"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="Llamar" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Colgar" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Controles de la voz" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_main_inventory.xml b/indra/newview/skins/default/xui/es/panel_main_inventory.xml
index 1252c7ce0d..bf1205046b 100644
--- a/indra/newview/skins/default/xui/es/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/es/panel_main_inventory.xml
@@ -9,6 +9,7 @@
<panel.string name="ItemcountUnknown">
[ITEM_COUNT] Objetos y [CATEGORY_COUNT] Carpetas Obtenidos [FILTER]
</panel.string>
+ <panel.string name="inventory_title">INVENTARIO</panel.string>
<text name="ItemcountText">
Ítems:
</text>
diff --git a/indra/newview/skins/default/xui/es/panel_profile_interests.xml b/indra/newview/skins/default/xui/es/panel_profile_interests.xml
deleted file mode 100644
index 86dd63390c..0000000000
--- a/indra/newview/skins/default/xui/es/panel_profile_interests.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Intereses" name="panel_profile_interests">
- <text name="I Want To:">
- Quiero:
- </text>
- <check_box label="Construye" name="chk0"/>
- <check_box label="Explora" name="chk1"/>
- <check_box label="Conoce" name="chk2"/>
- <check_box label="Encuentra empleo" name="chk6"/>
- <check_box label="Agrupa" name="chk3"/>
- <check_box label="Compra" name="chk4"/>
- <check_box label="Vende" name="chk5"/>
- <check_box label="Contrata" name="chk7"/>
- <line_editor name="want_to_edit">
- (cargando...)
- </line_editor>
- <text name="Skills:">
- Habilidades:
- </text>
- <check_box label="Texturas" name="schk0"/>
- <check_box label="Arquitectura" name="schk1"/>
- <check_box label="Modelo" name="schk3"/>
- <check_box label="Planificación de eventos" name="schk2"/>
- <check_box label="Preparación de scripts" name="schk4"/>
- <check_box label="Personajes personalizados" name="schk5"/>
- <line_editor name="skills_edit">
- (cargando...)
- </line_editor>
- <text name="Languages:">
- Idiomas:
- </text>
- <line_editor name="languages_edit">
- (cargando...)
- </line_editor>
-</panel>
diff --git a/indra/newview/skins/default/xui/fr/floater_chat_bar.xml b/indra/newview/skins/default/xui/fr/floater_chat_bar.xml
deleted file mode 100644
index 7dcb9a280d..0000000000
--- a/indra/newview/skins/default/xui/fr/floater_chat_bar.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="nearby_chat" title="CHAT PRÈS DE MOI">
- <panel name="bottom_panel">
- <line_editor label="Cliquer ici pour chatter." name="chat_box" tool_tip="Appuyer sur Entrée pour dire, Ctrl+Entrée pour crier"/>
- <button name="show_nearby_chat" tool_tip="Afficher/masquer le journal de chat près de vous."/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
deleted file mode 100644
index 1d4e7c818f..0000000000
--- a/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="item properties" title="PROPRIÉTÉS DES ARTICLES DE L&apos;INVENTAIRE">
- <floater.string name="unknown">(inconnu)</floater.string>
- <floater.string name="public">(public)</floater.string>
- <floater.string name="you_can">Vous pouvez :</floater.string>
- <floater.string name="owner_can">Le propriétaire peut :</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">Nom :</text>
- <text name="LabelItemDescTitle">Description :</text>
- <text name="LabelCreatorTitle">Créateur :</text>
- <button label="Profil..." label_selected="" name="BtnCreator"/>
- <text name="LabelOwnerTitle">Propriétaire :</text>
- <button label="Profil..." label_selected="" name="BtnOwner"/>
- <text name="LabelAcquiredTitle">Acquis :</text>
- <text name="LabelAcquiredDate">Wed May 24 12:50:46 2006</text>
- <text name="OwnerLabel">Vous :</text>
- <check_box label="Modifier" name="CheckOwnerModify"/>
- <check_box label="Copier" name="CheckOwnerCopy"/>
- <check_box label="Revendre" name="CheckOwnerTransfer"/>
- <text name="AnyoneLabel" width="80">N&apos;importe qui :</text>
- <check_box label="Copier" name="CheckEveryoneCopy"/>
- <text name="GroupLabel" width="80">Groupe :</text>
- <check_box label="Partager" name="CheckShareWithGroup"/>
- <text name="NextOwnerLabel" width="192">Le prochain propriétaire :</text>
- <check_box label="Modifier" name="CheckNextOwnerModify"/>
- <check_box label="Copier" name="CheckNextOwnerCopy"/>
- <check_box label="Revendre" name="CheckNextOwnerTransfer"/>
- <check_box label="À vendre" name="CheckPurchase"/>
- <combo_box name="ComboBoxSaleType">
- <combo_box.item label="Copier" name="Copy"/>
- <combo_box.item label="Contenu" name="Contents"/>
- <combo_box.item label="Original" name="Original"/>
- </combo_box>
- <spinner label="Prix :" name="Edit Cost"/>
- <text name="CurrencySymbol">L$</text>
-</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_perm_prefs.xml b/indra/newview/skins/default/xui/fr/floater_perm_prefs.xml
deleted file mode 100644
index 36bec80561..0000000000
--- a/indra/newview/skins/default/xui/fr/floater_perm_prefs.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="perm prefs" title="DROITS DE CHARGEMENT PAR DÉFAUT">
- <panel label="Droits" name="permissions">
- <button label="?" label_selected="?" name="help"/>
- <check_box label="Partager avec le groupe" name="share_with_group"/>
- <check_box label="Autoriser tout le monde à copier" name="everyone_copy"/>
- <text name="NextOwnerLabel">
- Le prochain propriétaire pourra :
- </text>
- <check_box label="Modifier" name="next_owner_modify"/>
- <check_box label="Copier" name="next_owner_copy"/>
- <check_box label="Revendre/Donner" name="next_owner_transfer"/>
- </panel>
- <button label="OK" label_selected="OK" name="ok"/>
- <button label="Annuler" label_selected="Annuler" name="cancel"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_voice_controls.xml b/indra/newview/skins/default/xui/fr/floater_voice_controls.xml
deleted file mode 100644
index fc4de4a5a6..0000000000
--- a/indra/newview/skins/default/xui/fr/floater_voice_controls.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_voice_controls" title="CONTROLES DE LA VOIX">
- <string name="title_nearby">
- PARAMÈTRES VOCAUX
- </string>
- <string name="title_group">
- APPEL DE GROUPE AVEC [GROUP]
- </string>
- <string name="title_adhoc">
- CONFÉRENCE
- </string>
- <string name="title_peer_2_peer">
- APPEL AVEC [NAME]
- </string>
- <string name="no_one_near">
- Il n&apos;y a personne près de vous avec le chat vocal activé
- </string>
- <layout_stack name="my_call_stack">
- <layout_panel name="my_panel">
- <text name="user_text" value="Mon 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="Quitter l&apos;appel" name="leave_call_btn"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml
deleted file mode 100644
index 53f22bb44a..0000000000
--- a/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="Voir le profil" name="view_profile"/>
- <menu_item_call label="Devenir amis" name="add_friend"/>
- <menu_item_call label="IM" name="im"/>
- <menu_item_call label="Appel" name="call"/>
- <menu_item_call label="Téléporter" name="teleport"/>
- <menu_item_call label="Inviter dans le groupe" name="invite_to_group"/>
- <menu_item_call label="Ignorer" name="block"/>
- <menu_item_call label="Ne plus ignorer" name="unblock"/>
- <menu_item_call label="Signaler" name="report"/>
- <menu_item_call label="Figer" name="freeze"/>
- <menu_item_call label="Expulser" name="eject"/>
- <menu_item_call label="Éjecter" name="kick"/>
- <menu_item_call label="Représentant de l&apos;Assistance client" name="csr"/>
- <menu_item_call label="Déboguer les textures" name="debug"/>
- <menu_item_call label="Situer sur la carte" name="find_on_map"/>
- <menu_item_call label="Zoomer en avant" name="zoom_in"/>
- <menu_item_call label="Payer" name="pay"/>
- <menu_item_call label="Partager" name="share"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml
deleted file mode 100644
index ac70df472d..0000000000
--- a/indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="M&apos;asseoir" name="Sit Down Here"/>
- <menu_item_call label="Me lever" name="Stand Up"/>
- <context_menu label="Enlever" name="Take Off &gt;">
- <context_menu label="Habits" name="Clothes &gt;">
- <menu_item_call label="Chemise" name="Shirt"/>
- <menu_item_call label="Pantalon" name="Pants"/>
- <menu_item_call label="Jupe" name="Skirt"/>
- <menu_item_call label="Chaussures" name="Shoes"/>
- <menu_item_call label="Chaussettes" name="Socks"/>
- <menu_item_call label="Veste" name="Jacket"/>
- <menu_item_call label="Gants" name="Gloves"/>
- <menu_item_call label="Débardeur" name="Self Undershirt"/>
- <menu_item_call label="Caleçon" name="Self Underpants"/>
- <menu_item_call label="Tatouage" name="Self Tattoo"/>
- <menu_item_call label="Alpha" name="Self Alpha"/>
- <menu_item_call label="Tous les habits" name="All Clothes"/>
- </context_menu>
- <context_menu label="HUD" name="Object Detach HUD"/>
- <context_menu label="Détacher" name="Object Detach"/>
- <menu_item_call label="Tout détacher" name="Detach All"/>
- </context_menu>
- <menu_item_call label="Changer de tenue" name="Chenge Outfit"/>
- <menu_item_call label="Modifier ma tenue" name="Edit Outfit"/>
- <menu_item_call label="Modifier ma silhouette" name="Edit My Shape"/>
- <menu_item_call label="Mes amis" name="Friends..."/>
- <menu_item_call label="Mes groupes" name="Groups..."/>
- <menu_item_call label="Mon profil" name="Profile..."/>
- <menu_item_call label="Déboguer les textures" name="Debug..."/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_name_field.xml b/indra/newview/skins/default/xui/fr/menu_name_field.xml
deleted file mode 100644
index 6c3fba4110..0000000000
--- a/indra/newview/skins/default/xui/fr/menu_name_field.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="CopyMenu">
- <menu_item_call label="Copier le Nom d&apos;affichage" name="copy_display"/>
- <menu_item_call label="Copier le Nom de l&apos;agent" name="copy_name"/>
- <menu_item_call label="Copier l&apos;ID de l&apos;agent" name="copy_id"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/fr/menu_people_friends_view_sort.xml
deleted file mode 100644
index a6170a6c16..0000000000
--- a/indra/newview/skins/default/xui/fr/menu_people_friends_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Trier par nom" name="sort_name"/>
- <menu_item_check label="Trier par statut" name="sort_status"/>
- <menu_item_check label="Afficher les icônes des résidents" name="view_icons"/>
- <menu_item_check label="Afficher les droits octroyés" name="view_permissions"/>
- <menu_item_call label="Afficher les résidents et les objets ignorés" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/fr/menu_people_groups_view_sort.xml
deleted file mode 100644
index 34f949cf2c..0000000000
--- a/indra/newview/skins/default/xui/fr/menu_people_groups_view_sort.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Afficher les icônes des groupes" name="Display Group Icons"/>
- <menu_item_call label="Quitter le groupe sélectionné" name="Leave Selected Group"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/fr/menu_people_nearby_view_sort.xml
deleted file mode 100644
index 8bb466b8d6..0000000000
--- a/indra/newview/skins/default/xui/fr/menu_people_nearby_view_sort.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_group_plus">
- <menu_item_check label="Trier par intervenants récents" name="sort_by_recent_speakers"/>
- <menu_item_check label="Trier par nom" name="sort_name"/>
- <menu_item_check label="Trier par distance" name="sort_distance"/>
- <menu_item_check label="Afficher les icônes des résidents" name="view_icons"/>
- <menu_item_check label="Afficher la carte" name="view_map"/>
- <menu_item_call label="Afficher les résidents et les objets ignorés" name="show_blocked_list"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/fr/menu_people_recent_view_sort.xml
deleted file mode 100644
index 93b90ae61c..0000000000
--- a/indra/newview/skins/default/xui/fr/menu_people_recent_view_sort.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Trier en commençant par le plus récent" name="sort_most"/>
- <menu_item_check label="Trier par nom" name="sort_name"/>
- <menu_item_check label="Afficher les icônes des résidents" name="view_icons"/>
- <menu_item_call label="Afficher les résidents et les objets ignorés" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/fr/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/fr/panel_adhoc_control_panel.xml
deleted file mode 100644
index 4191ba42f9..0000000000
--- a/indra/newview/skins/default/xui/fr/panel_adhoc_control_panel.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?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="Appeler" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Quitter l&apos;appel" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Contrôles vocaux" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_facebook_account.xml b/indra/newview/skins/default/xui/fr/panel_facebook_account.xml
deleted file mode 100644
index 6406ae4ae7..0000000000
--- a/indra/newview/skins/default/xui/fr/panel_facebook_account.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<panel name="panel_facebook_account">
- <string name="facebook_connected" value="Vous êtes connecté(e) à Facebook en tant que :"/>
- <string name="facebook_disconnected" value="Pas connecté(e) à Facebook"/>
- <text name="account_caption_label">
- Pas connecté(e) à Facebook.
- </text>
- <panel name="panel_buttons">
- <button label="Connexion..." name="connect_btn"/>
- <button label="Déconnexion" name="disconnect_btn"/>
- <text name="account_learn_more_label">
- [http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Share-Facebook/ta-p/2149711 Apprenez comment publier sur Facebook]
- </text>
- </panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_control_panel.xml b/indra/newview/skins/default/xui/fr/panel_group_control_panel.xml
deleted file mode 100644
index 3e66b3c72a..0000000000
--- a/indra/newview/skins/default/xui/fr/panel_group_control_panel.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?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="Profil du groupe" name="group_info_btn"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="Appeler le groupe" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Quitter l&apos;appel" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Ouvrir contrôles vocaux" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_im_control_panel.xml b/indra/newview/skins/default/xui/fr/panel_im_control_panel.xml
deleted file mode 100644
index 1f2169e22c..0000000000
--- a/indra/newview/skins/default/xui/fr/panel_im_control_panel.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <text name="avatar_name" value="Inconnu"/>
- <layout_stack name="button_stack">
- <layout_panel name="view_profile_btn_panel">
- <button label="Profil" name="view_profile_btn"/>
- </layout_panel>
- <layout_panel name="add_friend_btn_panel">
- <button label="Devenir amis" name="add_friend_btn"/>
- </layout_panel>
- <layout_panel name="teleport_btn_panel">
- <button label="Téléporter" name="teleport_btn" tool_tip="Proposer de téléporter cette personne"/>
- </layout_panel>
- <layout_panel name="share_btn_panel">
- <button label="Partager" name="share_btn"/>
- </layout_panel>
- <layout_panel name="pay_btn_panel">
- <button label="Payer" name="pay_btn"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="Appeler" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Quitter l&apos;appel" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Contrôles vocaux" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_main_inventory.xml b/indra/newview/skins/default/xui/fr/panel_main_inventory.xml
index 5bcee89752..5bf4d6c15d 100644
--- a/indra/newview/skins/default/xui/fr/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/panel_main_inventory.xml
@@ -9,6 +9,7 @@
<panel.string name="ItemcountUnknown">
Recherche effectuée [ITEM_COUNT] d&apos;articles et [CATEGORY_COUNT] de dossiers [FILTER]
</panel.string>
+ <panel.string name="inventory_title">INVENTAIRE</panel.string>
<text name="ItemcountText">
Articles :
</text>
diff --git a/indra/newview/skins/default/xui/fr/panel_profile_interests.xml b/indra/newview/skins/default/xui/fr/panel_profile_interests.xml
deleted file mode 100644
index e8212817d2..0000000000
--- a/indra/newview/skins/default/xui/fr/panel_profile_interests.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Centres d&apos;intérêt" name="panel_profile_interests">
- <text name="I Want To:">
- Je veux :
- </text>
- <check_box label="Construire" name="chk0"/>
- <check_box label="Explorer" name="chk1"/>
- <check_box label="Rencontrer" name="chk2"/>
- <check_box label="Être recruté" name="chk6"/>
- <check_box label="Grouper" name="chk3"/>
- <check_box label="Acheter" name="chk4"/>
- <check_box label="Vendre" name="chk5"/>
- <check_box label="Louer" name="chk7"/>
- <line_editor name="want_to_edit">
- (en cours de chargement...)
- </line_editor>
- <text name="Skills:">
- Compétences :
- </text>
- <check_box label="Textures" name="schk0"/>
- <check_box label="Architecture" name="schk1"/>
- <check_box label="Modèle" name="schk3"/>
- <check_box label="Planification des événements" name="schk2"/>
- <check_box label="Langage de scripts" name="schk4"/>
- <check_box label="Personnages personnalisés" name="schk5"/>
- <line_editor name="skills_edit">
- (en cours de chargement...)
- </line_editor>
- <text name="Languages:">
- Langues :
- </text>
- <line_editor name="languages_edit">
- (en cours de chargement...)
- </line_editor>
-</panel>
diff --git a/indra/newview/skins/default/xui/it/floater_chat_bar.xml b/indra/newview/skins/default/xui/it/floater_chat_bar.xml
deleted file mode 100644
index b47e32ce90..0000000000
--- a/indra/newview/skins/default/xui/it/floater_chat_bar.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="nearby_chat" title="CHAT NEI DINTORNI">
- <panel name="bottom_panel">
- <line_editor label="Clicca qui per la chat." name="chat_box" tool_tip="Premi Invio per parlare, Ctrl+Invio per gridare"/>
- <button name="show_nearby_chat" tool_tip="Mostra/Nasconde il registro della chat nei dintorni"/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml
deleted file mode 100644
index 8cf680b3f0..0000000000
--- a/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="item properties" title="CARATTERISTICHE DELL&apos;ARTICOLO IN INVENTARIO">
- <floater.string name="unknown">(sconosciuto)</floater.string>
- <floater.string name="public">(pubblico)</floater.string>
- <floater.string name="you_can">Tu puoi:</floater.string>
- <floater.string name="owner_can">Il proprietario può:</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">Nome:</text>
- <text name="LabelItemDescTitle">Descrizione:</text>
- <text name="LabelCreatorTitle">Creatore:</text>
- <button label="Profilo..." label_selected="" name="BtnCreator"/>
- <text name="LabelOwnerTitle">proprietario:</text>
- <button label="Profilo..." label_selected="" name="BtnOwner"/>
- <text name="LabelAcquiredTitle">Acquisito:</text>
- <text name="LabelAcquiredDate">Wed May 24 12:50:46 2006</text>
- <text name="OwnerLabel">Tu:</text>
- <check_box label="Modifica" name="CheckOwnerModify"/>
- <check_box label="Copiare" left_delta="88" name="CheckOwnerCopy"/>
- <check_box label="Rivendi" name="CheckOwnerTransfer"/>
- <text name="AnyoneLabel">Chiunque:</text>
- <check_box label="Copia" name="CheckEveryoneCopy"/>
- <text name="GroupLabel">Gruppo:</text>
- <check_box label="Condividi" name="CheckShareWithGroup"/>
- <text name="NextOwnerLabel" width="230">Proprietario successivo:</text>
- <check_box label="Modifica" name="CheckNextOwnerModify"/>
- <check_box label="Copiare" left_delta="88" name="CheckNextOwnerCopy"/>
- <check_box label="Rivendi" name="CheckNextOwnerTransfer"/>
- <check_box label="In vendita" name="CheckPurchase"/>
- <combo_box name="ComboBoxSaleType">
- <combo_box.item label="Copia" name="Copy"/>
- <combo_box.item label="Contenuti" name="Contents"/>
- <combo_box.item label="Originale" name="Original"/>
- </combo_box>
- <spinner label="Prezzo:" name="Edit Cost"/>
- <text name="CurrencySymbol">L$</text>
-</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_perm_prefs.xml b/indra/newview/skins/default/xui/it/floater_perm_prefs.xml
deleted file mode 100644
index a02b3b5075..0000000000
--- a/indra/newview/skins/default/xui/it/floater_perm_prefs.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="perm prefs" title="DIRITTI DI CARICAMENTO PREDEFINITI">
- <panel label="Permessi" name="permissions">
- <button label="?" label_selected="?" name="help"/>
- <check_box label="Condividi con il gruppo" name="share_with_group"/>
- <check_box label="Permetti a chiunque di copiare" name="everyone_copy"/>
- <text name="NextOwnerLabel">
- Il prossimo possessore può:
- </text>
- <check_box label="Modificare" name="next_owner_modify"/>
- <check_box label="Copiare" name="next_owner_copy"/>
- <check_box label="Rivendere/Regalare" name="next_owner_transfer"/>
- </panel>
- <button label="OK" label_selected="OK" name="ok"/>
- <button label="Annulla" label_selected="Annulla" name="cancel"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_voice_controls.xml b/indra/newview/skins/default/xui/it/floater_voice_controls.xml
deleted file mode 100644
index 77973eef1e..0000000000
--- a/indra/newview/skins/default/xui/it/floater_voice_controls.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_voice_controls" title="CONTROLLI VOCE">
- <string name="title_nearby">
- IMPOSTAZIONI VOCE
- </string>
- <string name="title_group">
- CHIAMATA DI GRUPPO CON [GROUP]
- </string>
- <string name="title_adhoc">
- CHIAMATA IN CONFERENZA
- </string>
- <string name="title_peer_2_peer">
- CHIAMATA CON [NAME]
- </string>
- <string name="no_one_near">
- Nessuno nei dintorni ha attivato la funzione voce
- </string>
- <layout_stack name="my_call_stack">
- <layout_panel name="my_panel">
- <text name="user_text" value="Il mio 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="Abbandona chiamata" name="leave_call_btn"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml
deleted file mode 100644
index 1f10734c4a..0000000000
--- a/indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="Vedi profilo" name="view_profile"/>
- <menu_item_call label="Aggiungi amico" name="add_friend"/>
- <menu_item_call label="IM" name="im"/>
- <menu_item_call label="Chiama" name="call"/>
- <menu_item_call label="Teleport" name="teleport"/>
- <menu_item_call label="Invita al gruppo" name="invite_to_group"/>
- <menu_item_call label="Blocca" name="block"/>
- <menu_item_call label="Sblocca" name="unblock"/>
- <menu_item_call label="Segnala" name="report"/>
- <menu_item_call label="Congela" name="freeze"/>
- <menu_item_call label="Espelli" name="eject"/>
- <menu_item_call label="Espelli" name="kick"/>
- <menu_item_call label="CSR" name="csr"/>
- <menu_item_call label="Debug delle texture" name="debug"/>
- <menu_item_call label="Trova sulla mappa" name="find_on_map"/>
- <menu_item_call label="Zoom avanti" name="zoom_in"/>
- <menu_item_call label="Paga" name="pay"/>
- <menu_item_call label="Condividi" name="share"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml
deleted file mode 100644
index 4f62ccaa9c..0000000000
--- a/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="Siedi" name="Sit Down Here"/>
- <menu_item_call label="Alzati" name="Stand Up"/>
- <context_menu label="Togli" name="Take Off &gt;">
- <context_menu label="Abiti" name="Clothes &gt;">
- <menu_item_call label="Camicia" name="Shirt"/>
- <menu_item_call label="Pantaloni" name="Pants"/>
- <menu_item_call label="Gonna" name="Skirt"/>
- <menu_item_call label="Scarpe" name="Shoes"/>
- <menu_item_call label="Calzini" name="Socks"/>
- <menu_item_call label="Giacca" name="Jacket"/>
- <menu_item_call label="Guanti" name="Gloves"/>
- <menu_item_call label="Maglietta intima" name="Self Undershirt"/>
- <menu_item_call label="Slip" name="Self Underpants"/>
- <menu_item_call label="Tatuaggio" name="Self Tattoo"/>
- <menu_item_call label="Alpha (Trasparenza)" name="Self Alpha"/>
- <menu_item_call label="Tutti gli abiti" name="All Clothes"/>
- </context_menu>
- <context_menu label="HUD" name="Object Detach HUD"/>
- <context_menu label="Stacca" name="Object Detach"/>
- <menu_item_call label="Stacca tutto" name="Detach All"/>
- </context_menu>
- <menu_item_call label="Cambia vestiario" name="Chenge Outfit"/>
- <menu_item_call label="Modifica il mio vestiario" name="Edit Outfit"/>
- <menu_item_call label="Modifica la figura corporea" name="Edit My Shape"/>
- <menu_item_call label="I miei amici" name="Friends..."/>
- <menu_item_call label="I miei gruppi" name="Groups..."/>
- <menu_item_call label="Il mio profilo" name="Profile..."/>
- <menu_item_call label="Debug delle texture" name="Debug..."/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_name_field.xml b/indra/newview/skins/default/xui/it/menu_name_field.xml
deleted file mode 100644
index 9ac863323c..0000000000
--- a/indra/newview/skins/default/xui/it/menu_name_field.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="CopyMenu">
- <menu_item_call label="Copia Nome Visualizzato" name="copy_display"/>
- <menu_item_call label="Copia Nome Agente" name="copy_name"/>
- <menu_item_call label="Copia ID Agente" name="copy_id"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/it/menu_people_friends_view_sort.xml
deleted file mode 100644
index 3a799f44eb..0000000000
--- a/indra/newview/skins/default/xui/it/menu_people_friends_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Ordina in base al nome" name="sort_name"/>
- <menu_item_check label="Ordina in base allo stato" name="sort_status"/>
- <menu_item_check label="Icone persone" name="view_icons"/>
- <menu_item_check label="Visualizza autorizzazioni concesse" name="view_permissions"/>
- <menu_item_call label="Mostra oggetti e residenti bloccati" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/it/menu_people_groups_view_sort.xml
deleted file mode 100644
index d31ddaf1aa..0000000000
--- a/indra/newview/skins/default/xui/it/menu_people_groups_view_sort.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Visualizza le icone di gruppo" name="Display Group Icons"/>
- <menu_item_call label="Lascia i gruppi selezionati" name="Leave Selected Group"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml
deleted file mode 100644
index 2b5c235706..0000000000
--- a/indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_group_plus">
- <menu_item_check label="Ordina in base a intervenuti recenti" name="sort_by_recent_speakers"/>
- <menu_item_check label="Ordina in base al nome" name="sort_name"/>
- <menu_item_check label="Ordina in base alla distanza" name="sort_distance"/>
- <menu_item_check label="Icone persone" name="view_icons"/>
- <menu_item_check label="Visualizza mappa" name="view_map"/>
- <menu_item_call label="Mostra oggetti e residenti bloccati" name="show_blocked_list"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/it/menu_people_recent_view_sort.xml
deleted file mode 100644
index 7fccd1621a..0000000000
--- a/indra/newview/skins/default/xui/it/menu_people_recent_view_sort.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Mostra prima i più recenti" name="sort_most"/>
- <menu_item_check label="Ordina in base al nome" name="sort_name"/>
- <menu_item_check label="Icone persone" name="view_icons"/>
- <menu_item_call label="Mostra oggetti e residenti bloccati" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/it/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/it/panel_adhoc_control_panel.xml
deleted file mode 100644
index be001d09f8..0000000000
--- a/indra/newview/skins/default/xui/it/panel_adhoc_control_panel.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?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="Chiama" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Abbandona chiamata" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Regolazione voce" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_facebook_account.xml b/indra/newview/skins/default/xui/it/panel_facebook_account.xml
deleted file mode 100644
index e887e7e4dc..0000000000
--- a/indra/newview/skins/default/xui/it/panel_facebook_account.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<panel name="panel_facebook_account">
- <string name="facebook_connected" value="Sei in collegamento con Facebook come:"/>
- <string name="facebook_disconnected" value="Non in collegamento con Facebook"/>
- <text name="account_caption_label">
- Non in collegamento con Facebook.
- </text>
- <panel name="panel_buttons">
- <button label="Collegamento..." name="connect_btn"/>
- <button label="Interrompi collegamento" name="disconnect_btn"/>
- <text name="account_learn_more_label">
- [http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Share-Facebook/ta-p/2149711 Come pubblicare su Facebook]
- </text>
- </panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_group_control_panel.xml b/indra/newview/skins/default/xui/it/panel_group_control_panel.xml
deleted file mode 100644
index 2d17e4a0cd..0000000000
--- a/indra/newview/skins/default/xui/it/panel_group_control_panel.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?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="Profilo del gruppo" name="group_info_btn"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="Chiama il gruppo" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Abbandona chiamata" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Apri la regolazione voce" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_im_control_panel.xml b/indra/newview/skins/default/xui/it/panel_im_control_panel.xml
deleted file mode 100644
index 76b28eab24..0000000000
--- a/indra/newview/skins/default/xui/it/panel_im_control_panel.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?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="Profilo" name="view_profile_btn"/>
- </layout_panel>
- <layout_panel name="add_friend_btn_panel">
- <button label="Aggiungi amico" name="add_friend_btn"/>
- </layout_panel>
- <layout_panel name="teleport_btn_panel">
- <button label="Teleport" name="teleport_btn" tool_tip="Offri teleport a questa persona"/>
- </layout_panel>
- <layout_panel name="share_btn_panel">
- <button label="Condividi" name="share_btn"/>
- </layout_panel>
- <layout_panel name="pay_btn_panel">
- <button label="Paga" name="pay_btn"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="Chiama" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Chiudi chiamata" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Regolazione voce" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_main_inventory.xml b/indra/newview/skins/default/xui/it/panel_main_inventory.xml
index 5d11967cee..d6890229e7 100644
--- a/indra/newview/skins/default/xui/it/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/it/panel_main_inventory.xml
@@ -9,6 +9,7 @@
<panel.string name="ItemcountUnknown">
Recuperati [ITEM_COUNT] oggetti e [CATEGORY_COUNT] cartelle [FILTER]
</panel.string>
+ <panel.string name="inventory_title">INVENTARIO</panel.string>
<text name="ItemcountText">
Oggetti:
</text>
diff --git a/indra/newview/skins/default/xui/it/panel_profile_interests.xml b/indra/newview/skins/default/xui/it/panel_profile_interests.xml
deleted file mode 100644
index 9fe7331e5c..0000000000
--- a/indra/newview/skins/default/xui/it/panel_profile_interests.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Interessi" name="panel_profile_interests">
- <text name="I Want To:">
- Desidero:
- </text>
- <check_box label="Costruire" name="chk0"/>
- <check_box label="Esplorare" name="chk1"/>
- <check_box label="Incontrare" name="chk2"/>
- <check_box label="Essere assunto" name="chk6"/>
- <check_box label="Gruppo" name="chk3"/>
- <check_box label="Acquistare" name="chk4"/>
- <check_box label="Vendere" name="chk5"/>
- <check_box label="Assumere" name="chk7"/>
- <line_editor name="want_to_edit">
- (caricamento in corso...)
- </line_editor>
- <text name="Skills:">
- Abilità:
- </text>
- <check_box label="Texture" name="schk0"/>
- <check_box label="Architettura" name="schk1"/>
- <check_box label="Realizzazione modelli 3D" name="schk3"/>
- <check_box label="Organizzazione eventi" name="schk2"/>
- <check_box label="Scripting" name="schk4"/>
- <check_box label="Personaggi personalizzati" name="schk5"/>
- <line_editor name="skills_edit">
- (caricamento in corso...)
- </line_editor>
- <text name="Languages:">
- Lingue:
- </text>
- <line_editor name="languages_edit">
- (caricamento in corso...)
- </line_editor>
-</panel>
diff --git a/indra/newview/skins/default/xui/ja/control_table_contents_camera.xml b/indra/newview/skins/default/xui/ja/control_table_contents_camera.xml
new file mode 100644
index 0000000000..f72ebcbbf3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/control_table_contents_camera.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<contents>
+ <rows name="camera_actions" value="">
+ <columns label="カメラ" name="lst_action"/>
+ </rows>
+ <rows name="look_up" value="look_up">
+ <columns name="lst_action" value="上に向ける"/>
+ </rows>
+ <rows name="look_down" value="look_down">
+ <columns name="lst_action" value="下に向ける"/>
+ </rows>
+ <rows name="move_forward" value="move_forward">
+ <columns name="lst_action" value="カメラを近づける"/>
+ </rows>
+ <rows name="move_backward" value="move_backward">
+ <columns name="lst_action" value="カメラを遠ざける"/>
+ </rows>
+ <rows name="move_forward_fast" value="move_forward_fast">
+ <columns name="lst_action" value="カメラを高速に近づける"/>
+ </rows>
+ <rows name="move_backward_fast" value="move_backward_fast">
+ <columns name="lst_action" value="カメラを高速に遠ざける"/>
+ </rows>
+ <rows name="spin_over" value="spin_over">
+ <columns name="lst_action" value="カメラの仰角を上げる"/>
+ </rows>
+ <rows name="spin_under" value="spin_under">
+ <columns name="lst_action" value="カメラの仰角を下げる"/>
+ </rows>
+ <rows name="pan_up" value="pan_up">
+ <columns name="lst_action" value="カメラの中心を上に移動"/>
+ </rows>
+ <rows name="pan_down" value="pan_down">
+ <columns name="lst_action" value="カメラの中心を下に移動"/>
+ </rows>
+ <rows name="pan_left" value="pan_left">
+ <columns name="lst_action" value="カメラの中心を左に移動"/>
+ </rows>
+ <rows name="pan_right" value="pan_right">
+ <columns name="lst_action" value="カメラの中心を右に移動"/>
+ </rows>
+ <rows name="pan_in" value="pan_in">
+ <columns name="lst_action" value="カメラの中心を拡大"/>
+ </rows>
+ <rows name="pan_out" value="pan_out">
+ <columns name="lst_action" value="カメラの中心を縮小"/>
+ </rows>
+ <rows name="spin_around_ccw" value="spin_around_ccw">
+ <columns name="lst_action" tool_tip="対象に対して、カメラを反時計回りに回します。" value="反時計回り"/>
+ </rows>
+ <rows name="spin_around_cw" value="spin_around_cw">
+ <columns name="lst_action" tool_tip="対象に対して、カメラをカメラを時計回りに回します。" value="時計回り"/>
+ </rows>
+ <rows name="move_forward_sitting" value="move_forward_sitting">
+ <columns name="lst_action" value="座ってカメラを近づける"/>
+ </rows>
+ <rows name="move_backward_sitting" value="move_backward_sitting">
+ <columns name="lst_action" value="座ってカメラを遠ざける"/>
+ </rows>
+ <rows name="spin_over_sitting" value="spin_over_sitting">
+ <columns name="lst_action" value="座ってカメラの仰角を上げる"/>
+ </rows>
+ <rows name="spin_under_sitting" value="spin_under_sitting">
+ <columns name="lst_action" value="座ってカメラの仰角を下げる"/>
+ </rows>
+ <rows name="spin_around_ccw_sitting" value="spin_around_ccw_sitting">
+ <columns name="lst_action" tool_tip="座った状態で対象に対して、カメラを反時計回りに回します。" value="座って反時計回り"/>
+ </rows>
+ <rows name="spin_around_cw_sitting" value="spin_around_cw_sitting">
+ <columns name="lst_action" tool_tip="座った状態で対象に対して、カメラを時計回りに回します。" value="座って時計回り"/>
+ </rows>
+</contents>
diff --git a/indra/newview/skins/default/xui/ja/control_table_contents_columns_basic.xml b/indra/newview/skins/default/xui/ja/control_table_contents_columns_basic.xml
new file mode 100644
index 0000000000..83f204648d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/control_table_contents_columns_basic.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<contents>
+ <columns label="アクション" name="lst_action"/>
+ <columns label="優先コントロール" name="lst_ctrl1"/>
+ <columns label="代わり1" name="lst_ctrl2"/>
+ <columns label="代わり2" name="lst_ctrl3"/>
+</contents>
diff --git a/indra/newview/skins/default/xui/ja/control_table_contents_editing.xml b/indra/newview/skins/default/xui/ja/control_table_contents_editing.xml
new file mode 100644
index 0000000000..3842a92db9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/control_table_contents_editing.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<contents>
+ <rows enabled="false" name="editing_actions" value="">
+ <columns label="編集中" name="lst_action" value="Tool_Dozer"/>
+ </rows>
+ <rows name="edit_avatar_spin_ccw" value="edit_avatar_spin_ccw">
+ <columns name="lst_action" tool_tip="アバターを中心にカメラを反時計回りに回します。" value="反時計回り"/>
+ </rows>
+ <rows name="edit_avatar_spin_cw" value="edit_avatar_spin_cw">
+ <columns name="lst_action" tool_tip="アバターを中心にカメラを時計回りに回します。" value="時計回り"/>
+ </rows>
+ <rows name="edit_avatar_spin_over" value="edit_avatar_spin_over">
+ <columns name="lst_action" tool_tip="アバターに対するカメラの仰角を上げます。" value="カメラの仰角を上げる"/>
+ </rows>
+ <rows name="edit_avatar_spin_under" value="edit_avatar_spin_under">
+ <columns name="lst_action" tool_tip="アバターに対するカメラの仰角を下げます。" value="カメラの仰角を下げる"/>
+ </rows>
+ <rows name="edit_avatar_move_forward" value="edit_avatar_move_forward">
+ <columns name="lst_action" value="カメラを近づける"/>
+ </rows>
+ <rows name="edit_avatar_move_backward" value="edit_avatar_move_backward">
+ <columns name="lst_action" value="カメラを遠ざける"/>
+ </rows>
+</contents>
diff --git a/indra/newview/skins/default/xui/ja/control_table_contents_media.xml b/indra/newview/skins/default/xui/ja/control_table_contents_media.xml
new file mode 100644
index 0000000000..00d19b81a3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/control_table_contents_media.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<contents>
+ <rows enabled="false" name="media_actions" value="">
+ <columns type="icontext" label="サウンドとメディア" name="lst_action" value="Audio_Press"/>
+ </rows>
+ <rows name="toggle_pause_media" value="toggle_pause_media">
+ <columns name="lst_action" value="メディアの再生/停止"/>
+ </rows>
+ <rows name="toggle_enable_media" value="toggle_enable_media">
+ <columns name="lst_action" value="全てのメディアを再生/停止"/>
+ </rows>
+ <rows name="voice_follow_key" value="voice_follow_key">
+ <columns name="lst_action" value="ボイスチャット"/>
+ </rows>
+ <rows name="toggle_voice" value="toggle_voice">
+ <columns name="lst_action" value="ボイスチャット切り替え"/>
+ </rows>
+ <rows name="start_chat" value="start_chat">
+ <columns name="lst_action" value="チャットを開始"/>
+ </rows>
+ <rows name="start_gesture" value="start_gesture">
+ <columns name="lst_action" value="ジェスチャーを開始"/>
+ </rows>
+ <rows name="script_trigger_lbutton" value="script_trigger_lbutton">
+ <columns name="lst_action" value="インタラクト(左クリックスクリプト)"/>
+ </rows>
+</contents>
diff --git a/indra/newview/skins/default/xui/ja/control_table_contents_movement.xml b/indra/newview/skins/default/xui/ja/control_table_contents_movement.xml
new file mode 100644
index 0000000000..4f1cd7d9e7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/control_table_contents_movement.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<contents>
+ <rows name="move_actions" value="">
+ <columns type="icontext" label="移動アクション" name="lst_action" value="Move_Walk_Off"/>
+ </rows>
+ <rows name="walk_to" value="walk_to">
+ <columns name="lst_action" tool_tip="マウスカーソルが指している場所に向かって歩きます。" value="移動先"/>
+ </rows>
+ <rows name="teleport_to" value="teleport_to">
+ <columns name="lst_action" tool_tip="マウスカーソルが指す場所にテレポートしますが、すべての場所において、必ずしも直接テレポートできるとは限らないため、代わりに目的地の近くにテレポートする場合があります。" value="テレポートする"/>
+ </rows>
+ <rows name="push_forward" value="push_forward">
+ <columns name="lst_action" value="前に移動"/>
+ </rows>
+ <rows name="push_backward" value="push_backward">
+ <columns name="lst_action" value="後ろに移動"/>
+ </rows>
+ <rows name="turn_left" value="turn_left">
+ <columns name="lst_action" value="左を向いて移動"/>
+ </rows>
+ <rows name="turn_right" value="turn_right">
+ <columns name="lst_action" value="右を向いて移動"/>
+ </rows>
+ <rows name="slide_left" value="slide_left">
+ <columns name="lst_action" value="左へ平行移動"/>
+ </rows>
+ <rows name="slide_right" value="slide_right">
+ <columns name="lst_action" value="右へ平行移動"/>
+ </rows>
+ <rows name="jump" value="jump">
+ <columns name="lst_action" value="ジャンプ/飛行"/>
+ </rows>
+ <rows name="push_down" value="push_down">
+ <columns name="lst_action" value="下降"/>
+ </rows>
+ <rows name="run_forward" value="run_forward">
+ <columns name="lst_action" value="前に走る"/>
+ </rows>
+ <rows name="run_backward" value="run_backward">
+ <columns name="lst_action" value="後ろに走る"/>
+ </rows>
+ <rows name="run_left" value="run_left">
+ <columns name="lst_action" value="左に走る"/>
+ </rows>
+ <rows name="run_right" value="run_right">
+ <columns name="lst_action" value="右に走る"/>
+ </rows>
+ <rows name="toggle_run" value="toggle_run">
+ <columns name="lst_action" value="常時走行切り替え"/>
+ </rows>
+ <rows name="toggle_fly" value="toggle_fly">
+ <columns name="lst_action" value="飛行/停止切り替え"/>
+ </rows>
+ <rows name="toggle_sit" value="toggle_sit">
+ <columns name="lst_action" value="座る/立つ"/>
+ </rows>
+ <rows name="stop_moving" value="stop_moving">
+ <columns name="lst_action" value="立ち止まる"/>
+ </rows>
+</contents>
diff --git a/indra/newview/skins/default/xui/ja/floater_360capture.xml b/indra/newview/skins/default/xui/ja/floater_360capture.xml
new file mode 100644
index 0000000000..d0a6eef0e0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_360capture.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="360capture" title="360度Sショット">
+ <panel name="ui_panel_left">
+ <text name="quality_level_label">
+ 品質
+ </text>
+ <radio_group name="360_quality_selection">
+ <radio_item label="プレビュー(高速)" name="preview_quality" tool_tip="プレビュー程度の品質"/>
+ <radio_item label="通常" name="medium_quality" value="512" tool_tip="通常品質"/>
+ <radio_item label="高" name="high_quality" value="1024" tool_tip="高品質"/>
+ <radio_item label="最高品位" name="maximum_quality" value="2048" tool_tip="最高品質"/>
+ </radio_group>
+ <check_box label="アバターをすべて隠す" name="360_hide_avatar"/>
+ <button label="360度画像を作成" name="capture_button"/>
+ <button label="名前をつけて保存…" name="save_local_button"/>
+ </panel>
+ <panel name="ui_panel_right">
+ <web_browser name="360capture_contents"/>
+ <text name="statusbar">
+ クリックとドラッグで視点変更
+ </text>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_aaa.xml b/indra/newview/skins/default/xui/ja/floater_aaa.xml
new file mode 100644
index 0000000000..91fb4f4662
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_aaa.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Test Floater" title="フローターのテスト">
+ <text left="0" follows="left|top|bottom" top="5" clip_partial="true" bottom="-5" width="100" valign="top">
+ ここに
+記載される
+なんらかの
+テキストは
+上部に
+寄せられて
+います
+ </text>
+ <text left_pad="5" follows="left|top|bottom" top="5" bottom="-5" clip_partial="true" width="100" valign="center">
+ ここに
+記載される
+なんらかの
+テキストは
+中央に
+寄せられて
+います
+ </text>
+ <text left_pad="5" follows="left|top|bottom" top="5" clip_partial="true" bottom="-5" width="100" valign="bottom">
+ ここに
+記載される
+なんらかの
+テキストは
+下部に
+寄せられて
+います
+ </text>
+ <text_editor left_pad="5" follows="left|top|bottom" top="5" clip_partial="true" bottom="-5" width="100" valign="top">
+ ここに
+記載される
+なんらかの
+テキストは
+上部に
+寄せられて
+います
+ </text_editor>
+ <text_editor left_pad="5" follows="left|top|bottom" top="5" bottom="-5" clip_partial="true" width="100" valign="center">
+ ここに
+記載される
+なんらかの
+テキストは
+中央に
+寄せられて
+います
+ </text_editor>
+ <text_editor left_pad="5" follows="left|top|bottom" top="5" clip_partial="true" bottom="-5" width="100" valign="bottom">
+ ここに
+記載される
+なんらかの
+テキストは
+下部に
+寄せられて
+います
+ </text_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_about.xml b/indra/newview/skins/default/xui/ja/floater_about.xml
index 22a65003d3..12d763be37 100644
--- a/indra/newview/skins/default/xui/ja/floater_about.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about.xml
@@ -1,17 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="[CAPITALIZED_APP_NAME] について">
+<floater name="floater_about" title="[CAPITALIZED_APP_NAME]について">
<tab_container name="about_tab">
<panel label="情報" name="support_panel">
- <button label="クリップボードにコピー" name="copy_btn"/>
- <button label="アップデートを確認" name="update_btn"/>
+ <button label="コピー" name="copy_btn"/>
+ <button label="更新の確認" name="update_btn"/>
</panel>
<panel label="クレジット" name="credits_panel">
- <text name="linden_intro">Second Life の提供元: Lindens の、
-オープンソースの提供:</text>
- <text_editor name="contrib_names">Dummy Name は実行時間に置き換え</text_editor>
+ <text name="linden_intro">
+ Second Life は Lindens によって開発され、以下のオープンソースの貢献があります:
+ </text>
+ <text_editor name="contrib_names">
+ Dummy Nameは実行時間に置き換えられます。
+ </text_editor>
</panel>
<panel label="ライセンス" name="licenses_panel">
- <text_editor name="licenses_editor">3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion
+ <text_editor name="licenses_editor">
+ 3Dconnexion SDK Copyright (C) 1992-2009 3Dconnexion
APR Copyright (C) 2011 The Apache Software Foundation
Collada DOM Copyright 2006 Sony Computer Entertainment Inc.
cURL Copyright (C) 1996-2010, Daniel Stenberg, (daniel@haxx.se)
@@ -23,6 +27,7 @@ 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.
+meshoptimizer Copyright (c) 2016-2021 Arseny Kapoulkine
ogg/vorbis Copyright (C) 2002, Xiphophorus
OpenSSL Copyright (C) 1998-2008 The OpenSSL Project.
PCRE Copyright (c) 1997-2012 University of Cambridge
@@ -32,13 +37,16 @@ xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
xxHash Copyright (C) 2012-2020 Yann Collet.
zlib Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler.
-Second Life ビューワでは Havok (TM) Physics が使用されています。(c)Copyright 1999-2010 Havok.com Inc. (and its Licensors).無断複写・複製・転載を禁じます。詳細については www.havok.com をご参照ください。
+Second Life ビューアでは Havok (TM) Physics が使用されています。
+(c)Copyright 1999-2010 Havok.com Inc. (and its Licensors).
+無断複写・複製・転載を禁じます。詳細については www.havok.com をご参照ください。
-このソフトウェアには、NVIDIA Corporation によるソースコードが含まれます。
+このソフトウェアには、NVIDIA Corporationによるソースコードが含まれます。
無断複写・複製・転載を禁じます。詳細については licenses.txt をご参照ください。
-ボイスチャットのオーディオコーディング:Polycom(R) Siren14(TM) (ITU-T Rec.G.722.1 Annex C)</text_editor>
+ボイスチャットのオーディオコーディング: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/ja/floater_about_land.xml b/indra/newview/skins/default/xui/ja/floater_about_land.xml
index 4703dfaa34..7da5f41f90 100644
--- a/indra/newview/skins/default/xui/ja/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about_land.xml
@@ -1,28 +1,28 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floaterland" title="土地情報">
<floater.string name="maturity_icon_general">
- &quot;Parcel_PG_Dark&quot;
+ "Parcel_PG_Dark"
</floater.string>
<floater.string name="maturity_icon_moderate">
- &quot;Parcel_M_Dark&quot;
+ "Parcel_M_Dark"
</floater.string>
<floater.string name="maturity_icon_adult">
- &quot;Parcel_R_Dark&quot;
+ "Parcel_R_Dark"
</floater.string>
<floater.string name="Hours">
- [HOURS] 時間
+ [HOURS]時間
</floater.string>
<floater.string name="Hour">
時間
</floater.string>
<floater.string name="Minutes">
- [MINUTES] 分
+ [MINUTES]分
</floater.string>
<floater.string name="Minute">
</floater.string>
<floater.string name="Seconds">
- [SECONDS] 秒
+ [SECONDS]秒
</floater.string>
<floater.string name="Remaining">
残り
@@ -42,10 +42,10 @@
面積:
</panel.string>
<panel.string name="area_size_text">
- [AREA] 平方メートル
+ [AREA]㎡
</panel.string>
<panel.string name="auction_id_text">
- オークション ID: [ID]
+ オークションID:[ID]
</panel.string>
<panel.string name="need_tier_to_modify">
この土地を修正変更するには、購入を承認する必要があります。
@@ -72,7 +72,7 @@
区画が選択されていません。
</panel.string>
<panel.string name="time_stamp_template">
- [year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ [year,datetime,local]年[mth,datetime,local]月[day,datetime,local]日[wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
</panel.string>
<text name="Name:">
名前:
@@ -85,7 +85,7 @@
種類:
</text>
<text name="LandTypeText">
- メインランド/ホームステッド
+ メインランド/入植地
</text>
<text name="ContentRating">
区分:
@@ -99,9 +99,9 @@
<text name="Group:">
グループ:
</text>
- <button label="設定" label_selected="設定..." name="Set..."/>
+ <button label="設定" label_selected="設定…" name="Set..."/>
<check_box label="グループへの譲渡を許可" name="check deed" tool_tip="グループのオフィサーはこの土地をグループに譲渡できます。グループの土地割り当てによってサポートされます。"/>
- <button label="譲渡" label_selected="譲渡..." name="Deed..." tool_tip="選択したグループのオフィサーのみ、土地を譲渡できます。"/>
+ <button label="譲渡" label_selected="譲渡…" name="Deed..." tool_tip="選択したグループのオフィサーのみ、土地を譲渡できます。"/>
<check_box label="所有者が譲渡と共に寄付" name="check contrib" tool_tip="土地がグループに譲渡されるとき、前の所有者は譲渡が成立するよう、十分な土地を寄付します。"/>
<text name="For Sale:">
販売の有無:
@@ -110,9 +110,9 @@
販売対象外
</text>
<text name="For Sale: Price L$[PRICE].">
- 価格: L$ [PRICE] (L$ [PRICE_PER_SQM] / 平方メートル)
+ 価格:L$ [PRICE](L$ [PRICE_PER_SQM]/㎡)
</text>
- <button label="土地を売る" label_selected="土地を販売..." name="Sell Land..."/>
+ <button label="土地を売る" label_selected="土地を販売…" name="Sell Land..."/>
<text name="For sale to">
販売先:[BUYER]
</text>
@@ -133,35 +133,34 @@
面積:
</text>
<text name="PriceText">
- 4048 m²
+ 4048m²
</text>
<text name="Traffic:">
- 交通量:
+ トラフィック:
</text>
<text name="DwellText">
- ローディング...
+ 読み込んでいます…
</text>
- <button label="土地の購入" label_selected="土地を購入..." left="130" name="Buy Land..." width="100"/>
+ <button label="土地の購入" label_selected="土地を購入…" name="Buy Land..."/>
<button label="リンデンセール" label_selected="Linden セール..." name="Linden Sale..." tool_tip="土地が所有されており、コンテンツが設定されている必要があります。オークションの対象になっていないことも必要条件です。"/>
- <button label="スクリプト情報" name="Scripts..." width="100"/>
- <button label="グループに購入" label_selected="グループ用に購入..." name="Buy For Group..."/>
- <button label="入場許可を購入" label_selected="入場許可を購入..." left="130" name="Buy Pass..." tool_tip="この土地への一時的なアクセスを許可します。" width="100"/>
- <button label="土地の放棄" label_selected="土地を放棄..." name="Abandon Land..."/>
- <button label="土地を取り戻す" label_selected="土地の返還を要求..." name="Reclaim Land..."/>
+ <button label="スクリプト情報…" name="Scripts..."/>
+ <button label="グループに購入" label_selected="グループ用に購入…" name="Buy For Group..."/>
+ <button label="入場許可を購入" label_selected="入場許可を購入…" name="Buy Pass..." tool_tip="この土地への一時的なアクセスを許可します。"/>
+ <button label="土地の放棄" label_selected="土地を放棄…" name="Abandon Land..."/>
+ <button label="土地を取り戻す" label_selected="土地の返還を要求…" name="Reclaim Land..."/>
</panel>
<panel label="約款" name="land_covenant_panel">
<panel.string name="can_resell">
- このリージョン(地域)で購入した土地は、再販できます。
+ このリージョン(地域)で購入した土地は、再販することができます。
</panel.string>
<panel.string name="can_not_resell">
- このリージョン(地域)で購入した土地は、再販できないことがあります。
+ このリージョン(地域)で購入した土地は、再販することができないことがあります。
</panel.string>
<panel.string name="can_change">
- このリージョン(地域)で購入した土地は、統合または再分割できます。
+ このリージョン(地域)で購入した土地は、結合や再分割することができます。
</panel.string>
<panel.string name="can_not_change">
- このリージョン(地域)で購入した土地は、統合・再分割できないことがあります。
-あります。
+ このリージョン(地域)で購入した土地は、結合や再分割することができないことがあります。
</panel.string>
<text font="SansSerifLarge" name="estate_section_lbl">
不動産:
@@ -179,7 +178,7 @@
この不動産には約款がありません。
</text_editor>
<text name="covenant_timestamp_text">
- 最後の更新1969年12月31日水曜日16:00:00
+ 最後更新:1969年12月31日水曜日 16:00:00
</text>
<text font="SansSerifLarge" name="region_section_lbl">
地域:
@@ -191,7 +190,7 @@
種類:
</text>
<text name="region_landtype_text">
- メインランド/ホームステッド
+ メインランド/入植地
</text>
<text name="region_maturity_lbl">
区分:
@@ -214,40 +213,40 @@
</panel>
<panel label="オブジェクト" name="land_objects_panel">
<panel.string name="objects_available_text">
- [MAX] の内 [COUNT]([AVAILABLE] 利用可能)
+ [MAX]個中[COUNT]個([AVAILABLE]個が利用可能)
</panel.string>
<panel.string name="objects_deleted_text">
- [MAX] の内 [COUNT]([DELETED] を削除)
+ [MAX]個中[COUNT]個([DELETED]個を削除しました)
</panel.string>
<text name="parcel_object_bonus">
- オブジェクトボーナス: [BONUS]
+ オブジェクトボーナス:[BONUS]個
</text>
<text name="Simulator primitive usage:">
- リージョン(地域)の許容数:
+ リージョン全体の最大プリム数:
</text>
<text name="objects_available">
- [MAX] の内 [COUNT] ([AVAILABLE] 利用可能)
+ [MAX]個中[COUNT]個([AVAILABLE]個が利用可能)
</text>
<text name="Primitives parcel supports:">
- 区画の許容数:
+ 区画で利用可能な最大プリム数:
</text>
<text name="object_contrib_text">
- [COUNT]
+ [COUNT]個
</text>
<text name="Primitives on parcel:">
- 区画の負荷:
+ 区画で使用中のプリム数:
</text>
<text name="total_objects_text">
- [COUNT]
+ [COUNT]個
</text>
<text name="Owned by parcel owner:">
- 区画所有者の所有物:
+ うち区画所有者のプリム数:
</text>
<text name="owner_objects_text">
- [COUNT]
+ [COUNT]個
</text>
<button label="表示" label_selected="表示" name="ShowOwner"/>
- <button label="返却" label_selected="返却..." name="ReturnOwner..." tool_tip="オブジェクトを所有者に返却します"/>
+ <button label="返却" label_selected="返却…" name="ReturnOwner..." tool_tip="オブジェクトを所有者に返却します"/>
<text name="Set to group:">
グループに設定:
</text>
@@ -255,30 +254,30 @@
[COUNT]
</text>
<button label="表示" label_selected="表示" name="ShowGroup"/>
- <button label="返却" label_selected="返却..." name="ReturnGroup..." tool_tip="オブジェクトを所有者に返却します"/>
+ <button label="返却" label_selected="返却…" name="ReturnGroup..." tool_tip="オブジェクトを所有者に返却します"/>
<text name="Owned by others:">
他人の所有物:
</text>
<text name="other_objects_text">
- [COUNT]
+ [COUNT]個
</text>
<button label="表示" label_selected="表示" name="ShowOther"/>
- <button label="返却" label_selected="返却..." name="ReturnOther..." tool_tip="オブジェクトを所有者に返却します"/>
+ <button label="返却" label_selected="返却…" name="ReturnOther..." tool_tip="オブジェクトを所有者に返却します"/>
<text name="Selected / sat upon:">
- 選択済み・決定済み:
+ 選択済み/決定済み:
</text>
<text name="selected_objects_text">
- [COUNT]
+ [COUNT]個
</text>
<text name="Autoreturn">
- 他人のオブジェクトを自動返却(分単位、0 で自動返却なし):
+ 他者のオブジェクトの自動返却(分単位、0で自動返却なし):
</text>
- <line_editor left_delta="5" name="clean other time"/>
+ <line_editor name="clean other time"/>
<text name="Object Owners:">
オブジェクトの所有者:
</text>
<button label="リスト更新" label_selected="リスト更新" name="Refresh List" tool_tip="オブジェクトのリストを更新します"/>
- <button label="オブジェクトを返却する" label_selected="オブジェクトの返却..." name="Return objects..."/>
+ <button label="オブジェクトを返却する" label_selected="オブジェクトの返却…" name="Return objects..."/>
<name_list label="カウント" name="owner list">
<name_list.columns label="タイプ" name="type"/>
<name_list.columns name="online_status"/>
@@ -292,7 +291,7 @@
この区画を検索結果に表示する
</panel.string>
<panel.string name="search_disabled_small_tooltip">
- 区画面積が 128 平方メートルかそれ以下のため、このオプションは無効です。
+ 区画面積が128㎡未満のため、このオプションは無効です。
大きな区画のみ検索に表示させることが可能です。
</panel.string>
<panel.string name="search_disabled_permissions_tooltip">
@@ -317,7 +316,7 @@
プッシュ禁止
</panel.string>
<panel.string name="push_restrict_region_text">
- プッシュ禁止 (地域設定優先)
+ プッシュ禁止 (リージョン設定優先)
</panel.string>
<text name="allow_label">
他の住人への許可:
@@ -325,34 +324,34 @@
<text name="allow_label0">
飛行:
</text>
- <check_box label="全員" name="check fly" tool_tip="チェックを入れるとこの土地での飛行が可能となります。チェックを外すと土地に入る際と通り過ぎるときのみ飛行可能となります。"/>
+ <check_box label="全員" name="check fly" tool_tip="チェックを入れると、この土地での飛行が可能となります。このチェックを外すと、土地に入る時や通過する時のみ飛行可能となります。"/>
<text name="allow_label2">
制作:
</text>
- <check_box label="全員" name="edit objects check" tool_tip="このオプションを選択すると、住人はあなたの土地でオブジェクトの制作や rez ができます。"/>
- <check_box label="グループ" name="edit group objects check" tool_tip="このオプションを選択すると、区画のグループメンバーは、あなたの土地でオブジェクトの制作や rez ができます。"/>
+ <check_box label="全員" name="edit objects check" tool_tip="このオプションを選択すると、住人があなたの土地でオブジェクトの制作や、rezすることができるようになります。"/>
+ <check_box label="グループ" name="edit group objects check" tool_tip="このオプションを選択すると、区画のグループメンバーが、あなたの土地でオブジェクトの制作やrezができるようになります。"/>
<text name="allow_label3">
オブジェクトの進入:
</text>
- <check_box label="全員" name="all object entry check" tool_tip="このオプションを選択すると、住人は他の区画にあるオブジェクトをこの区画に移動することが可能です。"/>
- <check_box label="グループ" name="group object entry check" tool_tip="このオプションを選択すると、区画のグループメンバーは他の区画にあるオブジェクトをこの区画に移動することが可能です。"/>
+ <check_box label="全員" name="all object entry check" tool_tip="このオプションを選択すると、住人が他の区画にあるオブジェクトをこの区画へ移動することができるようになります。"/>
+ <check_box label="グループ" name="group object entry check" tool_tip="このオプションを選択すると、区画のグループメンバーが、他の区画にあるオブジェクトからこの区画へ移動することができるようになります。"/>
<text name="allow_label4">
スクリプトの実行:
</text>
- <check_box label="全員" name="check other scripts" tool_tip="このオプションを選択すると、住人はアタッチメントなどのスクリプトをあなたの区画で実行できます。"/>
- <check_box label="グループ" name="check group scripts" tool_tip="このオプションを選択すると、区画のグループメンバーは、アタッチメントなどのスクリプトをあなたの区画で実行できます。"/>
- <check_box label="安全(ダメージなし)" name="check safe" tool_tip="チェックを入れるとこの土地でのダメージコンバットが無効になり、「安全」に設定されます。 チェックを外すとダメージコンバットが有効になります。"/>
- <check_box label="プッシュ禁止" name="PushRestrictCheck" tool_tip="スクリプトによるプッシュを禁止します。 このオプションを選択することにより、あなたの土地での破壊的行動を防ぐことができます。"/>
- <check_box label="検索に区画を表示(週 L$ 30)" name="ShowDirectoryCheck" tool_tip="この区画を検索結果に表示します"/>
+ <check_box label="全員" name="check other scripts" tool_tip="このオプションを選択すると、住人が装着物などのスクリプトの実行をあなたの区画でえるようになります。"/>
+ <check_box label="グループ" name="check group scripts" tool_tip="このオプションを選択すると、区画のグループメンバーは、装着物などのスクリプトの実行をあなたの区画で行えるようになります。"/>
+ <check_box label="安全(ダメージなし)" name="check safe" tool_tip="このチェックを入れると、この土地での戦闘行為が無効になり、「安全」に設定されます。チェックを外すと戦闘行為が有効になります。"/>
+ <check_box label="プッシュ禁止" name="PushRestrictCheck" tool_tip="スクリプトによるプッシュを禁止します。このオプションを選択することにより、あなたの土地での破壊的行動を防ぐことができます。"/>
+ <check_box label="検索に区画を表示(週L$ 30)" name="ShowDirectoryCheck" tool_tip="この区画を検索結果に表示します。"/>
<combo_box name="land category">
<combo_box.item label="全カテゴリ" name="item0"/>
- <combo_box.item label="Linden 所在地" name="item1"/>
- <combo_box.item label="アート&amp;カルチャー" name="item3"/>
+ <combo_box.item label="Linden所在地" name="item1"/>
+ <combo_box.item label="芸術と文化" name="item3"/>
<combo_box.item label="ビジネス" name="item4"/>
<combo_box.item label="教育的" name="item5"/>
<combo_box.item label="ゲーム" name="item6"/>
<combo_box.item label="たまり場" name="item7"/>
- <combo_box.item label="新住人に好意的" name="item8"/>
+ <combo_box.item label="新住民歓迎" name="item8"/>
<combo_box.item label="公園と自然" name="item9"/>
<combo_box.item label="住宅用" name="item10"/>
<combo_box.item label="ショッピング" name="item11"/>
@@ -363,30 +362,30 @@
<text name="Snapshot:">
スナップショット:
</text>
- <texture_picker label="" name="snapshot_ctrl" tool_tip="写真をクリックして選択"/>
+ <texture_picker label="" name="snapshot_ctrl" tool_tip="画像をクリックして選択"/>
<text name="allow_see_label">
- 他の区画にいるアバターがこの区画にいるアバターに会ってチャットできます
+ 別の区画にいるアバターが、この区画にいるアバターとチャットできるようになります。
</text>
- <check_box label="アバターを表示" name="SeeAvatarsCheck" tool_tip="他の区画のアバターが、この区画にいるアバターに会ってチャットすることを許可し、あなたもそれらアバターに会ってチャットできるようにします。"/>
+ <check_box label="アバターを表示" name="SeeAvatarsCheck" tool_tip="別の区画のアバターが、この区画にいるアバターとチャットすることを許可し、あなたもそれらアバターに会ってチャットできるようにします。"/>
<text name="landing_point">
- 着地点: [LANDING]
+ ランディング地点:[LANDING]
</text>
- <button label="設定" label_selected="設定" name="Set" tool_tip="訪問者の着地点の設定を行います。この区画内に立って行ってください。"/>
- <button label="クリア" label_selected="クリア" name="Clear" tool_tip="着地点をクリア"/>
+ <button label="設定" label_selected="設定" name="Set" tool_tip="訪問者が最初に訪れる場所の設定を行います。この区画内に立って行ってください。"/>
+ <button label="クリア" label_selected="クリア" name="Clear" tool_tip="ランディング地点をクリアする。"/>
<text name="Teleport Routing: ">
テレポート経路:
</text>
- <combo_box name="landing type" tool_tip="テレポート経路 -- あなたの土地へのテレポート経路を選択">
+ <combo_box name="landing type" tool_tip="テレポート経路-あなたの土地へのテレポート経路を選択してください。">
<combo_box.item label="不可" name="Blocked"/>
- <combo_box.item label="着地点" name="LandingPoint"/>
- <combo_box.item label="どこでも" name="Anywhere"/>
+ <combo_box.item label="ランディング地点のみ" name="LandingPoint"/>
+ <combo_box.item label="どこでも可能" name="Anywhere"/>
</combo_box>
</panel>
<panel label="メディア" name="land_media_panel">
<text name="with media:">
種類:
</text>
- <combo_box name="media type" tool_tip="URL が動画、Web ページ、その他のメディアかを指定します"/>
+ <combo_box name="media type" tool_tip="動画や、Webページ、その他のメディアのURLを指定します。"/>
<text name="at URL:">
ホームページ:
</text>
@@ -394,31 +393,31 @@
<text name="Description:">
説明:
</text>
- <line_editor name="url_description" tool_tip="「再生」「ロード」ボタンの隣に表示されるテキストです"/>
+ <line_editor name="url_description" tool_tip="「再生」「読み込み」ボタンの隣に表示されるテキストです。"/>
<text name="Media texture:">
- テクスチャ置き換え:
+ テクスチャの差し替え:
</text>
- <texture_picker label="" left="120" name="media texture" tool_tip="写真をクリックして選択"/>
- <text name="replace_texture_help" width="290">
- このテクスチャを使用するオブジェクトの「再生」をクリックすると、動画や Web ページを表示します。 テクスチャを変更するにはサムネイルを選択してください。
+ <texture_picker label="" name="media texture" tool_tip="画像をクリックして選択"/>
+ <text name="replace_texture_help">
+ このテクスチャを使用するオブジェクトの「再生」をクリックすると、動画やWebページを表示します。テクスチャを変更するにはサムネイルを選択してください。
</text>
- <check_box label="スケールを自動設定" name="media_auto_scale" tool_tip="このオプションをチェックすると、この区画のコンテンツのスケールが自動的に設定されます。 動作速度と画質が少し低下することがありますが、他のテクスチャのスケーリングや整列が必要になることはありません。"/>
- <text name="media_size" tool_tip="レンダリングする Web メディアのサイズです。デフォルトの 0 のままにします。">
+ <check_box label="スケールを自動設定" name="media_auto_scale" tool_tip="このオプションをチェックすると、この区画のコンテンツのスケールが自動的に設定されます。動作速度と画質が少し低下することがありますが、他のテクスチャのスケーリングや整列が必要になることはありません。"/>
+ <text name="media_size" tool_tip="レンダリングするWebメディアのサイズです。デフォルトの0のままにします。">
サイズ:
</text>
- <spinner name="media_size_width" tool_tip="レンダリングする Web メディアのサイズです。デフォルトの 0 のままにします。"/>
- <spinner name="media_size_height" tool_tip="レンダリングする Web メディアのサイズです。デフォルトの 0 のままにします。"/>
+ <spinner name="media_size_width" tool_tip="レンダリングするWebメディアのサイズです。デフォルトの0のままにします。"/>
+ <spinner name="media_size_height" tool_tip="レンダリングするWebメディアのサイズです。デフォルトの0のままにします。"/>
<text name="pixels">
ピクセル
</text>
<text name="Options:">
オプション:
</text>
- <check_box label="ループ" name="media_loop" tool_tip="メディアをループ再生します。 メディアの再生が終わったら、最初から再生し直します。"/>
+ <check_box label="ループ" name="media_loop" tool_tip="メディアをループ再生します。メディアの再生が終わったら、最初から再生し直します。"/>
</panel>
<panel label="サウンド" name="land_audio_panel">
<text name="MusicURL:">
- 音楽 URL:
+ 音楽URL:
</text>
<text name="Sound:">
サウンド:
@@ -432,21 +431,21 @@
<text name="Voice settings:">
ボイス:
</text>
- <check_box label="ボイスを有効にする" name="parcel_enable_voice_channel"/>
- <check_box label="ボイスを有効にする(不動産設定)" name="parcel_enable_voice_channel_is_estate_disabled"/>
- <check_box label="ボイスをこの区画に限定する" name="parcel_enable_voice_channel_local"/>
+ <check_box label="ボイスチャットを有効にする" name="parcel_enable_voice_channel"/>
+ <check_box label="ボイスチャットを有効にする(不動産設定)" name="parcel_enable_voice_channel_is_estate_disabled"/>
+ <check_box label="ボイスチャットをこの区画内に限定する" name="parcel_enable_voice_channel_local"/>
</panel>
<panel label="アクセス" name="land_access_panel">
<panel.string name="access_estate_defined">
- (エステートに限定)
+ (不動産に限定)
</panel.string>
<panel.string name="estate_override">
- 1 つ以上のオプションが、不動産レベルで設定されています。
+ 1つ以上のオプションが、不動産レベルで設定されています。
</panel.string>
<check_box label="誰でも訪問可(このオプションをオフにすると立入禁止ラインが作成されます)" name="public_access"/>
- <check_box label="18 歳以上である必要があります [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="この区画にアクセスするには、18 才以上でなければなりません。詳細については、[SUPPORT_SITE] をご覧ください。"/>
- <check_box label="支払情報が登録されている必要があります [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="支払情報が登録されていないと、この区画にアクセスすることはできません。詳細については、[SUPPORT_SITE] をご覧ください。"/>
- <check_box label="制約なしにグループ [GROUP] を許可する" name="GroupCheck" tool_tip="「一般」タブで、グループを選択してください。"/>
+ <check_box label="18歳以上である必要があります。[ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="この区画にアクセスするには、18歳以上でなければなりません。詳細につきましては、[SUPPORT_SITE]をご覧になってください。"/>
+ <check_box label="支払情報が登録されている必要があります。[ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="アカウントに支払情報が登録されていない場合、この区画にアクセスすることはできません。詳細につきましては、[SUPPORT_SITE]をご覧になってください。"/>
+ <check_box label="制約なしにグループ[GROUP]を許可する。" name="GroupCheck" tool_tip="「一般」タブで、グループを選択してください。"/>
<check_box label="入場許可を販売:" name="PassCheck" tool_tip="この区画への一時的なアクセスを許可します。"/>
<combo_box name="pass_combo">
<combo_box.item label="誰でも" name="Anyone"/>
@@ -455,21 +454,21 @@
<spinner label="価格(L$):" name="PriceSpin"/>
<spinner label="アクセス時間:" name="HoursSpin"/>
<text name="OwnerLimited">
- (不動産所有者がこのオプションに制約を与えている場合があります)
+ (不動産所有者が、このオプションに制約を与えている場合があります)
</text>
<panel name="Allowed_layout_panel">
<text label="常に許可" name="AllowedText">
- 常に許可する ([COUNT] 人、最大 [MAX] 人)
+ 常に許可する人([COUNT]人、最大[MAX]人)
</text>
- <name_list name="AccessList" tool_tip="(合計[LISTED] 人、最大 [MAX] 人)"/>
+ <name_list name="AccessList" tool_tip="(合計[LISTED]人、最大[MAX]人)"/>
<button label="追加" name="add_allowed"/>
<button label="削除" label_selected="削除" name="remove_allowed"/>
</panel>
<panel name="Banned_layout_panel">
- <text label="禁止" name="BanCheck">
- 禁止する ([COUNT] 人、最大 [MAX] 人)
+ <text label="バン" name="BanCheck">
+ バンした人([COUNT]人、最大[MAX]人)
</text>
- <name_list name="BannedList" tool_tip="(合計 [LISTED] 人、最大 [MAX] 人)">
+ <name_list name="BannedList" tool_tip="(合計[LISTED]人、最大[MAX]人)">
<columns label="名前" name="name"/>
<columns label="期間" name="duration"/>
</name_list>
diff --git a/indra/newview/skins/default/xui/ja/floater_activeim.xml b/indra/newview/skins/default/xui/ja/floater_activeim.xml
index 1c743e1fd2..c953c2e8d0 100644
--- a/indra/newview/skins/default/xui/ja/floater_activeim.xml
+++ b/indra/newview/skins/default/xui/ja/floater_activeim.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_activeim" title="アクティブな IM"/>
+<floater name="floater_activeim" title="有効なIM"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/floater_add_payment_method.xml b/indra/newview/skins/default/xui/ja/floater_add_payment_method.xml
new file mode 100644
index 0000000000..fb2cd37cc3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_add_payment_method.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_add_payment_method">
+ <floater.string name="continue_url">
+ https://secondlife.com/my/lindex/buy.php?associate_for_viewer=1&amp;lang=ja-JP
+ </floater.string>
+ <panel label="wrapper_panel" name="wrapper_panel">
+ <text name="title_txt">
+ 支払い方法を登録してリンデンドルを購入し、Second Lifeをもっと楽しみましょう。
+ </text>
+ <button label="始めましょう" name="continue_btn"/>
+ <button label="また後で"/>
+ <icon name="image_left"/>
+ <icon name="image_center"/>
+ <icon name="image_right"/>
+ <text name="image_left_desc">
+ お気に入りのアバターを作成しましょう。ストアやSecond Lifeマーケットプレイスにある何百万ものアイテムからお選びください。あなただけのスタイルがここにあります。
+ </text>
+ <text name="image_center_desc">
+ お気に入りのパフォーマーやホストに寄付をしましょう。あなたのサポートは、彼らが素晴らしい体験を生み出すのに役立ちます。
+ </text>
+ <text name="image_right_desc">
+ あなたの夢の家を作りましょう。何百万ものアイテムを購入できるので、あなただけの住まいを作ることができます。
+ </text>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_adjust_environment.xml b/indra/newview/skins/default/xui/ja/floater_adjust_environment.xml
index 6736dad336..75747d61a0 100644
--- a/indra/newview/skins/default/xui/ja/floater_adjust_environment.xml
+++ b/indra/newview/skins/default/xui/ja/floater_adjust_environment.xml
@@ -1,22 +1,106 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="env_adjust_snapshot" title="個人的な照明">
+<floater name="env_adjust_snapshot" title="個人的な光源">
<layout_stack name="outer_stack">
<layout_panel name="env_controls">
<layout_stack name="settings_stack">
<layout_panel>
- <button label="リセット" name="btn_reset" tool_tip="閉じて共有された環境にリセットする"/>
- <text name="cloud_map_label">
- 雲の画像:
+ <text>
+ 周辺:
</text>
+ <color_swatch name="ambient_light"/>
+ <text>
+ 青のホライズン:
+ </text>
+ <color_swatch name="blue_horizon"/>
+ <text>
+ 青の濃度:
+ </text>
+ <color_swatch name="blue_density"/>
+ <button label="リセット" tool_tip="閉じて共有された環境にリセットします。" name="btn_reset"/>
+ <text>
+ 太陽の色:
+ </text>
+ <color_swatch name="sun_color"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="0" top_pad="5" width="80">
+ 雲の色::
+ </text>
+ <color_swatch name="cloud_color"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="0" top_pad="10" name="cloud_map_label" width="80">
+ 雲の画像::
+ </text>
+ <texture_picker height="63" layout="topleft" left_delta="0" name="cloud_map" top_pad="5" width="60"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="0" top_pad="-13" name="cloud_map_label" width="80">
+ 水面の画像:
+ </text>
+ <texture_picker height="63" layout="topleft" left_delta="0" name="water_normal_map" top_pad="5" width="60"/>
</layout_panel>
- <layout_panel>
- <text name="label">
+ <layout_panel border="false" bevel_style="in" auto_resize="false" user_resize="false" visible="true" width="200" height="150">
+ <text follows="left|top" height="10" layout="topleft" left_delta="5" top_pad="5" width="80">
+ 靄のホライズン:
+ </text>
+ <slider decimal_digits="2" follows="left|top" height="16" increment="0.01" initial_value="0" layout="topleft" left_delta="5" min_val="0" max_val="5" name="haze_horizon" top_pad="5" width="185" can_edit_text="true"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="-5" top_pad="5" width="80">
+ 靄の濃度:
+ </text>
+ <slider decimal_digits="2" follows="left|top" height="16" increment="0.01" initial_value="0" layout="topleft" left_delta="5" min_val="0" max_val="5" name="haze_density" top_pad="5" width="185" can_edit_text="true"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="-5" top_pad="5" width="185">
+ 雲の量:
+ </text>
+ <slider decimal_digits="2" follows="left|top" height="16" increment="0.01" initial_value="0" layout="topleft" left_delta="5" min_val="0" max_val="1" name="cloud_coverage" top_pad="5" width="185" can_edit_text="true"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="-5" top_pad="5" width="185">
+ 雲のスケール:
+ </text>
+ <slider decimal_digits="2" follows="left|top" height="16" increment="0.01" initial_value="0" layout="topleft" left_delta="5" min_val="0.01" max_val="3" name="cloud_scale" top_pad="5" width="185" can_edit_text="true"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="-5" top_pad="15" width="80">
+ シーンのガンマ値:
+ </text>
+ <slider decimal_digits="2" follows="left|top" height="16" increment="0.01" initial_value="0" layout="topleft" left_delta="5" max_val="20" name="scene_gamma" top_pad="5" width="185" can_edit_text="true"/>
+ </layout_panel>
+ <layout_panel border="false" bevel_style="in" auto_resize="false" user_resize="false" height="150" width="310" min_height="0" visible="true">
+ <text follows="top|left" font="SansSerifBold" height="10" layout="topleft" name="label" left="5" top="5" width="105">
太陽:
</text>
- <check_box label="ビーコンを表示" name="sunbeacon"/>
+ <sun_moon_trackball name="sun_rotation" follows="left|top" left_delta="0" top_delta="20" height="150" width="150" thumb_mode="sun"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="0" top_pad="5" width="200">
+ 方位角:
+ </text>
+ <slider decimal_digits="2" follows="left|top" height="16" increment="0.01" initial_value="0" layout="topleft" left_delta="5" min_val="0" max_val="359.99" name="sun_azimuth" top_pad="5" width="130" can_edit_text="true"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="-5" top_pad="5" width="200">
+ 標高:
+ </text>
+ <slider decimal_digits="2" follows="left|top" height="16" increment="0.01" initial_value="0" layout="topleft" left_delta="5" min_val="-90" max_val="90" name="sun_elevation" top_pad="5" width="130" can_edit_text="true"/>
+ <check_box control_name="sunbeacon" width="60" height="16" label="ビーコンを表示" layout="topleft" name="sunbeacon" left_delta="-5" top_pad="8" follows="left|top"/>
+ <text follows="left|top" height="10" layout="topleft" left_pad="95" top="25" width="80">
+ スケール:
+ </text>
+ <slider decimal_digits="2" follows="left|top" height="16" increment="0.01" initial_value="0" layout="topleft" left_delta="5" min_val="0.25" max_val="20" name="sun_scale" top_delta="15" width="130" can_edit_text="true"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="-5" top_pad="5" width="100">
+ フォーカスの発光量:
+ </text>
+ <slider decimal_digits="2" follows="left|top" height="16" increment="0.01" initial_value="0" layout="topleft" left_delta="5" min_val="-2" max_val="2" name="glow_focus" top_pad="5" width="130" can_edit_text="true"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="-5" top_pad="5" width="200">
+ グローサイズ:
+ </text>
+ <slider decimal_digits="2" follows="left|top" height="16" increment="0.01" initial_value="0" layout="topleft" left_delta="5" min_val="0" max_val="1.99" name="glow_size" top_pad="5" width="130" can_edit_text="true"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="-5" top_pad="10" width="200">
+ 星の輝度:
+ </text>
+ <slider decimal_digits="2" follows="left|top" height="16" increment="0.01" initial_value="0" layout="topleft" left_delta="5" min_val="0" max_val="500" name="star_brightness" top_pad="5" width="130" can_edit_text="true"/>
</layout_panel>
- <layout_panel>
- <check_box label="ビーコンを表示" name="moonbeacon"/>
+ <layout_panel border="false" bevel_style="in" auto_resize="false" user_resize="false" height="150" width="160" min_height="0" visible="true">
+ <text follows="top|left" font="SansSerifBold" height="10" layout="topleft" name="label" left="5" top="5" width="105">
+ 月:
+ </text>
+ <sun_moon_trackball name="moon_rotation" follows="left|top" left_delta="0" top_delta="20" height="150" width="150" thumb_mode="moon"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="0" top_pad="5" width="200">
+ 方位角:
+ </text>
+ <slider decimal_digits="2" follows="left|top" height="16" increment="0.01" initial_value="0" layout="topleft" left_delta="5" min_val="0" max_val="359.99" name="moon_azimuth" top_pad="5" width="130" can_edit_text="true"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="-5" top_pad="5" width="200">
+ 標高:
+ </text>
+ <slider decimal_digits="2" follows="left|top" height="16" increment="0.01" initial_value="0" layout="topleft" left_delta="5" min_val="-90" max_val="90" name="moon_elevation" top_pad="5" width="130" can_edit_text="true"/>
+ <check_box control_name="moonbeacon" label="ビーコンを表示"/>
</layout_panel>
</layout_stack>
</layout_panel>
diff --git a/indra/newview/skins/default/xui/ja/floater_animation_anim_preview.xml b/indra/newview/skins/default/xui/ja/floater_animation_anim_preview.xml
index 2bada303ae..7dddd2c23d 100644
--- a/indra/newview/skins/default/xui/ja/floater_animation_anim_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_animation_anim_preview.xml
@@ -6,6 +6,6 @@
<text name="description_label">
説明:
</text>
- <button label="アップロード(L$[AMOUNT])" name="ok_btn"/>
- <button label="取り消し" label_selected="取り消し" name="cancel_btn"/>
+ <button label="アップロード(L$ [AMOUNT])" name="ok_btn"/>
+ <button label="キャンセル" label_selected="キャンセル" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_animation_bvh_preview.xml b/indra/newview/skins/default/xui/ja/floater_animation_bvh_preview.xml
index 20c7298462..15f4d42fd6 100644
--- a/indra/newview/skins/default/xui/ja/floater_animation_bvh_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_animation_bvh_preview.xml
@@ -4,13 +4,11 @@
動きを初期化できませんでした
</floater.string>
<floater.string name="anim_too_long">
- アニメーションファイルの長さは [LENGTH] 秒です。
-
-アニメーションの最大長は [MAX_LENGTH] 秒です。
+ このアニメーションファイルの長さは[LENGTH]秒です。
+アニメーションの最大長は[MAX_LENGTH]秒です。
</floater.string>
<floater.string name="failed_file_read">
アニメーションファイルを読み取れません。
-
[STATUS]
</floater.string>
<floater.string name="E_ST_OK">
@@ -23,22 +21,22 @@
制約定義を読み取れません。
</floater.string>
<floater.string name="E_ST_NO_FILE">
- BVH ファイルを開けません。
+ BVHファイルを開けません。
</floater.string>
<floater.string name="E_ST_NO_HIER">
- HIERARCHY ヘッダーが無効です。
+ HIERARCHYヘッダーが無効です。
</floater.string>
<floater.string name="E_ST_NO_JOINT">
- ROOT または JOINT が見つかりません。
+ ROOTまたはJOINTが見つかりません。
</floater.string>
<floater.string name="E_ST_NO_NAME">
- JOINT 名を取得できません。
+ JOINT名を取得できません。
</floater.string>
<floater.string name="E_ST_NO_OFFSET">
- OFFSET が見つかりません。
+ OFFSETが見つかりません。
</floater.string>
<floater.string name="E_ST_NO_CHANNELS">
- CHANNELS が見つかりません。
+ CHANNELSが見つかりません。
</floater.string>
<floater.string name="E_ST_NO_ROTATION">
回転順序を取得できません。
@@ -77,34 +75,34 @@
変換相対値を読み取れません。
</floater.string>
<floater.string name="E_ST_NO_XLT_OUTNAME">
- 変換 outname 値を読み取れません。
+ 変換outname値を読み取れません。
</floater.string>
<floater.string name="E_ST_NO_XLT_MATRIX">
変換行列を読み取れません。
</floater.string>
<floater.string name="E_ST_NO_XLT_MERGECHILD">
- Mergechild 名を取得できません。
+ Mergechild名を取得できません。
</floater.string>
<floater.string name="E_ST_NO_XLT_MERGEPARENT">
- Mergeparent 名を取得できません。
+ Mergeparent名を取得できません。
</floater.string>
<floater.string name="E_ST_NO_XLT_PRIORITY">
- priority 値を取得できません。
+ priority値を取得できません。
</floater.string>
<floater.string name="E_ST_NO_XLT_LOOP">
- loop 値を取得できません。
+ loop値を取得できません。
</floater.string>
<floater.string name="E_ST_NO_XLT_EASEIN">
- easeln 値を取得できません。
+ easeln値を取得できません。
</floater.string>
<floater.string name="E_ST_NO_XLT_EASEOUT">
- easeOut 値を取得できません。
+ easeOut値を取得できません。
</floater.string>
<floater.string name="E_ST_NO_XLT_HAND">
- Hand morph 値を取得できません。
+ Hand morph値を取得できません。
</floater.string>
<floater.string name="E_ST_NO_XLT_EMOTE">
- emote 名を読みとれません。
+ emote名を読みとれません。
</floater.string>
<floater.string name="E_ST_BAD_ROOT">
ルートジョイント名が不正です。「hip」を使用してください。
@@ -171,16 +169,14 @@
<item label="座る" name="Sitting"/>
<item label="飛ぶ" name="Flying"/>
</combo_box>
- <spinner label="イーズイン(秒)" name="ease_in_time" tool_tip="アニメーションのブレンドイン時間(秒)"/>
- <spinner label="イーズアウト(秒)" name="ease_out_time" tool_tip="アニメーションのブレンドアウト時間(秒)"/>
- <button name="play_btn" tool_tip="アニメーションを再生する"/>
- <button name="pause_btn" tool_tip="アニメーションを一時停止する"/>
- <button name="stop_btn" tool_tip="アニメーションの再生を停止する"/>
+ <spinner label="イーズ・イン(秒)" name="ease_in_time" tool_tip="アニメーションのブレンドイン時間(秒)"/>
+ <spinner label="イーズ・アウト(秒)" name="ease_out_time" tool_tip="アニメーションのブレンドアウト時間(秒)"/>
+ <button name="play_btn" tool_tip="アニメーションを再生する。"/>
+ <button name="pause_btn" tool_tip="アニメーションを一時停止する。"/>
+ <button name="stop_btn" tool_tip="アニメーションの再生を停止する。"/>
<text name="bad_animation_text">
- アニメーションファイルを読み取れません。
-
-Poser 4 からエクスポートした BVH ファイルをお勧めします。
+ アニメーションファイルを読み取れません。Poser 4からエクスポートしたBVHファイルをお勧めします。
</text>
- <button label="アップロード(L$[AMOUNT])" name="ok_btn"/>
- <button label="取り消し" name="cancel_btn"/>
+ <button label="アップロード(L$ [AMOUNT])" name="ok_btn"/>
+ <button label="キャンセル" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_associate_listing.xml b/indra/newview/skins/default/xui/ja/floater_associate_listing.xml
index b106750a6f..00fe1059c8 100644
--- a/indra/newview/skins/default/xui/ja/floater_associate_listing.xml
+++ b/indra/newview/skins/default/xui/ja/floater_associate_listing.xml
@@ -1,7 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="associate listing" title="リストを関連付ける">
- <text name="message">リスト ID:</text>
- <line_editor name="listing_id">ここに ID を入力</line_editor>
- <button label="OK" name="OK"/>
- <button label="取り消し" name="Cancel"/>
+<floater name="associate listing" title="一覧の関連付け">
+ <text name="message">
+ 一覧ID:
+ </text>
+ <line_editor name="listing_id">
+ ここにIDを入力
+ </line_editor>
+ <button label="OK" name="OK"/>
+ <button label="キャンセル" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_autoreplace.xml b/indra/newview/skins/default/xui/ja/floater_autoreplace.xml
index cf75fa3372..e193505cab 100644
--- a/indra/newview/skins/default/xui/ja/floater_autoreplace.xml
+++ b/indra/newview/skins/default/xui/ja/floater_autoreplace.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="autoreplace_floater" title="自動置換設定">
<check_box label="自動置換を有効にする" name="autoreplace_enable" tool_tip="チャットテキストを入力するにつれて、入力したキーワードを対応する置換キーワードに置き換えます"/>
- <button label="リストをインポート..." name="autoreplace_import_list" tool_tip="以前にエクスポートしたリストをファイルからロードします。"/>
- <button label="リストをエクスポート..." name="autoreplace_export_list" tool_tip="選択したリストをファイルに保存して、共有できるようにします。"/>
- <button label="新規リスト..." name="autoreplace_new_list" tool_tip="新規リストを作成します。"/>
+ <button label="リストをインポート…" name="autoreplace_import_list" tool_tip="以前にエクスポートしたリストをファイルからロードします。"/>
+ <button label="リストをエクスポート…" name="autoreplace_export_list" tool_tip="選択したリストをファイルに保存して、共有できるようにします。"/>
+ <button label="新規リスト…" name="autoreplace_new_list" tool_tip="新規リストを作成します。"/>
<button label="リストを削除" name="autoreplace_delete_list" tool_tip="選択したリストを削除します。"/>
<button name="autoreplace_list_up" tool_tip="このリストの優先度を上げます。"/>
<button name="autoreplace_list_down" tool_tip="このリストの優先度を下げます。"/>
@@ -11,7 +11,7 @@
<scroll_list.columns label="キーワード" name="keyword"/>
<scroll_list.columns label="置換" name="replacement"/>
</scroll_list>
- <button label="追加..." name="autoreplace_add_entry"/>
+ <button label="追加…" name="autoreplace_add_entry"/>
<button label="削除" name="autoreplace_delete_entry"/>
<text name="autoreplace_keyword_txt">
キーワード:
@@ -21,18 +21,5 @@
</text>
<button label="エントリを保存" name="autoreplace_save_entry" tool_tip="このエントリを保存します。"/>
<button label="変更を保存" name="autoreplace_save_changes" tool_tip="変更をすべて保存します。"/>
- <button label="取り消し" name="autoreplace_cancel" tool_tip="変更をすべて破棄します。"/>
+ <button label="キャンセル" name="autoreplace_cancel" tool_tip="変更をすべて破棄します。"/>
</floater>
-<!--
- <text
- top_pad="10"
- left="10"
- height="16"
- width="260"
- follows="left|top"
- halign="center"
- mouse_opaque="true"
- name="autoreplace_text2">
- Entries
- </text>
--->
diff --git a/indra/newview/skins/default/xui/ja/floater_avatar.xml b/indra/newview/skins/default/xui/ja/floater_avatar.xml
index d289580506..acb22181f5 100644
--- a/indra/newview/skins/default/xui/ja/floater_avatar.xml
+++ b/indra/newview/skins/default/xui/ja/floater_avatar.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Avatar" title="アバターを選択"/>
+<floater name="Avatar" title="アバター選択"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml b/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml
index da2c9d1e58..8dd8aca32a 100644
--- a/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater min_width="275" name="avatarpicker" title="住人を選択" width="275">
+<floater name="avatarpicker" title="住人を選択">
<floater.string name="not_found">
「[TEXT]」は見つかりませんでした
</floater.string>
@@ -10,48 +10,51 @@
近くに誰もいません
</floater.string>
<floater.string name="no_results">
- 検索結果:ゼロ
+ 検索結果:なし
</floater.string>
<floater.string name="searching">
- 検索中...
+ 検索しています…
</floater.string>
- <string label="OK" label_selected="OK" name="Select">
+ <string label="OK" label_selected="OK" name="Select">
選択
</string>
<string name="Close">
閉じる
</string>
- <tab_container name="ResidentChooserTabs" width="265">
- <panel label="検索" name="SearchPanel" width="145">
+ <tab_container name="ResidentChooserTabs">
+ <panel label="検索" name="SearchPanel">
<text name="InstructSearchResidentName">
名前の一部を入力:
</text>
- <button label="検索" label_selected="検索" name="Find"/>
+ <line_editor name="Edit"/>
+ <button label="実行" label_selected="実行" name="Find"/>
<scroll_list name="SearchResults">
<columns label="名前" name="name"/>
- <columns label="ユーザー名" name="username"/>
+ <columns label="ユーザ名" name="username"/>
</scroll_list>
</panel>
<panel label="フレンド" name="FriendsPanel">
<text name="InstructSelectFriend">
- アバターを選択:
+ 人物を選択
</text>
+ <button name="RefreshFriends"/>
+ <scroll_list name="Friends"/>
</panel>
- <panel label="自分の近く" name="NearMePanel" width="145">
+ <panel label="近くにいる人" name="NearMePanel">
<text name="InstructSelectResident">
- 近くの人を選択:
+ 近くにいる人を選択:
</text>
<slider label="範囲" name="near_me_range"/>
- <text name="meters" width="50">
+ <text name="meters">
メートル
</text>
- <button label="リスト更新" label_selected="リスト更新" name="Refresh"/>
+ <button name="Refresh"/>
<scroll_list name="NearMe">
<columns label="名前" name="name"/>
- <columns label="ユーザー名" name="username"/>
+ <columns label="ユーザ名" name="username"/>
</scroll_list>
</panel>
</tab_container>
- <button label="OK" label_selected="OK" name="ok_btn"/>
+ <button label="OK" label_selected="OK" name="ok_btn"/>
<button label="キャンセル" label_selected="キャンセル" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_avatar_render_settings.xml b/indra/newview/skins/default/xui/ja/floater_avatar_render_settings.xml
index 0d16510c92..19e93ed51b 100644
--- a/indra/newview/skins/default/xui/ja/floater_avatar_render_settings.xml
+++ b/indra/newview/skins/default/xui/ja/floater_avatar_render_settings.xml
@@ -2,11 +2,11 @@
<floater name="floater_avatar_render_settings" title="アバターの描画設定">
<string name="av_never_render" value="使用しない"/>
<string name="av_always_render" value="常に使用する"/>
- <filter_editor label="人をフィルター" name="people_filter_input"/>
- <menu_button name="plus_btn" tool_tip="選択した人に対するアクション:"/>
<name_list name="render_settings_list">
<name_list.columns label="名前" name="name"/>
<name_list.columns label="描画設定" name="setting"/>
- <name_list.columns label="日付を追加" name="timestamp"/>
</name_list>
+ <panel name="add_subpanel">
+ <menu_button label="何かを追加…" name="plus_btn" tool_tip="選択した人物に対するアクション"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml b/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml
index 19b3be60b1..e71ed5c599 100644
--- a/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml
@@ -1,60 +1,65 @@
-<?xml version="1.0" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="avatar_texture_debug" title="アバターのテクスチャ">
- <floater.string name="InvalidAvatar">無効なアバター</floater.string>
+ <floater.string name="InvalidAvatar">
+ 無効なアバター
+ </floater.string>
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
- <text name="label">ベークド
-テクスチャ</text>
- <text name="composite_label">合成
-テクスチャ</text>
- <button label="ID をコンソールにダンプ" label_selected="ダンプ" name="Dump"/>
+ <text name="label">
+ ベークド
+テクスチャ
+ </text>
+ <text name="composite_label">
+ 合成テクスチャ
+ </text>
+ <button label="IDをコンソールにダンプ" label_selected="ダンプ" name="Dump"/>
<panel name="scroll_content_panel">
<texture_picker label="髪" name="hair-baked"/>
<texture_picker label="髪" name="hair_grain"/>
<texture_picker label="髪のアルファ" name="hair_alpha"/>
+ <texture_picker label="髪のタトゥ" name="hair_tattoo"/>
<texture_picker label="頭" name="head-baked"/>
<texture_picker label="メイクアップ" name="head_bodypaint"/>
<texture_picker label="頭部のアルファ" name="head_alpha"/>
- <texture_picker label="頭部のタトゥー" name="head_tattoo"/>
+ <texture_picker label="頭部のタトゥ" name="head_tattoo"/>
+ <texture_picker label="頭部全般のタトゥ" name="head_universal_tattoo"/>
<texture_picker label="目" name="eyes-baked"/>
<texture_picker label="目" name="eyes_iris"/>
<texture_picker label="目のアルファ" name="eyes_alpha"/>
+ <texture_picker label="目のタトゥ" name="eyes_tattoo"/>
<texture_picker label="上半身" name="upper-baked"/>
- <texture_picker label="ボディペイント(上)" name="upper_bodypaint"/>
- <texture_picker label="下着シャツ" name="upper_undershirt"/>
+ <texture_picker label="上半身のボディペイント" name="upper_bodypaint"/>
+ <texture_picker label="上半身の下着" name="upper_undershirt"/>
<texture_picker label="手袋" name="upper_gloves"/>
<texture_picker label="シャツ" name="upper_shirt"/>
<texture_picker label="上着" name="upper_jacket"/>
- <texture_picker label="アルファ(上)" name="upper_alpha"/>
- <texture_picker label="上部のタトゥー" name="upper_tattoo"/>
+ <texture_picker label="上半身のアルファ" name="upper_alpha"/>
+ <texture_picker label="上半身のタトゥ" name="upper_tattoo"/>
+ <texture_picker label="上半身全般のタトゥ" name="upper_universal_tattoo"/>
<texture_picker label="下半身" name="lower-baked"/>
- <texture_picker label="ボディペイント(下)" name="lower_bodypaint"/>
- <texture_picker label="下着パンツ" name="lower_underpants"/>
+ <texture_picker label="下半身のボディペイント" 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_pants"/>
<texture_picker label="ジャケット" name="lower_jacket"/>
- <texture_picker label="アルファ(下)" name="lower_alpha"/>
- <texture_picker label="下部のタトゥー" name="lower_tattoo"/>
+ <texture_picker label="下半身のアルファ" name="lower_alpha"/>
+ <texture_picker label="下半身のタトゥ" name="lower_tattoo"/>
<texture_picker label="スカート" name="skirt-baked"/>
<texture_picker label="スカート" name="skirt"/>
+ <texture_picker label="スカートのタトゥ" name="skirt_tattoo"/>
+ <texture_picker label="下半身全般のタトゥ" name="lower_universal_tattoo"/>
+ <texture_picker label="左腕" name="leftarm-baked"/>
+ <texture_picker label="左腕のタトゥ" name="leftarm_tattoo"/>
+ <texture_picker label="左足" name="leftleg-baked"/>
+ <texture_picker label="左足のタトゥ" name="leftleg_tattoo"/>
+ <texture_picker label="予備1" name="aux1-baked"/>
+ <texture_picker label="予備1タトゥ" name="aux1_tattoo"/>
+ <texture_picker label="予備2" name="aux2-baked"/>
+ <texture_picker label="予備2タトゥ" name="aux2_tattoo"/>
+ <texture_picker label="予備3" name="aux3-baked"/>
+ <texture_picker label="予備3タトゥ" name="aux3_tattoo"/>
</panel>
</panel>
- <texture_picker name="upper_universal_tattoo" label="上腕 タトゥー"/>
- <texture_picker name="aux1_tattoo" label="予備 1 タトゥー"/>
- <texture_picker name="leftarm-baked" label="左腕"/>
- <texture_picker name="aux1-baked" label="予備 1"/>
- <texture_picker name="skirt_tattoo" label="スカートタトゥー"/>
- <texture_picker name="aux2_tattoo" label="予備 2 タトゥー"/>
- <texture_picker name="eyes_tattoo" label="アイタトゥー"/>
- <texture_picker name="head_universal_tattoo" label="頭 Unv タトゥー"/>
- <texture_picker name="leftleg_tattoo" label="左脚タトゥー"/>
- <texture_picker name="aux3-baked" label="予備 3"/>
- <texture_picker name="hair_tattoo" label="ヘアータトゥー"/>
- <texture_picker name="leftleg-baked" label="左脚"/>
- <texture_picker name="aux2-baked" label="予備 2"/>
- <texture_picker name="aux3_tattoo" label="予備 3 タトゥー"/>
- <texture_picker name="leftarm_tattoo" label="左腕タトゥー"/>
- <texture_picker name="lower_universal_tattoo" label="下腕タトゥー"/>
</scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_ban_duration.xml b/indra/newview/skins/default/xui/ja/floater_ban_duration.xml
index a9d00b0116..479468c156 100644
--- a/indra/newview/skins/default/xui/ja/floater_ban_duration.xml
+++ b/indra/newview/skins/default/xui/ja/floater_ban_duration.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="ban_duration" title="禁止期間">
+<floater name="ban_duration" title="バン期間">
<text name="duration_textbox">
- 禁止期間:
+ バンする期間:
</text>
<radio_group name="ban_duration_radio">
<radio_item label="常時" name="always_radio">
diff --git a/indra/newview/skins/default/xui/ja/floater_beacons.xml b/indra/newview/skins/default/xui/ja/floater_beacons.xml
index cb3dae0644..f8b50b4bfa 100644
--- a/indra/newview/skins/default/xui/ja/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/ja/floater_beacons.xml
@@ -6,7 +6,7 @@
</text>
<check_box label="ビーコン(標識)" name="beacons"/>
<check_box label="ハイライト" name="highlights"/>
- <text name="beacon_width_label" tool_tip="ビーコン(標識)の幅">
+ <text name="beacon_width_label" tool_tip="ビーコンの幅">
幅:
</text>
<text name="label_objects">
@@ -18,6 +18,9 @@
<check_box label="音源" name="sounds"/>
<check_box label="パーティクル源" name="particles"/>
<check_box label="メディア源" name="moapbeacon"/>
+ <text name="label_objects">
+ 以下の向きを示す:
+ </text>
<check_box label="太陽" name="sun"/>
<check_box label="月" name="moon"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/floater_big_preview.xml b/indra/newview/skins/default/xui/ja/floater_big_preview.xml
index bb55db7a13..e88d6fc488 100644
--- a/indra/newview/skins/default/xui/ja/floater_big_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_big_preview.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_big_preview" title="プレビュー"/>
+<floater name="floater_big_preview" title="プレビュー"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/floater_build_options.xml b/indra/newview/skins/default/xui/ja/floater_build_options.xml
index 6865409e7a..783bd0278f 100644
--- a/indra/newview/skins/default/xui/ja/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/ja/floater_build_options.xml
@@ -7,13 +7,13 @@
ローカル
</floater.string>
<floater.string name="grid_world_text">
- 世界
+ ワールド
</floater.string>
<floater.string name="grid_reference_text">
リファレンス
</floater.string>
<floater.string name="grid_attachment_text">
- アタッチメント
+ 装着物
</floater.string>
<text name="grid_mode_label" tool_tip="グリッドの不透明度">
モード
diff --git a/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml b/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml
index fc9b35a34d..74f133ba79 100644
--- a/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml
@@ -1,23 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floaterbulkperms" title="コンテンツ権限を調整">
<floater.string name="nothing_to_modify_text">
- 選択した中に編集できないものが含まれています
+ 選択した中に編集できないものが含まれています。
</floater.string>
<floater.string name="status_text">
[NAME]に権限を設定中です。
</floater.string>
<floater.string name="start_text">
- 権限変更リクエストをしています
+ 権限変更リクエストをしています。
</floater.string>
<floater.string name="done_text">
- 権限変更リクエストが完了しました
+ 権限変更リクエストが完了しました。
</floater.string>
<check_box label="アニメーション" name="check_animation"/>
<icon name="icon_animation" tool_tip="アニメーション"/>
<check_box label="身体部位" name="check_bodypart"/>
<icon name="icon_bodypart" tool_tip="身体部位"/>
- <check_box label="服" name="check_clothing"/>
- <icon name="icon_clothing" tool_tip="衣類"/>
+ <check_box label="服装" name="check_clothing"/>
+ <icon name="icon_clothing" tool_tip="服装"/>
<check_box label="ジェスチャー" name="check_gesture"/>
<icon name="icon_gesture" tool_tip="ジェスチャー"/>
<check_box label="ノートカード" name="check_notecard"/>
@@ -49,8 +49,8 @@
</text>
<check_box label="修正" name="next_owner_modify" tool_tip="次の所有者は、アイテム名などのプロパティ内容を編集したり、このオブジェクトのサイズを変更することができます。"/>
<check_box label="コピー" name="next_owner_copy" tool_tip="次の所有者は、このオブジェクトを無制限にコピーできます。コピーには制作者の情報が含まれ、コピー元のアイテムと違って許可などに関し制限があります。"/>
- <check_box initial_value="true" label="再販・プレゼント" name="next_owner_transfer" tool_tip="次の所有者はこのオブジェクトを他人にあげたり再販できます。"/>
- <button label="OK" name="ok"/>
+ <check_box initial_value="true" label="再販・譲渡" name="next_owner_transfer" tool_tip="次の所有者はこのオブジェクトを他人にあげたり再販できます。"/>
+ <button label="OK" name="ok"/>
<button label="適用" name="apply"/>
<button label="キャンセル" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_bumps.xml b/indra/newview/skins/default/xui/ja/floater_bumps.xml
index 62f8a0669e..8cd9c0cff9 100644
--- a/indra/newview/skins/default/xui/ja/floater_bumps.xml
+++ b/indra/newview/skins/default/xui/ja/floater_bumps.xml
@@ -4,21 +4,21 @@
検出なし
</floater.string>
<floater.string name="bump">
- [TIME] [NAME] があなたに衝突しました
+ [TIME] [NAME]があなたに衝突しました。
</floater.string>
<floater.string name="llpushobject">
- [TIME] [NAME] がスクリプトであなたを押しました
+ [TIME] [NAME]がスクリプトであなたを押しました。
</floater.string>
<floater.string name="selected_object_collide">
- [TIME] [NAME] がオブジェクトであなたをたたきました
+ [TIME] [NAME]が、オブジェクトであなたを叩きました。
</floater.string>
<floater.string name="scripted_object_collide">
- [TIME] [NAME] がスクリプトのオブジェクトであなたをたたきました
+ [TIME] [NAME]が、スクリプトのオブジェクトであなたを叩きました。
</floater.string>
<floater.string name="physical_object_collide">
- [TIME] [NAME] が物理的オブジェクトであなたをたたきました
+ [TIME] [NAME]が、物理オブジェクトであなたを叩きました。
</floater.string>
<floater.string name="timeStr">
- [[hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt]]
+ [[hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt]]
</floater.string>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_contents.xml b/indra/newview/skins/default/xui/ja/floater_buy_contents.xml
index 7e4932c78f..152fd7e87a 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_contents.xml
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater min_width="340" name="floater_buy_contents" title="中身の購入" width="340">
- <text name="contains_text" width="320">
- &lt;nolink&gt;[NAME]&lt;/nolink&gt; に含まれるもの:
+<floater name="floater_buy_contents" title="中身の購入">
+ <text name="contains_text">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt;に含まれるもの:
</text>
- <scroll_list name="item_list" width="310"/>
- <text name="buy_text" width="320">
- 中身を [NAME] から L$[AMOUNT] で購入しますか?
+ <scroll_list name="item_list"/>
+ <text name="buy_text">
+ [NAME]から、L$ [AMOUNT]で購入しますか?
</text>
- <button label="取り消し" label_selected="取り消し" name="cancel_btn" width="73"/>
- <button label="購入" label_selected="購入" left_delta="-77" name="buy_btn" width="73"/>
- <check_box label="今すぐ着る" left_delta="-125" name="wear_check"/>
+ <button label="キャンセル" label_selected="キャンセル" name="cancel_btn"/>
+ <button label="購入" label_selected="購入" name="buy_btn"/>
+ <check_box label="今すぐ着る" name="wear_check"/>
<text name="no_copy_text">
(コピー不可)
</text>
@@ -17,6 +17,6 @@
(修正不可)
</text>
<text name="no_transfer_text">
- (再販・プレゼント不可)
+ (再販・譲渡不可)
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
index ac2db917cc..6e369671ca 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
@@ -1,65 +1,92 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="buy currency" title="L$ の購入">
+<floater title="L$の購入" name="buy currency">
<floater.string name="buy_currency">
- 約 [LOCALAMOUNT] で L$ [LINDENS] を購入
+ 約[LOCALAMOUNT]でL$ [LINDENS]を購入
</floater.string>
- <text name="info_need_more">
- L$ が足りません
- </text>
- <text name="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">
- 価格
- </text>
- <text name="currency_est">
- 約 [LOCALAMOUNT]
- </text>
- <text left_delta="3" name="getting_data">
- 見積もり中...
- </text>
- <text name="buy_action">
- [ACTION]
- </text>
- <text name="total_label">
- 購入後の残高
- </text>
- <text name="total_amount">
- L$ [AMT]
- </text>
- <text name="currency_links">
- [http://www.secondlife.com/my/account/payment_method_management.php 支払方法] | [http://www.secondlife.com/my/account/currency.php 通貨]
- </text>
- <text name="exchange_rate_note">
- 金額を再入力して最新換算レートを確認します。
- </text>
- <text name="purchase_warning_repurchase">
- この取引を決定すると、L$ を購入します。オブジェクトは購入しません。
- </text>
- <text name="purchase_warning_notenough">
- 購入しようとしている L$ が不足しています。 金額を上げてください。
- </text>
- <button label="購入する" name="buy_btn"/>
- <button label="取り消し" name="cancel_btn"/>
<floater.string name="info_cannot_buy">
- 購入できません
+ 購入できません。
</floater.string>
+ <floater.string name="estimated_zero">
+ US$ 0.00
+ </floater.string>
+ <icon name="normal_background"/>
+ <layout_stack name="outer_stack">
+ <layout_panel name="layout_panel_title">
+ <text name="info_need_more">
+ L$が足りません。
+ </text>
+ <text name="info_buying">
+ L$を購入
+ </text>
+ <view_border name="text_border"/>
+ </layout_panel>
+ <layout_panel name="layout_panel_price">
+ <text name="target_price_label">
+ 必要金額
+ </text>
+ <text name="target_price">
+ L$ [AMT]
+ </text>
+ </layout_panel>
+ <layout_panel name="layout_panel_balance">
+ <text name="balance_label">
+ 所持金
+ </text>
+ <text name="balance_amount">
+ L$ [AMT]
+ </text>
+ </layout_panel>
+ <layout_panel name="layout_panel_required">
+ <text name="required_label">
+ 必要最低金額
+ </text>
+ <text name="required_amount">
+ L$ [AMT]
+ </text>
+ </layout_panel>
+ <layout_panel name="layout_panel_action">
+ <view_border name="text_border_2"/>
+ <text name="currency_action">
+ 購入金額を選択
+ </text>
+ <text name="currency_label">
+ L$
+ </text>
+ <line_editor label="L$" name="currency_amt">
+ 1234
+ </line_editor>
+ <text name="currency_est">
+ 平均[LOCALAMOUNT]
+ </text>
+ <text name="getting_data">
+ 見積もり中…
+ </text>
+ <text name="total_label">
+ 購入後の残高
+ </text>
+ <text name="total_amount">
+ L$ [AMT]
+ </text>
+ </layout_panel>
+ <layout_panel name="layout_panel_msg">
+ <view_border name="text_border_3"/>
+ <text name="currency_links">
+ [https://accounts.secondlife.com/billing_information/ 支払い方法]|[https://www.secondlife.com/my/lindex/buy.php L$の購入]
+ </text>
+ <text name="exchange_rate_note">
+ 金額を再入力して、最新の為替レートを確認してください。
+ </text>
+ <text name="purchase_warning_repurchase">
+ L$ を受け取ったら、
+もう一度購入してください。
+ </text>
+ </layout_panel>
+ <layout_panel name="layout_panel_buttons">
+ <text name="contacting">
+ LindeXに接続中…
+ </text>
+ <button label="今すぐL$を購入" name="buy_btn"/>
+ <button label="キャンセル" name="cancel_btn"/>
+ </layout_panel>
+ </layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/ja/floater_buy_currency_html.xml
index 37fd6826e5..fc9c619be7 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_currency_html.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_currency_html.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_buy_currency_html" title="通貨の購入"/>
+<floater name="floater_buy_currency_html" title="通貨の購入"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_land.xml b/indra/newview/skins/default/xui/ja/floater_buy_land.xml
index 34f9d38de1..a99321a43f 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_land.xml
@@ -13,40 +13,39 @@
統合・再分割不可能
</floater.string>
<floater.string name="cant_buy_for_group">
- あなたはアクティブなグループ用の土地購入を許可されていません
+ あなたはアクティブなグループ用の土地購入を許可されていません。
</floater.string>
<floater.string name="no_land_selected">
- 土地が選択されていません
+ 土地が選択されていません。
</floater.string>
<floater.string name="multiple_parcels_selected">
- 複数の異なった区画を選択しました。
+ 複数の異なった区画を選択しました。
これより小さな範囲を選択してください。
</floater.string>
<floater.string name="no_permission">
- あなたはアクティブなグループ用の土地購入を許可されていません
+ あなたはアクティブなグループ用の土地購入を許可されていません。
</floater.string>
<floater.string name="parcel_not_for_sale">
- 選択された区画は販売対象外です
+ 選択された区画は販売対象外です。
</floater.string>
<floater.string name="group_already_owns">
- グループはすでにこの区画を所有しています
+ グループはすでにこの区画を所有しています。
</floater.string>
<floater.string name="you_already_own">
あなたはすでにこの区画を所有しています
</floater.string>
<floater.string name="set_to_sell_to_other">
- 選択された区画は、他の人への販売が決まっています
+ 選択された区画は、他の人への販売が決まっています。
</floater.string>
<floater.string name="no_public_land">
- 選択された地域に、公共の土地はありません
+ 選択された地域に、公共の土地はありません。
</floater.string>
<floater.string name="not_owned_by_you">
- 他の住人が所有する土地を選択しています。
+ 他の住人が所有する土地を選択しています。
もっと狭い範囲を選択してみてください。
</floater.string>
<floater.string name="processing">
- 購入処理中...
-
+ 購入処理中…
(数分かかることがあります)
</floater.string>
<floater.string name="fetching_error">
@@ -56,7 +55,7 @@
この土地を買うと:
</floater.string>
<floater.string name="buying_for_group">
- グループ用の土地を購入すると:
+ グループ用の土地の購入:
</floater.string>
<floater.string name="cannot_buy_now">
現在購入不可:
@@ -71,58 +70,58 @@
アカウントをアップグレードしないと、土地を所有できません
</floater.string>
<floater.string name="cant_own_land">
- あなたのアカウントで土地を所有できます
+ あなたのアカウントで土地を所有できます。
</floater.string>
<floater.string name="land_holdings">
- あなたは、[BUYER] 平方メートルの土地を所有しています。
+ あなたは、[BUYER]㎡の土地を所有しています。
</floater.string>
<floater.string name="pay_to_for_land">
- この土地の代金として、[SELLER]にL$[AMOUNT]を支払う
+ この土地の代金として、[SELLER]にL$[AMOUNT]を支払う。
</floater.string>
<floater.string name="buy_for_US">
- L$ [AMOUNT] を、約 [LOCAL_AMOUNT] で購入します。
+ L$[AMOUNT]を、約[LOCAL_AMOUNT]で購入します。
</floater.string>
<floater.string name="parcel_meters">
- この区画は [AMOUNT] 平方メートルです。
+ この区画は[AMOUNT]㎡です。
</floater.string>
<floater.string name="premium_land">
- この土地は割り増し付です。 [AMOUNT] 平方メートルの料金がかかります。
+ この土地は割り増し付です。[AMOUNT]㎡の料金がかかります。
</floater.string>
<floater.string name="discounted_land">
- この土地はディスカウントされています。 [AMOUNT] 平方メートルの料金がかかります。
+ この土地はディスカウントされています。[AMOUNT]㎡の料金がかかります。
</floater.string>
<floater.string name="meters_supports_object">
- [AMOUNT] 平方メートル
-オブジェクト [AMOUNT2] 個サポート
+ [AMOUNT]㎡
+オブジェクト[AMOUNT2]個サポート
</floater.string>
<floater.string name="sold_with_objects">
オブジェクト込みで販売
</floater.string>
<floater.string name="sold_without_objects">
- オブジェクトは含まれていません
+ オブジェクトは含まれていません。
</floater.string>
<floater.string name="info_price_string">
L$ [PRICE]
-(L$[PRICE_PER_SQM]/平方メートル)
+(L$ [PRICE_PER_SQM]/㎡)
[SOLD_WITH_OBJECTS]
</floater.string>
<floater.string name="insufficient_land_credits">
- この [GROUP] が区画の購入手続きを完了するには、 価格に見合うだけの寄付された土地の利用実績が必要です
+ この[GROUP]が区画の購入手続きを完了するには、価格に見合うだけの寄付された土地の利用実績が必要です。
</floater.string>
<floater.string name="have_enough_lindens">
- あなたの所持する L$ [AMOUNT]で、この土地を購入できます
+ あなたの現在の所持金L$ [AMOUNT]で、この土地を購入できます。
</floater.string>
<floater.string name="not_enough_lindens">
- あなたの所持金は L$ [AMOUNT]だけで、あとL$ [AMOUNT2] 必要です
+ あなたの現在の所持金は、L$ [AMOUNT]で、L$ [AMOUNT2]不足しています。
</floater.string>
<floater.string name="balance_left">
- 購入後、あなたの残額はL$[AMOUNT]になります
+ 購入後、残額はL$ [AMOUNT]になります。
</floater.string>
<floater.string name="balance_needed">
- この土地を買うには、少なくとも L$ [AMOUNT] を購入する必要があります
+ この土地を買うには、少なくともL$ [AMOUNT]購入する必要があります。
</floater.string>
<floater.string name="no_parcel_selected">
- (区画が選定されていません)
+ (区画が選定されていません)
</floater.string>
<text name="region_name_label">
地域:
@@ -149,20 +148,20 @@
(不明)
</text>
<text name="resellable_changeable_label">
- この地域で購入した土地:
+ このリージョン(地域)で購入した土地:
</text>
- <text left="460" name="resellable_clause">
+ <text name="resellable_clause">
再販できる場合とできない場合があります。
</text>
- <text left="460" name="changeable_clause">
+ <text name="changeable_clause">
統合または再分割できる場合とできない場合があります。
</text>
<text name="covenant_text">
不動産約款に同意してください:
</text>
- <text left="470" name="covenant_timestamp_text"/>
+ <text name="covenant_timestamp_text"/>
<text_editor name="covenant_editor">
- ロード中...
+ 読み込んでいます…。
</text_editor>
<check_box label="上記の約款に同意します" name="agree_covenant"/>
<text name="info_parcel_label">
@@ -175,14 +174,14 @@
サイズ:
</text>
<text bottom_delta="-37" height="48" name="info_size">
- 1024 平方メートル
+ 1024㎡
</text>
<text name="info_price_label">
価格:
</text>
<text name="info_price">
L$ 1500
-(L$ 1.1/平方メートル)
+(L$ 1.1/㎡)
オブジェクトも土地販売価格に含まれます
</text>
<text name="info_action">
@@ -193,28 +192,27 @@
</text>
<button label="Webサイトに移動" name="error_web"/>
<text name="account_action">
- プレミアム会員にアップグレード
+ プレミアム会員にアップグレードする
</text>
<text name="account_reason">
- 土地を保有できるのはプレミアム会員だけです
+ 土地を保有できるのはプレミアム会員だけです。
</text>
<combo_box name="account_level">
- <combo_box.item label="月額 9.95米ドル、 月払い" name="US$9.95/month,billedmonthly"/>
- <combo_box.item label="月額 7.50米ドル、 年4回3ヶ月毎" name="US$7.50/month,billedquarterly"/>
- <combo_box.item label="月額 6.00米ドル、 年間一括払い" name="US$6.00/month,billedannually"/>
+ <combo_box.item label="月額9.95米ドル、月払い" name="US$9.95/month,billedmonthly"/>
+ <combo_box.item label="月額7.50米ドル、四半期払い" name="US$7.50/month,billedquarterly"/>
+ <combo_box.item label="月額6.00米ドル、年間一括払い" name="US$6.00/month,billedannually"/>
</combo_box>
<text name="land_use_action">
- 毎月の土地使用料をUS$40に引き上げます
+ 毎月の土地使用料をUS $40に引き上げます
</text>
<text name="land_use_reason">
- あなたは 1309 平方メートルの土地を所有しています。
-この区画の大きさは、512 平方メートルです。
+ あなたは、1309㎡の土地を所有しています。この区画の大きさは、512㎡です。
</text>
<text name="purchase_action">
- Joe ResidentにL$4000支払って土地を購入
+ Joe ResidentにL$ 4000支払って土地を購入
</text>
<text name="currency_reason">
- 所持金は L$2,100です。
+ 所持金は、L$ 2,100です。
</text>
<text name="currency_action">
追加でL$の購入
@@ -223,12 +221,12 @@
1000
</line_editor>
<text name="currency_est">
- 約 [LOCAL_AMOUNT]
+ 約[LOCAL_AMOUNT]
</text>
<text name="currency_balance">
- 所持金は L$2,100です。
+ 所持金はL$ 2,100です。
</text>
- <check_box label="グループから [AMOUNT] 平方メートルの貢献を取り除きます。" name="remove_contribution"/>
+ <check_box label="グループから[AMOUNT]㎡の貢献を取り除きます。" name="remove_contribution"/>
<button label="購入" name="buy_btn"/>
- <button label="取り消し" name="cancel_btn"/>
+ <button label="キャンセル" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_object.xml b/indra/newview/skins/default/xui/ja/floater_buy_object.xml
index ce269df6da..e3fb13be0a 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_object.xml
@@ -4,7 +4,7 @@
購入
</floater.string>
<floater.string name="title_buy_copy_text">
- 次のものを購入
+ 以下を購入:
</floater.string>
<floater.string name="no_copy_text">
(コピー不可)
@@ -13,17 +13,17 @@
(修正不可)
</floater.string>
<floater.string name="no_transfer_text">
- (再販・プレゼント不可)
+ (再販・譲渡不可)
</floater.string>
<text name="contents_text">
中身:
</text>
<text name="buy_text">
- 次の売り手から L$[AMOUNT] で購入:
+ 次の売り手から L$ [AMOUNT]で購入:
</text>
<text name="buy_name_text">
- [NAME]?
+ [NAME]?
</text>
<button label="購入" label_selected="購入" name="buy_btn"/>
- <button label="取消" label_selected="取消" name="cancel_btn"/>
+ <button label="キャンセル" label_selected="キャンセル" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_camera.xml b/indra/newview/skins/default/xui/ja/floater_camera.xml
index a690fbd844..38de4374ac 100644
--- a/indra/newview/skins/default/xui/ja/floater_camera.xml
+++ b/indra/newview/skins/default/xui/ja/floater_camera.xml
@@ -1,45 +1,43 @@
-<?xml version="1.0" ?>
-<floater name="camera_floater" title="カメラのコントロール">
- <floater.string name="rotate_tooltip">フォーカスを中心にカメラを回転</floater.string>
- <floater.string name="zoom_tooltip">フォーカスに向けてカメラをズーム</floater.string>
- <floater.string name="move_tooltip">カメラを上下左右に移動</floater.string>
- <floater.string name="free_mode_title">オブジェクトを見る</floater.string>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="camera_floater" help_topic="camera_floater" title="カメラ操作">
+ <floater.string name="rotate_tooltip">
+ 対象を中心にカメラを回す
+ </floater.string>
+ <floater.string name="zoom_tooltip">
+ 対象にカメラをズーム
+ </floater.string>
+ <floater.string name="move_tooltip">
+ カメラを上下左右に移動
+ </floater.string>
+ <floater.string name="free_mode_title">
+ オブジェクト視点
+ </floater.string>
+ <string name="inactive_combo_text">
+ プリセットを使用
+ </string>
<panel name="controls">
- <panel name="preset_views_list">
- <panel_camera_item name="front_view" tool_tip="前側">
- <panel_camera_item.text name="front_view_text">前方視界</panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="group_view" tool_tip="側面">
- <panel_camera_item.text name="side_view_text">グループ視界</panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="rear_view" tool_tip="後側">
- <panel_camera_item.text name="rear_view_text">後方視界</panel_camera_item.text>
- </panel_camera_item>
+ <panel name="zoom">
+ <joystick_rotate name="cam_rotate_stick" tool_tip="対象にカメラを追尾"/>
+ <button name="zoom_plus_btn"/>
+ <slider_bar tool_tip="対象にカメラをズーム"/>
+ <button name="zoom_minus_btn"/>
+ <joystick_track tool_tip="カメラを上下左右に動かします。"/>
+ <text name="precise_ctrs_label">
+ 数値で角度方位を指定
+ </text>
</panel>
- <panel name="camera_modes_list">
- <panel_camera_item name="object_view" tool_tip="オブジェクトビュー">
- <panel_camera_item.text name="object_view_text">オブジェクト視点</panel_camera_item.text>
- </panel_camera_item>
- <panel_camera_item name="mouselook_view" tool_tip="マウスルックビュー">
- <panel_camera_item.text name="mouselook_view_text">一人称視点</panel_camera_item.text>
- </panel_camera_item>
- </panel>
- <panel name="zoom" tool_tip="向いている方法にカメラをズーム">
- <joystick_rotate name="cam_rotate_stick" tool_tip="自分を軸にカメラを回す"/>
- <slider_bar name="zoom_slider" tool_tip="向いている方向にカメラをズーム"/>
- <joystick_track name="cam_track_stick" tool_tip="カメラを上下左右に動かします"/>
- </panel>
- <text name="precise_ctrs_label">精密制御を使用する</text>
- </panel>
- <panel name="buttons">
- <button label="" name="presets_btn" tool_tip="事前設定の視野"/>
- <button label="" name="pan_btn" tool_tip="旋回 - ズーム - 水平・垂直移動"/>
- <button label="" name="avatarview_btn" tool_tip="カメラモード"/>
</panel>
<panel name="buttons_panel">
- <button name="gear_btn" tool_tip="カメラプリセット"/>
- <button name="save_preset_btn" label="プリセットとして保存する..."/>
- <combo_box.item name="Use preset" label="プリセットを使用する"/>
+ <panel_camera_item name="front_view" tool_tip="前方視界"/>
+ <panel_camera_item name="group_view" tool_tip="斜方視界"/>
+ <panel_camera_item name="rear_view" tool_tip="後方視界"/>
+ <panel_camera_item name="object_view" tool_tip="オブジェクト視点"/>
+ <panel_camera_item name="mouselook_view" tool_tip="マウスルックビュー"/>
+ <combo_box name="preset_combo">
+ <combo_list mouse_wheel_opaque="true"/>
+ <combo_box.item label="プリセットを使用" name="Use preset" value="default"/>
+ </combo_box>
+ <button name="gear_btn" tool_tip="カメラのプリセット"/>
+ <button label="プリセットを保存…" name="save_preset_btn"/>
</panel>
- <combo_box name="preset_combo"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_camera_presets.xml b/indra/newview/skins/default/xui/ja/floater_camera_presets.xml
index d394c0547c..7b643feb24 100644
--- a/indra/newview/skins/default/xui/ja/floater_camera_presets.xml
+++ b/indra/newview/skins/default/xui/ja/floater_camera_presets.xml
@@ -1,2 +1,4 @@
-<?xml version="1.0" ?>
-<floater name="floater_camera_presets" title="カメラプリセット"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater title="カメラのプリセット" name="floater_camera_presets">
+ <flat_list_view name="preset_list"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_chat_bar.xml b/indra/newview/skins/default/xui/ja/floater_chat_bar.xml
deleted file mode 100644
index 9f5df6fb85..0000000000
--- a/indra/newview/skins/default/xui/ja/floater_chat_bar.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="nearby_chat" title="近くのチャット">
- <panel name="bottom_panel">
- <line_editor label="ここをクリックしてチャットを開始します。" name="chat_box" tool_tip="Enter キーを押して話し、Ctrl + Enter キーで叫びます。"/>
- <button name="show_nearby_chat" tool_tip="近くのチャットログを表示/非表示"/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_choose_group.xml b/indra/newview/skins/default/xui/ja/floater_choose_group.xml
index 7d91cb69ed..1fe04626aa 100644
--- a/indra/newview/skins/default/xui/ja/floater_choose_group.xml
+++ b/indra/newview/skins/default/xui/ja/floater_choose_group.xml
@@ -3,6 +3,6 @@
<text name="groupdesc">
グループを選択:
</text>
- <button label="OK" label_selected="OK" name="OK"/>
- <button label="取り消し" label_selected="取り消し" name="Cancel"/>
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="キャンセル" label_selected="キャンセル" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_classified.xml b/indra/newview/skins/default/xui/ja/floater_classified.xml
new file mode 100644
index 0000000000..a83463de00
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_classified.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_classified" title="クラシファイド広告">
+ <panel name="main_panel" filename="panel_classified_info.xml"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_color_picker.xml b/indra/newview/skins/default/xui/ja/floater_color_picker.xml
index dc87d27a15..814dd24df1 100644
--- a/indra/newview/skins/default/xui/ja/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/ja/floater_color_picker.xml
@@ -1,31 +1,57 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="ColorPicker" title="カラーピッカー">
- <text name="r_val_text">
- 赤:
- </text>
- <text name="g_val_text">
- 緑:
- </text>
- <text name="b_val_text">
- 青:
- </text>
+ <tab_container name="color_type_container">
+ <panel name="RGB" label="RGB">
+ <text name="r_val_text">
+ 赤:
+ </text>
+ <spinner name="rspin"/>
+ <text name="g_val_text">
+ 緑:
+ </text>
+ <spinner name="gspin"/>
+ <text name="b_val_text">
+ 青:
+ </text>
+ <spinner name="bspin"/>
+ </panel>
+ <panel name="LSL" label="LSL">
+ <text name="r_val_text_float">
+ 赤:
+ </text>
+ <spinner decimal_digits="3" name="rspin_float"/>
+ <text name="g_val_text_float">
+ 緑:
+ </text>
+ <spinner decimal_digits="3" name="gspin_float"/>
+ <text name="b_val_text_float">
+ 青:
+ </text>
+ <spinner decimal_digits="3" name="bspin_float"/>
+ </panel>
+ </tab_container>
<text name="h_val_text">
色相:
</text>
+ <spinner name="hspin"/>
<text name="s_val_text">
- 色調:
+ 彩度:
</text>
+ <spinner name="sspin"/>
<text name="l_val_text">
輝度:
</text>
+ <spinner name="lspin"/>
+ <text name="hex_text">
+ Hex #
+ </text>
+ <line_editor name="hex_value"/>
<check_box label="すぐ適用" name="apply_immediate"/>
- <button label="" label_selected="" name="color_pipette"/>
- <button label="取り消し" label_selected="取り消し" name="cancel_btn"/>
- <button label="OK" label_selected="OK" name="select_btn"/>
- <text name="Current color:">
+ <button name="color_pipette"/>
+ <button label="OK" name="select_btn"/>
+ <button label="キャンセル" label_selected="キャンセル" name="cancel_btn"/>
+ <text tool_tip="パレットの下にドラッグして保存" name="Current color:">
現在の色:
</text>
- <text name="(Drag below to save.)">
- (下にドラッグして保存)
- </text>
+ <menu_button menu_filename="menu_copy_color_picker.xml" name="clipboard_color" tool_tip="色のコピー時のオプション"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_conversation_log.xml b/indra/newview/skins/default/xui/ja/floater_conversation_log.xml
index 98b1a59a0d..3742030dff 100644
--- a/indra/newview/skins/default/xui/ja/floater_conversation_log.xml
+++ b/indra/newview/skins/default/xui/ja/floater_conversation_log.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_conversation_log" title="会話ログ">
<panel name="buttons_panel">
- <filter_editor label="人をフィルター" name="people_filter_input"/>
- <menu_button name="conversation_view_btn" tool_tip="表示 / 並べ替えのオプション"/>
+ <filter_editor label="人物をフィルタ" name="people_filter_input"/>
+ <menu_button name="conversation_view_btn" tool_tip="表示/並べ替えのオプション"/>
<menu_button name="conversations_gear_btn" tool_tip="選択した住人・グループに対するアクション"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_conversation_preview.xml b/indra/newview/skins/default/xui/ja/floater_conversation_preview.xml
index ea0b23de48..da6e0ea364 100644
--- a/indra/newview/skins/default/xui/ja/floater_conversation_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_conversation_preview.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview_conversation" title="会話:">
+<floater name="preview_conversation" title="会話:">
<floater.string name="Title">
- 会話:[NAME]
+ 会話:[NAME]
</floater.string>
<text name="page_label" value="ページ"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_create_landmark.xml b/indra/newview/skins/default/xui/ja/floater_create_landmark.xml
new file mode 100644
index 0000000000..da39d4917d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_create_landmark.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="create_landmark" title="ランドマーク作成">
+ <string name="favorites_bar">
+ お気に入りバー
+ </string>
+ <text name="title_label" value="ランドマークの追加"/>
+ <text name="name_label" value="名前"/>
+ <line_editor name="title_editor"/>
+ <text name="folder_label" value="ランドマークの保存先:"/>
+ <combo_box name="folder_combo"/>
+ <text name="new_folder_textbox">
+ [secondlife:/// フォルダを作成]
+ </text>
+ <text name="notes_label" value="私のノート"/>
+ <text_editor name="notes_editor"/>
+ <button label="OK" name="ok_btn"/>
+ <button label="キャンセル" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_critical.xml b/indra/newview/skins/default/xui/ja/floater_critical.xml
index f69c24622a..0ca8971a5b 100644
--- a/indra/newview/skins/default/xui/ja/floater_critical.xml
+++ b/indra/newview/skins/default/xui/ja/floater_critical.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="modal container" title=" ">
- <button label="続行" label_selected="続行" name="Continue" />
- <button label="取り消し" label_selected="取り消し" name="Cancel" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container">
+ <button label="続行" label_selected="続行" name="Continue"/>
+ <button label="キャンセル" label_selected="キャンセル" name="Cancel"/>
<text name="tos_title">
- クリティカルメッセージ
+ 重要なメッセージ
</text>
<text name="tos_heading">
次のメッセージを注意してよくお読みください。
diff --git a/indra/newview/skins/default/xui/ja/floater_delete_pref_preset.xml b/indra/newview/skins/default/xui/ja/floater_delete_pref_preset.xml
index 50e508ad40..9cb93619dc 100644
--- a/indra/newview/skins/default/xui/ja/floater_delete_pref_preset.xml
+++ b/indra/newview/skins/default/xui/ja/floater_delete_pref_preset.xml
@@ -1,14 +1,15 @@
-<?xml version="1.0" encoding="utf-8"?>
-<floater name="Delete Pref Preset" title="優先プリセットを削除">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="delete_pref_preset" title="プリセットの削除">
<string name="title_graphic">
- グラフィックプリセットを削除
+ グラフィックのプリセットを削除
</string>
<string name="title_camera">
- カメラプリセットを削除
+ カメラのプリセットを削除
</string>
<text name="Preset">
プリセットを選択
</text>
+ <combo_box name="preset_combo"/>
<button label="削除" name="delete"/>
- <button label="取り消し" name="cancel"/>
+ <button label="キャンセル" name="cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_destinations.xml b/indra/newview/skins/default/xui/ja/floater_destinations.xml
index b7f6ad4d4e..723bad5832 100644
--- a/indra/newview/skins/default/xui/ja/floater_destinations.xml
+++ b/indra/newview/skins/default/xui/ja/floater_destinations.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Destinations" title="行き先"/>
+<floater name="Destinations" title="行き先"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/floater_display_name.xml b/indra/newview/skins/default/xui/ja/floater_display_name.xml
index cc71b1cd9f..4f47dbc162 100644
--- a/indra/newview/skins/default/xui/ja/floater_display_name.xml
+++ b/indra/newview/skins/default/xui/ja/floater_display_name.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Display Name" title="表示名を変更">
<text name="info_text">
- アバターにつけた名前があなたの表示名となります。表示名は週一回の頻度で変更することが可能です。
+ アバターにつけた名前があなたの表示名になります。表示名は週に一回まで変更することができます。
</text>
<text name="lockout_text">
- 表示名は次の日付まで変更できません:[TIME]。
+ 表示名は次の日付まで変更できません:[TIME]
</text>
<text name="set_name_label">
新しい表示名:
@@ -12,7 +12,7 @@
<text name="name_confirm_label">
新しい表示名を再入力して確認:
</text>
- <button label="保存" name="save_btn" tool_tip="新しい表示名を保存"/>
- <button label="リセット" name="reset_btn" tool_tip="表示名とユーザー名を統一"/>
- <button label="取り消し" name="cancel_btn"/>
+ <button label="保存" name="save_btn" tool_tip="この表示名を保存します。"/>
+ <button label="リセット" name="reset_btn" tool_tip="表示名をユーザー名に戻します。"/>
+ <button label="キャンセル" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_edit_ext_day_cycle.xml b/indra/newview/skins/default/xui/ja/floater_edit_ext_day_cycle.xml
index 79c97472df..f75564cd4c 100644
--- a/indra/newview/skins/default/xui/ja/floater_edit_ext_day_cycle.xml
+++ b/indra/newview/skins/default/xui/ja/floater_edit_ext_day_cycle.xml
@@ -13,69 +13,70 @@
自分で作成したデイサイクルを編集するには、希望の設定に調節して、「保存」をクリックします。
</string>
<string name="time_label">
- ([HH]:[MM])
+ ([HH]:[MM])
</string>
<string name="sky_track_label">
- 空 [ALT]
+ 空[ALT]
</string>
<string name="sky_label">
</string>
<string name="water_label">
- 水
+ 水面
</string>
<string name="commit_parcel">
区画に適用
</string>
<string name="commit_region">
- リージョンに適用
+ リージョン(地域)に適用
</string>
<layout_stack name="outer_stack">
<layout_panel name="name_and_import">
<text name="label">
デイサイクル名:
</text>
- <button label="インポート" name="btn_import" tool_tip="ディスクから過去の設定をインポートする。"/>
+ <line_editor name="day_cycle_name"/>
+ <button label="インポート" fname="btn_import" tool_tip="ディスクから過去の設定をインポートする。"/>
</layout_panel>
<layout_panel name="content">
<layout_stack name="content_stack">
<layout_panel name="timeline_track_selection">
<panel name="timeline_layers">
- <button label="空 4" name="sky4_track"/>
- <button label="空 3" name="sky3_track"/>
- <button label="空 2" name="sky2_track"/>
- <button label="地表レベル" name="sky1_track"/>
- <button label="水" name="water_track"/>
+ <button label="空4" name="sky4_track"/>
+ <button label="空3" name="sky3_track"/>
+ <button label="空2" name="sky2_track"/>
+ <button label="地面" name="sky1_track"/>
+ <button label="水面" name="water_track"/>
</panel>
<panel name="timeline">
- <text name="p0" value="0%[DSC]"/>
- <text name="p1" value="25%[DSC]"/>
- <text name="p2" value="50%[DSC]"/>
- <text name="p3" value="75%[DSC]"/>
- <text name="p4" value="100%[DSC]"/>
- <multi_slider initial_value="0" name="WLTimeSlider"/>
- <multi_slider initial_value="0" name="WLDayCycleFrames"/>
- <text name="current_time" value="[PRCNT]%[DSC]"/>
- <layout_stack>
- <layout_panel>
- <button label="トラックを以下からクローン" name="copy_track"/>
- <button label="トラックを以下からロード" name="load_track"/>
- <button label="トラックをクリア" name="clear_track"/>
+ <text value="0%[DSC]"/>
+ <text name="p1" value="25% [DSC]"/>
+ <text name="p2" value="50% [DSC]"/>
+ <text name="p3" value="75% [DSC]"/>
+ <text name="p4" value="100% [DSC]"/>
+ <multi_slider name="WLTimeSlider"/>
+ <multi_slider name="WLDayCycleFrames"/>
+ <text name="current_time" value="[PRCNT]% [DSC]"/>
+ <layout_stack name="track_options_ls">
+ <layout_panel name="track_options_lp">
+ <button label="トラックを以下から複製" name="copy_track"/>
+ <button label="トラックを以下から読み込み" name="load_track"/>
+ <button label="トラックを消去" name="clear_track"/>
</layout_panel>
- <layout_panel>
+ <layout_panel name="track_progress_lp">
<layout_stack name="progress_control">
<layout_panel name="skip_back">
<button name="skip_back_btn" tool_tip="後ろに移動"/>
</layout_panel>
- <layout_panel name="skip_forward">
- <button name="skip_forward_btn" tool_tip="前に移動"/>
- </layout_panel>
+ <layout_panel name="play_layout"/>
+ <layout_panel name="pause_layout"/>
+ <layout_panel name="skip_forward"/>
</layout_stack>
</layout_panel>
- <layout_panel>
- <button label="[FRAME] を追加" name="add_frame"/>
- <button label="[FRAME] をロード" name="btn_load_frame"/>
- <button label="[FRAME] を削除" name="delete_frame"/>
+ <layout_panel name="frames_lp">
+ <button label="[FRAME]を追加" name="add_frame"/>
+ <button label="[FRAME]を読み込む" name="btn_load_frame"/>
+ <button label="[FRAME]を削除" name="delete_frame"/>
</layout_panel>
</layout_stack>
</panel>
@@ -87,20 +88,21 @@
</layout_panel>
<layout_panel name="frame_settings_water">
<tab_container name="water_tabs">
- <panel label="水" name="water_panel"/>
+ <panel filename="panel_settings_water.xml" label="水面" name="water_panel"/>
</tab_container>
</layout_panel>
<layout_panel name="frame_settings_sky">
<tab_container name="sky_tabs">
- <panel label="大気&光" name="atmosphere_panel"/>
- <panel label="雲" name="clouds_panel"/>
- <panel label="太陽&月" name="moon_panel"/>
+ <panel filename="panel_settings_sky_atmos.xml" label="大気&光源" name="atmosphere_panel"/>
+ <panel filename="panel_settings_sky_clouds.xml" label="雲" name="clouds_panel"/>
+ <panel filename="panel_settings_sky_sunmoon.xml" label="太陽&月" name="moon_panel"/>
</tab_container>
</layout_panel>
</layout_stack>
</layout_panel>
<layout_panel name="buttons">
<button label="保存" name="save_btn"/>
+ <button label="" name="btn_flyout"/>
<button label="キャンセル" name="cancel_btn"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/ja/floater_event.xml b/indra/newview/skins/default/xui/ja/floater_event.xml
index ca50ba8ef8..a4b6a5c7ad 100644
--- a/indra/newview/skins/default/xui/ja/floater_event.xml
+++ b/indra/newview/skins/default/xui/ja/floater_event.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater can_resize="true" follows="all" height="400" help_topic="event_details" label="Event" layout="topleft" name="Event" save_rect="true" save_visibility="false" title="EVENT DETAILS" width="600">
+<floater label="イベント" name="Event" title="イベントの情報">
<floater.string name="loading_text">
- ローディング...
+ 読み込んでいます…
</floater.string>
<floater.string name="done_text">
完了
</floater.string>
- <web_browser follows="left|right|top|bottom" height="365" layout="topleft" left="10" name="browser" top="0" trusted_content="true" width="580"/>
- <text follows="bottom|left" height="16" layout="topleft" left_delta="0" name="status_text" top_pad="10" width="150"/>
+ <web_browser name="browser"/>
+ <text name="status_text"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_experience_search.xml b/indra/newview/skins/default/xui/ja/floater_experience_search.xml
index 37f3da7d73..e913c35e1a 100644
--- a/indra/newview/skins/default/xui/ja/floater_experience_search.xml
+++ b/indra/newview/skins/default/xui/ja/floater_experience_search.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="experiencepicker" title="体験を選択"/>
+<floater name="experiencepicker" title="体験を選択"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/floater_experienceprofile.xml b/indra/newview/skins/default/xui/ja/floater_experienceprofile.xml
index be9cfd8c01..f2f6d5e039 100644
--- a/indra/newview/skins/default/xui/ja/floater_experienceprofile.xml
+++ b/indra/newview/skins/default/xui/ja/floater_experienceprofile.xml
@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater title="EXPERIENCE PROFILE">
+<floater name="experience_profile" title="体験プロフィール">
<floater.string name="empty_slurl">
- (なし)
+ (なし)
</floater.string>
<floater.string name="maturity_icon_general">
- &quot;Parcel_PG_Light&quot;
+ "Parcel_PG_Light"
</floater.string>
<floater.string name="maturity_icon_moderate">
- &quot;Parcel_M_Light&quot;
+ "Parcel_M_Light"
</floater.string>
<floater.string name="maturity_icon_adult">
- &quot;Parcel_R_Light&quot;
+ "Parcel_R_Light"
</floater.string>
<text name="edit_title" value="体験プロフィール"/>
<tab_container name="tab_container">
diff --git a/indra/newview/skins/default/xui/ja/floater_experiences.xml b/indra/newview/skins/default/xui/ja/floater_experiences.xml
index 5186f8ee38..b275204921 100644
--- a/indra/newview/skins/default/xui/ja/floater_experiences.xml
+++ b/indra/newview/skins/default/xui/ja/floater_experiences.xml
@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_experiences" title="体験"/>
+<floater name="floater_experiences" title="体験">
+ <tab_container name="xp_tabs"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_fast_timers.xml b/indra/newview/skins/default/xui/ja/floater_fast_timers.xml
index b226dfbfe1..1d5ec4135f 100644
--- a/indra/newview/skins/default/xui/ja/floater_fast_timers.xml
+++ b/indra/newview/skins/default/xui/ja/floater_fast_timers.xml
@@ -7,15 +7,15 @@
走る
</string>
<combo_box name="time_scale_combo">
- <item label="2x 平均" name="2x Average"/>
+ <item label="平均の2倍" name="2x Average"/>
<item label="最大" name="Max"/>
<item label="最近の最大" name="Recent Max"/>
- <item label="100ms" name="100ms"/>
+ <item label="100㎳" name="100ms"/>
</combo_box>
<combo_box name="metric_combo">
<item label="時間" name="Time"/>
<item label="通話数" name="Number of Calls"/>
- <item label="Hz" name="Hz"/>
+ <item label="㎐" name="Hz"/>
</combo_box>
<button label="一時停止" name="pause_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_fbc_web.xml b/indra/newview/skins/default/xui/ja/floater_fbc_web.xml
new file mode 100644
index 0000000000..cb54288a49
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_fbc_web.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_fbc_web" filename="floater_web_content.xml"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/floater_fixedenvironment.xml b/indra/newview/skins/default/xui/ja/floater_fixedenvironment.xml
index a00b87b990..a54ebe5c38 100644
--- a/indra/newview/skins/default/xui/ja/floater_fixedenvironment.xml
+++ b/indra/newview/skins/default/xui/ja/floater_fixedenvironment.xml
@@ -4,20 +4,30 @@
空を編集:
</string>
<string name="edit_water">
- 水を編集:
+ 水面を編集
</string>
<layout_stack name="floater_stack">
<layout_panel name="info_panel">
- <button label="ロード" name="btn_load" tool_tip="持ち物から設定をロードする"/>
- <button label="インポート" name="btn_import" tool_tip="ディスクから過去の設定をインポートする。"/>
+ <text name="info_panel_label">
+ 名前:
+ </text>
+ <line_editor name="settings_name"/>
+ <button label="読み込む" tool_tip="インベントリから設定を読み込みます。"/>
+ <button label="インポート" tool_tip="ディスクから過去の設定をインポートします。"/>
+ </layout_panel>
+ <layout_panel name="tab_area">
+ <tab_container name="tab_settings">
+
+ </tab_container>
</layout_panel>
<layout_panel name="button_panel">
<layout_stack name="button_bar_ls">
<layout_panel name="save_btn_lp">
<button label="保存" name="btn_commit"/>
+ <button name="btn_flyout"/>
</layout_panel>
<layout_panel name="revert_btn_lp">
- <button label="キャンセル" name="btn_cancel" tool_tip="最後に保存された状態に戻す"/>
+ <button label="キャンセル" name="btn_cancel" tool_tip="最後に保存された状態に戻す。"/>
</layout_panel>
</layout_stack>
</layout_panel>
diff --git a/indra/newview/skins/default/xui/ja/floater_font_test.xml b/indra/newview/skins/default/xui/ja/floater_font_test.xml
index b853f395dd..a1669a52e3 100644
--- a/indra/newview/skins/default/xui/ja/floater_font_test.xml
+++ b/indra/newview/skins/default/xui/ja/floater_font_test.xml
@@ -1,6 +1,87 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="contents" title="フォントのテスト">
- <text name="linea">
- オーバーライドテスト - Times Romanでここに表示されます。 (default/xui/en-us フォルダー内)
+<floater name="contents" title="フォントテスト">
+ <text type="string" length="1" bottom_delta="40" follows="left|top|right" height="16" layout="topleft" left="16">
+ 小さいサンセリフ
+ </text>
+ <text type="string" length="1" bottom_delta="20" follows="left|top|right" font="SansSerifMedium" height="16" layout="topleft" left="16">
+ 普通の大きさのサンセリフ
+ </text>
+ <text type="string" length="1" bottom_delta="20" follows="left|top|right" font="SansSerif" height="16" layout="topleft" left="16">
+ サンセリフ。スタイル設定無し(普通の大きさと同じ)
+ </text>
+ <text type="string" length="1" bottom_delta="20" follows="left|top|right" font="SansSerifLarge" height="16" layout="topleft" left="16">
+ 大きいサンセリフ
+ </text>
+ <text type="string" length="1" bottom_delta="36" follows="left|top|right" font="SansSerifHuge" height="32" layout="topleft" left="16">
+ サンセリフ size=huge
+ </text>
+ <text type="string" length="1" bottom_delta="36" follows="left|top|right" font="SansSerifHuge" font.style.="BOLD" height="32" layout="topleft" left="16">
+ 巨大なサンセリフ style=BOLD
+ </text>
+ <text type="string" length="1" bottom_delta="36" follows="left|top|right" font="SansSerifBold" font.size="Huge" height="32" layout="topleft" left="16">
+ ボールドのサンセリフ size=huge
+ </text>
+ <text type="string" length="1" bottom_delta="40" follows="left|top|right" font="Monospace" height="16" layout="topleft" left="16">
+ 等幅
+ </text>
+ <text type="string" length="1" bottom_delta="20" follows="left|top|right" font="Monospace" font.size="Large" height="16" layout="topleft" left="16">
+ 等幅 size=large
+ </text>
+ <text type="string" length="1" bottom_delta="20" follows="left|top|right" font="SansSerifLarge" font.style="BOLD" height="16" layout="topleft" left="16">
+ 大きなサンセリフ style=BOLD
+ </text>
+ <text type="string" length="1" bottom_delta="20" follows="left|top|right" font="SansSerifBold" height="16" layout="topleft" left="16">
+ ボールドのサンセリフ
+ </text>
+ <text type="string" length="1" bottom_delta="20" follows="left|top|right" font="SansSerif" font.style="BOLD" height="16" layout="topleft" left="16">
+ サンセリフ style=BOLD(ボールドのサンセリフと一緒)
+ </text>
+ <text type="string" length="1" bottom_delta="20" follows="left|top|right" font="SansSerif" font.style="ITALIC" height="16" layout="topleft" left="16">
+ サンセリフ style=ITALIC
+ </text>
+ <text type="string" length="1" bottom_delta="20" follows="left|top|right" font="SansSerif" font.style="BOLD|ITALIC" height="16" layout="topleft" left="16">
+ サンセリフ style=BOLD|ITALIC
+ </text>
+ <text type="string" length="1" bottom_delta="20" follows="left|top|right" font="SansSerif" font.style="BOLD|ITALIC" height="16" layout="topleft" left="16">
+ サンセリフ style=BOLD|ITALIC shadow=soft
+ </text>
+ <text type="string" length="1" bottom_delta="20" follows="left|top|right" font="SansSerif" font.style="UNDERLINE" height="16" layout="topleft" left="16">
+ サンセリフ style=UNDERLINE
+ </text>
+ <text type="string" length="1" bottom_delta="20" follows="left|top|right" font="SansSerif" font_shadow="none" height="16" layout="topleft" left="16">
+ サンセリフ style=hard
+ </text>
+ <text type="string" length="1" bottom_delta="20" follows="left|top|right" font="SansSerif" height="16" layout="topleft" left="16">
+ サンセリフ shadow=soft
+ </text>
+ <text type="string" length="1" bottom_delta="20" follows="left|top|right" font="DejaVu" height="16" layout="topleft" left="16">
+ DejaVu
+ </text>
+ <text type="string" length="1" bottom_delta="20" follows="left|top|right" font="DejaVu" font.style="BOLD" height="16" layout="topleft" left="16">
+ DejaVu style=BOLD
+ </text>
+ <text type="string" length="1" bottom_delta="20" follows="left|top|right" font="DejaVu" font.style="ITALIC" height="16" layout="topleft" left="16">
+ DejaVu style=ITALIC
+ </text>
+ <text type="string" length="1" bottom_delta="20" follows="left|top|right" font="DejaVu" font.style="BOLD|ITALIC" height="16" layout="topleft" left="16">
+ DejaVu style=BOLD|ITALIC
+ </text>
+ <text type="string" length="1" bottom_delta="20" follows="left|top|right" font="DejaVu" font.size="Large" font.style="BOLD|ITALIC" height="16" layout="topleft" left="16">
+ DejaVu size=Large style=BOLD|ITALIC
+ </text>
+ <text type="string" length="1" bottom_delta="20" follows="left|top|right" font="Helvetica" height="16" layout="topleft" left="16">
+ Helvetica
+ </text>
+ <text type="string" length="1" bottom_delta="20" follows="left|top|right" font="Helvetica" font.style="BOLD" height="16" layout="topleft" left="16">
+ Helvetica style=BOLD
+ </text>
+ <text type="string" length="1" bottom_delta="20" follows="left|top|right" font="Helvetica" font.style="ITALIC" height="16" layout="topleft" left="16">
+ Helvetica style=ITALIC
+ </text>
+ <text type="string" length="1" bottom_delta="20" follows="left|top|right" font="Helvetica" font.style="BOLD|ITALIC" height="16" layout="topleft" left="16">
+ Helvetica style=BOLD|ITALIC
+ </text>
+ <text type="string" length="1" bottom_delta="20" follows="left|top|right" font="Helvetica" font.size="Large" font.style="BOLD|ITALIC" height="16" layout="topleft" left="16">
+ Helvetica size=Large style=BOLD|ITALIC
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_forget_user.xml b/indra/newview/skins/default/xui/ja/floater_forget_user.xml
index 63d6d05a5e..349bb11d3e 100644
--- a/indra/newview/skins/default/xui/ja/floater_forget_user.xml
+++ b/indra/newview/skins/default/xui/ja/floater_forget_user.xml
@@ -1,2 +1,8 @@
-<?xml version="1.0" ?>
-<floater name="groups" title="記憶されたユーザー名"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="groups" title="記録済みのユーザ名">
+ <scroll_list name="user_list">
+ <scroll_list.columns name="user"/>
+ </scroll_list>
+ <button label="削除" label_selected="削除" name="forget"/>
+ <check_box height="20" label="このユーザー名のローカルデータも削除する" name="delete_data" tool_tip="削除対象:チャット履歴、最後のセッションのスクリーンショット、ブラウザのCookie、テレポート履歴、ツールバー設定など。一部のローカルファイルは、グリッド間で共有されます。"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_gesture.xml b/indra/newview/skins/default/xui/ja/floater_gesture.xml
index b5b1efe386..087919946d 100644
--- a/indra/newview/skins/default/xui/ja/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/ja/floater_gesture.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater label="場所" name="gestures" title="ジェスチャー">
<floater.string name="loading">
- ローディング...
+ 読み込んでいます…。
</floater.string>
<floater.string name="playing">
(再生中)
</floater.string>
<floater.string name="copy_name">
- [COPY_NAME] のコピー
+ [COPY_NAME]のコピー
</floater.string>
<scroll_list name="gesture_list">
<scroll_list.columns label="名前" name="name"/>
@@ -17,11 +17,11 @@
</scroll_list>
<panel label="bottom_panel" name="bottom_panel">
<menu_button name="gear_btn" tool_tip="詳細オプション"/>
- <button name="new_gesture_btn" tool_tip="新規ジェスチャーを作成"/>
- <button name="activate_btn" tool_tip="選択したジェスチャーのアクティベートの有無"/>
+ <button name="new_gesture_btn" tool_tip="新しいジェスチャーを作成"/>
+ <button name="activate_btn" tool_tip="選択したジェスチャーの有効化/無効化"/>
<button name="del_btn" tool_tip="このジェスチャーを削除"/>
</panel>
- <button label="編集" name="edit_btn" tool_tip="選択済みのジェスチャーを編集するためにウィンドウを開ける。"/>
- <button label="再生" name="play_btn" tool_tip="インワールドで選択済みのジェスチャーを実行する。"/>
+ <button label="編集" name="edit_btn" tool_tip="選択したジェスチャーの編集ウィンドウを開く。"/>
+ <button label="再生" name="play_btn" tool_tip="インワールドで選択したジェスチャーを実行する。"/>
<button label="停止" name="stop_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_god_tools.xml b/indra/newview/skins/default/xui/ja/floater_god_tools.xml
index 9e5d473db7..3c96e2e340 100644
--- a/indra/newview/skins/default/xui/ja/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/ja/floater_god_tools.xml
@@ -2,49 +2,47 @@
<floater name="godtools floater" title="ゴッド・ツール">
<tab_container name="GodTools Tabs">
<panel label="グリッド" name="grid">
- <button label="この地域の地図の表示キャッシュを消去" label_selected="この地域の地図の表示キャッシュを消去" name="Flush This Region&apos;s Map Visibility Caches"/>
+ <button label="このリージョン(地域)のマップの表示キャッシュを消去" label_selected="このリージョン(地域)のマップの表示キャッシュを消去" name="Flush This Region's Map Visibility Caches"/>
</panel>
<panel label="地域" name="region">
<text name="Region Name:">
- リージョン名:
+ リージョン(地域)名:
</text>
<check_box label="準備" name="check prelude" tool_tip="この設定により、この地域の準備をします。"/>
- <check_box label="太陽固定" name="check fixed sun" tool_tip="太陽位置を固定([地域/不動産]>[地形]の場合と同様)"/>
+ <check_box label="太陽固定" name="check fixed sun" tool_tip="太陽位置を固定(「地域/不動産」>「地形」の場合と同様)"/>
<check_box label="テレポートのホームをリセット" name="check reset home" tool_tip="住人がテレポートで外に出たら、ホームを目的地にリセットします。"/>
<check_box label="可視" name="check visible" tool_tip="この設定により、この地域をゴッド・モード以外でも可視にします。"/>
<check_box label="ダメージ" name="check damage" tool_tip="この設定により、この地域内でダメージを有効化します。"/>
- <check_box label="トラフィック・トラッキングをブロック" name="block dwell" tool_tip="この設定により、この地域内のトラフィック計算をオフにします。"/>
+ <check_box label="トラフィックのトラッキングをブロック" name="block dwell" tool_tip="この設定により、この地域内のトラフィック計算をオフにします。"/>
<check_box label="地形編集をブロック" name="block terraform" tool_tip="この設定により、この地域内での土地整備を禁止"/>
<check_box label="サンドボックス" name="is sandbox" tool_tip="これがサンドボックス地域でも切り替え"/>
<button label="地形を構築する" label_selected="地形を構築する" name="Bake Terrain" tool_tip="現在の地形をデフォルトとして保存します。"/>
<button label="地形を元に戻す" label_selected="地形を元に戻す" name="Revert Terrain" tool_tip="現在の地形をデフォルトに置換します。"/>
<button label="地形を交換" label_selected="地形を交換" name="Swap Terrain" tool_tip="現在の地形をデフォルトと入れ替えます。"/>
<text name="estate id">
- 不動産ID:
+ 不動産ID:
</text>
<text name="parent id">
- 親ID:
+ 親ID:
</text>
- <line_editor name="parentestate" tool_tip="これは、この地域の親不動産です。"/>
+ <line_editor name="parentestate" tool_tip="これは、このリージョン(地域)の親不動産です。"/>
<text name="Grid Pos: ">
グリッド位置:
</text>
- <line_editor name="gridposx" tool_tip="これは、この地域のグリッドxの位置です。"/>
- <line_editor name="gridposy" tool_tip="これは、この地域のグリッドyの位置です。"/>
+ <line_editor name="gridposx" tool_tip="これは、このリージョン(地域)のグリッドX座標です。"/>
+ <line_editor name="gridposy" tool_tip="これは、このリージョン(地域)のグリッドY座標です。"/>
<text name="Redirect to Grid: ">
- グリッドにリダ
-イレクト:
+ グリッドにリダイレクト:
</text>
<text name="billable factor text">
請求率:
</text>
<text name="land cost text">
- 平方メートル当
-たりL$:
+ ㎡当たりのL$:
</text>
<button label="更新" label_selected="更新" name="Refresh" tool_tip="上記の情報を更新するには、ここをクリックします。"/>
<button label="適用" label_selected="適用" name="Apply" tool_tip="上記の変更を適用するには、ここをクリックします。"/>
- <button label="地域を選択" label_selected="地域を選択" name="Select Region" tool_tip="土地ツールで地域全体を選択してください。"/>
+ <button label="リージョン(地域)を選択" label_selected="地域を選択" name="Select Region" tool_tip="土地ツールで地域全体を選択してください。"/>
<button label="ただちに自動保存する" label_selected="ただちに自動保存する" name="Autosave now" tool_tip="Gzip状態を自動保存ディレクトリに保存します。"/>
</panel>
<panel label="オブジェクト" name="objects">
@@ -52,7 +50,7 @@
(ターゲットなし)
</panel.string>
<text name="Region Name:">
- リージョン名:
+ リージョン(地域)名:
</text>
<text name="region name">
ウェルシュ
@@ -65,9 +63,9 @@
<text name="target_avatar_name">
(対象なし)
</text>
- <button label="他の土地における対象のスクリプト・オブジェクトを削除" label_selected="他の土地における対象のスクリプト・オブジェクトを削除" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="この地域において対象が所有していないスクリプト・オブジェクトをすべて削除します。 (コピー禁止)オブジェクトは返却されます。"/>
- <button label="「すべての」土地における対象のスクリプト・オブジェクトを削除" label_selected="「すべての」土地における対象のスクリプト・オブジェクトを削除" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="この地域において対象が所有しているスクリプト・オブジェクトをすべて削除します。 (コピー禁止)オブジェクトは返却されます。"/>
- <button label="対象のオブジェクトを「すべて」削除" label_selected="対象のオブジェクトを「すべて」削除" name="Delete *ALL* Of Target&apos;s Objects" tool_tip="この地域において対象が所有しているオブジェクトをすべて削除します。 (コピー禁止)オブジェクトは返却されます。"/>
+ <button label="他の土地における対象のスクリプト・オブジェクトを削除" label_selected="他の土地における対象のスクリプト・オブジェクトを削除" name="Delete Target's Scripted Objects On Others Land" tool_tip="この地域において対象が所有していないスクリプト・オブジェクトをすべて削除します。(コピー禁止)オブジェクトは返却されます。"/>
+ <button label="「すべての」土地における対象のスクリプト・オブジェクトを削除" label_selected="「すべての」土地における対象のスクリプト・オブジェクトを削除" name="Delete Target's Scripted Objects On *Any* Land" tool_tip="この地域において対象が所有しているスクリプト・オブジェクトをすべて削除します。(コピー禁止)オブジェクトは返却されます。"/>
+ <button label="対象のオブジェクトを「すべて」削除" label_selected="対象のオブジェクトを「すべて」削除" name="Delete *ALL* Of Target's Objects" tool_tip="この地域において対象が所有しているオブジェクトをすべて削除します。(コピー禁止)オブジェクトは返却されます。"/>
<button label="トップ・コライダーを取得" label_selected="トップ・コライダーを取得" name="Get Top Colliders" tool_tip="最も段階の狭いコールバックが発生したオブジェクトのリストを取得します。"/>
<button label="トップ・スクリプトを取得" label_selected="トップ・スクリプトを取得" name="Get Top Scripts" tool_tip="スクリプトの起動に最も時間を費やしているオブジェクトのリストを取得します。"/>
<button label="スクリプト・ダイジェスト" label_selected="スクリプト・ダイジェスト" name="Scripts digest" tool_tip="すべてのスクリプトとそれらの使用回数のリストを取得します。"/>
@@ -87,7 +85,7 @@
<combo_box.item label="コライダー<ステップ>" name="item1"/>
<combo_box.item label="スクリプト<回数>、<オプション・パターン>" name="item2"/>
<combo_box.item label="オブジェクト<パターン>" name="item3"/>
- <combo_box.item label="rez <asset_id>" name="item4"/>
+ <combo_box.item label="rez <アセットID>" name="item4"/>
</combo_box>
<text name="Parameter:">
パラメーター:
diff --git a/indra/newview/skins/default/xui/ja/floater_goto_line.xml b/indra/newview/skins/default/xui/ja/floater_goto_line.xml
index 5f2717ace5..90c264b898 100644
--- a/indra/newview/skins/default/xui/ja/floater_goto_line.xml
+++ b/indra/newview/skins/default/xui/ja/floater_goto_line.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="script goto" title="行に移動">
- <button label="OK" label_selected="OK" name="goto_btn"/>
+ <button label="OK" label_selected="OK" name="goto_btn"/>
<text name="txt">
行に移動
</text>
diff --git a/indra/newview/skins/default/xui/ja/floater_help_browser.xml b/indra/newview/skins/default/xui/ja/floater_help_browser.xml
index 15200d7ef7..5828d1b00e 100644
--- a/indra/newview/skins/default/xui/ja/floater_help_browser.xml
+++ b/indra/newview/skins/default/xui/ja/floater_help_browser.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_help_browser" title="ヘルプブラウザ">
<floater.string name="loading_text">
- ローディング...
+ 読み込んでいます…。
</floater.string>
<layout_stack name="stack1">
<layout_panel name="external_controls"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_how_to.xml b/indra/newview/skins/default/xui/ja/floater_how_to.xml
index 4cebe27226..480fb4649c 100644
--- a/indra/newview/skins/default/xui/ja/floater_how_to.xml
+++ b/indra/newview/skins/default/xui/ja/floater_how_to.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_how_to" title="ハウツー"/>
+<floater name="floater_how_to" title="ウェルカムアイランドガイドブック" filename="floater_web_content.xml"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/floater_hud.xml b/indra/newview/skins/default/xui/ja/floater_hud.xml
index e3841c2cd9..ce36051ea3 100644
--- a/indra/newview/skins/default/xui/ja/floater_hud.xml
+++ b/indra/newview/skins/default/xui/ja/floater_hud.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_hud" title="チュートリアル"/>
+<floater name="floater_hud" title="チュートリアル"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/floater_im_container.xml b/indra/newview/skins/default/xui/ja/floater_im_container.xml
index a155efdc1e..83ccb3995c 100644
--- a/indra/newview/skins/default/xui/ja/floater_im_container.xml
+++ b/indra/newview/skins/default/xui/ja/floater_im_container.xml
@@ -6,12 +6,12 @@
<layout_panel name="conversations_layout_panel">
<layout_stack name="conversations_pane_buttons_stack">
<layout_panel name="conversations_pane_buttons_expanded">
- <menu_button name="sort_btn" tool_tip="オプションの表示 / 並べ替え"/>
+ <menu_button name="sort_btn" tool_tip="オプションの表示/並べ替え"/>
<button name="add_btn" tool_tip="新しい会話を開始"/>
<button name="speak_btn" tool_tip="マイクを使って人と話す"/>
</layout_panel>
<layout_panel name="conversations_pane_buttons_collapsed">
- <button name="expand_collapse_btn" tool_tip="このリストを閉じる / 開く"/>
+ <button name="expand_collapse_btn" tool_tip="このリストを閉じる/開く"/>
</layout_panel>
</layout_stack>
</layout_panel>
diff --git a/indra/newview/skins/default/xui/ja/floater_im_session.xml b/indra/newview/skins/default/xui/ja/floater_im_session.xml
index 7ed46f7f01..a2c116dbdc 100644
--- a/indra/newview/skins/default/xui/ja/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/ja/floater_im_session.xml
@@ -12,8 +12,8 @@
<floater.string name="expand_icon" value="Conv_toolbar_expand"/>
<floater.string name="tear_off_icon" value="Conv_toolbar_arrow_ne"/>
<floater.string name="return_icon" value="Conv_toolbar_arrow_sw"/>
- <floater.string name="participant_added" value="[NAME] は会話に招待されました。"/>
- <floater.string name="multiple_participants_added" value="[NAME] は会話に招待されました。"/>
+ <floater.string name="participant_added" value="[NAME]に会話を招待されました。"/>
+ <floater.string name="multiple_participants_added" value="[NAME]は会話に招待されました。"/>
<floater.string name="tooltip_to_separate_window" value="この会話を別のウィンドウへ移動する"/>
<floater.string name="tooltip_to_main_window" value="この会話をメインウィンドウへ戻す"/>
<floater.string name="start_call_button_tooltip" value="会話の接続を開く"/>
@@ -24,12 +24,12 @@
<view name="contents_view">
<layout_stack name="main_stack">
<layout_panel name="toolbar_panel">
- <menu_button name="view_options_btn" tool_tip="表示 / 並べ替えのオプション"/>
+ <menu_button name="view_options_btn" tool_tip="表示/並べ替えのオプション"/>
<menu_button name="gear_btn" tool_tip="選択した人に対するアクション"/>
<button name="add_btn" tool_tip="この会話に他の人を追加する"/>
<button name="voice_call_btn" tool_tip="会話の接続を開く"/>
<button name="close_btn" tool_tip="この会話を終了する"/>
- <button name="expand_collapse_btn" tool_tip="このペインを閉じる / 開く"/>
+ <button name="expand_collapse_btn" tool_tip="このペインを閉じる/開く"/>
</layout_panel>
<layout_panel name="body_panel">
<layout_stack name="im_panels">
@@ -45,10 +45,10 @@
<layout_panel name="chat_layout_panel">
<layout_stack name="input_panels">
<layout_panel name="input_editor_layout_panel">
- <chat_editor label="宛先" name="chat_editor"/>
+ <chat_editor label="送信先" name="chat_editor"/>
</layout_panel>
<layout_panel name="input_button_layout_panel">
- <button name="minz_btn" tool_tip="メッセージパネルの表示 / 非表示"/>
+ <button name="minz_btn" tool_tip="メッセージパネルの表示/非表示"/>
</layout_panel>
</layout_stack>
</layout_panel>
diff --git a/indra/newview/skins/default/xui/ja/floater_image_preview.xml b/indra/newview/skins/default/xui/ja/floater_image_preview.xml
index 1ffc27fd70..09097d79ea 100644
--- a/indra/newview/skins/default/xui/ja/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_image_preview.xml
@@ -9,9 +9,9 @@
<text name="preview_label">
プレビュー:
</text>
- <combo_box label="服の種類" name="clothing_type_combo">
+ <combo_box label="服装の種類" name="clothing_type_combo">
<item label="画像" name="Image" value="画像"/>
- <item label="髪" name="Hair" value="髪"/>
+ <item label="髪型" name="Hair" value="髪型"/>
<item label="女性の頭" name="FemaleHead" value="女性の頭"/>
<item label="女性の上半身" name="FemaleUpperBody" value="女性の上半身"/>
<item label="女性の下半身" name="FemaleLowerBody" value="女性の下半身"/>
@@ -22,11 +22,10 @@
<item label="スカルプトプリム" name="SculptedPrim" value="スカルプトプリム"/>
</combo_box>
<text name="bad_image_text">
- イメージを読み取れません。
-
-24bitTarga(.tga)でイメージを保存してください。
+ 画像を読み込めませんでした。
+24bitのTarga(.tga)形式で画像を保存してください。
</text>
<check_box label="可逆圧縮" name="lossless_check"/>
- <button label="取り消し" name="cancel_btn"/>
+ <button label="キャンセル" name="cancel_btn"/>
<button label="アップロード゙L$[AMOUNT]" name="ok_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_import_collada.xml b/indra/newview/skins/default/xui/ja/floater_import_collada.xml
index 65edafb169..a5a62d6304 100644
--- a/indra/newview/skins/default/xui/ja/floater_import_collada.xml
+++ b/indra/newview/skins/default/xui/ja/floater_import_collada.xml
@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Import Collada" title="風景のインポート">
<text name="mesh count">
- メッシュ: [COUNT]
+ メッシュ:[COUNT]
</text>
<text name="texture count">
- テクスチャ: [COUNT]
+ テクスチャ:[COUNT]
</text>
<text name="status">
- ステータス: [STATUS]
+ ステータス:[STATUS]
</text>
- <button label="取り消し" name="cancel"/>
- <button label="OK" name="ok"/>
+ <button label="キャンセル" name="cancel"/>
+ <button label="OK" name="ok"/>
<string name="status_idle">
待機状態
</string>
diff --git a/indra/newview/skins/default/xui/ja/floater_incoming_call.xml b/indra/newview/skins/default/xui/ja/floater_incoming_call.xml
index 308f6f9a3d..319db34879 100644
--- a/indra/newview/skins/default/xui/ja/floater_incoming_call.xml
+++ b/indra/newview/skins/default/xui/ja/floater_incoming_call.xml
@@ -4,7 +4,7 @@
5
</floater.string>
<floater.string name="localchat">
- 近くのボイスチャット
+ 近隣のボイスチャット
</floater.string>
<floater.string name="anonymous">
匿名ユーザー
@@ -13,13 +13,13 @@
からコールを受けています。
</floater.string>
<floater.string name="VoiceInviteAdHoc">
- がコンファレンスチャットで、ボイスチャットに参加しました。
+ が会話チャットで、ボイスチャットに参加しました。
</floater.string>
<floater.string name="VoiceInviteGroup">
- &apos;[GROUP]&apos;のボイスチャネルに参加なさいました。
+ 「[GROUP]」のボイスチャネルに参加なさいました。
</floater.string>
<floater.string name="VoiceInviteQuestionGroup">
- [CURRENT_CHAT]を退席して、&apos;[GROUP]&apos;とのチャットに参加しますか?
+ [CURRENT_CHAT]を退席して、「[GROUP]」とのチャットに参加しますか?
</floater.string>
<floater.string name="VoiceInviteQuestionDefault">
[CURRENT_CHAT]を退席して、このボイスチャットに参加しますか?
@@ -29,5 +29,5 @@
</text>
<button label="取る" label_selected="取る" name="Accept"/>
<button label="無視" label_selected="無視" name="Reject"/>
- <button label="代わりに IM を開く" name="Start IM"/>
+ <button label="代わりにIMを開く" name="Start IM"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_inspect.xml b/indra/newview/skins/default/xui/ja/floater_inspect.xml
index b3825c0b7f..fca7b2eab8 100644
--- a/indra/newview/skins/default/xui/ja/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/ja/floater_inspect.xml
@@ -1,14 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater min_width="450" name="inspect" title="オブジェクトのチェック">
+<floater name="inspect" title="オブジェクトの調査">
<floater.string name="timeStamp">
- [year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ [year,datetime,slt]年[mth,datetime,slt]月[day,datetime,slt]日([wkday,datetime,slt]) [hour,datetime,slt]:[min,datetime,slt]:[second,datetime,slt]
</floater.string>
- <scroll_list name="object_list" tool_tip="リストからオブジェクトを選択し、インワールドで強調表示します。">
- <scroll_list.columns label="名前" name="object_name"/>
- <scroll_list.columns label="所有者名" name="owner_name"/>
- <scroll_list.columns label="制作者名" name="creator_name"/>
- <scroll_list.columns label="作成日" name="creation_date"/>
+ <scroll_list name="object_list" tool_tip="このリストからオブジェクトを選択して、インワールドでハイライトします。">
+ <scroll_list.columns label="オブジェクト名" name="object_name"/>
+ <scroll_list.columns label="所有者" name="owner_name"/>
+ <scroll_list.columns label="制作者" name="creator_name"/>
+ <scroll_list.columns label="制作日" name="creation_date"/>
+ <scroll_list.commit_callback function="Inspect.SelectObject"/>
</scroll_list>
- <button label="所有者のプロフィールを表示..." name="button owner" tool_tip="選択したオブジェクトの所有者のプロフィールを表示します" width="180"/>
- <button label="制作者のプロフィールを表示..." name="button creator" tool_tip="選択したオブジェクトの制作者のプロフィールを表示します" width="180"/>
+ <button label="所有者のプロフィール…" name="button owner" tool_tip="ハイライトされたオブジェクトの所有者のプロフィールを見る"/>
+ <button label="制作者のプロフィール…" name="button creator" tool_tip="ハイライトされたオブジェクトの元の作成者のプロフィールを見る"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml
deleted file mode 100644
index 8d3a655a06..0000000000
--- a/indra/newview/skins/default/xui/ja/floater_inventory_item_properties.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="item properties" title="インベントリアイテムのプロパティ">
- <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">[year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]</floater.string>
- <text name="LabelItemNameTitle">名前:</text>
- <text name="LabelItemDescTitle">説明:</text>
- <text name="LabelCreatorTitle">クリエーター</text>
- <button label="プロフィール..." label_selected="" name="BtnCreator"/>
- <text name="LabelOwnerTitle">オーナー:</text>
- <button label="プロフィール..." label_selected="" name="BtnOwner"/>
- <text name="LabelAcquiredTitle">入手日時:</text>
- <text name="LabelAcquiredDate">2006年5月24日水曜日12:50:46</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">グループ:</text>
- <check_box label="共有" name="CheckShareWithGroup"/>
- <text name="NextOwnerLabel" width="158">次の所有者:</text>
- <check_box label="編集" name="CheckNextOwnerModify"/>
- <check_box label="コピー" name="CheckNextOwnerCopy"/>
- <check_box label="再販・プレゼント" name="CheckNextOwnerTransfer"/>
- <check_box label="売り出し中" name="CheckPurchase"/>
- <combo_box name="ComboBoxSaleType">
- <combo_box.item label="コピー" name="Copy"/>
- <combo_box.item label="コンテンツ" name="Contents"/>
- <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/ja/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml
index 425cb7ad81..e9d5757e84 100644
--- a/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml
@@ -2,7 +2,7 @@
<floater name="Inventory Finder" title="インベントリ最近取得したアイテム">
<check_box label="アニメーション" name="check_animation"/>
<check_box label="コーリング・カード" name="check_calling_card"/>
- <check_box label="服" name="check_clothing"/>
+ <check_box label="服装" name="check_clothing"/>
<check_box label="ジェスチャー" name="check_gesture"/>
<check_box label="ランドマーク" name="check_landmark"/>
<check_box label="ノートカード" name="check_notecard"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_item_properties.xml b/indra/newview/skins/default/xui/ja/floater_item_properties.xml
index c8648503d7..61ae5b83d7 100644
--- a/indra/newview/skins/default/xui/ja/floater_item_properties.xml
+++ b/indra/newview/skins/default/xui/ja/floater_item_properties.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Item Properties" title="アイテムのプロパティ"/>
+<floater name="Item Properties" title="アイテムのプロパティ"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/floater_joystick.xml b/indra/newview/skins/default/xui/ja/floater_joystick.xml
index daa480ef5a..559ecee5a8 100644
--- a/indra/newview/skins/default/xui/ja/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/ja/floater_joystick.xml
@@ -1,119 +1,123 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Joystick" title="ジョイスティックの設定">
- <check_box label="ジョイスティックを使う:" name="enable_joystick" width="120"/>
- <text left="180" name="joystick_type" width="320"/>
- <spinner label="X軸マッピング" name="JoystickAxis1"/>
- <spinner label="Y軸マッピング" name="JoystickAxis2"/>
- <spinner label="Z軸マッピング" name="JoystickAxis0"/>
- <spinner label="ピッチ・マッピング" label_width="110" left="10" name="JoystickAxis4" width="150"/>
+ <floater.string name="JoystickDisabled">
+ なし
+ </floater.string>
+ <text name="joystick_lbl">
+ ジョイスティック:
+ </text>
+ <spinner label="X軸マッピング" name="JoystickAxis1"/>
+ <spinner label="Y軸マッピング" name="JoystickAxis2"/>
+ <spinner label="Z軸マッピング" name="JoystickAxis0"/>
+ <spinner label="ピッチ・マッピング" name="JoystickAxis4"/>
<spinner label="ヨー・マッピング" name="JoystickAxis5"/>
- <spinner label="ロール・マッピング" label_width="110" left="350" name="JoystickAxis3" width="150"/>
- <spinner label="ズーム・マッピング" label_width="110" left="10" name="JoystickAxis6" width="150"/>
+ <spinner label="ロール・マッピング" name="JoystickAxis3"/>
+ <spinner label="ズーム・マッピング" name="JoystickAxis6"/>
<check_box label="直接ズーム" name="ZoomDirect"/>
<check_box label="3Dカーソル" name="Cursor3D"/>
<check_box label="自動レベル" name="AutoLeveling"/>
<text name="Control Modes:">
制御モード:
</text>
- <check_box label="アバター" left="131" name="JoystickAvatarEnabled"/>
- <check_box label="造る" left="201" name="JoystickBuildEnabled"/>
- <check_box label="フライ・カメラ" left="271" name="JoystickFlycamEnabled"/>
- <text left="5" name="XScale" width="120">
- Xスケール
- </text>
- <spinner left="135" name="AvatarAxisScale1" width="50"/>
- <spinner left="205" name="BuildAxisScale1" width="50"/>
- <spinner left="275" name="FlycamAxisScale1" width="50"/>
- <text left="5" name="YScale" width="120">
- Yスケール
- </text>
- <spinner left="135" name="AvatarAxisScale2" width="50"/>
- <spinner left="205" name="BuildAxisScale2" width="50"/>
- <spinner left="275" name="FlycamAxisScale2" width="50"/>
- <text left="5" name="ZScale" width="120">
- Zスケール
- </text>
- <spinner left="135" name="AvatarAxisScale0" width="50"/>
- <spinner left="205" name="BuildAxisScale0" width="50"/>
- <spinner left="275" name="FlycamAxisScale0" width="50"/>
- <text left="5" name="PitchScale" width="120">
+ <check_box label="アバター" name="JoystickAvatarEnabled"/>
+ <check_box label="造る" name="JoystickBuildEnabled"/>
+ <check_box label="フライ・カメラ" name="JoystickFlycamEnabled"/>
+ <text name="XScale">
+ Xスケール
+ </text>
+ <spinner name="AvatarAxisScale1"/>
+ <spinner name="BuildAxisScale1"/>
+ <spinner name="FlycamAxisScale1"/>
+ <text name="YScale">
+ Yスケール
+ </text>
+ <spinner name="AvatarAxisScale2"/>
+ <spinner name="BuildAxisScale2"/>
+ <spinner name="FlycamAxisScale2"/>
+ <text name="ZScale">
+ Zスケール
+ </text>
+ <spinner name="AvatarAxisScale0"/>
+ <spinner name="BuildAxisScale0"/>
+ <spinner name="FlycamAxisScale0"/>
+ <text name="PitchScale">
ピッチ・スケール
</text>
- <spinner left="135" name="AvatarAxisScale4" width="50"/>
- <spinner left="205" name="BuildAxisScale4" width="50"/>
- <spinner left="275" name="FlycamAxisScale4" width="50"/>
- <text left="5" name="YawScale" width="120">
+ <spinner name="AvatarAxisScale4"/>
+ <spinner name="BuildAxisScale4"/>
+ <spinner name="FlycamAxisScale4"/>
+ <text name="YawScale">
ヨー・スケール
</text>
- <spinner left="135" name="AvatarAxisScale5" width="50"/>
- <spinner left="205" name="BuildAxisScale5" width="50"/>
- <spinner left="275" name="FlycamAxisScale5" width="50"/>
- <text left="5" name="RollScale" width="120">
+ <spinner name="AvatarAxisScale5"/>
+ <spinner name="BuildAxisScale5"/>
+ <spinner name="FlycamAxisScale5"/>
+ <text name="RollScale">
ロール・スケール
</text>
- <spinner left="205" name="BuildAxisScale3" width="50"/>
- <spinner left="275" name="FlycamAxisScale3" width="50"/>
- <text left="5" name="XDeadZone" width="120">
- Xデッド・ゾーン
- </text>
- <spinner left="135" name="AvatarAxisDeadZone1" width="50"/>
- <spinner left="205" name="BuildAxisDeadZone1" width="50"/>
- <spinner left="275" name="FlycamAxisDeadZone1" width="50"/>
- <text left="5" name="YDeadZone" width="120">
- Yデッド・ゾーン
- </text>
- <spinner left="135" name="AvatarAxisDeadZone2" width="50"/>
- <spinner left="205" name="BuildAxisDeadZone2" width="50"/>
- <spinner left="275" name="FlycamAxisDeadZone2" width="50"/>
- <text left="5" name="ZDeadZone" width="120">
- Zデッド・ゾーン
- </text>
- <spinner left="135" name="AvatarAxisDeadZone0" width="50"/>
- <spinner left="205" name="BuildAxisDeadZone0" width="50"/>
- <spinner left="275" name="FlycamAxisDeadZone0" width="50"/>
- <text left="0" name="PitchDeadZone" width="125">
+ <spinner name="BuildAxisScale3"/>
+ <spinner name="FlycamAxisScale3"/>
+ <text name="XDeadZone">
+ Xデッド・ゾーン
+ </text>
+ <spinner name="AvatarAxisDeadZone1"/>
+ <spinner name="BuildAxisDeadZone1"/>
+ <spinner name="FlycamAxisDeadZone1"/>
+ <text name="YDeadZone">
+ Yデッド・ゾーン
+ </text>
+ <spinner name="AvatarAxisDeadZone2"/>
+ <spinner name="BuildAxisDeadZone2"/>
+ <spinner name="FlycamAxisDeadZone2"/>
+ <text name="ZDeadZone">
+ Zデッド・ゾーン
+ </text>
+ <spinner name="AvatarAxisDeadZone0"/>
+ <spinner name="BuildAxisDeadZone0"/>
+ <spinner name="FlycamAxisDeadZone0"/>
+ <text name="PitchDeadZone">
ピッチ・デッド・ゾーン
</text>
- <spinner left="135" name="AvatarAxisDeadZone4" width="50"/>
- <spinner left="205" name="BuildAxisDeadZone4" width="50"/>
- <spinner left="275" name="FlycamAxisDeadZone4" width="50"/>
- <text left="5" name="YawDeadZone" width="120">
+ <spinner name="AvatarAxisDeadZone4"/>
+ <spinner name="BuildAxisDeadZone4"/>
+ <spinner name="FlycamAxisDeadZone4"/>
+ <text name="YawDeadZone">
ヨー・デッド・ゾーン
</text>
- <spinner left="135" name="AvatarAxisDeadZone5" width="50"/>
- <spinner left="205" name="BuildAxisDeadZone5" width="50"/>
- <spinner left="275" name="FlycamAxisDeadZone5" width="50"/>
- <text left="0" name="RollDeadZone" width="125">
+ <spinner name="AvatarAxisDeadZone5"/>
+ <spinner name="BuildAxisDeadZone5"/>
+ <spinner name="FlycamAxisDeadZone5"/>
+ <text name="RollDeadZone">
ロール・デッド・ゾーン
</text>
- <spinner left="205" name="BuildAxisDeadZone3" width="50"/>
- <spinner left="275" name="FlycamAxisDeadZone3" width="50"/>
+ <spinner name="BuildAxisDeadZone3"/>
+ <spinner name="FlycamAxisDeadZone3"/>
<text name="Feathering">
感度調整
</text>
- <slider label="" left="126" name="AvatarFeathering" width="67"/>
- <slider label="" left="196" name="BuildFeathering" width="67"/>
- <slider label="" left="266" name="FlycamFeathering" width="67"/>
- <text left="0" name="ZoomScale2" width="140">
+ <slider label="" name="AvatarFeathering"/>
+ <slider label="" name="BuildFeathering"/>
+ <slider label="" name="FlycamFeathering"/>
+ <text name="ZoomScale2">
ズーム・スケール
</text>
- <spinner label="" left="275" name="FlycamAxisScale6" width="50"/>
- <text left="0" name="ZoomDeadZone" width="140">
+ <spinner label="" name="FlycamAxisScale6"/>
+ <text name="ZoomDeadZone">
ズーム・デッド・ゾーン
</text>
- <spinner label="" left="275" name="FlycamAxisDeadZone6" width="50"/>
- <button label="SpaceNavigatorのデフォルト設定" left="330" name="SpaceNavigatorDefaults" width="210"/>
- <button label="OK" label_selected="OK" name="ok_btn"/>
- <button label="取り消し" label_selected="取り消し" name="cancel_btn"/>
+ <spinner label="" name="FlycamAxisDeadZone6"/>
+ <button label="SpaceNavigatorのデフォルト設定" name="SpaceNavigatorDefaults"/>
+ <button label="OK" label_selected="OK" name="ok_btn"/>
+ <button label="キャンセル" label_selected="キャンセル" name="cancel_btn"/>
<stat_view label="ジョイスティック・モニター" name="axis_view">
- <stat_bar label="軸 0" name="axis0"/>
- <stat_bar label="軸 1" name="axis1"/>
- <stat_bar label="軸 2" name="axis2"/>
- <stat_bar label="軸 3" name="axis3"/>
- <stat_bar label="軸 4" name="axis4"/>
- <stat_bar label="軸 5" name="axis5"/>
+ <stat_bar label="軸0" name="axis0"/>
+ <stat_bar label="軸1" name="axis1"/>
+ <stat_bar label="軸2" name="axis2"/>
+ <stat_bar label="軸3" name="axis3"/>
+ <stat_bar label="軸4" name="axis4"/>
+ <stat_bar label="軸5" name="axis5"/>
</stat_view>
<string name="NoDevice">
- デバイスは検出されませんでした
+ デバイスは検出されませんでした。
</string>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_lagmeter.xml b/indra/newview/skins/default/xui/ja/floater_lagmeter.xml
index dd51d64ed2..e7830bbd25 100644
--- a/indra/newview/skins/default/xui/ja/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/ja/floater_lagmeter.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_lagmeter" title="ラグメーター">
<floater.string name="max_title_msg">
- ラグ計測器
+ 遅延計測器
</floater.string>
<floater.string name="max_width_px">
360
</floater.string>
<floater.string name="min_title_msg">
- ラグ
+ 遅延
</floater.string>
<floater.string name="min_width_px">
90
@@ -25,10 +25,10 @@
標準、ウィンドウは背景に
</floater.string>
<floater.string name="client_frame_time_critical_msg">
- クライアントのフレームレートが [CLIENT_FRAME_RATE_CRITICAL] 以下
+ クライアントのフレームレートが[CLIENT_FRAME_RATE_CRITICAL]以下
</floater.string>
<floater.string name="client_frame_time_warning_msg">
- クライアントのフレーム レートが [CLIENT_FRAME_RATE_CRITICAL] と [CLIENT_FRAME_RATE_WARNING] の間
+ クライアントのフレームレートが[CLIENT_FRAME_RATE_CRITICAL]と[CLIENT_FRAME_RATE_WARNING]の間
</floater.string>
<floater.string name="client_frame_time_normal_msg">
標準
@@ -55,10 +55,10 @@
5
</floater.string>
<floater.string name="network_packet_loss_critical_msg">
- 接続で [NETWORK_PACKET_LOSS_CRITICAL]% を超えるパケットが脱落しています
+ 接続で[NETWORK_PACKET_LOSS_CRITICAL]%を超えるパケットが脱落しています。
</floater.string>
<floater.string name="network_packet_loss_warning_msg">
- 接続で [NETWORK_PACKET_LOSS_WARNING]%~[NETWORK_PACKET_LOSS_CRITICAL]% のパケットが脱落しています
+ 接続で[NETWORK_PACKET_LOSS_WARNING]%~[NETWORK_PACKET_LOSS_CRITICAL]%のパケットが脱落しています。
</floater.string>
<floater.string name="network_performance_normal_msg">
標準
@@ -70,16 +70,16 @@
300
</floater.string>
<floater.string name="network_ping_critical_msg">
- 接続の ping 時間が [NETWORK_PING_CRITICAL] ms 以上です
+ 接続のping時間が、[NETWORK_PING_CRITICAL]ms以上です
</floater.string>
<floater.string name="network_ping_warning_msg">
- 接続の ping 時間が [NETWORK_PING_WARNING]~[NETWORK_PING_CRITICAL] ms です
+ 接続のping時間が、[NETWORK_PING_WARNING]~[NETWORK_PING_CRITICAL]msです。
</floater.string>
<floater.string name="network_packet_loss_cause_msg">
- 接続不良または &apos;帯域幅&apos; の設定が高すぎる可能性があります
+ 接続不良または、'帯域幅'の設定が高すぎる可能性があります。
</floater.string>
<floater.string name="network_ping_cause_msg">
- 接続不良またはファイル共有アプリの可能性があります。
+ 接続不良または、ファイル共有アプリの可能性があります。
</floater.string>
<floater.string name="server_text_msg">
サーバー
@@ -94,10 +94,10 @@
20
</floater.string>
<floater.string name="server_frame_time_critical_msg">
- シミュレータのフレームレートが [SERVER_FRAME_RATE_CRITICAL] 以下
+ シミュレータのフレームレートが、[SERVER_FRAME_RATE_CRITICAL]以下
</floater.string>
<floater.string name="server_frame_time_warning_msg">
- シミュレータのフレームレートが [SERVER_FRAME_RATE_CRITICAL] ~ [SERVER_FRAME_RATE_WARNING] の間
+ シミュレータのフレームレートが、[SERVER_FRAME_RATE_CRITICAL]~[SERVER_FRAME_RATE_WARNING]の間
</floater.string>
<floater.string name="server_frame_time_normal_msg">
標準
@@ -121,31 +121,31 @@
考えられる原因:シミュレータのロードが重すぎる
</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="クライアント ラグ ステータス"/>
+ <button name="client_lagmeter" tool_tip="クライアントの遅延ステータス"/>
<text name="client">
クライアント
</text>
<text name="client_text">
標準
</text>
- <button name="network_lagmeter" tool_tip="ネットワーク ラグ ステータス"/>
+ <button name="network_lagmeter" tool_tip="ネットワークの遅延ステータス"/>
<text name="network">
ネットワーク
</text>
<text name="network_text">
標準
</text>
- <button name="server_lagmeter" tool_tip="サーバー ラグ ステータス"/>
+ <button name="server_lagmeter" tool_tip="サーバーの遅延ステータス"/>
<text name="server">
サーバー
</text>
<text name="server_text">
標準
</text>
- <button label="&gt;&gt;" name="minimize" tool_tip="フローターのサイズをトグル"/>
+ <button label="》" name="minimize" tool_tip="フローターのサイズをトグル"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_land_holdings.xml b/indra/newview/skins/default/xui/ja/floater_land_holdings.xml
index aca916f22f..31009cb2e0 100644
--- a/indra/newview/skins/default/xui/ja/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/ja/floater_land_holdings.xml
@@ -2,13 +2,13 @@
<floater name="land holdings floater" title="自分の土地">
<scroll_list name="parcel list">
<column label="区画" name="name"/>
- <column label="地域(リージョン)" name="location"/>
+ <column label="リージョン(地域)" name="location"/>
<column label="種類" name="type"/>
<column label="面積" name="area"/>
<column label="" name="hidden"/>
</scroll_list>
- <button label="テレポート" label_selected="テレポート" name="Teleport" tool_tip="この土地の中心にテレポートします"/>
- <button label="地図" label_selected="地図" name="Show on Map" tool_tip="この土地を世界地図に表示します"/>
+ <button label="テレポート" label_selected="テレポート" name="Teleport" tool_tip="この土地の中心にテレポートします。"/>
+ <button label="マップ" label_selected="マップ" name="Show on Map" tool_tip="この土地をワールドマップに表示します。"/>
<text name="contrib_label">
所属グループへの貢献:
</text>
@@ -17,24 +17,24 @@
<column label="面積" name="area"/>
</scroll_list>
<text name="allowed_label">
- 現在の支払いプランで許可された保有地:
+ 現在の支払いプランで利用可能な入植地:
</text>
<text name="allowed_text">
- [AREA] 平方メートル
+ [AREA]㎡
</text>
<text name="current_label">
現在の保有地:
</text>
<text name="current_text">
- [AREA] 平方メートル
+ [AREA]㎡
</text>
<text name="available_label">
購入可能な土地:
</text>
<text name="available_text">
- [AREA] 平方メートル
+ [AREA]㎡
</text>
<string name="area_string">
- [AREA] 平方メートル
+ [AREA]㎡
</string>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_linkreplace.xml b/indra/newview/skins/default/xui/ja/floater_linkreplace.xml
index 806543dcc5..98711ccea7 100644
--- a/indra/newview/skins/default/xui/ja/floater_linkreplace.xml
+++ b/indra/newview/skins/default/xui/ja/floater_linkreplace.xml
@@ -1,2 +1,34 @@
-<?xml version="1.0" ?>
-<floater name="linkreplace" title="インベントリ リンク交換"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="linkreplace" title="インベントリのリンク置換え">
+ <string name="Ready">
+ 準備中…
+ </string>
+ <string name="TargetNotFound">
+ 置換先のアイテムは見つかりませんでした。
+ </string>
+ <string name="ItemsIdentical">
+ 置換元と置換先が同一です。
+ </string>
+ <string name="ItemsFound">
+ [NUM]件のリンクが見つかりました。
+ </string>
+ <string name="ItemsRemaining">
+ 残りリンク数:[NUM]件
+ </string>
+ <string name="ReplaceFinished">
+ インベントリのリンクの置換えが完了しました。
+ </string>
+ <text name="source_label">
+ 置換元:
+ </text>
+ <inventory_link_replace_drop_target name="source_uuid_editor" tool_tip="置換えたいインベントリ内のアイテムを、ここへドラッグ・アンド・ドロップしてください。"/>
+ <text type="string" name="target_label">
+ 置換先:
+ </text>
+ <inventory_link_replace_drop_target name="target_uuid_editor" tool_tip="新しいインベントリ内のアイテムを、ここへドラッグ・アンド・ドロップしてください。"/>
+ <text type="string" name="status_text">
+ 準備中…
+ </text>
+ <button name="btn_refresh" label="リフレッシュ"/>
+ <button name="btn_start" label="開始"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml
index f48cc642ee..770d7b4a13 100644
--- a/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/ja/floater_live_lsleditor.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script ed float" title="スクリプト: 新しいスクリプト">
+<floater name="script ed float" title="スクリプト:新しいスクリプト">
<floater.string name="not_allowed">
- このスクリプトは「コピー不可」のため、表示・編集することができません。 オブジェクト内のスクリプトの表示・編集には、全権限が必要です。
+ このスクリプトは「複製不可」のため、表示・編集することができません。オブジェクト内のスクリプトの表示・編集には、全権限が必要です。
</floater.string>
<floater.string name="script_running">
実行中
</floater.string>
<floater.string name="Title">
- スクリプト: [NAME]
+ スクリプト:[NAME]
</floater.string>
<floater.string name="experience_enabled">
オフにして、現在の体験を削除する
@@ -22,7 +22,7 @@
クリックして、体験プロフィールを表示する
</floater.string>
<floater.string name="loading">
- ロード中...
+ 読み込んでいます…
</floater.string>
<button label="リセット" label_selected="リセット" name="Reset"/>
<check_box initial_value="true" label="実行中" name="running"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_load_pref_preset.xml b/indra/newview/skins/default/xui/ja/floater_load_pref_preset.xml
index 351d8507cc..fa27721bd4 100644
--- a/indra/newview/skins/default/xui/ja/floater_load_pref_preset.xml
+++ b/indra/newview/skins/default/xui/ja/floater_load_pref_preset.xml
@@ -1,14 +1,14 @@
-<?xml version="1.0" encoding="utf-8"?>
-<floater name="Load Pref Preset" title="優先プリセットをロード">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="load_pref_preset" title="プリセット設定を読み込み">
<string name="title_graphic">
- グラフィックプリセットをロード
+ グラフィックのプリセットを読み込む
</string>
<string name="title_camera">
- カメラプリセットをロード
+ カメラのプリセットを読み込む
</string>
<text name="Preset">
プリセットを選択
</text>
- <button label="OK" name="ok"/>
- <button label="取り消し" name="cancel"/>
+ <button label="OK" name="ok"/>
+ <button label="キャンセル" name="cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_lsl_guide.xml b/indra/newview/skins/default/xui/ja/floater_lsl_guide.xml
index 5773752788..4bb370f6ea 100644
--- a/indra/newview/skins/default/xui/ja/floater_lsl_guide.xml
+++ b/indra/newview/skins/default/xui/ja/floater_lsl_guide.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script ed float" title="LSL レファレンス">
+<floater name="script ed float" title="LSLレファレンス">
<check_box label="カーソルを追う" name="lock_check"/>
<combo_box label="ロック" name="history_combo"/>
<button label="戻る" name="back_btn"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_map.xml b/indra/newview/skins/default/xui/ja/floater_map.xml
index 1122203446..000f2ce67e 100644
--- a/indra/newview/skins/default/xui/ja/floater_map.xml
+++ b/indra/newview/skins/default/xui/ja/floater_map.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Map" title="ミニマップ">
<floater.string name="ToolTipMsg">
- [REGION](ダブルクリックで地図を開く。Shift‐ドラッグで水平・垂直移動)
+ [REGION](ダブルクリックでマップを表示。Shift+ドラッグで水平・垂直移動)
</floater.string>
<floater.string name="AltToolTipMsg">
- [地域](ダブルクリックでテレポート。Shift‐ドラッグで水平・垂直移動)
+ [REGION](ダブルクリックでテレポート。Shift+ドラッグで水平・垂直移動)
</floater.string>
<floater.string name="mini_map_caption">
ミニマップ
diff --git a/indra/newview/skins/default/xui/ja/floater_marketplace_listings.xml b/indra/newview/skins/default/xui/ja/floater_marketplace_listings.xml
index f6b8e2928e..522d558aba 100644
--- a/indra/newview/skins/default/xui/ja/floater_marketplace_listings.xml
+++ b/indra/newview/skins/default/xui/ja/floater_marketplace_listings.xml
@@ -1,10 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_marketplace_listings" title="マーケットプレイスのリスト">
+<floater title="マーケットプレイス一覧" name="floater_marketplace_listings">
<panel name="marketplace_listings_panel">
<panel>
<panel name="marketplace_listings_inventory_placeholder_panel">
- <text name="marketplace_listings_inventory_placeholder_title">ロード中...</text>
+ <text name="marketplace_listings_inventory_placeholder_title">
+ 読み込んでいます…
+ </text>
+ <text name="marketplace_listings_inventory_placeholder_text"/>
</panel>
+ <panel name="panel_marketplace_listing" filename="panel_marketplace_listings.xml" class="llpanelmarketplacelistings" top="0" follows="all"/>
</panel>
+ <panel name="marketplace_panel_status"/>
+ <layout_stack name="initialization_progress_indicator"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_marketplace_validation.xml b/indra/newview/skins/default/xui/ja/floater_marketplace_validation.xml
index 164864ed4e..bc74ac5d48 100644
--- a/indra/newview/skins/default/xui/ja/floater_marketplace_validation.xml
+++ b/indra/newview/skins/default/xui/ja/floater_marketplace_validation.xml
@@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_marketplace_validation" title="マーケットプレイスのリストの監査">
- <button label="OK" label_selected="OK" name="OK"/>
- <text_editor name="validation_text">MARKETPLACE_VALIDATION_TEXT</text_editor>
+ <button label="OK" label_selected="OK" name="OK"/>
+ <text_editor name="validation_text">
+ MARKETPLACE_VALIDATION_TEXT
+ </text_editor>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_media_browser.xml b/indra/newview/skins/default/xui/ja/floater_media_browser.xml
index c4731b73a3..038e484655 100644
--- a/indra/newview/skins/default/xui/ja/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/ja/floater_media_browser.xml
@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_about" title="メディアブラウザ">
<floater.string name="home_page_url">
- http://jp.secondlife.com
+ https://secondlife.com
</floater.string>
<floater.string name="support_page_url">
- http://jp.secondlife.com/support
+ https://support.secondlife.com/
</floater.string>
<layout_stack name="stack1">
<layout_panel name="nav_controls">
<button label="戻る" name="back"/>
<button label="進む" name="forward"/>
- <button label="更新" name="reload"/>
+ <button label="リロード" name="reload"/>
<button label="閲覧" name="go"/>
</layout_panel>
<layout_panel name="time_controls">
diff --git a/indra/newview/skins/default/xui/ja/floater_media_settings.xml b/indra/newview/skins/default/xui/ja/floater_media_settings.xml
index 46ac1a8dfd..423a329871 100644
--- a/indra/newview/skins/default/xui/ja/floater_media_settings.xml
+++ b/indra/newview/skins/default/xui/ja/floater_media_settings.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="media_settings" title="メディアの設定">
- <button label="OK" label_selected="OK" name="OK"/>
+ <button label="OK" label_selected="OK" name="OK"/>
<button label="キャンセル" label_selected="キャンセル" name="Cancel"/>
<button label="適用" label_selected="適用" name="Apply"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml b/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml
index f48bb94e32..b483dc2134 100644
--- a/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml
+++ b/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="MemLeak" title="メモリリークのシミュレート">
- <spinner label="リーク速度(1フレームごとのバイト数):" label_width="244" name="leak_speed"/>
- <spinner label="最大メモリリーク(MB):" label_width="244" name="max_leak"/>
+ <spinner label="リーク速度(1フレームごとのバイト数):" name="leak_speed"/>
+ <spinner label="最大メモリリーク(㎆):" name="max_leak"/>
<text name="total_leaked_label">
- 現在のメモリリーク: [SIZE] KB
+ 現在のメモリリーク:[SIZE]㎅
</text>
<text name="note_label_1">
[NOTE1]
diff --git a/indra/newview/skins/default/xui/ja/floater_mfa.xml b/indra/newview/skins/default/xui/ja/floater_mfa.xml
new file mode 100644
index 0000000000..8bce64ae45
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_mfa.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater title="二段階認証トークンが必要です" name="mfa_challenge">
+ <text name="token_prompt_text">
+ トークンのプロンプト
+ </text>
+ <line_editor name="token_edit"/>
+ <button label="続ける" name="continue_btn"/>
+ <button label="キャンセル" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_model_preview.xml b/indra/newview/skins/default/xui/ja/floater_model_preview.xml
index 9292433cd2..69629f357f 100644
--- a/indra/newview/skins/default/xui/ja/floater_model_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_model_preview.xml
@@ -5,13 +5,13 @@
エラー:Dae に問題が見つかりました - 詳細についてはログをご参照ください。
</string>
<string name="status_bind_shape_orientation">
- 警告: バインドシェイプマトリックスは、標準の X 軸正方向にはありません。
+ 警告:バインドシェイプマトリックスは、標準の X 軸正方向にはありません。
</string>
<string name="status_material_mismatch">
エラー:モデルの材料は参考モデルのサブセットではありません。
</string>
<string name="status_reading_file">
- ローディング...
+ 読み込んでいます…
</string>
<string name="status_generating_meshes">
メッシュを作成中
@@ -44,10 +44,10 @@
なし
</string>
<string name="mesh_status_submesh_mismatch">
- テクスチャ編集可能な面の数は描画詳細度に応じて異なります。
+ テクスチャ編集可能な面の数は、描画詳細度に応じて異なります。
</string>
<string name="mesh_status_mesh_mismatch">
- メッシュインスタンスの数は描画詳細度に応じて異なります。
+ メッシュインスタンスの数は、描画詳細度に応じて異なります。
</string>
<string name="mesh_status_too_many_vertices">
描画詳細度に対して頂点の数が多すぎます。
@@ -56,10 +56,10 @@
必要な描画詳細度が見つかりません。
</string>
<string name="mesh_status_invalid_material_list">
- LOD 付きの材料は参考モデルのサブセットではありません。
+ LOD付きの材料は、参考モデルのサブセットではありません。
</string>
<string name="phys_status_vertex_limit_exceeded">
- 一部の物理的な外殻構造が頂点の制限を超えます。
+ 一部の物理的な外殻構造が、頂点の制限を超えます。
</string>
<string name="layer_all">
全て
@@ -68,7 +68,7 @@
分析中
</string>
<string name="simplifying">
- 単純化
+ 簡素化
</string>
<string name="tbd">
未定
@@ -79,12 +79,12 @@
モデル名:
</text>
<text name="model_category_label">
- このモデルは...
+ このモデルは…
</text>
<combo_box name="model_category_combo">
- <combo_item label="1つを選択..." name="Choose one"/>
+ <combo_item label="1つを選択…" name="Choose one"/>
<combo_item label="アバターの形" name="Avatar shape"/>
- <combo_item label="アバターのアタッチメント" name="Avatar attachment"/>
+ <combo_item label="アバターの装着物" name="Avatar attachment"/>
<combo_item label="動くオブジェクト(車、動物)" name="Moving object (vehicle, animal)"/>
<combo_item label="制作用コンポーネント" name="Building Component"/>
<combo_item label="大型、不動、等" name="Large, non moving etc"/>
@@ -99,7 +99,7 @@
<text initial_value="頂点" name="vertices" value="頂点"/>
<text initial_value="高" name="high_label" value="高"/>
<combo_box name="lod_source_high">
- <item label="ファイルからロード" name="Load from file" value="ファイルからロード"/>
+ <item label="ファイルから読み込む" name="Load from file" value="ファイルから読み込む"/>
<item label="生成" name="Generate" value="生成"/>
</combo_box>
<button label="参照" name="lod_browse_high"/>
@@ -111,7 +111,7 @@
<text initial_value="0" name="high_vertices" value="0"/>
<text initial_value="中" name="medium_label" value="中"/>
<combo_box name="lod_source_medium">
- <item label="ファイルからロード" name="Load from file" value="ファイルからロード"/>
+ <item label="ファイルから読み込む" name="Load from file" value="ファイルから読み込む"/>
<item label="生成" name="Generate" value="生成"/>
<item label="上記の LoD を使用" name="Use LoD above" value="上記の LoD を使用"/>
</combo_box>
@@ -124,7 +124,7 @@
<text initial_value="0" name="medium_vertices" value="0"/>
<text initial_value="低" name="low_label" value="低"/>
<combo_box name="lod_source_low">
- <item label="ファイルからロード" name="Load from file" value="ファイルからロード"/>
+ <item label="ファイルから読み込む" name="Load from file" value="ファイルから読み込む"/>
<item label="生成" name="Generate" value="生成"/>
<item label="上記の LoD を使用" name="Use LoD above" value="上記の LoD を使用"/>
</combo_box>
@@ -137,7 +137,7 @@
<text initial_value="0" name="low_vertices" value="0"/>
<text initial_value="最低" name="lowest_label" value="最低"/>
<combo_box name="lod_source_lowest">
- <item label="ファイルからロード" name="Load from file" value="ファイルからロード"/>
+ <item label="ファイルから読み込む" name="Load from file" value="ファイルから読み込む"/>
<item label="生成" name="Generate" value="生成"/>
<item label="上記の LoD を使用" name="Use LoD above" value="上記の LoD を使用"/>
</combo_box>
@@ -155,11 +155,11 @@
<panel label="物理効果" name="physics_panel">
<panel name="physics geometry">
<text name="first_step_name">
- 手順1:描画詳細度
+ 手順1:描画詳細度
</text>
<combo_box name="physics_lod_combo" tool_tip="実像に適用するLOD">
<combo_item name="choose_one">
- 1つを選択...
+ 1つを選択…
</combo_item>
<combo_item name="physics_high">
@@ -181,7 +181,7 @@
</panel>
<panel name="physics analysis">
<text name="method_label">
- 手順2:分析
+ 手順2:分析
</text>
<text name="analysis_method_label">
方法:
@@ -194,11 +194,11 @@
</text>
<check_box label="穴を閉じる" name="Close Holes (Slow)"/>
<button label="分析" name="Decompose"/>
- <button label="取り消し" name="decompose_cancel"/>
+ <button label="キャンセル" name="decompose_cancel"/>
</panel>
<panel name="physics simplification">
<text name="second_step_label">
- 手順3:単純化
+ 手順3:簡素化
</text>
<text name="simp_method_header">
方法:
@@ -213,8 +213,8 @@
維持率:
</text>
<combo_box name="Combine Quality" value="1"/>
- <button label="単純化" name="Simplify"/>
- <button label="取り消し" name="simplify_cancel"/>
+ <button label="簡素化" name="Simplify"/>
+ <button label="キャンセル" name="simplify_cancel"/>
</panel>
<panel name="physics info">
<text name="results_text">
@@ -233,31 +233,31 @@
</panel>
<panel label="アップロードのオプション" name="modifiers_panel">
<text name="scale_label">
- スケール(1=増減なし):
+ スケール(1=増減なし):
</text>
<spinner name="import_scale" value="1.0"/>
<text name="dimensions_label">
サイズ:
</text>
<text name="import_dimensions">
- [X] X [Y] X [Z]
+ [X]✕[Y]✕[Z]
</text>
<check_box label="テクスチャを含む" name="upload_textures"/>
<text name="include_label">
アバターモデル専用:
</text>
<check_box label="スキンの重さを含む" name="upload_skin"/>
- <check_box label="ジョイントポジションを含む" name="upload_joints"/>
+ <check_box label="ジョイント位置を含む" name="upload_joints"/>
<check_box label="ジョイント位置が定義されている場合、スケールをロック" name="lock_scale_if_joint_position"/>
<text name="pelvis_offset_label">
- Z オフセット(アバターを上下調整):
+ Zオフセット(アバターを上下調整):
</text>
<spinner name="pelvis_offset" value="0.0"/>
</panel>
</tab_container>
<panel name="weights_and_warning_panel">
<button label="ウェイトと料金の計算" name="calculate_btn" tool_tip="ウェイトと料金の計算"/>
- <button label="取り消し" name="cancel_btn"/>
+ <button label="キャンセル" name="cancel_btn"/>
<button label="アップロード" name="ok_btn" tool_tip="シミュレーターにアップロード"/>
<button label="設定をクリアしてフォームをリセット" name="reset_btn"/>
<text name="upload_fee">
@@ -279,7 +279,7 @@
ご注意:
</text>
<text name="warning_message">
- メッシュモデルをアップロードする権利がありません。権利の取得方法については [[VURL]] こちらを参照してください。
+ メッシュモデルをアップロードする権利がありません。権利の取得方法については[[VURL]]こちらを参照してください。
</text>
<text name="status">
[STATUS]
@@ -290,7 +290,7 @@
プレビュー:
</text>
<panel name="right_panel">
- <combo_box name="preview_lod_combo" tool_tip="プレビュー表示の LOD 設定">
+ <combo_box name="preview_lod_combo" tool_tip="プレビュー表示のLOD設定">
<combo_item name="high">
</combo_item>
@@ -305,13 +305,13 @@
</combo_item>
</combo_box>
<text name="label_display">
- ディスプレイ...
+ 外観…
</text>
- <check_box label="稜" name="show_edges"/>
+ <check_box label="輪部" name="show_edges"/>
<check_box label="物理効果" name="show_physics"/>
<check_box label="テクスチャ" name="show_textures"/>
<check_box label="スキンの重さ" name="show_skin_weight"/>
- <check_box label="ジョイント" name="show_joint_positions"/>
+ <check_box label="ジョイント位置" name="show_joint_positions"/>
<text name="physics_explode_label">
プレビュースプレッド:
</text>
diff --git a/indra/newview/skins/default/xui/ja/floater_moveview.xml b/indra/newview/skins/default/xui/ja/floater_moveview.xml
index aed3b78a14..e56a93e891 100644
--- a/indra/newview/skins/default/xui/ja/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_moveview.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="move_floater" title="歩行 / 走行 / 飛行">
+<floater name="move_floater" title="歩行/走行/飛行">
<string name="walk_forward_tooltip">
前に進む(上矢印か W を押す)
</string>
diff --git a/indra/newview/skins/default/xui/ja/floater_mute_object.xml b/indra/newview/skins/default/xui/ja/floater_mute_object.xml
index 04ffd5254d..4cb6b50836 100644
--- a/indra/newview/skins/default/xui/ja/floater_mute_object.xml
+++ b/indra/newview/skins/default/xui/ja/floater_mute_object.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="mute by name" title="名前でオブジェクトをブロック">
+<floater name="block by name" title="名前でオブジェクトをブロック">
<text name="message">
オブジェクトをブロックします:
</text>
@@ -9,6 +9,6 @@
<text name="note">
* ブロックされるのはオブジェクトの文字だけで、音はブロックされません。
</text>
- <button label="OK" name="OK"/>
- <button label="キャンセル" name="Cancel"/>
+ <button label="OK" name="OK" top_pad="10"/>
+ <button label="キャンセル" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_my_environments.xml b/indra/newview/skins/default/xui/ja/floater_my_environments.xml
index d697a9f321..b316222919 100644
--- a/indra/newview/skins/default/xui/ja/floater_my_environments.xml
+++ b/indra/newview/skins/default/xui/ja/floater_my_environments.xml
@@ -1,23 +1,28 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater label="場所" name="my_environments" title="私の環境">
- <layout_stack>
- <layout_panel label="フィルター" name="filter_panel">
+<floater name="my_environments" title="私の環境">
+ <layout_stack name="main_layout">
+ <layout_panel name="filter_panel" label="フィルタ">
+ <icon name="icon_settingsdays"/>
<check_box label="日間" name="chk_days"/>
+ <icon name="icon_settingsskies"/>
<check_box label="空" name="chk_skies"/>
- <check_box label="水" name="chk_water"/>
+ <icon name="icon_settingswater"/>
+ <check_box label="水面" name="chk_water"/>
<filter_editor label="環境の絞り込み" name="flt_search"/>
</layout_panel>
- <layout_panel label="環境" name="list_panel">
- <panel label="pnl_inv_wrap" name="pnl_inv_wrap"/>
+ <layout_panel name="list_panel" label="環境">
+ <panel name="pnl_inv_wrap" label="pnl_inv_wrap">
+ <asset_filtered_inv_panel name="pnl_settings"/>
+ </panel>
</layout_panel>
- <layout_panel>
- <check_box initial_value="false" label="すべてのフォルダを表示" name="chk_showfolders"/>
+ <layout_panel name="lp_showfolders">
+ <check_box label="全てのフォルダを開く" name="chk_showfolders"/>
</layout_panel>
<layout_panel name="pnl_control">
- <panel label="bottom_panel" name="pnl_bottom">
+ <panel label="ボトムパネル" name="pnl_bottom">
<menu_button name="btn_gear" tool_tip="その他のオプションを表示"/>
- <menu_button name="btn_newsettings" tool_tip="新規設定を作成"/>
- <button name="btn_del" tool_tip="選択したアイテムを削除"/>
+ <menu_button name="btn_newsettings" tool_tip="新しい設定を作成"/>
+ <button name="btn_del" tool_tip="選択した項目を削除"/>
</panel>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/ja/floater_my_inventory.xml b/indra/newview/skins/default/xui/ja/floater_my_inventory.xml
index d708fc3dec..01644e0925 100644
--- a/indra/newview/skins/default/xui/ja/floater_my_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/floater_my_inventory.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_my_inventory" title="インベントリ"/>
+<floater name="floater_my_inventory" title="インベントリ"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/floater_my_scripts.xml b/indra/newview/skins/default/xui/ja/floater_my_scripts.xml
index c691e37613..fb74c34d00 100644
--- a/indra/newview/skins/default/xui/ja/floater_my_scripts.xml
+++ b/indra/newview/skins/default/xui/ja/floater_my_scripts.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="myscripts" title="スクリプト"/>
+<floater name="myscripts" title="スクリプト"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/floater_notification.xml b/indra/newview/skins/default/xui/ja/floater_notification.xml
index 0f37b30f52..cd4c1d4def 100644
--- a/indra/newview/skins/default/xui/ja/floater_notification.xml
+++ b/indra/newview/skins/default/xui/ja/floater_notification.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="notification" title="通知コンソール">
<text_editor name="payload">
- ローディング...
+ 読み込んでいます…。
</text_editor>
- <combo_box label="応答" name="response"/>
+ <combo_box label="レスポンス" name="response"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_object_weights.xml b/indra/newview/skins/default/xui/ja/floater_object_weights.xml
index d727a268fb..18a6b77f8e 100644
--- a/indra/newview/skins/default/xui/ja/floater_object_weights.xml
+++ b/indra/newview/skins/default/xui/ja/floater_object_weights.xml
@@ -1,28 +1,28 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="object_weights" title="詳しい設定">
- <floater.string name="nothing_selected" value="--"/>
+ <floater.string name="nothing_selected" value="─"/>
<text name="selected_text" value="選択済"/>
- <text name="objects" value="--"/>
+ <text name="objects" value="─"/>
<text name="objects_label" value="オブジェクト"/>
- <text name="prims" value="--"/>
+ <text name="prims" value="─"/>
<text name="prims_label" value="プリム"/>
<text name="weights_of_selected_text" value="選択済みアイテムのウエイト"/>
- <text name="download" value="--"/>
+ <text name="download" value="─"/>
<text name="download_label" value="ダウンロード"/>
- <text name="physics" value="--"/>
+ <text name="physics" value="─"/>
<text name="physics_label" value="物理効果"/>
- <text name="server" value="--"/>
+ <text name="server" value="─"/>
<text name="server_label" value="サーバー"/>
- <text name="display" value="--"/>
+ <text name="display" value="─"/>
<text name="display_label" value="ディスプレイ"/>
<text name="land_impacts_text" value="土地の負荷"/>
- <text name="selected" value="--"/>
+ <text name="selected" value="─"/>
<text name="selected_label" value="選択済"/>
- <text name="rezzed_on_land" value="--"/>
+ <text name="rezzed_on_land" value="─"/>
<text name="rezzed_on_land_label" value="土地に Rez 済み"/>
- <text name="remaining_capacity" value="--"/>
+ <text name="remaining_capacity" value="─"/>
<text name="remaining_capacity_label" value="残りの許容数"/>
- <text name="total_capacity" value="--"/>
+ <text name="total_capacity" value="─"/>
<text name="total_capacity_label" value="許容合計"/>
<text name="help_SLURL" value="[secondlife:///app/help/object_weights オブジェクトのウェイトとは?]"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_openobject.xml b/indra/newview/skins/default/xui/ja/floater_openobject.xml
index 3f2f71511b..b3743f03b2 100644
--- a/indra/newview/skins/default/xui/ja/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/ja/floater_openobject.xml
@@ -1,13 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="objectcontents" title="オブジェクトの中身">
+<floater name="objectcontents" title="オブジェクトのコンテンツ">
<text name="object_name">
- [DESC]:
+ [DESC]:
</text>
- <text name="border_note">
- インベントリおよびウェアにコピー
- </text>
- <button label="アウトフィットに追加" label_selected="アウトフィットに追加" name="copy_and_wear_button"/>
- <button label="アウトフィットを交換" label_selected="アウトフィットを交換" name="copy_and_replace_button"/>
- <button label="インベントリにコピーするだけ" label_selected="インベントリにコピーするだけ" name="copy_to_inventory_button"/>
- <button label="取り消し" label_selected="取り消し" name="cancel_button"/>
+ <panel_inventory_object name="object_contents"/>
+ <button label="インベントリにコピーのみ" label_selected="インベントリにコピー" name="copy_to_inventory_button"/>
+ <button label="キャンセル" label_selected="キャンセル" name="cancel_button"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_outfit_photo_preview.xml b/indra/newview/skins/default/xui/ja/floater_outfit_photo_preview.xml
new file mode 100644
index 0000000000..96809924c1
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_outfit_photo_preview.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="outfit_photo_preview">
+ <floater.string name="Title">
+ テスクチャ:[NAME]
+ </floater.string>
+ <floater.string name="exceed_limits">
+ アウトフィット画像の最大サイズは[MAX_WIDTH]✕[MAX_HEIGHT]です。他のテスクチャを選択してください。
+ </floater.string>
+ <floater.string name="photo_confirmation">
+ この画像を[OUTFIT]のアウトフィット画像にしますか?
+ </floater.string>
+ <text name="dimensions">
+ [WIDTH]px✕[HEIGHT]px
+ </text>
+ <text name="notification"/>
+ <button label="OK" name="ok_btn"/>
+ <button label="キャンセル" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/ja/floater_outfit_save_as.xml
index 70555e6ded..85d5b5e2c6 100644
--- a/indra/newview/skins/default/xui/ja/floater_outfit_save_as.xml
+++ b/indra/newview/skins/default/xui/ja/floater_outfit_save_as.xml
@@ -3,10 +3,9 @@
<button label="保存" label_selected="保存" name="Save"/>
<button label="キャンセル" label_selected="キャンセル" name="Cancel"/>
<text name="Save item as:">
- 着用しているものを
-新しいアウトフィットに保存:
+ 名前をつけて保存:
</text>
<line_editor name="name ed">
- [DESC] (新)
+ [DESC] (NEW)
</line_editor>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml b/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml
index f1a05e0eec..d74b714b1a 100644
--- a/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml
@@ -4,7 +4,7 @@
5
</floater.string>
<floater.string name="localchat">
- 近くのボイスチャット
+ 近隣のボイスチャット
</floater.string>
<floater.string name="anonymous">
匿名ユーザー
@@ -13,28 +13,28 @@
がコールしています。
</floater.string>
<floater.string name="VoiceInviteAdHoc">
- がコンファレンスチャットで、ボイスチャットに参加しました。
+ が会話チャットで、ボイスチャットに参加しました。
</floater.string>
<text name="connecting">
- [CALLEE_NAME] に接続中
+ [CALLEE_NAME]に接続中
</text>
<text name="calling">
- [CALLEE_NAME] にコール中
+ [CALLEE_NAME]をコール中
</text>
<text name="noanswer">
- 繋がりませんでした。 あとでもう一度お試しください。
+ 繋がりませんでした。あとでもう一度お試しください。
</text>
<text name="nearby">
- [VOICE_CHANNEL_NAME] への接続が切れました。 [RECONNECT_NEARBY]
+ [VOICE_CHANNEL_NAME]への接続が切れました。[RECONNECT_NEARBY]
</text>
<text name="nearby_P2P_by_other">
- コールを切りました。 [RECONNECT_NEARBY]
+ コールを切りました。[RECONNECT_NEARBY]
</text>
<text name="nearby_P2P_by_agent">
- コールを終了しました。 [RECONNECT_NEARBY]
+ コールを終了しました。[RECONNECT_NEARBY]
</text>
<text name="leaving">
- [CURRENT_CHAT] を終了します。
+ [CURRENT_CHAT]を終了します。
</text>
<button label="キャンセル" label_selected="キャンセル" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_pathfinding_characters.xml b/indra/newview/skins/default/xui/ja/floater_pathfinding_characters.xml
index 0e72b40dc6..00742aef23 100644
--- a/indra/newview/skins/default/xui/ja/floater_pathfinding_characters.xml
+++ b/indra/newview/skins/default/xui/ja/floater_pathfinding_characters.xml
@@ -1,22 +1,22 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_pathfinding_characters" title="パスファインディングキャラクター">
+<floater name="floater_pathfinding_characters" title="経路探索キャラクター">
<floater.string name="messaging_get_inprogress">
- パスファインディングキャラクターを照会中...
+ 経路探索キャラクターを照会中…
</floater.string>
<floater.string name="messaging_get_error">
- パスファインディングキャラクターの照会中にエラーが発生しました。
+ 経路探索キャラクターの照会中にエラーが発生しました。
</floater.string>
<floater.string name="messaging_complete_none_found">
- パスファインディングキャラクターがありません。
+ 経路探索キャラクターがありません。
</floater.string>
<floater.string name="messaging_complete_available">
- [NUM_TOTAL] キャラクター中 [NUM_SELECTED] キャラクターが選択されました。
+ [NUM_TOTAL]人のキャラクター中[NUM_SELECTED]人のキャラクターが選択されました。
</floater.string>
<floater.string name="messaging_not_enabled">
- この地域(リージョン)はパスファインディングに対応していません。
+ このリージョン(地域)は経路探索に対応していません。
</floater.string>
<floater.string name="character_cpu_time">
- [CPU_TIME] µs
+ [CPU_TIME]㎲
</floater.string>
<floater.string name="character_owner_loading">
[Loading]
@@ -32,7 +32,7 @@
<scroll_list.columns label="名前" name="name"/>
<scroll_list.columns label="説明" name="description"/>
<scroll_list.columns label="所有者" name="owner"/>
- <scroll_list.columns label="CPU" name="cpu_time"/>
+ <scroll_list.columns label="CPU" name="cpu_time"/>
<scroll_list.columns label="高度" name="altitude"/>
</scroll_list>
<text name="messaging_status">
@@ -50,7 +50,7 @@
<check_box label="物理効果カプセルを表示" name="show_physics_capsule"/>
<button label="取る" name="take_objects"/>
<button label="コピーを取る" name="take_copy_objects"/>
- <button label="私をそこにテレポートする" name="teleport_me_to_object" tool_tip="1 つのキャラクターが選択された場合にのみ有効です。"/>
+ <button label="その場所にテレポート" name="teleport_me_to_object" tool_tip="1つのキャラクターが選択された場合にのみ有効です。"/>
<button label="返却" name="return_objects"/>
<button label="削除" name="delete_objects"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml
index d531d588f7..218fade27b 100644
--- a/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml
+++ b/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_pathfinding_console" title="パスファインディングの表示/テスト">
+<floater name="floater_pathfinding_console" title="経路探索の表示/テスト">
<floater.string name="navmesh_viewer_status_library_not_implemented">
- パスファインディングライブラリの実装が見つかりません。
+ 経路探索ライブラリの実装が見つかりません。
</floater.string>
<floater.string name="navmesh_viewer_status_region_not_enabled">
- この地域(リージョン)はパスファインディングに対応していません。
+ このリージョン(地域)は経路探索に対応していません。
</floater.string>
<floater.string name="navmesh_viewer_status_region_loading">
- 地域(リージョン)の読み込みを待機しています。
+ リージョン(地域)の読み込みを待機しています。
</floater.string>
<floater.string name="navmesh_viewer_status_checking_version">
ナビメッシュのステータスを確認しています。
@@ -22,7 +22,7 @@
最新のナビメッシュがダウンロードされました。
</floater.string>
<floater.string name="navmesh_viewer_status_error">
- ナビメッシュを正しくダウンロードできません。
+ ナビメッシュが正しくダウンロードできませんでした。
</floater.string>
<floater.string name="navmesh_simulator_status_pending">
ナビメッシュに保留中の変更があります。
@@ -31,22 +31,22 @@
ナビメッシュを作成しています。
</floater.string>
<floater.string name="navmesh_simulator_status_some_pending">
- ナビメッシュの一部の地域(リージョン)に保留中の変更があります。
+ ナビメッシュの一部のリージョン(地域)に保留中の変更があります。
</floater.string>
<floater.string name="navmesh_simulator_status_some_building">
- 一部のナビメッシュ地域(リージョン)を構築しています。
+ 一部のナビメッシュのリージョン(地域)を構築しています。
</floater.string>
<floater.string name="navmesh_simulator_status_pending_and_building">
- ナビメッシュの一部の地域(リージョン)に保留中の変更があり、その他の地域(リージョン)は構築中です。
+ ナビメッシュの一部のリージョン(地域)に保留中の変更があり、その他のリージョンは構築中です。
</floater.string>
<floater.string name="navmesh_simulator_status_complete">
ナビメッシュは最新です。
</floater.string>
<floater.string name="pathing_library_not_implemented">
- パスファインディングライブラリの実装が見つかりません。
+ 経路探索ライブラリの実装が見つかりません。
</floater.string>
<floater.string name="pathing_region_not_enabled">
- この地域(リージョン)はパスファインディングに対応していません。
+ このリージョン(地域)は経路探索に対応していません。
</floater.string>
<floater.string name="pathing_choose_start_and_end_points">
開始点と終了点を選択してください。
@@ -61,19 +61,19 @@
パスはオレンジ色で表示されています。
</floater.string>
<floater.string name="pathing_path_invalid">
- 選択した 2 点間のパスが見つかりません。
+ 選択した2点間のパスが見つかりません。
</floater.string>
<floater.string name="pathing_error">
パスの生成中にエラーが発生しました。
</floater.string>
<panel name="pathfinding_console_main">
<text name="viewer_status_label">
- ビューワステータス
+ ビューアのステータス
</text>
</panel>
<panel name="pathfinding_console_simulator">
<text name="simulator_status_label">
- シミュレータステータス
+ シミュレータのステータス
</text>
</panel>
<tab_container name="view_test_tab_container">
@@ -81,51 +81,51 @@
<text name="show_label">
表示:
</text>
- <check_box label="世界" name="show_world"/>
+ <check_box label="ワールド" name="show_world"/>
<check_box label="可動物のみ" name="show_world_movables_only"/>
<check_box label="ナビメッシュ" name="show_navmesh"/>
<text name="show_walkability_label">
- 歩行可能マップを表示:
+ 歩行可能マップを表示:
</text>
<combo_box name="show_heatmap_mode">
<combo_box.item label="表示しない" name="show_heatmap_mode_none"/>
- <combo_box.item label="キャラクター タイプ A" name="show_heatmap_mode_a"/>
- <combo_box.item label="キャラクター タイプ B" name="show_heatmap_mode_b"/>
- <combo_box.item label="キャラクター タイプ C" name="show_heatmap_mode_c"/>
- <combo_box.item label="キャラクター タイプ D" name="show_heatmap_mode_d"/>
+ <combo_box.item label="キャラクタータイプA" name="show_heatmap_mode_a"/>
+ <combo_box.item label="キャラクタータイプB" name="show_heatmap_mode_b"/>
+ <combo_box.item label="キャラクタータイプC" name="show_heatmap_mode_c"/>
+ <combo_box.item label="キャラクタータイプD" name="show_heatmap_mode_d"/>
</combo_box>
<check_box label="歩行可能" name="show_walkables"/>
<check_box label="素材ボリューム" name="show_material_volumes"/>
<check_box label="静的障害物" name="show_static_obstacles"/>
<check_box label="除外ボリューム" name="show_exclusion_volumes"/>
<check_box label="水上飛行機" name="show_water_plane"/>
- <check_box label="X 線表示による" name="show_xray"/>
+ <check_box label="X線表示" name="show_xray"/>
</panel>
<panel label="パスをテスト" name="test_panel">
<text name="ctrl_click_label">
- Ctrl キーを押しながらクリックして、開始点を選択します。
+ Ctrlキーを押しながらクリックして、開始点を選択します。
</text>
<text name="shift_click_label">
- Shift キーを押しながらクリックして、終了点を選択します。
+ Shiftキーを押しながらクリックして、終了点を選択します。
</text>
<text name="character_width_label">
キャラクターの幅
</text>
<slider name="character_width" value="1"/>
<text name="character_width_unit_label">
- m
+ m
</text>
<text name="character_type_label">
キャラクタータイプ
</text>
<combo_box name="path_character_type">
<combo_box.item label="なし" name="path_character_type_none"/>
- <combo_box.item label="A" name="path_character_type_a"/>
- <combo_box.item label="B" name="path_character_type_b"/>
- <combo_box.item label="C" name="path_character_type_c"/>
- <combo_box.item label="D" name="path_character_type_d"/>
+ <combo_box.item label="A" name="path_character_type_a"/>
+ <combo_box.item label="B" name="path_character_type_b"/>
+ <combo_box.item label="C" name="path_character_type_c"/>
+ <combo_box.item label="D" name="path_character_type_d"/>
</combo_box>
- <button label="パスをクリア" name="clear_path"/>
+ <button label="経路をクリア" name="clear_path"/>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_pathfinding_linksets.xml b/indra/newview/skins/default/xui/ja/floater_pathfinding_linksets.xml
index 16d6acfeef..0189cbd47b 100644
--- a/indra/newview/skins/default/xui/ja/floater_pathfinding_linksets.xml
+++ b/indra/newview/skins/default/xui/ja/floater_pathfinding_linksets.xml
@@ -1,43 +1,43 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_pathfinding_linksets" title="リージョンオブジェクト">
<floater.string name="messaging_get_inprogress">
- パスファインディングリンクセットを照会中...
+ 経路探索リンクセットを照会中…
</floater.string>
<floater.string name="messaging_get_error">
- パスファインディングリンクセットの照会中にエラーが発生しました。
+ 経路探索リンクセットの照会中にエラーが発生しました。
</floater.string>
<floater.string name="messaging_set_inprogress">
- 選択したパスファインディングリンクセットを修正中...
+ 選択した経路探索リンクセットを修正中…
</floater.string>
<floater.string name="messaging_set_error">
- 選択したパスファインディングリンクセットの修正中にエラーが発生しました。
+ 選択した経路探索リンクセットの修正中にエラーが発生しました。
</floater.string>
<floater.string name="messaging_complete_none_found">
- パスファインディングリンクセットがありません。
+ 経路探索リンクセットがありません。
</floater.string>
<floater.string name="messaging_complete_available">
- [NUM_TOTAL] 中 [NUM_SELECTED] が選択されました。
+ [NUM_TOTAL]個中[NUM_SELECTED]個が選択されました。
</floater.string>
<floater.string name="messaging_not_enabled">
- この地域(リージョン)はパスファインディングに対応していません。
+ このリージョン(地域)は経路探索に対応していません。
</floater.string>
<floater.string name="linkset_terrain_name">
[Terrain]
</floater.string>
<floater.string name="linkset_terrain_description">
- --
+ -
</floater.string>
<floater.string name="linkset_terrain_owner">
- --
+ -
</floater.string>
<floater.string name="linkset_terrain_scripted">
- --
+ -
</floater.string>
<floater.string name="linkset_terrain_land_impact">
- --
+ -
</floater.string>
<floater.string name="linkset_terrain_dist_from_you">
- --
+ -
</floater.string>
<floater.string name="linkset_owner_loading">
[Loading]
@@ -88,11 +88,11 @@
[restricted,concave]
</floater.string>
<floater.string name="linkset_choose_use">
- リンクセットの用途を選択...
+ リンクセットの用途を選択…
</floater.string>
<panel name="pathfinding_linksets_main">
<text name="linksets_filter_label">
- フィルター:
+ フィルタ:
</text>
<text name="linksets_name_label">
名前
@@ -101,7 +101,7 @@
説明
</text>
<combo_box name="filter_by_linkset_use">
- <combo_box.item label="リンクセットの用途でフィルター..." name="filter_by_linkset_use_none"/>
+ <combo_box.item label="リンクセットの用途でフィルタ…" name="filter_by_linkset_use_none"/>
<combo_box.item label="歩行可能" name="filter_by_linkset_use_walkable"/>
<combo_box.item label="静的障害物" name="filter_by_linkset_use_static_obstacle"/>
<combo_box.item label="可動障害物" name="filter_by_linkset_use_dynamic_obstacle"/>
@@ -112,17 +112,17 @@
<button label="適用" name="apply_filters"/>
<button label="クリア" name="clear_filters"/>
<scroll_list name="objects_scroll_list">
- <scroll_list.columns label="名前 (ルートプリム)" name="name"/>
- <scroll_list.columns label="説明 (ルートプリム)" name="description"/>
+ <scroll_list.columns label="名前(ルートプリム)" name="name"/>
+ <scroll_list.columns label="説明(ルートプリム)" name="description"/>
<scroll_list.columns label="所有者" name="owner"/>
<scroll_list.columns label="スクリプト" name="scripted"/>
- <scroll_list.columns label="負荷" name="land_impact"/>
+ <scroll_list.columns label="ランドインパクト" name="land_impact"/>
<scroll_list.columns label="距離" name="dist_from_you"/>
- <scroll_list.columns label="パスファインディング使用" name="linkset_use"/>
- <scroll_list.columns label="A %" name="a_percent"/>
- <scroll_list.columns label="B %" name="b_percent"/>
- <scroll_list.columns label="C %" name="c_percent"/>
- <scroll_list.columns label="D %" name="d_percent"/>
+ <scroll_list.columns label="経路探索で使用" name="linkset_use"/>
+ <scroll_list.columns label="A%" name="a_percent"/>
+ <scroll_list.columns label="B%" name="b_percent"/>
+ <scroll_list.columns label="C%" name="c_percent"/>
+ <scroll_list.columns label="D%" name="d_percent"/>
</scroll_list>
<text name="messaging_status">
リンクセット:
@@ -138,45 +138,45 @@
<check_box label="ビーコンを表示" name="show_beacon"/>
<button label="取る" name="take_objects"/>
<button label="コピーを取る" name="take_copy_objects"/>
- <button label="私をそこにテレポートする" name="teleport_me_to_object"/>
+ <button label="その場所にテレポート" name="teleport_me_to_object"/>
<button label="返却" name="return_objects"/>
<button label="削除" name="delete_objects"/>
</panel>
<panel name="pathfinding_linksets_attributes">
<text name="linksets_attributes_label">
- パスファインディング属性を編集する
+ 経路探索属性を編集する
</text>
<text name="walkability_coefficients_label">
歩行可能性:
</text>
<text name="edit_a_label">
- A
+ A
</text>
- <line_editor name="edit_a_value" tool_tip="タイプ A のキャラクターの歩行可能性。キャラクタータイプの例はヒューマノイドです。"/>
+ <line_editor name="edit_a_value" tool_tip="タイプAのキャラクターの歩行可能性。キャラクタータイプの例はヒューマノイドです。"/>
<text name="edit_b_label">
- B
+ B
</text>
- <line_editor name="edit_b_value" tool_tip="タイプ B のキャラクターの歩行可能性。キャラクタータイプの例はクリーチャーです。"/>
+ <line_editor name="edit_b_value" tool_tip="タイプBのキャラクターの歩行可能性。キャラクタータイプの例はクリーチャーです。"/>
<text name="edit_c_label">
- C
+ C
</text>
- <line_editor name="edit_c_value" tool_tip="タイプ C のキャラクターの歩行可能性。キャラクタータイプの例はメカニカルです。"/>
+ <line_editor name="edit_c_value" tool_tip="タイプCのキャラクターの歩行可能性。キャラクタータイプの例はメカニカルです。"/>
<text name="edit_d_label">
- D
+ D
</text>
- <line_editor name="edit_d_value" tool_tip="タイプ D のキャラクターの歩行可能性。キャラクタータイプの例はその他です。"/>
+ <line_editor name="edit_d_value" tool_tip="タイプDのキャラクターの歩行可能性。キャラクタータイプの例はその他です。"/>
<button label="変更を適用" name="apply_edit_values"/>
<text name="suggested_use_a_label">
- (ヒューマノイド)
+ (ヒューマノイド)
</text>
<text name="suggested_use_b_label">
- (クリーチャー)
+ (クリーチャー)
</text>
<text name="suggested_use_c_label">
- (メカニカル)
+ (メカニカル)
</text>
<text name="suggested_use_d_label">
- (その他)
+ (その他)
</text>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_pay.xml b/indra/newview/skins/default/xui/ja/floater_pay.xml
index 7807fdf7b4..bf613a8133 100644
--- a/indra/newview/skins/default/xui/ja/floater_pay.xml
+++ b/indra/newview/skins/default/xui/ja/floater_pay.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Give Money" title="">
+<floater name="Give Money" title="お支払い">
<string name="payee_group">
グループに支払う
</string>
@@ -7,7 +7,7 @@
住人に支払う
</string>
<text name="paying_text">
- 支払中:
+ 支払い先:
</text>
<text name="payee_name">
非常に長い名前が途中で切れていないかをテストして確認
@@ -16,16 +16,16 @@
説明(任意項目):
</text>
<panel label="検索" name="PatternsPanel">
- <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"/>
+ <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"/>
</panel>
<panel label="検索" name="InputPanel">
<text name="amount text">
- その他の金額:
+ その他の金額:
</text>
<button label="支払い" label_selected="支払い" name="pay btn"/>
- <button label="取り消し" label_selected="取り消し" name="cancel btn"/>
+ <button label="キャンセル" label_selected="支払いの取り消し" name="cancel btn"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_pay_object.xml b/indra/newview/skins/default/xui/ja/floater_pay_object.xml
index 3331cee0e0..bc3f88168e 100644
--- a/indra/newview/skins/default/xui/ja/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/ja/floater_pay_object.xml
@@ -1,21 +1,35 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Give Money" title="">
- <string name="payee_group">グループに支払う</string>
- <string name="payee_resident">住人に支払う</string>
- <text name="paying_text">支払中:</text>
- <text name="payee_name">Ericacita Moostopolison</text>
- <text name="object_name_label">オブジェクトを介して:</text>
+<floater name="Give Money" title="オブジェクトにお支払い">
+ <string name="payee_group">
+ グループに支払う
+ </string>
+ <string name="payee_resident">
+ 住人に支払う
+ </string>
+ <text name="paying_text">
+ 支払い先:
+ </text>
+ <text name="payee_name">
+ エリカシタ・モストポリゾン
+ </text>
+ <text name="object_name_label">
+ 以下のオブジェクトを介して支払う:
+ </text>
<icon name="icon_object" tool_tip="オブジェクト"/>
- <text name="object_name_text">...</text>
+ <text name="object_name_text">
+ …
+ </text>
<panel label="検索" name="PatternsPanel">
- <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"/>
+ <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"/>
</panel>
<panel label="検索" name="InputPanel">
- <text name="amount text">その他の金額:</text>
- <button label="支払い" label_selected="支払い" name="pay btn"/>
- <button label="取り消し" label_selected="取り消し" name="cancel btn"/>
+ <text name="amount text">
+ その他の金額:
+ </text>
+ <button label="支払い" label_selected="オブジェクトに支払います。" name="pay btn"/>
+ <button label="キャンセル" label_selected="オブジェクトへの支払いを取り消します。" name="cancel btn"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_people.xml b/indra/newview/skins/default/xui/ja/floater_people.xml
index 0f7c298289..bf65bb3a70 100644
--- a/indra/newview/skins/default/xui/ja/floater_people.xml
+++ b/indra/newview/skins/default/xui/ja/floater_people.xml
@@ -1,8 +1,7 @@
-<?xml version="1.0" ?>
-<floater name="floater_people" title="人">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_people" title="人物">
<panel_container name="main_panel">
- <panel label="グループプロフィール" name="panel_group_info_sidetray"/>
+ <panel label="グループのプロフィール" name="panel_group_info_sidetray"/>
<panel label="ブロックされた住人とオブジェクト" name="panel_block_list_sidetray"/>
- <panel name="panel_group_creation_sidetray" label="グループ作成"/>
</panel_container>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_performance.xml b/indra/newview/skins/default/xui/ja/floater_performance.xml
new file mode 100644
index 0000000000..e2efc152a4
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_performance.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="performance" title="グラフィックの最適化">
+ <string name="fps_text" value="フレーム/秒"/>
+ <string name="max_text" value="(最大)"/>
+ <panel name="panel_top">
+ <panel name="fps_subpanel">
+ <text name="fps_value">
+ 167
+ </text>
+ <text name="fps_lbl">
+ フレーム/秒
+ </text>
+ <text name="fps_desc1_lbl">
+ 変更が完全に反映されるまで
+ </text>
+ <text name="fps_desc2_lbl">
+ 5~10秒程度かかります。
+ </text>
+ </panel>
+ </panel>
+ <panel name="panel_performance_main">
+ <panel name="autoadjustments_subpanel">
+ <text name="auto_adj_lbl">
+ 自動調整設定(推奨)
+ </text>
+ <text name="auto_adj_desc">
+ 求めているフレームレートになるように自動調整します。
+ </text>
+ <icon name="icon_arrow4"/>
+ </panel>
+ <panel name="settings_subpanel">
+ <text name="settings_lbl">
+ グラフィック設定
+ </text>
+ <text name="settings_desc">
+ 距離、水面、照明などの設定を選択します。
+ </text>
+ <icon name="icon_arrow3"/>
+ </panel>
+ <panel name="nearby_subpanel">
+ <text name="avatars_nearby_lbl">
+ 近隣のアバター
+ </text>
+ <text name="avatars_nearby_desc">
+ 近くにいるアバターのうち、どのタイプのアバターを完全に表示するかを管理します。
+ </text>
+ <icon name="icon_arrow2"/>
+ </panel>
+ <panel name="complexity_subpanel">
+ <text name="complexity_lbl">
+ アバターの複雑度
+ </text>
+ <text name="complexity_info">
+ FPSが出ない場合は、アバターの複雑度を減らしてください。
+ </text>
+ <icon name="icon_arrow4"/>
+ </panel>
+ <panel name="huds_subpanel">
+ <text name="huds_lbl">
+ アクティブなHUD
+ </text>
+ <text name="huds_desc">
+ 使用していないHUDを外すと、速度が向上する可能性があります。
+ </text>
+ <icon name="icon_arrow4"/>
+ </panel>
+ </panel>
+ <panel filename="panel_performance_nearby.xml" name="panel_performance_nearby"/>
+ <panel filename="panel_performance_complexity.xml" name="panel_performance_complexity"/>
+ <panel filename="panel_performance_preferences.xml" name="panel_performance_preferences"/>
+ <panel filename="panel_performance_huds.xml" name="panel_performance_huds"/>
+ <panel filename="panel_performance_autoadjustments.xml" name="panel_performance_autoadjustments"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_perm_prefs.xml b/indra/newview/skins/default/xui/ja/floater_perm_prefs.xml
deleted file mode 100644
index 98cda25a81..0000000000
--- a/indra/newview/skins/default/xui/ja/floater_perm_prefs.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="perm prefs" title="デフォルトのアップロード権限">
- <panel label="権限" name="permissions">
- <button label="?" label_selected="?" name="help"/>
- <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 label="再販・プレゼント" name="next_owner_transfer"/>
- </panel>
- <button label="OK" label_selected="OK" name="ok"/>
- <button label="取り消し" label_selected="取り消し" name="cancel"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_perms_default.xml b/indra/newview/skins/default/xui/ja/floater_perms_default.xml
index 33551a5706..0dfeadde93 100644
--- a/indra/newview/skins/default/xui/ja/floater_perms_default.xml
+++ b/indra/newview/skins/default/xui/ja/floater_perms_default.xml
@@ -11,7 +11,7 @@
修正
</text>
<text name="label_4">
- 再販・プレゼント
+ 再販・譲渡
</text>
<text name="label_5">
グループで共同管理
@@ -19,29 +19,29 @@
<text name="label_6">
誰に対してもコピーを許可
</text>
- <text name="label_7" tool_tip="オブジェクトを作成するときにデフォルトの権限を設定する">
+ <text name="label_7" tool_tip="オブジェクトを作成するときに、デフォルトの権限を設定する。">
オブジェクト
</text>
- <text name="label_8" tool_tip="アップロードしたアイテムにデフォルトの権限を設定する">
+ <text name="label_8" tool_tip="アップロードしたアイテムに、デフォルトの権限を設定する。">
アップロード
</text>
- <text name="label_9" tool_tip="スクリプトを作成するときにデフォルトの権限を設定する">
+ <text name="label_9" tool_tip="スクリプトを作成するときに、デフォルトの権限を設定する。">
スクリプト
</text>
- <text name="label_10" tool_tip="ノートカードを作成するときにデフォルトの権限を設定する">
+ <text name="label_10" tool_tip="ノートカードを作成するときに、デフォルトの権限を設定する。">
ノートカード
</text>
- <text name="label_11" tool_tip="ジェスチャーを作成するときにデフォルトの権限を設定する">
+ <text name="label_11" tool_tip="ジェスチャーを作成するときに、デフォルトの権限を設定する。">
ジェスチャー
</text>
- <text name="label_12" tool_tip="衣服またはボディパーツを作成するときにデフォルトの権限を設定する">
- 着用物
+ <text name="label_12" tool_tip="衣服装またはボディパーツを作成するときに、デフォルトの権限を設定する。">
+ 装着するもの
</text>
- <text name="label_13" tool_tip="自然環境の設定を作成するときにデフォルトの権限を設定する">
+ <text name="label_13" tool_tip="自然環境の設定を作成するときに、デフォルトの権限を設定する。">
設定
</text>
<check_box name="env_settings_c" value="true"/>
</panel>
- <button label="OK" label_selected="OK" name="ok"/>
- <button label="取り消し" label_selected="取り消し" name="cancel"/>
+ <button label="OK" label_selected="OK" name="ok"/>
+ <button label="キャンセル" label_selected="キャンセル" name="cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_pick_track.xml b/indra/newview/skins/default/xui/ja/floater_pick_track.xml
index e5773e1ec8..11265e6d38 100644
--- a/indra/newview/skins/default/xui/ja/floater_pick_track.xml
+++ b/indra/newview/skins/default/xui/ja/floater_pick_track.xml
@@ -8,14 +8,14 @@
</layout_panel>
<layout_panel name="pnl_traks">
<radio_group name="track_selection">
- <radio_item label="空 4 [ALT]" name="radio_sky4" value="4"/>
- <radio_item label="空 3 [ALT]" name="radio_sky3" value="3"/>
- <radio_item label="空 2 [ALT]" name="radio_sky2" value="2"/>
+ <radio_item label="空4[ALT]" name="radio_sky4" value="4"/>
+ <radio_item label="空3[ALT]" name="radio_sky3" value="3"/>
+ <radio_item label="空2[ALT]" name="radio_sky2" value="2"/>
<radio_item label="地面" name="radio_sky1" value="1"/>
</radio_group>
</layout_panel>
<layout_panel name="pnl_ok_cancel">
- <button label="OK" label_selected="OK" name="btn_select"/>
+ <button label="OK" label_selected="OK" name="btn_select"/>
<button label="キャンセル" label_selected="キャンセル" name="btn_cancel"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/ja/floater_post_process.xml b/indra/newview/skins/default/xui/ja/floater_post_process.xml
index 7c4d9c78ee..91ecbb73a2 100644
--- a/indra/newview/skins/default/xui/ja/floater_post_process.xml
+++ b/indra/newview/skins/default/xui/ja/floater_post_process.xml
@@ -1,27 +1,27 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Post-Process Floater" title="ポストプロセス設定">
<tab_container name="Post-Process Tabs">
- <panel label="カラー・フィルター" name="wmiColorFilterPanel">
- <check_box label="有効" name="wmiColorFilterToggle" />
+ <panel label="カラー・フィルタ" name="wmiColorFilterPanel">
+ <check_box label="有効" name="wmiColorFilterToggle"/>
<text name="wmiColorFilterBrightnessText">
- 明るさ
+ 明度
</text>
<text name="wmiColorFilterSaturationText">
彩度
</text>
<text name="wmiColorFilterContrastText">
- コントラスト
+ 輝度
</text>
<text name="wmiColorFilterBaseText">
- コントラストの基本色
+ 輝度の基準色
</text>
- <slider label="R" name="wmiColorFilterBaseR" />
- <slider label="G" name="wmiColorFilterBaseG" />
- <slider label="B" name="wmiColorFilterBaseB" />
- <slider label="I" name="wmiColorFilterBaseI" />
+ <slider label="赤" name="wmiColorFilterBaseR"/>
+ <slider label="緑" name="wmiColorFilterBaseG"/>
+ <slider label="青" name="wmiColorFilterBaseB"/>
+ <slider label="I" name="wmiColorFilterBaseI"/>
</panel>
- <panel label="ナイトビジョン" name="wmiNightVisionPanel">
- <check_box label="有効" name="wmiNightVisionToggle" />
+ <panel label="暗視" name="wmiNightVisionPanel">
+ <check_box label="有効" name="wmiNightVisionToggle"/>
<text name="wmiNightVisionBrightMultText">
光の増幅(マルチ)
</text>
@@ -33,7 +33,7 @@
</text>
</panel>
<panel label="ブルーム" name="wmiBloomPanel">
- <check_box label="有効" name="wmiBloomToggle" />
+ <check_box label="有効" name="wmiBloomToggle"/>
<text name="wmiBloomExtractText">
明度の抽出
</text>
@@ -45,10 +45,9 @@
</text>
</panel>
<panel label="その他" name="Extras">
- <button label="効果読み込み" label_selected="効果読み込み"
- name="PPLoadEffect" />
- <button label="効果保存" label_selected="効果保存" name="PPSaveEffect" />
- <line_editor label="効果名" name="PPEffectNameEditor" />
+ <button label="効果読み込み" label_selected="効果読み込み" name="PPLoadEffect"/>
+ <button label="効果保存" label_selected="効果保存" name="PPSaveEffect"/>
+ <line_editor label="効果名" name="PPEffectNameEditor"/>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preferences.xml b/indra/newview/skins/default/xui/ja/floater_preferences.xml
index 4a316ef606..c26bad3176 100644
--- a/indra/newview/skins/default/xui/ja/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preferences.xml
@@ -1,24 +1,22 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Preferences" title="環境設定">
- <floater.string name="email_unverified_tooltip">
- IM を有効にするには、https://accounts.secondlife.com/change_email/ からあなたのメールアドレスを確認してください
- </floater.string>
- <button label="OK" label_selected="OK" name="OK"/>
- <button label="取り消し" label_selected="取り消し" name="Cancel"/>
+<floater name="Preferences" title="初期設定">
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="キャンセル" label_selected="キャンセル" name="Cancel"/>
<panel name="search_panel">
- <search_editor label="設定の検索" name="search_prefs_edit" tool_tip="検索したい内容をここに入力してください。設定の名前またはコメントに部分的に一致する結果が表示されます。"/>
+ <search_editor label="設定を検索" name="search_prefs_edit" tool_tip="検索したい内容をここに入力してください。設定の名前またはコメントに部分的に一致する結果が表示されます。"/>
</panel>
<tab_container name="pref core">
<panel label="一般" name="general"/>
<panel label="グラフィック" name="display"/>
<panel label="サウンドとメディア" name="audio"/>
<panel label="チャット" name="chat"/>
- <panel label="移動 &amp; 表示" name="move"/>
- <panel label="メッセージ" name="msgs"/>
+ <panel label="移動と表示" name="move"/>
+ <panel label="通知" name="msgs"/>
<panel label="色" name="colors"/>
<panel label="プライバシー" name="im"/>
<panel label="セットアップ" name="input"/>
- <panel label="詳細" name="advanced1"/>
+ <panel label="拡張" name="advanced1"/>
<panel label="アップロード" name="uploads"/>
+ <panel label="操作" name="controls"/>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/ja/floater_preferences_graphics_advanced.xml
index 8ba537faa2..66a416f416 100644
--- a/indra/newview/skins/default/xui/ja/floater_preferences_graphics_advanced.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preferences_graphics_advanced.xml
@@ -1,21 +1,22 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="prefs_graphics_advanced" title="詳細グラフィックス設定">
+<floater name="prefs_graphics_advanced" title="拡張グラフィック設定">
<text name="GeneralText">
全般
</text>
<slider label="描画距離:" name="DrawDistance"/>
<text name="DrawDistanceMeterText2">
- m
+ m
</text>
<slider label="最大パーティクル数:" name="MaxParticleCount"/>
<slider label="ポストプロセス品質:" name="RenderPostProcess"/>
<text name="PostProcessText">
</text>
+ <check_box label="垂直同期を有効化" name="vsync" tool_tip="フレームレートをモニターのリフレッシュレートに同期させ、スムーズなパフォーマンスを実現します。"/>
<text name="AvatarText">
アバター
</text>
- <slider label="最大の複雑さ:" name="IndirectMaxComplexity" tool_tip="どの点で視覚的に複雑なアバターを JellyDoll として描くかを制御します"/>
+ <slider tool_tip="複雑なアバターがどの時点でJellyDollとして描画されるかを制御します。" label="最大複雑度:" name="IndirectMaxComplexity"/>
<text name="IndirectMaxComplexityText">
0
</text>
@@ -34,29 +35,29 @@
<text name="HardwareText">
ハードウェア
</text>
- <slider label="テクスチャメモリ (MB):" name="GraphicsCardTextureMemory" tool_tip="テクスチャに割り当てられたメモリの量。ビデオカードのメモリに既定。数値を下げるとパフォーマンスが向上しますが、テクスチャの精度が落ちることがあります。"/>
+ <slider label="テクスチャメモリ(㎆):" name="GraphicsCardTextureMemory" tool_tip="テクスチャに割り当てるメモリの量を指定します。デフォルトはビデオカードの搭載メモリの値です。この値を減らすとパフォーマンスが向上する可能性がありますが、テクスチャがぼやける可能性があります。"/>
<slider label="フォグの距離比率:" name="fog"/>
<slider label="ガンマ:" name="gamma"/>
<text name="(brightness, lower is brighter)">
- (0 でデフォルト、低いほど明るい)
+ (0がデフォルトです。低い値ほど明るくなります。)
</text>
- <check_box label="異方的フィルタリング (有効にすると速度が低下)" name="ani"/>
- <check_box initial_value="true" label="OpenGL Vertex Buffer Objects を有効化" name="vbo" tool_tip="最新のハードウェアでこのオプションを有効にするとパフォーマンスが向上します。ただし、古いハードウェアでは VBO の実装が貧弱なため、このオプションを有効にするとクラッシュする場合があります。"/>
- <check_box initial_value="true" label="テクスチャ圧縮の有効化 (再起動後に反映)" name="texture compression" tool_tip="ビデオメモリでテクスチャを圧縮すると、一部のカラー品質を犠牲にして、高解像度のテクスチャをロードできます。"/>
- <check_box initial_value="true" label="HiDPI 表示のためにサポートを有効にする(再起動が必要)" name="use HiDPI" tool_tip="高画質の描画のために OpenGL を有効にする"/>
+ <check_box label="異方的フィルタリング(有効にすると速度が低下します)" name="ani"/>
+ <check_box control_name="RenderCompressTextures" label="テクスチャ圧縮の有効化 (再起動後に反映)" name="texture compression" tool_tip="ビデオメモリ内のテクスチャを圧縮し、色の品質をある程度犠牲にして、より高解像度のテクスチャを読み込むようにします。"/>
+ <check_box control_name="HiDPIディスプレイのサポートを有効にする(再起動後に反映)" name="高解像度の描画のためにOpenGLを有効にします。"/>
<text name="antialiasing label">
- アンチエイリアシング:
- </text>
- <combo_box label="アンチエイリアシング" name="fsaa">
- <combo_box.item label="無効" 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"/>
+ アンチエイリアス:
+ </text>
+ <combo_box label="アンチエイリアス" name="fsaa">
+ <combo_box.item label="無効" name="FSAADisabled" value="0"/>
+ <combo_box.item label="2x" name="2x" value="2"/>
+ <combo_box.item label="4x" name="4x" value="4"/>
+ <combo_box.item label="8x" name="8x" value="8"/>
+ <combo_box.item label="16x" name="16x" value="16"/>
</combo_box>
<text name="antialiasing restart">
- (再起動後に反映)
+ (再起動後に反映)
</text>
+ <view_border name="vert_border"/>
<text name="MeshText">
メッシュ
</text>
@@ -79,44 +80,46 @@
<text name="ShadersText">
シェーダー
</text>
- <check_box initial_value="true" label="透明な水" name="TransparentWater"/>
- <check_box initial_value="true" label="バンプマッピングと光沢" name="BumpShiny"/>
- <check_box initial_value="true" label="近くの光" name="LocalLights"/>
- <slider label="地形詳細:" name="TerrainDetail"/>
+ <check_box label="透明な水" name="TransparentWater"/>
+ <check_box label="バンプマッピングと光沢" name="BumpShiny"/>
+ <check_box label="ローカル光源" name="LocalLights"/>
+ <slider label="地形の詳細:" name="TerrainDetail"/>
<text name="TerrainDetailText">
</text>
- <check_box initial_value="true" label="アバターハードウェアスキニング" name="AvatarVertexProgram"/>
- <check_box initial_value="true" label="アバターの布" name="AvatarCloth"/>
+ <check_box label="アバターの衣類" name="AvatarCloth"/>
<text name="ReflectionsText">
- 水の反射:
+ 水面の反射:
</text>
<combo_box name="Reflections">
- <combo_box.item label="最小" name="0"/>
- <combo_box.item label="地形と樹木" name="1"/>
- <combo_box.item label="すべての静止オブジェクト" name="2"/>
- <combo_box.item label="すべてのアバターとオブジェクト" name="3"/>
- <combo_box.item label="すべて" name="4"/>
+ <combo_box.item label="無し;不透明" name="0" value="-2"/>
+ <combo_box.item label="無し;透明" name="0" value="-1"/>
+ <combo_box.item label="最小限" name="0" value="0"/>
+ <combo_box.item label="地形と樹木" name="1" value="1"/>
+ <combo_box.item label="すべての静止オブジェクト" name="2" value="2"/>
+ <combo_box.item label="すべてのアバターとオブジェクト" name="3" value="3"/>
+ <combo_box.item label="すべて" name="4" value="4"/>
</combo_box>
- <check_box initial_value="true" label="周囲 (大気) シェーダー" name="WindLightUseAtmosShaders"/>
+ <check_box label="大気(周囲)シェーダー" name="WindLightUseAtmosShaders"/>
<slider label="空:" name="SkyMeshDetail"/>
<text name="SkyMeshDetailText">
</text>
- <check_box initial_value="true" label="高度なライティングモデル" name="UseLightShaders"/>
- <check_box initial_value="true" label="アンビエントオクルージョン" name="UseSSAO"/>
- <check_box initial_value="true" label="フィールドの遠近感" name="UseDoF"/>
+ <check_box label="高度な光源モデル" name="UseLightShaders"/>
+ <check_box label="アンビエントオクルージョン" name="UseSSAO"/>
+ <check_box label="被写界深度(DoF)" name="UseDoF"/>
<text name="RenderShadowDetailText">
影:
</text>
<combo_box name="ShadowDetail">
<combo_box.item label="なし" name="0"/>
- <combo_box.item label="太陽/月" name="1"/>
- <combo_box.item label="太陽/月・プロジェクタ" name="2"/>
+ <combo_box.item label="太陽/月" name="1"/>
+ <combo_box.item label="太陽/月+プロジェクタ" name="2"/>
</combo_box>
- <button label="推奨設定にリセット" name="Defaults"/>
- <button label="OK" label_selected="OK" name="OK"/>
- <button label="取り消し" label_selected="取り消し" name="Cancel"/>
+ <view_border name="horiz_border"/>
+ <button label="推奨設定値にリセット" name="Defaults"/>
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="キャンセル" label_selected="キャンセル" name="Cancel"/>
<check_box label="RenderAvatarMaxComplexity" name="RenderAvatarMaxComplexity"/>
<check_box label="RenderAvatarMaxNonImpostors" name="RenderAvatarMaxNonImpostors"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preferences_proxy.xml b/indra/newview/skins/default/xui/ja/floater_preferences_proxy.xml
index 4638fd002e..650667ca9e 100644
--- a/indra/newview/skins/default/xui/ja/floater_preferences_proxy.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preferences_proxy.xml
@@ -31,10 +31,10 @@
他の HTTP トラフィックプロキシ:
</text>
<radio_group name="other_http_proxy_type">
- <radio_item label="プロキシしない" name="OtherNoProxy" tool_tip="ウェブ以外の HTTP トラフィックはいずれのプロキシにもルーティングされません。" value="なし"/>
+ <radio_item label="プロキシを使用しない" name="OtherNoProxy" tool_tip="ウェブ以外の HTTP トラフィックはいずれのプロキシにもルーティングされません。" value="なし"/>
<radio_item label="HTTP プロキシを使う" name="OtherHTTPProxy" tool_tip="ウェブ以外の HTTP は設定済みウェブプロキシを通してルーティングされます。" value="Web"/>
<radio_item label="SOCKS 5 プロキシを使う" name="OtherSocksProxy" tool_tip="ウェブ以外の HTTP トラフィックは設定済みの Socks 5 プロキシを通してルーティングされます。" value="Socks"/>
</radio_group>
- <button label="OK" label_selected="OK" name="OK"/>
- <button label="取り消し" label_selected="取り消し" name="Cancel"/>
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="キャンセル" label_selected="キャンセル" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preferences_view_advanced.xml b/indra/newview/skins/default/xui/ja/floater_preferences_view_advanced.xml
index 09eaf7b294..5efbbf7e17 100644
--- a/indra/newview/skins/default/xui/ja/floater_preferences_view_advanced.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preferences_view_advanced.xml
@@ -1,2 +1,20 @@
-<?xml version="1.0" ?>
-<floater name="floaterpreferencesviewadvanced" title="カメラ位置"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floaterpreferencesviewadvanced" title="カメラの位置">
+ <text name="camera_offset_lbl">
+ カメラのオフセット:
+ </text>
+ <spinner name="camera_x"/>
+ <spinner label="Y" name="camera_y"/>
+ <spinner label="Z" name="camera_z"/>
+ <text name="focus_offset_lbl">
+ 焦点のオフセット:
+ </text>
+ <spinner name="focus_x"/>
+ <spinner label="Y" name="focus_y"/>
+ <spinner label="Z" name="focus_z"/>
+ <text name="offset_scale_lbl">
+ カメラのオフセット倍率:
+ </text>
+ <slider name="offset_scale_sld"/>
+ <spinner name="offset_scale_ctrl"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_animation.xml b/indra/newview/skins/default/xui/ja/floater_preview_animation.xml
index a3042f66ea..655a58a3aa 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_animation.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_anim">
<floater.string name="Title">
- アニメーション: [NAME]
+ アニメーション:[NAME]
</floater.string>
<text name="desc txt">
説明:
</text>
- <button label="インワールドで再生" label_selected="停止" name="Inworld" tool_tip="他人に見えるように再生"/>
- <button label="ローカル再生" label_selected="停止" name="Locally" tool_tip="自分だけが見えるように再生"/>
+ <button label="インワールドで再生" label_selected="停止" name="Inworld" tool_tip="他人から見えるように再生します。"/>
+ <button label="ローカル再生" label_selected="停止" name="Locally" tool_tip="自分だけが見えるように再生します。"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml b/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml
index 59ce36b022..e588bba107 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="gesture_preview">
<floater.string name="step_anim">
- プレイするアニメーション:
+ 再生するアニメーション:
</floater.string>
<floater.string name="step_sound">
- プレイするサウンド:
+ 再生するサウンド:
</floater.string>
<floater.string name="step_chat">
発言するチャット:
@@ -13,31 +13,31 @@
待機:
</floater.string>
<floater.string name="stop_txt">
- 止まる
+ 停止
</floater.string>
<floater.string name="preview_txt">
プレビュー
</floater.string>
<floater.string name="none_text">
- -- なし --
+ -なし-
</floater.string>
<floater.string name="Title">
- ジェスチャー: [NAME]
+ ジェスチャー:[NAME]
</floater.string>
<text name="desc_label">
説明:
</text>
<text name="trigger_label">
- トリガー:
+ トリガー:
</text>
- <text name="replace_text" tool_tip="トリガーワードをこれらの単語に置き換えます。 たとえば、トリガー「hello」を「Howdy」に置換すると、「I wanted to say hello」というチャット文が「I wanted to say howdy」に変わり、ジェスチャーにも置換が反映されます。">
+ <text name="replace_text" tool_tip="トリガーワードをこれらの単語に置き換えます。たとえば、トリガー「hello」を「Howdy」に置換すると、「I wanted to say hello」というチャット文が「I wanted to say howdy」に変わり、ジェスチャーにも置換が反映されます。">
置換:
</text>
- <line_editor name="replace_editor" tool_tip="トリガーワードをこれらの単語に置き換えます。 たとえば、トリガー「hello」を「Howdy」に置換すると、「I wanted to say hello」というチャット文が「I wanted to say howdy」に変わり、ジェスチャーにも置換が反映されます。"/>
+ <line_editor name="replace_editor" tool_tip="トリガーワードをこれらの単語に置き換えます。たとえば、トリガー「hello」を「Howdy」に置換すると、「I wanted to say hello」というチャット文が「I wanted to say howdy」に変わり、ジェスチャーにも置換が反映されます。"/>
<text name="key_label">
ショートカット:
</text>
- <combo_box label="なし" left="160" name="modifier_combo"/>
+ <combo_box label="なし" name="modifier_combo"/>
<combo_box label="なし" name="key_combo"/>
<text name="library_label">
ライブラリ:
@@ -65,9 +65,9 @@
<check_box label="アニメーションが完了するまで" name="wait_anim_check"/>
<check_box label="時間(秒):" name="wait_time_check"/>
<text name="help_label">
- 待機ステップを入れない限りは、すべてのステップが同時に起こります。
+ 待機ステップを入れていない場合、すべてのステップが同時に実行されます。
</text>
- <check_box label="アクティブ" name="active_check" tool_tip="アクティブなジェスチャーは、トリガーフレーズを使うか、ホットキーを押すと切り替わります。 1つのショートカットキーに2つ以上のジェスチャーが割り当てられた場合、そのジェスチャーは両方ともアクティブではなくなります。"/>
+ <check_box label="アクティブ" name="active_check" tool_tip="アクティブなジェスチャーは、トリガーとなる語句を入力するか、ホットキーを押すことで実行されます。通常、同じキーバインディングを使用するゼスチャーがある場合、そのゼスチャーは非アクティブになります。"/>
<button label="プレビュー" name="preview_btn"/>
<button label="保存" name="save_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_notecard.xml b/indra/newview/skins/default/xui/ja/floater_preview_notecard.xml
index ef7e90a6bc..5debd63256 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_notecard.xml
@@ -7,15 +7,15 @@
このノートを見る権限がありません。
</floater.string>
<floater.string name="Title">
- ノートカード: [NAME]
+ ノートカード:[NAME]
</floater.string>
<text name="desc txt">
説明:
</text>
<text_editor name="Notecard Editor">
- ローディング...
+ 読み込んでいます…
</text_editor>
- <button label="編集..." label_selected="編集" name="Edit"/>
+ <button label="編集…" label_selected="編集" name="Edit"/>
<button label="保存" label_selected="保存" name="Save"/>
<button label="削除" label_selected="削除" name="Delete"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_sound.xml b/indra/newview/skins/default/xui/ja/floater_preview_sound.xml
index 5c0f05cec6..eca4e482f7 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_sound.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_sound.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_sound">
<floater.string name="Title">
- サウンド: [NAME]
+ サウンド:[NAME]
</floater.string>
<text name="desc txt">
説明:
</text>
- <button label="インワールドで再生" label_selected="インワールドで再生" name="Sound play btn" tool_tip="他人にも聞こえるように再生します"/>
- <button label="ローカル再生" label_selected="ローカル再生" name="Sound audition btn" tool_tip="自分だけが聞こえるように再生します"/>
+ <button label="インワールドで再生" label_selected="インワールドで再生" name="Sound play btn" tool_tip="他人からも聞こえるように再生します。"/>
+ <button label="ローカル再生" label_selected="ローカル再生" name="Sound audition btn" tool_tip="自分のみ聞こえるように再生します。"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_texture.xml b/indra/newview/skins/default/xui/ja/floater_preview_texture.xml
index 66ef13948a..cc624d43d3 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_texture.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_texture">
<floater.string name="Title">
- テクスチャ: [NAME]
+ テクスチャ:[NAME]
</floater.string>
<floater.string name="Copy">
インベントリにコピー
@@ -12,7 +12,7 @@
説明:
</text>
<text name="dimensions">
- [WIDTH]px x [HEIGHT]px
+ [WIDTH]px✕[HEIGHT]px
</text>
<text name="aspect_ratio">
縦横比のプレビュー
@@ -20,9 +20,9 @@
<combo_box name="combo_aspect_ratio" tool_tip="固定した縦横比のプレビュー"/>
</layout_panel>
<layout_panel name="buttons_panel">
- <button label="OK" name="Keep"/>
- <button label="処分する" name="Discard"/>
- <button label="別名で保存" name="save_tex_btn"/>
+ <button label="OK" name="Keep"/>
+ <button label="破棄" name="Discard"/>
+ <button label="名前をつけて保存" name="save_tex_btn"/>
</layout_panel>
</layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_trash.xml b/indra/newview/skins/default/xui/ja/floater_preview_trash.xml
index 54cf632727..afb68e5944 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_trash.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_trash.xml
@@ -1,7 +1,12 @@
-<?xml version="1.0" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_preview_trash" title="ゴミ箱">
- <layout_panel name="empty_btn_lp"/>
+ <inventory_panel name="inventory_trash"/>
<layout_stack name="button_panel_ls">
- <button name="empty_btn" label="ゴミ箱を空にする"/>
+ <layout_panel name="empty_btn_lp">
+ <button label="ゴミ箱を空に" name="empty_btn"/>
+ </layout_panel>
+ <layout_panel name="share_btn_lp">
+ <button label="キャンセル" name="cancel_btn"/>
+ </layout_panel>
</layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_price_for_listing.xml b/indra/newview/skins/default/xui/ja/floater_price_for_listing.xml
index 10a46247a7..86ca80e112 100644
--- a/indra/newview/skins/default/xui/ja/floater_price_for_listing.xml
+++ b/indra/newview/skins/default/xui/ja/floater_price_for_listing.xml
@@ -1,18 +1,17 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="price_for_listing" title="クラシファイド広告の掲載">
<text name="explanation_text">
- あなたのクラシファイド広告は、公開された日から1週間有効です。
-
+ あなたのクラシファイド広告は、公開された日から1週間有効です。
クラシファイドリストのあなたの広告の位置は、広告費をいくら支払うかで決まります。
最高金額を支払った広告がリストのトップに載り、検索で上位に表示されます。
</text>
<text name="price_text">
- 広告費:
+ 広告掲載費:
</text>
<text name="price_symbol">
L$
</text>
- <button label="OK" name="set_price_btn"/>
- <button label="取り消し" name="cancel_btn"/>
+ <button label="OK" name="set_price_btn"/>
+ <button label="キャンセル" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_profile.xml b/indra/newview/skins/default/xui/ja/floater_profile.xml
index 4192dc38f1..b074d4a987 100644
--- a/indra/newview/skins/default/xui/ja/floater_profile.xml
+++ b/indra/newview/skins/default/xui/ja/floater_profile.xml
@@ -3,14 +3,14 @@
<panel name="panel_profile_view">
<tab_container name="panel_profile_tabs">
<panel label="Second Life" name="panel_profile_secondlife"/>
- <panel label="フィード" name="panel_profile_web"/>
+ <panel label="Web" name="panel_profile_web"/>
<panel label="趣味" name="panel_profile_interests"/>
<panel label="ピック" name="panel_profile_picks"/>
<panel label="クラシファイド広告" name="panel_profile_classifieds"/>
<panel label="リアルライフ(現実世界)" name="panel_profile_firstlife"/>
<panel label="メモ" name="panel_profile_notes"/>
</tab_container>
- <button label="OK" name="ok_btn" tool_tip="プロフィールの変更を保存して閉じる"/>
+ <button label="OK" name="ok_btn" tool_tip="プロフィールの変更を保存して閉じる"/>
<button label="キャンセル" label_selected="キャンセル" name="cancel_btn"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_profile_permissions.xml b/indra/newview/skins/default/xui/ja/floater_profile_permissions.xml
new file mode 100644
index 0000000000..9605d46ef7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_profile_permissions.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="profile_permissions">
+ <string name="description_string" value="エージェントの[AGENT_NAME]に許可:"/>
+ <text name="perm_description" value="許可するエージェント:"/>
+ <check_box name="online_check" label="自分のオンライン状況"/>
+ <check_box name="map_check" label="ワールドマップ上の自分の位置"/>
+ <check_box name="objects_check" label="自分の土地からの自分のオブジェクトの編集、削除、または取得"/>
+ <button name="perms_btn_ok" label="OK"/>
+ <button name="perms_btn_cancel" label="キャンセル"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_profile_texture.xml b/indra/newview/skins/default/xui/ja/floater_profile_texture.xml
new file mode 100644
index 0000000000..d4b5efa2c7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_profile_texture.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="profile_texture">
+ <layout_stack name="preview_stack">
+ <layout_panel name="texture_panel">
+ <icon name="profile_pic"/>
+ </layout_panel>
+ <layout_panel name="buttons_panel">
+ <layout_stack name="buttons_stack">
+ <layout_panel name="resizer_left"/>
+ <layout_panel name="close_panel">
+ <button label="閉じる" name="close_btn"/>
+ </layout_panel>
+ <layout_panel name="resizer_right"/>
+ </layout_stack>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_publish_classified.xml b/indra/newview/skins/default/xui/ja/floater_publish_classified.xml
index f33406da51..bdfc497746 100644
--- a/indra/newview/skins/default/xui/ja/floater_publish_classified.xml
+++ b/indra/newview/skins/default/xui/ja/floater_publish_classified.xml
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="publish_classified" title="クラシファイド広告掲載">
<text name="explanation_text">
- あなたのクラシファイド広告は、掲載された日から1週間有効です。
-
+ あなたのクラシファイド広告は、掲載された日から1週間有効です。
+
クラシファイド広告は返金できませんのでご了承ください。
</text>
- <spinner label="価格:L$" name="price_for_listing" tool_tip="掲載価格" value="50"/>
+ <spinner label="掲載費:L$" name="price_for_listing" tool_tip="掲載価格" value="50"/>
<text name="l$_text" value="L$"/>
<text name="more_info_text">
詳しい情報(クラシファイドヘルプへのリンク)
</text>
- <button label="掲載" name="publish_btn"/>
+ <button label="掲載する" name="publish_btn"/>
<button label="キャンセル" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_region_debug_console.xml b/indra/newview/skins/default/xui/ja/floater_region_debug_console.xml
index 4edb4972e4..bbc23408d6 100644
--- a/indra/newview/skins/default/xui/ja/floater_region_debug_console.xml
+++ b/indra/newview/skins/default/xui/ja/floater_region_debug_console.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="region_debug_console" title="地域デバッグ"/>
+<floater name="region_debug_console" title="リージョン(地域)のデバッグ"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/floater_region_info.xml b/indra/newview/skins/default/xui/ja/floater_region_info.xml
index d08c51c61e..9e07cf5363 100644
--- a/indra/newview/skins/default/xui/ja/floater_region_info.xml
+++ b/indra/newview/skins/default/xui/ja/floater_region_info.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="regioninfo" title="地域 / 不動産"/>
+<floater name="regioninfo" title="リージョン(地域)/不動産"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/floater_region_restarting.xml b/indra/newview/skins/default/xui/ja/floater_region_restarting.xml
index e9ba9d230d..27ffa95bdb 100644
--- a/indra/newview/skins/default/xui/ja/floater_region_restarting.xml
+++ b/indra/newview/skins/default/xui/ja/floater_region_restarting.xml
@@ -1,23 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="region_restarting" title="リージョンの再起動">
<string name="RegionName">
- 今 ([NAME]) がいるリージョンを再起動しようとしています。
+ 現在あなたがいるリージョン「[NAME]」は、再起動しようとしています。
-このままここにいるとログアウトされます。
+このまま、この場所にいるとログアウトされます。
</string>
<string name="RestartSeconds">
- 再起動までの秒数
-[SECONDS]
+ 再起動まであと
+[SECONDS]秒
</string>
<panel name="layout_panel_1">
<text name="region_name">
- 今 (-最長リージョン名-) がいるリージョンを再起動しようとしています。
+ 現在あなたがいるリージョン「-最長リージョン名-」は、再起動しようとしています。
-このままここにいるとログアウトされます。
+このまま、この場所にいるとログアウトされます。
</text>
<text name="restart_seconds">
- 再起動までの秒数
- 32767
+ 再起動まであと
+32767秒
</text>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_report_abuse.xml b/indra/newview/skins/default/xui/ja/floater_report_abuse.xml
index 4ddd0d2605..58c7233e98 100644
--- a/indra/newview/skins/default/xui/ja/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/ja/floater_report_abuse.xml
@@ -11,10 +11,10 @@
Loremipsum Dolorsitamut Longnamez
</text>
<text name="sim_title">
- 地域:
+ リージョン(地域):
</text>
<text name="sim_field">
- 地域名
+ リージョン(地域)名
</text>
<text name="pos_title">
位置:
@@ -38,13 +38,13 @@
<text name="owner_name">
Hendrerit Vulputate Kamawashi Longname
</text>
- <combo_box name="category_combo" tool_tip="カテゴリ -- この報告に最も適したカテゴリを選択してください">
+ <combo_box name="category_combo" tool_tip="カテゴリ-この報告に最も適したカテゴリを選択してください">
<combo_box.item label="カテゴリを選択してください" name="Select_category"/>
<combo_box.item label="年齢>年齢偽証" name="Age__Age_play"/>
- <combo_box.item label="年齢 &gt; 成人の住人が Teen Second Life にいる" name="Age__Adult_resident_on_Teen_Second_Life"/>
- <combo_box.item label="年齢 &gt; 未成年の住人がTeen Second Life の外にいる" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+ <combo_box.item label="年齢>成人の住人が Teen Second Life にいる" name="Age__Adult_resident_on_Teen_Second_Life"/>
+ <combo_box.item label="年齢>未成年の住人がTeen Second Life の外にいる" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
<combo_box.item label="攻撃>コンバット・サンドボックス/危険なエリア" name="Assault__Combat_sandbox___unsafe_area"/>
- <combo_box.item label="攻撃 &gt; 安全エリアで他の住人を銃撃、プッシュ、または突き飛ばす" name="Assault__Safe_area"/>
+ <combo_box.item label="攻撃>安全エリアで他の住人を銃撃、プッシュ、または突き飛ばす" name="Assault__Safe_area"/>
<combo_box.item label="攻撃>武器テスト用サンドボックス" name="Assault__Weapons_testing_sandbox"/>
<combo_box.item label="商取引>製品またはサービスの提供が行われない" name="Commerce__Failure_to_deliver_product_or_service"/>
<combo_box.item label="開示>リアルワールドの情報" name="Disclosure__Real_world_information"/>
@@ -58,22 +58,22 @@
<combo_box.item label="詐欺> L$" name="Fraud__L$"/>
<combo_box.item label="詐欺>土地" name="Fraud__Land"/>
<combo_box.item label="詐欺>マルチ商法またはチェーンメール" name="Fraud__Pyramid_scheme_or_chain_letter"/>
- <combo_box.item label="詐欺 &gt; リンデンドルまたは米ドル" name="Fraud__US$"/>
+ <combo_box.item label="詐欺>リンデンドルまたは米ドル" name="Fraud__US$"/>
<combo_box.item label="嫌がらせ>広告委託/視覚的なスパム" name="Harassment__Advert_farms___visual_spam"/>
<combo_box.item label="嫌がらせ>個人またはグループの中傷" name="Harassment__Defaming_individuals_or_groups"/>
<combo_box.item label="嫌がらせ>移動の妨害" name="Harassment__Impeding_movement"/>
<combo_box.item label="嫌がらせ>性的な嫌がらせ" name="Harassment__Sexual_harassment"/>
- <combo_box.item label="ハラスメント &gt; 対象者を定めて嫌がらせを目的とした行為" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
+ <combo_box.item label="ハラスメント>対象者を定めて嫌がらせを目的とした行為" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
<combo_box.item label="嫌がらせ>暴言" name="Harassment__Verbal_abuse"/>
- <combo_box.item label="わいせつ>著しく不快であると見なされるコンテンツまたは行為" name="Indecency__Broadly_offensive_content_or_conduct"/>
- <combo_box.item label="わいせつ>不適切なアバター名" name="Indecency__Inappropriate_avatar_name"/>
- <combo_box.item label="わいせつ &gt; 地域(リージョン)のレーティング区分に対して不適切なコンテンツまたは行為" name="Indecency__Mature_content_in_PG_region"/>
- <combo_box.item label="わいせつ &gt; 「Moderate」指定の地域での不適切なコンテンツまたは行為" name="Indecency__Inappropriate_content_in_Mature_region"/>
+ <combo_box.item label="猥褻>著しく不快であると見なされるコンテンツまたは行為" name="Indecency__Broadly_offensive_content_or_conduct"/>
+ <combo_box.item label="猥褻>不適切なアバター名" name="Indecency__Inappropriate_avatar_name"/>
+ <combo_box.item label="猥褻>リージョン(地域)のレーティング区分に対して不適切なコンテンツまたは行為" name="Indecency__Mature_content_in_PG_region"/>
+ <combo_box.item label="猥褻>「Moderate」指定の地域での不適切なコンテンツまたは行為" name="Indecency__Inappropriate_content_in_Mature_region"/>
<combo_box.item label="知的財産の侵害>コンテンツの撤去" name="Intellectual_property_infringement_Content_Removal"/>
<combo_box.item label="知的財産の侵害>コピーBot及び権限の悪用" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
<combo_box.item label="不寛容" name="Intolerance"/>
<combo_box.item label="土地>サンドボックスのリソースの乱用" name="Land__Abuse_of_sandbox_resources"/>
- <combo_box.item label="土地 &gt; 不法侵入 &gt; オブジェクトまたはテクスチャ" name="Land__Encroachment__Objects_textures"/>
+ <combo_box.item label="土地>不法侵入>オブジェクトまたはテクスチャ" name="Land__Encroachment__Objects_textures"/>
<combo_box.item label="土地>不法侵入>パーティクル" name="Land__Encroachment__Particles"/>
<combo_box.item label="土地>不法侵入>樹木/植物" name="Land__Encroachment__Trees_plants"/>
<combo_box.item label="スキルゲーミング ポリシー違反" name="Wagering_gambling"/>
@@ -84,7 +84,7 @@
</text>
<button label="選択" label_selected="" name="select_abuser" tool_tip="嫌がらせをした人の名前をリストから選択してください。"/>
<text name="abuser_name_title2">
- 嫌がらせの起きた場所:
+ 嫌がらせを受けた場所:
</text>
<text name="sum_title">
概要:
@@ -98,6 +98,6 @@
<text name="incomplete_title">
* 不完全な報告は調査対象になりません。
</text>
- <button label="嫌がらせの報告" label_selected="嫌がらせの報告" name="send_btn"/>
- <button label="取り消し" label_selected="取り消し" name="cancel_btn"/>
+ <button label="嫌がらせを報告する" label_selected="嫌がらせを報告する" name="send_btn"/>
+ <button label="キャンセル" label_selected="キャンセル" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_save_camera_preset.xml b/indra/newview/skins/default/xui/ja/floater_save_camera_preset.xml
index c3d7db85c7..b12cf36fd3 100644
--- a/indra/newview/skins/default/xui/ja/floater_save_camera_preset.xml
+++ b/indra/newview/skins/default/xui/ja/floater_save_camera_preset.xml
@@ -1,7 +1,17 @@
-<?xml version="1.0" ?>
-<floater name="save_camera_preset" title="カメラプリセットを保存">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="save_camera_preset" title="カメラプリセットの保存">
+ <string name="btn_label_save">
+ 保存
+ </string>
+ <string name="btn_label_replace">
+ 置き換え
+ </string>
<radio_group name="radio_save_preset">
- <radio_item name="replace_preset" label="プリセットを交換する"/>
- <radio_item name="new_preset" label="新しいプリセットとして保存する"/>
+ <radio_item label="新しいプリセットとして保存" name="new_preset"/>
+ <radio_item label="プリセットを置き換え" name="replace_preset"/>
</radio_group>
+ <line_editor name="preset_txt_editor"/>
+ <button label="保存" name="save"/>
+ <button label="キャンセル" name="cancel"/>
+ <combo_box name="preset_combo"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_save_pref_preset.xml b/indra/newview/skins/default/xui/ja/floater_save_pref_preset.xml
index cdc67b3148..977fd05eef 100644
--- a/indra/newview/skins/default/xui/ja/floater_save_pref_preset.xml
+++ b/indra/newview/skins/default/xui/ja/floater_save_pref_preset.xml
@@ -1,14 +1,14 @@
-<?xml version="1.0" encoding="utf-8"?>
-<floater name="Save Pref Preset" title="優先プリセットを保存">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="save_pref_preset" title="グラフィックプリセットの保存">
<string name="title_graphic">
- グラフィックプリセットを保存
+ グラフィックのプリセットを保存
</string>
<string name="title_camera">
- カメラプリセットを保存
+ カメラのプリセットを保存
</string>
<text name="Preset">
プリセットの名前を入力するか、既存のプリセットを選択します。
</text>
<button label="保存" name="save"/>
- <button label="取り消し" name="cancel"/>
+ <button label="キャンセル" name="cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_scene_load_stats.xml b/indra/newview/skins/default/xui/ja/floater_scene_load_stats.xml
index f348ce3c4d..43d5223ecc 100644
--- a/indra/newview/skins/default/xui/ja/floater_scene_load_stats.xml
+++ b/indra/newview/skins/default/xui/ja/floater_scene_load_stats.xml
@@ -1,63 +1,74 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Scene Load Statistics" title="シーン ロード統計情報">
- <button label="一時停止" name="playpause"/>
+<floater name="Scene Load Statistics" title="シーン読み込みの統計情報">
<scroll_container name="statistics_scroll">
<container_view name="statistics_view">
- <stat_view label="ベーシック" name="basic">
- <stat_bar label="フレーム ピクセル差" name="frame difference"/>
- <stat_bar label="UDP データを受け取りました" name="bandwidth"/>
- <stat_bar label="パケットロス" name="packet_loss"/>
+ <stat_view name="basic" label="基本">
+ <stat_bar label="フレームごとのピクセル差" name="frame difference" unit_label="%"/>
+ <stat_bar label="UDPデータの受信量" name="bandwidth" unit_label="kbps"/>
+ <stat_bar label="パケットロス" name="packet_loss" unit_label="%"/>
</stat_view>
- <stat_view label="アドバンス" name="advanced">
- <stat_view label="描画" name="render">
- <stat_bar label="オブジェクト合計" name="objs"/>
- <stat_bar label="新規オブジェクト" name="newobjs"/>
- <stat_bar label="オブジェクト キャッシュ ヒット率" name="object_cache_hits"/>
+ <stat_view name="advanced" label="拡張">
+ <stat_view name="render" label="描画">
+ <stat_bar name="objs" label="オブジェクト合計"/>
+ <stat_bar name="newobjs" label="新しいオブジェクト" unit_label="/秒"/>
+ <stat_bar name="object_cache_hits" label="オブジェクトのキャッシュのヒット率" unit_label="%"/>
</stat_view>
- <stat_view label="テクスチャ" name="texture">
- <stat_bar label="キャッシュ ヒット率" name="texture_cache_hits"/>
- <stat_bar label="キャッシュ読み込み遅延" name="texture_cache_read_latency"/>
- <stat_bar label="カウント" name="numimagesstat"/>
- <stat_bar label="Raw カウント" name="numrawimagesstat"/>
+ <stat_view name="texture" label="テクスチャ">
+ <stat_bar name="texture_cache_hits" label="キャッシュヒット率" unit_label="%"/>
+ <stat_bar name="texture_cache_read_latency" label="キャッシュ読み込み遅延量" unit_label="秒"/>
+ <stat_bar name="texture_decode_latency" label="キャッシュデコード遅延量" unit_label="秒"/>
+ <stat_bar name="texture_decode_latency" label="キャッシュ書き込み遅延量" unit_label="秒"/>
+ <stat_bar name="texture_fetch_latency" label="キャッシュ取得遅延量" unit_label="秒"/>
+ <stat_bar name="texture_fetch_time" label="キャッシュ取得時間" unit_label="秒"/>
+ <stat_bar name="numimagesstat" label="カウント"/>
+ <stat_bar name="numrawimagesstat" label="Rawカウント"/>
</stat_view>
- <stat_view label="ネットワーク" name="network">
- <stat_bar label="パケットイン" name="packetsinstat"/>
- <stat_bar label="パケットアウト" name="packetsoutstat"/>
- <stat_bar label="オブジェクト" name="objectdatareceived"/>
- <stat_bar label="テクスチャ" name="texturedatareceived"/>
- <stat_bar label="資産" name="assetudpdatareceived"/>
- <stat_bar label="レイヤー" name="layersdatareceived"/>
- <stat_bar label="実際の受信" name="messagedatain"/>
- <stat_bar label="実際の送信" name="messagedataout"/>
+ <stat_view name="network" label="ネットワーク">
+ <stat_bar name="packetsinstat" label="受信パケット量" unit_label="/秒"/>
+ <stat_bar name="packetsoutstat" label="送信パケット量" unit_label="/秒"/>
+ <stat_bar name="objectdatareceived" label="オブジェクト" unit_label="kbps"/>
+ <stat_bar name="texturedatareceived" label="テスクチャ" unit_label="kbps"/>
+ <stat_bar name="assetudpdatareceived" label="アセット" unit_label="kbps"/>
+ <stat_bar name="layersdatareceived" label="レイヤー" unit_label="kbps"/>
+ <stat_bar name="messagedatain" label="実効受信量" unit_label="kbps"/>
+ <stat_bar name="messagedataout" label="実効送信量" unit_label="kbps"/>
</stat_view>
</stat_view>
- <stat_view label="シミュレーター" name="sim">
- <stat_bar label="オブジェクト" name="simobjects"/>
- <stat_bar label="アクティブなオブジェクト" name="simactiveobjects"/>
- <stat_bar label="アクティブなスクリプト" name="simactivescripts"/>
- <stat_bar label="パケットイン" name="siminpps"/>
- <stat_bar label="パケットアウト" name="simoutpps"/>
- <stat_bar label="保留中のダウンロード" name="simpendingdownloads"/>
- <stat_bar label="保留中のアップロード" name="simpendinguploads"/>
- <stat_bar label="未送信バイト合計" name="simtotalunackedbytes"/>
- <stat_view label="時間(ms)" name="simperf">
- <stat_bar label="フレーム時間合計" name="simframemsec"/>
- <stat_bar label="総時間数" name="simnetmsec"/>
- <stat_bar label="物理的作用時間" name="simsimphysicsmsec"/>
- <stat_bar label="シミュレーション時間" name="simsimothermsec"/>
- <stat_bar label="エージェント時間" name="simagentmsec"/>
- <stat_bar label="イメージ時間" name="simimagesmsec"/>
- <stat_bar label="スクリプト時間" name="simscriptmsec"/>
- <stat_bar label="余暇" name="simsparemsec"/>
- <stat_view label="時間の詳細(ms)" name="timedetails">
- <stat_bar label="物理効果の単位" name="simsimphysicsstepmsec"/>
- <stat_bar label="物理形状を更新" name="simsimphysicsshapeupdatemsec"/>
- <stat_bar label="他の物理効果" name="simsimphysicsothermsec"/>
- <stat_bar label="スリープ時間" name="simsleepmsec"/>
- <stat_bar label="ポンプ I/O" name="simpumpiomsec"/>
+ <stat_view name="sim" label="シミュレーター">
+ <stat_bar name="simobjects" label="オブジェクト"/>
+ <stat_bar name="simactiveobjects" label="アクティブなオブジェクト"/>
+ <stat_bar name="simactivescripts" label="アクティブなスクリプト"/>
+ <stat_bar name="siminpps" label="受信パケット" unit_label="pps"/>
+ <stat_bar name="simoutpps" label="送信パケット" unit_label="pps"/>
+ <stat_bar name="simpendingdownloads" label="保留中のダウンロード"/>
+ <stat_bar name="simpendinguploads" label="保留中のアップロード"/>
+ <stat_bar name="simtotalunackedbytes" label="未確認バイトの合計" unit_label="㎅"/>
+ <stat_view name="simperf" label="時間(㎳)">
+ <stat_bar name="simframemsec" label="合計フレーム時間" unit_label="㎳"/>
+ <stat_bar name="simnetmsec" label="ネット時間" unit_label="㎳"/>
+ <stat_bar name="simsimphysicsmsec" label="物理作用時間" unit_label="㎳"/>
+ <stat_bar name="simsimothermsec" label="シミュレーション時間" unit_label="㎳"/>
+ <stat_bar name="simagentmsec" label="エージェント時間" unit_label="㎳"/>
+ <stat_bar name="simimagesmsec" label="イメージ時間" unit_label="㎳"/>
+ <stat_bar name="simscriptmsec" label="スクリプト時間" unit_label="㎳"/>
+ <stat_bar name="simsparemsec" label="スペア時間" unit_label="㎳"/>
+ <stat_view name="timedetails" label="時間詳細(㎳)">
+ <stat_bar name="simsimphysicsstepmsec" label=" 物理作用単位" unit_label="㎳"/>
+ <stat_bar name="simsimphysicsshapeupdatemsec" label=" 物理形状更新" unit_label="㎳"/>
+ <stat_bar name="simsimphysicsothermsec" label=" 他の物理作用" unit_label="㎳"/>
+ <stat_bar name="simsleepmsec" label=" スリープ時間" unit_label="㎳"/>
+ <stat_bar name="simpumpiomsec" label=" ポンプI/O" unit_label="㎳"/>
</stat_view>
</stat_view>
</stat_view>
+ <stat_view name="frame_stats" label="フレームの内訳">
+ <stat_bar name="scenery_frame_pct" label="景色" unit_label="%"/>
+ <stat_bar name="avatar_frame_pct" label="アバター" unit_label="%"/>
+ <stat_bar name="ui_frame_pct" label="UI" unit_label="%"/>
+ <stat_bar name="huds_frame_pct" label="HUD" unit_label="%"/>
+ <stat_bar name="swap_frame_pct" label="スワップ" unit_label="%"/>
+ <stat_bar name="idle_frame_pct" label="タスク" unit_label="%"/>
+ </stat_view>
</container_view>
</scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_script_debug.xml b/indra/newview/skins/default/xui/ja/floater_script_debug.xml
index 0ac7a988e0..6ed292e8fa 100644
--- a/indra/newview/skins/default/xui/ja/floater_script_debug.xml
+++ b/indra/newview/skins/default/xui/ja/floater_script_debug.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<multi_floater name="script debug floater" title="スクリプト警告/エラー">
<tab_container name="Preview Tabs">
- <floater label="スクリプト" name="all_scripts" title="[ALL SCRIPTS]" />
+ <floater label="スクリプト" name="all_scripts" title="[ALL SCRIPTS]"/>
</tab_container>
</multi_floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/ja/floater_script_debug_panel.xml
index e70a30fa24..b2acebe95b 100644
--- a/indra/newview/skins/default/xui/ja/floater_script_debug_panel.xml
+++ b/indra/newview/skins/default/xui/ja/floater_script_debug_panel.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script" short_title="[ALL SCRIPTS]" title="[ALL SCRIPTS]"/>
+<floater name="script" short_title="[ALL SCRIPTS]" title="[ALL SCRIPTS]"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/floater_script_ed_prefs.xml b/indra/newview/skins/default/xui/ja/floater_script_ed_prefs.xml
index 3a90e673ae..49ca6d8f98 100644
--- a/indra/newview/skins/default/xui/ja/floater_script_ed_prefs.xml
+++ b/indra/newview/skins/default/xui/ja/floater_script_ed_prefs.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_script_colors" title="スクリプトの色">
<text name="color_pickers_label">
- 希望の色を選択:
+ 希望の色を選択:
</text>
<text name="text_label">
テキスト
@@ -37,12 +37,12 @@
/* サンプル スクリプト */
default
{
-state_entry()
- {
-// コメント
-string greeting = &quot;こんにちは&quot;;
-llSay(PUBLIC_CHANNEL, greeting);
- }
+ state_entry()
+ {
+ // コメント
+ string greeting = "こんにちは";
+ llSay(PUBLIC_CHANNEL, greeting);
+ }
}
</script_editor>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_script_limits.xml b/indra/newview/skins/default/xui/ja/floater_script_limits.xml
index 7ccd858af7..abea8bdf9b 100644
--- a/indra/newview/skins/default/xui/ja/floater_script_limits.xml
+++ b/indra/newview/skins/default/xui/ja/floater_script_limits.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="scriptlimits" title="スクリプト情報"/>
+<floater name="scriptlimits" title="スクリプト情報"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/floater_script_preview.xml b/indra/newview/skins/default/xui/ja/floater_script_preview.xml
index 656357aa17..a1e78a7e12 100644
--- a/indra/newview/skins/default/xui/ja/floater_script_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_script_preview.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview lsl text" title="スクリプト: 回転スクリプト">
+<floater name="preview lsl text" title="スクリプト:回転スクリプト">
<floater.string name="Title">
- スクリプト: [NAME]
+ スクリプト:[NAME]
</floater.string>
<text name="desc txt">
説明:
diff --git a/indra/newview/skins/default/xui/ja/floater_script_queue.xml b/indra/newview/skins/default/xui/ja/floater_script_queue.xml
index de0c4469c1..d444015a14 100644
--- a/indra/newview/skins/default/xui/ja/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/ja/floater_script_queue.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="queue" title="進行のリセット">
<floater.string name="Starting">
- [COUNT] アイテムの [START] を開始します。
+ [COUNT]アイテムの[START]を開始します。
</floater.string>
<floater.string name="Done">
完了。
@@ -16,10 +16,10 @@
実行されていません
</floater.string>
<floater.string name="Timeout">
- タイムアウト: [OBJECT_NAME]
+ タイムアウト:[OBJECT_NAME]
</floater.string>
<floater.string name="LoadingObjInv">
- 次のインベントリをロード中: [OBJECT_NAME]
+ 次のインベントリをロード中:[OBJECT_NAME]
</floater.string>
<button label="閉じる" label_selected="閉じる" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_search.xml b/indra/newview/skins/default/xui/ja/floater_search.xml
index 0723be0068..531ac77f95 100644
--- a/indra/newview/skins/default/xui/ja/floater_search.xml
+++ b/indra/newview/skins/default/xui/ja/floater_search.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_search" title="">
<floater.string name="loading_text">
- ローディング...
+ 読み込んでいます…。
</floater.string>
<floater.string name="done_text">
完了
@@ -9,7 +9,7 @@
<layout_stack name="stack1">
<layout_panel name="browser_layout">
<text name="refresh_search">
- 現在のゴッドレベルに反映させるため検索をやり直してください
+ 現在のゴッドレベルに反映させるため、検索をやり直してください。
</text>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/ja/floater_select_key.xml b/indra/newview/skins/default/xui/ja/floater_select_key.xml
index d41be86873..8f92384daa 100644
--- a/indra/newview/skins/default/xui/ja/floater_select_key.xml
+++ b/indra/newview/skins/default/xui/ja/floater_select_key.xml
@@ -1,7 +1,24 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container">
- <button label="キャンセル" label_selected="キャンセル" name="Cancel"/>
- <text name="Save item as:">
- キーを押してスピーカーボタンのトリガーを設定します。
+ <floater.string name="keyboard">
+ キーボード
+ </floater.string>
+ <floater.string name="mouse">
+ マウスのボタン
+ </floater.string>
+ <floater.string name="basic_description">
+ キーを押してトリガーを設定します。
+許可される入力:[INPUT]
+ </floater.string>
+ <floater.string name="reserved_by_menu">
+ その組み合わせ([KEYSTR])は、メニューで予約されています。
+ </floater.string>
+ <text name="description">
+ キーを押してトリガーを設定します。
+許可される入力:[INPUT]
</text>
+ <check_box label="全てに適用" name="apply_all" tool_tip="ビューアは、ワールドで何をしているかに応じて、さまざまなコントロールの組み合わせを使用します。これを設定すると、変更がすべての組み合わせに適用されます。"/>
+ <button label="空欄にする" name="SetEmpty"/>
+ <button label="デフォルト" name="Default"/>
+ <button label="キャンセル" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_sell_land.xml b/indra/newview/skins/default/xui/ja/floater_sell_land.xml
index aa368eef11..be7151876d 100644
--- a/indra/newview/skins/default/xui/ja/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_sell_land.xml
@@ -6,22 +6,22 @@
区画:
</text>
<text name="info_parcel">
- PARCEL NAME
+ 区画名
</text>
<text name="info_size_label">
サイズ:
</text>
<text name="info_size">
- [AREA] 平方メートル
+ [AREA]㎡
</text>
<text name="info_action">
この区画を販売:
</text>
<text name="price_label">
- 1. 価格の設定:
+ 1.価格の設定:
</text>
<text name="price_text">
- 適正価格を設定してください。
+ 適正と思われる価格を入力してください。
</text>
<text name="price_ld">
L$
@@ -30,35 +30,35 @@
0
</line_editor>
<text name="price_per_m">
- (1平方メートルあたり L$[PER_METER])
+ (1㎡あたりL$ [PER_METER])
</text>
<text name="sell_to_label">
- 2. 特定の人に販売:
+ 2.特定の人物に販売:
</text>
<text name="sell_to_text">
- 販売先の指定なしか、特定の人に販売するかを選択してください。
+ 販売先を特定の人物に限定するか、しないかを選択してください。
</text>
<combo_box name="sell_to">
- <combo_box.item label="- 1つ選択 -" name="--selectone--"/>
+ <combo_box.item label="─1つ選択─" name="--selectone--"/>
<combo_box.item label="指定なし・誰にでも販売" name="Anyone"/>
- <combo_box.item label="特定の人:" name="Specificuser:"/>
+ <combo_box.item label="特定の人物:" name="Specificuser:"/>
</combo_box>
<button label="選択" name="sell_to_select_agent"/>
<text name="sell_objects_label">
- 3. オブジェクトも土地と一緒に販売しますか?
+ 3.オブジェクトと土地を一緒に販売しますか?
</text>
<text name="sell_objects_text">
- 区画上にある、土地所有者の譲渡可能なオブジェクトは、所有権が変更されます。
+ 区画上の土地所有者の譲渡可能なオブジェクトは、所有権が変更されます。
</text>
<radio_group name="sell_objects">
- <radio_item label="いいえ、オブジェクトの所有権を保持します" name="no"/>
- <radio_item label="はい、オブジェクトと土地を一緒に販売します" name="yes"/>
+ <radio_item label="いいえ、オブジェクトの所有権は保持します。" name="no"/>
+ <radio_item label="はい、オブジェクトと土地を一緒に販売します。" name="yes"/>
</radio_group>
<button label="オブジェクトを表示" name="show_objects"/>
<text name="nag_message_label">
- 注意: 返品・交換はできません。
+ 注意:返品・交換はできません。
</text>
- <button label="土地を販売" name="sell_btn"/>
+ <button label="土地を販売する" name="sell_btn"/>
<button label="キャンセル" name="cancel_btn"/>
</panel>
</scroll_container>
diff --git a/indra/newview/skins/default/xui/ja/floater_settings_debug.xml b/indra/newview/skins/default/xui/ja/floater_settings_debug.xml
index cb7950bf53..f304ab9769 100644
--- a/indra/newview/skins/default/xui/ja/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/ja/floater_settings_debug.xml
@@ -1,13 +1,25 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="settings_debug" title="デバッグ設定">
- <combo_box name="boolean_combo">
- <combo_box.item label="TRUE" name="TRUE"/>
- <combo_box.item label="FALSE" name="FALSE"/>
- </combo_box>
+ <filter_editor name="filter_input"/>
+ <scroll_list name="setting_list">
+ <scroll_list.columns name="changed_setting"/>
+ <scroll_list.columns label="設定" name="setting"/>
+ </scroll_list>
+ <text name="setting_name_txt">
+ デバッグ設定名
+ </text>
+ <text_editor name="comment_text"/>
+ <radio_group name="boolean_combo">
+ <radio_item label="有効" name="TRUE" value="true"/>
+ <radio_item label="無効" name="FALSE" value=""/>
+ <commit_callback function="CommitSettings"/>
+ </radio_group>
+ <line_editor name="val_text"/>
<color_swatch label="色" 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"/>
+ <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="デフォルトにリセット" name="default_btn"/>
+ <check_box label="変更された設定のみ表示" name="hide_default"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_settings_picker.xml b/indra/newview/skins/default/xui/ja/floater_settings_picker.xml
index b8b1699f03..ffef8733cf 100644
--- a/indra/newview/skins/default/xui/ja/floater_settings_picker.xml
+++ b/indra/newview/skins/default/xui/ja/floater_settings_picker.xml
@@ -10,20 +10,20 @@
設定を選択
</floater.string>
<floater.string name="track_water">
- 水
+ 水面
</floater.string>
<floater.string name="track_ground">
地面
</floater.string>
<floater.string name="track_sky">
- 空 [NUM]
+ 空[NUM]
</floater.string>
<layout_stack name="test_stack">
<layout_panel name="inv_list">
- <filter_editor label="テクスチャをフィルター" name="flt_inventory_search"/>
+ <filter_editor label="テクスチャをフィルタ" name="flt_inventory_search"/>
</layout_panel>
<layout_panel name="temp">
- <button label="OK" label_selected="OK" name="btn_select"/>
+ <button label="OK" label_selected="OK" name="btn_select"/>
<button label="キャンセル" label_selected="キャンセル" name="btn_cancel"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/ja/floater_simple_outfit_snapshot.xml b/indra/newview/skins/default/xui/ja/floater_simple_outfit_snapshot.xml
new file mode 100644
index 0000000000..0b8030048d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_simple_outfit_snapshot.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="simple_outfit_snapshot" title="アウトフィットのスナップショット">
+ <ui_ctrl name="thumbnail_placeholder"/>
+ <button label="画像を撮影" name="new_snapshot_btn"/>
+ <button label="保存(L$ [UPLOAD_COST])" name="save_btn"/>
+ <button label="キャンセル" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_snapshot.xml b/indra/newview/skins/default/xui/ja/floater_snapshot.xml
index 64f292c75c..8035e8a13f 100644
--- a/indra/newview/skins/default/xui/ja/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/ja/floater_snapshot.xml
@@ -4,13 +4,10 @@
不明
</floater.string>
<string name="postcard_progress_str">
- メールの送信
- </string>
- <string name="facebook_progress_str">
- Facebook へ投稿中
+ メール送信
</string>
<string name="profile_progress_str">
- 投稿
+ プロフィールに投稿
</string>
<string name="inventory_progress_str">
インベントリに保存
@@ -18,60 +15,84 @@
<string name="local_progress_str">
コンピュータに保存
</string>
- <string name="facebook_succeeded_str">
- 画像がアップロードされました
- </string>
<string name="profile_succeeded_str">
- 画像がアップロードされました
+ 画像がアップロードされました。
</string>
<string name="postcard_succeeded_str">
- メールが送信されました
+ メールが送信されました!
</string>
<string name="inventory_succeeded_str">
- インベントリに保存されました
+ インベントリに保存されました!
</string>
<string name="local_succeeded_str">
- コンピュータに保存されました
- </string>
- <string name="facebook_failed_str">
- Facebook のタイムラインに画像をアップロードできませんでした。
+ コンピュータに保存されました!
</string>
<string name="profile_failed_str">
- プロフィールフィードに画像をアップロードできませんでした。
+ フィードにアップできませんでした。
</string>
<string name="postcard_failed_str">
- メールを送信できませんでした。
+ メール送信に失敗しました。
</string>
<string name="inventory_failed_str">
インベントリに保存できませんでした。
</string>
<string name="local_failed_str">
- コンピュータに保存できませんでした。
+ コンピュータへの保存に失敗しました。
</string>
- <button label="更新" name="new_snapshot_btn"/>
+ <button label="リフレッシュ" name="new_snapshot_btn"/>
<panel name="advanced_options_panel">
<text name="layer_type_label">
- キャプチャ:
+ キャプチャーオプション:
</text>
<combo_box label="画像レイヤー" name="layer_types">
- <combo_box.item label="色" name="Colors"/>
- <combo_box.item label="深度" name="Depth"/>
+ <combo_box.item label="カラー" name="Colors" value="colors"/>
+ <combo_box.item label="色深度" name="Depth" value="depth"/>
</combo_box>
<check_box label="インターフェース" name="ui_check"/>
- <check_box label="HUD" name="hud_check"/>
- <check_box label="画面全体を静止" name="freeze_frame_check"/>
- <check_box label="自動更新" name="auto_snapshot_check"/>
+ <check_box label="HUD" name="hud_check"/>
+ <check_box label="フレームをフリーズ(全画面)" name="freeze_frame_check"/>
+ <check_box label="自動リフレッシュ" name="auto_snapshot_check"/>
<text name="filter_list_label">
- フィルター:
+ フィルタ:
</text>
- <combo_box name="filters_combobox" tool_tip="画像フィルター">
- <combo_box.item label="フィルターなし" name="NoFilter"/>
+ <combo_box name="filters_combobox" tool_tip="画像フィルタ">
+ <combo_box.item label="フィルタなし" name="NoFilter" value="NoFilter"/>
</combo_box>
</panel>
+ <panel_container name="panel_container">
+ <panel name="panel_snapshot_options" filename="panel_snapshot_options.xml"/>
+ <panel name="panel_snapshot_profile" filename="panel_snapshot_profile.xml"/>
+ <panel name="panel_snapshot_postcard" filename="panel_snapshot_postcard.xml"/>
+ <panel name="panel_snapshot_inventory" filename="panel_snapshot_inventory.xml"/>
+ <panel name="panel_snapshot_local" filename="panel_snapshot_local.xml"/>
+ </panel_container>
+ <view_border name="status_hr"/>
+ <panel name="succeeded_panel">
+ <text name="succeeded_lbl">
+ 成功
+ </text>
+ </panel>
+ <panel name="failed_panel">
+ <text name="failed_lbl">
+ 失敗
+ </text>
+ </panel>
+ <loading_indicator name="working_indicator"/>
+ <text name="working_lbl">
+ 処理中
+ </text>
+ <text name="refresh_lbl">
+ リフレッシュして保存
+ </text>
+ <ui_ctrl name="thumbnail_placeholder"/>
+ <view_border name="img_info_border"/>
<text name="image_res_text">
- [WIDTH]px (横幅) x [HEIGHT]px (高さ)
+ [WIDTH]px(幅)✕[HEIGHT]px(高さ)
</text>
<text name="file_size_label">
- [SIZE] キロバイト
+ [SIZE]㎅
+ </text>
+ <text name="360_label">
+ 360度Sショットを撮影
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_sound_preview.xml b/indra/newview/skins/default/xui/ja/floater_sound_preview.xml
index 7d83309c46..b55a664cfa 100644
--- a/indra/newview/skins/default/xui/ja/floater_sound_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_sound_preview.xml
@@ -6,10 +6,10 @@
<text name="description_label">
説明:
</text>
- <button label="取り消し" label_selected="取り消し" name="cancel_btn"/>
- <button label="アップロード (L$[AMOUNT])" label_selected="アップロード (L$[AMOUNT])" name="ok_btn"/>
+ <button label="キャンセル" label_selected="キャンセル" name="cancel_btn"/>
+ <button label="アップロード(L$[AMOUNT])" label_selected="アップロード(L$ [AMOUNT])" name="ok_btn"/>
<text name="text">
- ビットレート(kbps):
+ ビットレート(kbps):
</text>
<radio_group name="bitrate">
<radio_item label="32" name="32"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_spellcheck.xml b/indra/newview/skins/default/xui/ja/floater_spellcheck.xml
index 31fbef9bcf..28e07e68c4 100644
--- a/indra/newview/skins/default/xui/ja/floater_spellcheck.xml
+++ b/indra/newview/skins/default/xui/ja/floater_spellcheck.xml
@@ -14,5 +14,5 @@
有効
</text>
<button label="削除" name="spellcheck_remove_btn"/>
- <button label="インポート..." name="spellcheck_import_btn"/>
+ <button label="インポート…" name="spellcheck_import_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_spellcheck_import.xml b/indra/newview/skins/default/xui/ja/floater_spellcheck_import.xml
index 81bfbe15f5..9000d862a6 100644
--- a/indra/newview/skins/default/xui/ja/floater_spellcheck_import.xml
+++ b/indra/newview/skins/default/xui/ja/floater_spellcheck_import.xml
@@ -11,5 +11,5 @@
言語:
</text>
<button label="インポート" name="ok_btn"/>
- <button label="取り消し" name="cancel_btn"/>
+ <button label="キャンセル" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_stats.xml b/indra/newview/skins/default/xui/ja/floater_stats.xml
index 1da0e5ebc9..0c28b47351 100644
--- a/indra/newview/skins/default/xui/ja/floater_stats.xml
+++ b/indra/newview/skins/default/xui/ja/floater_stats.xml
@@ -2,16 +2,19 @@
<floater name="Statistics" title="統計">
<scroll_container name="statistics_scroll">
<container_view name="statistics_view">
- <stat_view label="ベーシック" name="basic">
- <stat_bar label="FPS" name="fps"/>
- <stat_bar label="UDP データを受け取りました" name="bandwidth"/>
+ <stat_view label="基本" name="basic">
+ <stat_bar label="FPS" name="fps" unit_label="/秒"/>
+ <stat_bar name="frame_mean" label="フレーム(平均)" unit_label="㎳"/>
+ <stat_bar name="frame_median" label="フレーム(中央値)" unit_label="㎳"/>
+ <stat_bar name="framet_jitter" label="ジッタ"/>
+ <stat_bar label="受信したUDPデータ" name="bandwidth"/>
<stat_bar label="パケットロス" name="packet_loss"/>
- <stat_bar label="Pingシム" name="ping"/>
+ <stat_bar label="シムのPing" name="ping"/>
</stat_view>
- <stat_view label="アドバンス" name="advanced">
+ <stat_view label="拡張" name="advanced">
<stat_view label="描画" name="render">
- <stat_bar label="KTris (フレームごと)" name="ktrisframe"/>
- <stat_bar label="KTris (秒ごと)" name="ktrissec"/>
+ <stat_bar label="フレームあたりのKTris" name="ktrisframe" unit_label="ktris/フレーム"/>
+ <stat_bar label="秒あたりのKTris" name="ktrissec"/>
<stat_bar label="オブジェクト合計" name="totalobjs"/>
<stat_bar label="キャッシュされたオブジェクト" name="cachedobjs"/>
<stat_bar label="新規オブジェクト" name="newobjs"/>
@@ -24,27 +27,27 @@
<stat_bar label="キャッシュヒット率" name="texture_cache_hits"/>
<stat_bar label="キャッシュ読み取り遅延" name="texture_cache_read_latency"/>
<stat_bar label="カウント" name="numimagesstat"/>
- <stat_bar label="Raw カウント" name="numrawimagesstat"/>
- <stat_bar label="GL メモリ" name="gltexmemstat"/>
+ <stat_bar label="RAWカウント" name="numrawimagesstat"/>
+ <stat_bar label="GLメモリ" name="gltexmemstat"/>
<stat_bar label="フォーマット済メモリ" name="formattedmemstat"/>
- <stat_bar label="Raw メモリ" name="rawmemstat"/>
+ <stat_bar label="RAWメモリ" name="rawmemstat"/>
<stat_bar label="統合メモリ" name="glboundmemstat"/>
</stat_view>
<stat_view label="メモリ使用量" name="memory">
- <stat_bar label="LLTrace" name="LLTrace"/>
- <stat_bar label="UI" name="LLView"/>
+ <stat_bar label="LLトレース" name="LLTrace"/>
+ <stat_bar label="UI" name="LLView"/>
<stat_bar label="フォント" name="LLFontFreetype"/>
<stat_bar label="インベントリ" name="LLInventoryObject"/>
- <stat_bar label="ビューワ オブジェクト" name="LLViewerObject"/>
- <stat_bar label="Octree グループ データ" name="LLViewerOctreeGroup"/>
- <stat_bar label="Octree データ" name="LLViewerOctreeEntry"/>
- <stat_bar label="ビューワ オブジェクト キャッシュ" name="LLVOCacheEntry"/>
+ <stat_bar label="ビューアオブジェクト" name="LLViewerObject"/>
+ <stat_bar label="八分木グループデータ" name="LLViewerOctreeGroup"/>
+ <stat_bar label="八分木データ" name="LLViewerOctreeEntry"/>
+ <stat_bar label="ビューアのオブジェクトキャッシュ" name="LLVOCacheEntry"/>
<stat_bar label="描画可能オブジェクト" name="LLDrawable"/>
<stat_bar label="顔データ" name="LLFace"/>
<stat_bar label="描画情報" name="LLDrawInfo"/>
- <stat_bar label="テクスチャ データ" name="LLTexture"/>
+ <stat_bar label="テクスチャデータ" name="LLTexture"/>
<stat_bar label="画像データ" name="LLImage"/>
- <stat_bar label="GL 画像データ" name="LLImageGL"/>
+ <stat_bar label="GL画像データ" name="LLImageGL"/>
<stat_bar label="頂点バッファ" name="LLVertexBuffer"/>
</stat_view>
<stat_view label="ネットワーク" name="network">
@@ -52,39 +55,39 @@
<stat_bar label="パケットアウト" name="packetsoutstat"/>
<stat_bar label="オブジェクト" name="objectdatareceived"/>
<stat_bar label="テクスチャ" name="texturedatareceived"/>
- <stat_bar label="資産" name="assetudpdatareceived"/>
+ <stat_bar label="アセット" name="assetudpdatareceived"/>
<stat_bar label="レイヤー" name="layersdatareceived"/>
<stat_bar label="実際の受信" name="messagedatain"/>
<stat_bar label="実際の送信" name="messagedataout"/>
</stat_view>
</stat_view>
<stat_view label="シミュレーター" name="sim">
- <stat_bar label="時間の遅れ" name="simtimedilation"/>
- <stat_bar label="シム FPS" name="simfps"/>
- <stat_bar label="物理作用 FPS" name="simphysicsfps"/>
+ <stat_bar label="遅延時間" name="simtimedilation"/>
+ <stat_bar label="シムのFPS" name="simfps"/>
+ <stat_bar label="物理作用のFPS" name="simphysicsfps"/>
<stat_view label="物理作用の詳細" name="physicsdetail">
<stat_bar label="ピン留めオブジェクト" name="physicspinnedtasks"/>
- <stat_bar label="低 LOD オブジェクト" name="physicslodtasks"/>
+ <stat_bar label="低LODオブジェクト" name="physicslodtasks"/>
<stat_bar label="メモリ配分" name="physicsmemoryallocated"/>
</stat_view>
- <stat_bar label="エージェントの更新/秒" name="simagentups"/>
+ <stat_bar label="エージェントの更新/秒" name="simagentups"/>
<stat_bar label="メインエージェント" name="simmainagents"/>
<stat_bar label="チャイルドエージェント" name="simchildagents"/>
<stat_bar label="オブジェクト" name="simobjects"/>
<stat_bar label="アクティブなオブジェクト" name="simactiveobjects"/>
<stat_bar label="アクティブなスクリプト" name="simactivescripts"/>
<stat_bar label="スクリプト実行" name="simpctscriptsrun"/>
- <stat_bar label="スクリプトイベント" name="simscripteps"/>
- <stat_view label="パスファインディング" name="simpathfinding">
- <stat_bar label="AIステップ時間" name="simsimaistepmsec"/>
- <stat_bar label="スキップされたシルエットステップ" name="simsimskippedsilhouettesteps"/>
- <stat_bar label="更新されたキャラクター" name="simsimpctsteppedcharacters"/>
+ <stat_bar label="スクリプトイベント" name="simscripteps" unit_label="eps"/>
+ <stat_view label="経路探索" name="simpathfinding">
+ <stat_bar label="AIステップ時間" name="simsimaistepmsec"/>
+ <stat_bar label="スキップされたシルエットステップ" name="simsimskippedsilhouettesteps" unit_label="/秒"/>
+ <stat_bar label="更新されたキャラクター" name="simsimpctsteppedcharacters" unit_label="%"/>
</stat_view>
- <stat_bar label="パケットイン" name="siminpps"/>
- <stat_bar label="パケットアウト" name="simoutpps"/>
+ <stat_bar label="入力パケット" name="siminpps" unit_label="パケット/秒"/>
+ <stat_bar label="出力パケット" name="simoutpps" unit_label="パケット/秒"/>
<stat_bar label="保留中のダウンロード" name="simpendingdownloads"/>
<stat_bar label="保留中のアップロード" name="simpendinguploads"/>
- <stat_bar label="合計未承認データ" name="simtotalunackedbytes"/>
+ <stat_bar label="未承認の合計データ" name="simtotalunackedbytes"/>
<stat_view label="時間" name="simperf">
<stat_bar label="フレーム時間合計" name="simframemsec"/>
<stat_bar label="総時間数" name="simnetmsec"/>
@@ -93,13 +96,13 @@
<stat_bar label="エージェント時間" name="simagentmsec"/>
<stat_bar label="イメージ時間" name="simimagesmsec"/>
<stat_bar label="スクリプト時間" name="simscriptmsec"/>
- <stat_bar label="余暇" name="simsparemsec"/>
+ <stat_bar label="スペア時間" name="simsparemsec"/>
<stat_view label="時間の詳細" name="timedetails">
<stat_bar label="物理効果の単位" name="simsimphysicsstepmsec"/>
<stat_bar label="物理形状を更新" name="simsimphysicsshapeupdatemsec"/>
<stat_bar label="他の物理効果" name="simsimphysicsothermsec"/>
<stat_bar label="スリープ時間" name="simsleepmsec"/>
- <stat_bar label="ポンプ I/O" name="simpumpiomsec"/>
+ <stat_bar label="ポンプ入出力" name="simpumpiomsec"/>
</stat_view>
</stat_view>
</stat_view>
diff --git a/indra/newview/skins/default/xui/ja/floater_telehub.xml b/indra/newview/skins/default/xui/ja/floater_telehub.xml
index 7318083771..6ca900a83f 100644
--- a/indra/newview/skins/default/xui/ja/floater_telehub.xml
+++ b/indra/newview/skins/default/xui/ja/floater_telehub.xml
@@ -20,6 +20,7 @@
<button label="出現位置を追加" name="add_spawn_point_btn"/>
<button label="出現地点を削除" name="remove_spawn_point_btn"/>
<text name="spawn_point_help">
- オブジェクトを選び、「出現地点を追加」をクリックして位置を指定します。そうするとそのオブジェクトを移動させたり削除できます。位置はテレハブセンターに関連します。リストのアイテムを選択してインワールドでハイライトさせます。
+ オブジェクトを選び、「出現地点を追加」をクリックして位置を指定します。そうするとそのオブジェクトを移動させたり削除できます。
+位置はテレハブセンターに関連します。リストのアイテムを選択してインワールドでハイライトさせます。
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_test_button.xml b/indra/newview/skins/default/xui/ja/floater_test_button.xml
new file mode 100644
index 0000000000..c7427e8ecf
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_test_button.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_test_button">
+ <button label="汎用ボタン" name="generic_button"/>
+ <button name="bottom_delta_button"/>
+ <button name="sans_serif_small_button"/>
+ <button label="自動リサイズ" name="auto_resize_button"/>
+ <button label="クリックでラベル変更" label_selected="新しいラベル" name="label_selected_button"/>
+ <button label="ラベルに影をつけない" name="label_shadow_button"/>
+ <button label="強調色のラベル" name="label_color_button"/>
+ <button label="トグル" label_selected="トグル入" name="label_color_selected_button"/>
+ <button label="無効" label_selected="選択済み" name="label_color_disabled_button"/>
+ <button label="ハイライト" name="highlight_color_button"/>
+ <button label="ホーバーでグローさせない" name="hover_glow_amount_button"/>
+ <button name="image_button"/>
+ <button name="image_color_button"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_test_checkbox.xml b/indra/newview/skins/default/xui/ja/floater_test_checkbox.xml
new file mode 100644
index 0000000000..c4bbd74e17
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_test_checkbox.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_test_checkbox">
+ <check_box label="おおっ!これはチェックボックスのようだ!" name="show_location_checkbox"/>
+ <check_box label="最小のチェックボックス" name="minimal_checkbox"/>
+ <check_box label="無効状態のチェックボックス" name="disabled_checkbox"/>
+ <check_box label="有効時の文字色" name="text_enabled_color_checkbox"/>
+ <check_box label="無効時の文字色" name="text_disabled_color_checkbox"/>
+ <check_box label="チェックボックスの初期値" name="initial_value_checkbox"/>
+ <check_box label="等幅フォント" name="font_checkbox"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_test_combobox.xml b/indra/newview/skins/default/xui/ja/floater_test_combobox.xml
new file mode 100644
index 0000000000..5059a9d57a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_test_combobox.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_test_combobox">
+ <text type="string" length="1" height="16" layout="topleft" left="10" top="24" width="200">
+ 現実の使い道(ログイン場所):
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="最後に訪れた場所" name="MyLastLocation" value="last"/>
+ <combo_box.item label="自分の家" name="MyHome" value="home"/>
+ <combo_box.item label="<リージョン(地域)名を入力>" name="Typeregionname" value=""/>
+ </combo_box>
+ <text type="string" length="1" height="16" layout="topleft" left_delta="0" top_pad="24" width="200">
+ 最小のコンボボックス:
+ </text>
+ <combo_box name="minimal_combo">
+ <combo_box.item label="最初" name="item1" value="first"/>
+ <combo_box.item label="2つ目" name="item2" value="second"/>
+ </combo_box>
+ <text type="string" length="1" height="16" layout="topleft" left_delta="0" top_pad="24" width="200">
+ テキスト入力を許可:
+ </text>
+ <combo_box name="text_entry_combo">
+ <combo_box.item label="最初の項目" name="item1" value="first"/>
+ <combo_box.item label="2つ目の項目" name="item2" value="second"/>
+ </combo_box>
+ <text type="string" length="1" height="16" layout="topleft" left_delta="0" top_pad="24" width="200">
+ テキスト入力を許可。デフォルトは2つ目の項目:
+ </text>
+ <combo_box name="text_entry_combo2">
+ <combo_box.item label="最初の項目" name="item1" value="first"/>
+ <combo_box.item label="2つ目の項目" name="item2" value="second"/>
+ </combo_box>
+ <text type="string" length="1" height="16" layout="topleft" left_delta="0" top_pad="24" width="200">
+ 2文字まで入力可能:
+ </text>
+ <combo_box name="state_combo">
+ <combo_box.item label="CA" name="item1" value="ca"/>
+ <combo_box.item label="NY" name="item2" value="ny"/>
+ <combo_box.item label="TX" name="item3" value="tx"/>
+ </combo_box>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_test_inspectors.xml b/indra/newview/skins/default/xui/ja/floater_test_inspectors.xml
new file mode 100644
index 0000000000..c107b2bf69
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_test_inspectors.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_test_inspectors" title="インスペクタのテスト">
+ <text name="test_inspectors">
+ クリックしてインスペクターを生成します:
+ </text>
+ <button name="avatar_2d_btn1" label="2Dアバター"/>
+ <button name="avatar_2d_btn5" label="2Dアバター"/>
+ <button name="avatar_2d_btn2" label="2Dアバター"/>
+ <button name="avatar_2d_btn3" label=" 2Dアバター"/>
+ <button name="avatar_2d_btn4" label="2Dアバター"/>
+ <button name="avatar_3d_btn" label="3Dアバター"/>
+ <button name="object_2d_btn" label="2Dオブジェクト"/>
+ <button name="object_3d_btn" label="3Dオブジェクト"/>
+ <button name="group_btn" label="グループ"/>
+ <button name="place_btn" label="場所"/>
+ <button name="event_btn" label="イベント"/>
+ <text name="slurl">
+ secondlife:///app/agent/00000000-0000-0000-0000-000000000000/inspect
+ </text>
+ <text name="slurl_group">
+ secondlife:///app/group/00000000-0000-0000-0000-000000000000/inspect
+ </text>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_test_layout_stacks.xml b/indra/newview/skins/default/xui/ja/floater_test_layout_stacks.xml
index 31b5bbd3bf..2a9be07c80 100644
--- a/indra/newview/skins/default/xui/ja/floater_test_layout_stacks.xml
+++ b/indra/newview/skins/default/xui/ja/floater_test_layout_stacks.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Test Floater" title="レイアウトスタックテスト"/>
+<floater name="Test Floater" title="レイアウトスタックテスト"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/floater_test_line_editor.xml b/indra/newview/skins/default/xui/ja/floater_test_line_editor.xml
new file mode 100644
index 0000000000..c480c80ba5
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_test_line_editor.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_test_line_editor">
+ <line_editor name="enabled_line_editor" tool_tip="有効なラインエディタ">
+ ラインエディタを有効化
+ </line_editor>
+ <line_editor name="ascii_line_editor" prevalidate_callback="ascii" tool_tip="asciiラインエディタ">
+ ASCIIのみのラインエディタ
+ </line_editor>
+ <line_editor name="disabled_line_editor" tool_tip="無効なラインエディタ">
+ ラインエディタを無効化
+ </line_editor>
+ <line_editor name="enabled_colored_line_editor" tool_tip="有効な色付けされたラインエディタ">
+ 赤文字ラインエディタを有効化
+ </line_editor>
+ <line_editor name="disabled_colored_line_editor" tool_tip="無効な色付けされたラインエディタ">
+ 赤文字ラインエディタを無効化
+ </line_editor>
+ <line_editor name="left_pad_editor">
+ 左に25pxの余白
+ </line_editor>
+ <line_editor name="left_pad_editor">
+ 右に75pxの余白
+ </line_editor>
+ <line_editor name="left_pad_editor">
+ 左に25px、右に75pxの余白
+ </line_editor>
+ <search_editor label="検索語句を入力" name="search editor" tool_tip="エディタを検索"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_test_radiogroup.xml b/indra/newview/skins/default/xui/ja/floater_test_radiogroup.xml
new file mode 100644
index 0000000000..cfacc0393c
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_test_radiogroup.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_test_radiogroup">
+ <radio_group name="parcel_voice_channel">
+ <radio_item label="不動産空間チャネルを使用" name="Estate"/>
+ <radio_item label="プライベート空間チャネルを使用" name="Private"/>
+ <radio_item label="この区画の空間でのボイスチャットを無効化" name="Disabled"/>
+ </radio_group>
+ <radio_group name="simple_radio_group">
+ <radio_item label="label属性のラベル" name="label_radio_item"/>
+ <radio_item label="テキストコンテンツのラベル" name="contents_radio_item"/>
+ </radio_group>
+ <radio_group name="no_border_radio_group">
+ <radio_item label="Fooにはボーダーがありません" name="foo_radio_item"/>
+ <radio_item label="ボーダーのバー無し" name="bar_item"/>
+ </radio_group>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_test_slider.xml b/indra/newview/skins/default/xui/ja/floater_test_slider.xml
new file mode 100644
index 0000000000..a3c665155b
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_test_slider.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_test_slider">
+ <slider label="Generic Slider" name="generic_slider"/>
+ <slider label="コールバックスライダー" name="callback_slider"/>
+ <slider label="値スライダー" max_val="5" min_val="1" name="value_slider"/>
+ <slider label="ミニスライダー1" name="mini_slider_1"/>
+ <slider label="ミニスライダー2" name="mini_slider_2"/>
+ <slider_ name="slider_bar_vertical"/>
+ <slider_bar label="スライダーバー" name="slider_bar"/>
+ <slider label="赤スライダー" name="red_slider"/>
+ <slider label="赤い垂直スライダー" name="red_slider_vertical"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_test_spinner.xml b/indra/newview/skins/default/xui/ja/floater_test_spinner.xml
new file mode 100644
index 0000000000..2cac68188e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_test_spinner.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_test_spinner">
+ <spinner label="汎用スピナー" name="generic_spinner"/>
+ <spinner label="コールバックスピナー" name="callback_spinner"/>
+ <spinner label="カラフルなスピナー" name="colorful_spinner"/>
+ <spinner label="値スピナー" name="value_spinner"/>
+ <spinner label="ミニスピナー1" name="mini_spinner_1"/>
+ <spinner label="ミニスピナー2" name="mini_spinner_2"/>
+ <spinner label="操作スピナー" name="control_spinner"/>
+ <spinner label="左に続く" name="follows_left"/>
+ <spinner label="右に続く" name="follows_right"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_test_text_editor.xml b/indra/newview/skins/default/xui/ja/floater_test_text_editor.xml
new file mode 100644
index 0000000000..0933069ae6
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_test_text_editor.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_test_text_editor">
+ <text_editor name="test_text_editor" tool_tip="テキストエディタ">
+ テキストエディタ
+ </text_editor>
+ <text_editor name="test_text_editor" tool_tip="テキストエディタ">
+ これには長いテキストが含まれており、右に水平にスクロールする必要があります。
+ </text_editor>
+ <text_editor name="numeric_text_editor" tool_tip="数値のみ入力可能なテキストエディタ">
+ これは数字ではないテキストなので、表示されるべきではありません。
+ </text_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_test_text_vertical_aligment.xml b/indra/newview/skins/default/xui/ja/floater_test_text_vertical_aligment.xml
index 40fd8e9f93..4274fa5a87 100644
--- a/indra/newview/skins/default/xui/ja/floater_test_text_vertical_aligment.xml
+++ b/indra/newview/skins/default/xui/ja/floater_test_text_vertical_aligment.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Test Floater" title="テスト用ウィンドウ"/>
+<floater name="Test Floater" title="テスト用ウィンドウ"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml
index 1221702e9b..61f3b0ab54 100644
--- a/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="texture picker" title="テクスチャの選択">
<floater.string name="choose_picture">
- クリックして写真を選択
+ クリックして画像を選択
</floater.string>
<floater.string name="pick title">
- ピック:
+ ピック:
</floater.string>
<text name="Multiple">
複数のテクスチャ
@@ -18,14 +18,14 @@
<button label="なし" label_selected="なし" name="None"/>
<button label="" label_selected="" name="Pipette"/>
<text name="preview_disabled" value="プレビュー無効"/>
- <filter_editor label="テクスチャをフィルター" name="inventory search editor"/>
+ <filter_editor label="テクスチャをフィルタ" name="inventory search editor"/>
<check_box initial_value="false" label="フォルダを表示" name="show_folders_check"/>
<button label="追加" label_selected="追加" name="l_add_btn"/>
<button label="削除" label_selected="削除" name="l_rem_btn"/>
<button label="アップロード" label_selected="アップロード" name="l_upl_btn"/>
<scroll_list name="l_name_list">
<column label="名前" name="unit_name"/>
- <column label="ID" name="unit_id_HIDDEN"/>
+ <column label="ID" name="unit_id_HIDDEN"/>
</scroll_list>
<combo_box name="l_bake_use_texture_combo_box" tool_tip="構築(ベーク)するテクスチャを選択">
<combo_box.item label="なし" name="None"/>
@@ -42,7 +42,7 @@
<combo_box.item label="BAKED_AUX3" name="BAKED_AUX3"/>
</combo_box>
<check_box initial_value="false" label="基本となるメッシュリージョンを隠す" name="hide_base_mesh_region"/>
- <button label="OK" label_selected="OK" name="Select"/>
- <button label="取り消し" label_selected="取り消し" name="Cancel"/>
+ <button label="OK" label_selected="OK" name="Select"/>
+ <button label="キャンセル" label_selected="キャンセル" name="Cancel"/>
<check_box initial_value="true" label="今すぐ適用" name="apply_immediate_check"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_texture_fetch_debugger.xml b/indra/newview/skins/default/xui/ja/floater_texture_fetch_debugger.xml
index adc35137b5..c22cbba0d5 100644
--- a/indra/newview/skins/default/xui/ja/floater_texture_fetch_debugger.xml
+++ b/indra/newview/skins/default/xui/ja/floater_texture_fetch_debugger.xml
@@ -1,62 +1,62 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="TexFetchDebugger" title="テクスチャ取得デバッガ">
<text name="total_num_fetched_label">
- 1, 取得したテクスチャの合計数:[NUM]
+ 1,取得したテクスチャの合計数:[NUM]
</text>
<text name="total_num_fetching_requests_label">
- 2, 取得リクエストの合計数:[NUM]
+ 2,取得リクエストの合計数:[NUM]
</text>
<text name="total_num_cache_hits_label">
- 3, キャッシュヒットの合計数:[NUM]
+ 3,キャッシュヒットの合計数:[NUM]
</text>
<text name="total_num_visible_tex_label">
- 4, 表示テクスチャの合計数:[NUM]
+ 4,表示テクスチャの合計数:[NUM]
</text>
<text name="total_num_visible_tex_fetch_req_label">
- 5, 表示テクスチャ取得リクエストの合計数:[NUM]
+ 5,表示テクスチャ取得リクエストの合計数:[NUM]
</text>
<text name="total_fetched_data_label">
- 6, 取得したデータの合計数:[SIZE1]KB、デコードされたデータ:[SIZE2]KB、[PIXEL]メガピクセル
+ 6,取得したデータの合計数:[SIZE1]㎅、デコードされたデータ:[SIZE2]㎅、[PIXEL]メガピクセル
</text>
<text name="total_fetched_vis_data_label">
- 7, 表示データの合計数:[SIZE1]KB、デコードされたデータ:[SIZE2]KB
+ 7,表示データの合計数:[SIZE1]㎅、デコードされたデータ:[SIZE2]㎅
</text>
<text name="total_fetched_rendered_data_label">
- 8, レンダリングされたデータの合計数:[SIZE1]KB、デコードされたデータ:[SIZE2]KB、[PIXEL]メガピクセル
+ 8,レンダリングされたデータの合計数:[SIZE1]㎅、デコードされたデータ:[SIZE2]㎅、[PIXEL]メガピクセル
</text>
<text name="total_time_cache_read_label">
- 9, キャッシュ読み取りの合計時間:[TIME] 秒
+ 9,キャッシュ読み取りの合計時間:[TIME]秒
</text>
<text name="total_time_cache_write_label">
- 10, キャッシュ書き込みの合計時間:[TIME] 秒
+ 10,キャッシュ書き込みの合計時間:[TIME]秒
</text>
<text name="total_time_decode_label">
- 11, デコードの合計時間:[TIME] 秒
+ 11,デコードの合計時間:[TIME]秒
</text>
<text name="total_time_gl_label">
- 12, glテクスチャ作成の合計時間:[TIME] 秒
+ 12,glテクスチャ作成の合計時間:[TIME]秒
</text>
<text name="total_time_http_label">
- 13, HTTP 取得の合計時間:[TIME] 秒
+ 13,HTTP取得の合計時間:[TIME]秒
</text>
<text name="total_time_fetch_label">
- 14, 取得全体の合計時間:[TIME] 秒
+ 14,取得全体の合計時間:[TIME]秒
</text>
<text name="total_time_refetch_vis_cache_label">
- 15, キャッシュから表示テクスチャを再取得、時間:[TIME] 秒、取得:[SIZE]KB、[PIXEL]メガピクセル
+ 15,キャッシュから表示テクスチャを再取得、時間:[TIME]秒、取得:[SIZE]㎅、[PIXEL]メガピクセル
</text>
<text name="total_time_refetch_all_cache_label">
- 16、キャッシュからすべてのテクスチャを再フェッチ中、時間: [TIME] 秒、フェッチ済み: [SIZE]KB、[PIXEL]メガピクセル
+ 16,キャッシュからすべてのテクスチャを再フェッチ中、時間:[TIME]秒、フェッチ済み:[SIZE]㎅、[PIXEL]メガピクセル
</text>
<text name="total_time_refetch_vis_http_label">
- 17、HTTP から可視ファイルを再フェッチ中、時間: [TIME] 秒、フェッチ済み: [SIZE]KB、[PIXEL]メガピクセル
+ 17,HTTPから可視ファイルを再フェッチ中、時間:[TIME]秒、フェッチ済み:[SIZE]㎅、[PIXEL]メガピクセル
</text>
<text name="total_time_refetch_all_http_label">
- 18、HTTP からすべてのテクスチャを再フェッチ中、時間: [TIME] 秒、フェッチ済み: [SIZE]KB、[PIXEL]メガピクセル
+ 18,HTTPからすべてのテクスチャを再フェッチ中、時間:[TIME]秒、フェッチ済み:[SIZE]㎅、[PIXEL]メガピクセル
</text>
- <spinner label="19、テセル/ピクセル比:" name="texel_pixel_ratio"/>
+ <spinner label="19、テセル/ピクセル比:" name="texel_pixel_ratio"/>
<text name="texture_source_label">
- 20、テクスチャ ソース:
+ 20、テクスチャ ソース:
</text>
<radio_group name="texture_source">
<radio_item label="キャッシュ + HTTP" name="0"/>
@@ -69,7 +69,7 @@
<button label="キャッシュ書き込み" name="cachewrite_btn"/>
<button label="HTTP" name="http_btn"/>
<button label="デコード" name="decode_btn"/>
- <button label="GL テクスチャ" name="gl_btn"/>
+ <button label="GLテクスチャ" name="gl_btn"/>
<button label="キャッシュ表示テクスチャ再取得" name="refetchviscache_btn"/>
<button label="すべてのキャッシュを再フェッチ" name="refetchallcache_btn"/>
<button label="HTTP表示テクスチャ再取得" name="refetchvishttp_btn"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml
index 13f766698e..fb95a71ce0 100644
--- a/indra/newview/skins/default/xui/ja/floater_tools.xml
+++ b/indra/newview/skins/default/xui/ja/floater_tools.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="toolbox floater" short_title="制作ツール" title="">
+<floater name="toolbox floater" short_title="制作" title="制作ツール">
<floater.string name="grid_screen_text">
画面
</floater.string>
@@ -7,13 +7,13 @@
ローカル
</floater.string>
<floater.string name="grid_world_text">
- 世界
+ ワールド
</floater.string>
<floater.string name="grid_reference_text">
リファレンス
</floater.string>
<floater.string name="grid_attachment_text">
- アタッチメント
+ 装着物
</floater.string>
<floater.string name="status_rotate">
色の付いたバンドをドラッグしてオブジェクトを回転
@@ -22,16 +22,16 @@
選択した側をクリックし、ドラッグで引き伸ばす
</floater.string>
<floater.string name="status_move">
- 移動:ドラッグ、コピー:Shift + ドラッグ
+ 移動:ドラッグ、コピー:Shift+ドラッグ
</floater.string>
<floater.string name="status_modifyland">
土地をクリックし、ボタンを押したまま入力して修正変更
</floater.string>
<floater.string name="status_camera">
- クリック + ドラッグで視界移動
+ クリック+ドラッグで視界移動
</floater.string>
<floater.string name="status_grab">
- ドラッグで移動、Ctrlで持ち上げ、Ctrl + Shiftで回転
+ ドラッグで移動、Ctrlで持ち上げ、Ctrl+Shiftで回転
</floater.string>
<floater.string name="status_place">
インワールドでクリックして作成
@@ -40,10 +40,10 @@
土地をクリックし、ドラッグして選択
</floater.string>
<floater.string name="status_selectcount">
- 選択されているオブジェクトは [OBJ_COUNT] 個、土地の負荷は [LAND_IMPACT] [secondlife:///app/openfloater/object_weights 詳細]
+ 選択されているオブジェクトは[OBJ_COUNT]個、土地の負荷は[LAND_IMPACT] [secondlife:///app/openfloater/object_weights 詳細]
</floater.string>
<floater.string name="status_remaining_capacity">
- 残りの許容数 [LAND_CAPACITY]。
+ 残りの許容数[LAND_CAPACITY]
</floater.string>
<button label="" label_selected="" name="button focus" tool_tip="フォーカス"/>
<button label="" label_selected="" name="button move" tool_tip="動かす"/>
@@ -56,17 +56,17 @@
<radio_group name="focus_radio_group">
<radio_item label="ズーム" name="radio zoom"/>
<radio_item label="旋回(Ctrl)" name="radio orbit"/>
- <radio_item label="水平・垂直移動 (Ctrl + Shift)" name="radio pan"/>
+ <radio_item label="水平・垂直移動 (Ctrl+Shift)" name="radio pan"/>
</radio_group>
<radio_group name="move_radio_group">
<radio_item label="移動" name="radio move"/>
<radio_item label="持ち上げる(Ctrl)" name="radio lift"/>
- <radio_item label="回転 (Ctrl + Shift)" name="radio spin"/>
+ <radio_item label="回転 (Ctrl+Shift)" name="radio spin"/>
</radio_group>
<radio_group name="edit_radio_group">
<radio_item label="移動" name="radio position"/>
<radio_item label="回転(Ctrl)" name="radio rotate"/>
- <radio_item label="引き延ばす (Ctrl+Shift)" name="radio stretch"/>
+ <radio_item label="引き延ばす (Ctrl+Shift)" name="radio stretch"/>
<radio_item label="面を選択" name="radio select face"/>
</radio_group>
<check_box label="リンク部分を編集" name="checkbox edit linked parts"/>
@@ -74,13 +74,13 @@
<button label="リンクを外す" name="unlink_btn"/>
<check_box label="両側を引き伸ばす" name="checkbox uniform"/>
<check_box initial_value="true" label="テクスチャを引き延ばす" name="checkbox stretch textures"/>
- <check_box initial_value="true" label="スナップ" name="checkbox snap to grid"/>
+ <check_box initial_value="true" label="グリッドにスナップ" name="checkbox snap to grid"/>
<combo_box name="combobox grid mode" tool_tip="オブジェクトの配置に使うグリッドルーラの種類を選択">
- <combo_box.item label="世界" name="World"/>
+ <combo_box.item label="ワールド" name="World"/>
<combo_box.item label="ローカル" name="Local"/>
<combo_box.item label="リファレンス" name="Reference"/>
</combo_box>
- <button label="" label_selected="オプション" name="Options..." tool_tip="グリッドオプションを表示します"/>
+ <button label="" label_selected="オプション…" name="Options..." tool_tip="グリッドオプションを表示します"/>
<button label="" label_selected="" name="ToolCube" tool_tip="キューブ"/>
<button label="" label_selected="" name="ToolPrism" tool_tip="プリズム"/>
<button label="" label_selected="" name="ToolPyramid" tool_tip="ピラミッド"/>
@@ -98,7 +98,7 @@
<button label="" label_selected="" name="ToolGrass" tool_tip="草地"/>
<check_box label="選択したツールを維持" name="checkbox sticky"/>
<check_box label="選択したものをコピー" name="checkbox copy selection"/>
- <check_box initial_value="true" label="中央に位置" name="checkbox copy centers"/>
+ <check_box label="中央に位置" name="checkbox copy centers"/>
<check_box label="回転" name="checkbox copy rotates"/>
<radio_group name="land_radio_group">
<radio_item label="土地を選択" name="radio select land"/>
@@ -113,17 +113,17 @@
ブルドーザー:
</text>
<text name="Dozer Size:">
- サイズ
+ サイズ:
</text>
<text name="Strength:">
- 強度
+ 強度:
</text>
<button label="適用" label_selected="適用" name="button apply to selection" tool_tip="選択した土地を修正します"/>
<text name="selection_empty">
何も選択されていません。
</text>
<text name="remaining_capacity">
- [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights 詳細]
+ [CAPACITY_STRING] [secondlife:///app/openfloater/object_weights 詳細]
</text>
<tab_container name="Object Info Tabs">
<panel label="一般" name="General">
@@ -134,49 +134,49 @@
譲渡
</panel.string>
<panel.string name="text modify info 1">
- このオブジェクトを修正できます
+ このオブジェクトは、修正することができます。
</panel.string>
<panel.string name="text modify info 2">
- これらのオブジェクトを修正できます
+ これらのオブジェクトは、修正することができます。
</panel.string>
<panel.string name="text modify info 3">
- このオブジェクトを修正できません
+ このオブジェクトは、修正することができません。
</panel.string>
<panel.string name="text modify info 4">
- これらのオブジェクトを修正できません
+ これらのオブジェクトは、修正することができません。
</panel.string>
<panel.string name="text modify info 5">
- 地域(リージョン)の境界を越えてこのオブジェクトを修正できません
+ リージョン(地域)の境界を越えて、このオブジェクトを修正することはできません。
</panel.string>
<panel.string name="text modify info 6">
- 地域(リージョン)の境界を越えてこれらのオブジェクトを修正できません
+ リージョン(地域)の境界を越えて、これらのオブジェクトを修正することはできません。
</panel.string>
<panel.string name="text modify warning">
- オブジェクト全体を選択して権限の設定を行ってください。
+ オブジェクト全体を選択して、権限の設定を行ってください。
</panel.string>
<panel.string name="Cost Default">
- 価格: L$
+ 価格:L$
</panel.string>
<panel.string name="Cost Total">
- 合計: L$
+ 合計:L$
</panel.string>
<panel.string name="Cost Per Unit">
- 単価: L$
+ 単価:L$
</panel.string>
<panel.string name="Cost Mixed">
- 混合価格
+ 総額
</panel.string>
<panel.string name="Sale Mixed">
- 混合販売
+ 販売価格
</panel.string>
<text name="Name:">
名前:
</text>
- <line_editor name="Object Name" tool_tip="使用できる名前の文字数は最大 63 文字までです。長いプリム名は短縮されます。名前に使用できる文字は ASCII-7 (非拡張)に含まれる印字可能な文字のみです(縦線「|」は例外)。"/>
+ <line_editor name="Object Name" tool_tip="使用できる名前の文字数は最大63文字までです。長いプリム名は短縮されます。名前に使用できる文字は、ASCII-7(非拡張)に含まれる印字可能な文字のみです(パイプ文字「|」は例外)。"/>
<text name="Description:">
説明:
</text>
- <line_editor name="Object Description" tool_tip="ビューワの設定で [すべてのオブジェクト上でヒントを表示] が選択されている場合、オブジェクトにマウスのポインタをかざすとそのオブジェクトの説明がポップアップ表示されます。プリムの説明は最大 127 バイトまでに制限されているため、それよりも長い文字列は切り捨てられます。"/>
+ <line_editor name="Object Description" tool_tip="ビューアーの設定で「すべてのオブジェクト上でヒントを表示」が選択されている場合、オブジェクトにマウスのポインタをかざすと、そのオブジェクトの説明がポップアップ表示されます。プリムの説明は最大 127 バイトまでに制限されているため、それよりも長い文字列は切り捨てられます。"/>
<text name="Creator:">
制作者:
</text>
@@ -187,19 +187,19 @@
所有者:
</text>
<text name="Owner Name">
- Mrs. Erica &quot;Moose&quot; Linden (erica.linden)
+ Mrs. Erica "Moose" Linden (erica.linden)
</text>
<text name="Group:">
グループ:
</text>
- <name_box initial_value="ローディング..." name="Group Name Proxy"/>
- <button label="設定..." label_selected="設定..." name="button set group" tool_tip="このオブジェクト権限を共有するグループを選択します"/>
- <check_box label="共有" name="checkbox share with group" tool_tip="設定したグループのメンバー全員にこのオブジェクトの修正権限を与えます。 譲渡しない限り、役割制限を有効にはできません"/>
- <button label="譲渡" label_selected="譲渡" name="button deed" tool_tip="このアイテムを譲渡すると「次の所有者」の権限が適用されます。 グループ共有オブジェクトは、グループのオフィサーが譲渡できます"/>
+ <name_box initial_value="読み込んでいます…" name="Group Name Proxy"/>
+ <button label="設定…" label_selected="設定…" name="button set group" tool_tip="このオブジェクト権限を共有したいグループを選択します。"/>
+ <check_box label="共有" name="checkbox share with group" tool_tip="設定したグループのメンバー全員に、このオブジェクトの修正権限を与えます。譲渡しない限り、役割制限を有効にはできません"/>
+ <button label="譲渡" label_selected="譲渡" name="button deed" tool_tip="このアイテムを譲渡すると「次の所有者」の権限が適用されます。グループ共有オブジェクトは、グループのオフィサーが譲渡できます"/>
<text name="label click action">
クリックで:
</text>
- <combo_box name="clickaction" tool_tip="マウスを 1 回左クリックすると、オブジェクトに対してアクションを起こせるようになります。各クリックアクションには、何ができるかを示す特別なカーソルがあります。クリックアクションによっては、動作要件が必要なものもあります。たとえば、[タッチ] や [支払い] にはスクリプトが必要になるなどです">
+ <combo_box name="clickaction" tool_tip="マウスを1回左クリックすると、オブジェクトに対してアクションを起こせるようになります。各クリックアクションには、何ができるかを示す特別なカーソルがあります。クリック・アクションによっては、動作要件が必要なものもあります。たとえば、「触る」や「お支払い」には、スクリプトが必要になるなどです">
<combo_box.item label="触る(デフォルト)" name="Touch/grab(default)"/>
<combo_box.item label="オブジェクトに座る" name="Sitonobject"/>
<combo_box.item label="オブジェクトを購入する" name="Buyobject"/>
@@ -209,16 +209,16 @@
<combo_box.item label="なし" name="None"/>
</combo_box>
<check_box label="販売対象:" name="checkbox for sale" tool_tip="このオブジェクトやオブジェクトの中身が購入できるようになるか、指定価格でインワールドにコピーできるようになります。"/>
- <spinner label="L$" name="Edit Cost" tool_tip="オブジェクトの価格。"/>
+ <spinner label="L$" name="Edit Cost" tool_tip="オブジェクトの価格"/>
<combo_box name="sale type" tool_tip="購入者がコピー、コピーの中身、またはアイテム自体を受け取るのか選択してください。">
<combo_box.item label="コピー" name="Copy"/>
<combo_box.item label="中身" name="Contents"/>
- <combo_box.item label="オリジナル" name="Original"/>
+ <combo_box.item label="オブジェクトそのもの" name="Original"/>
</combo_box>
- <check_box label="検索に表示" name="search_check" tool_tip="検索結果にこのオブジェクトを表示します"/>
+ <check_box label="検索に表示" name="search_check" tool_tip="検索結果にこのオブジェクトを表示します。"/>
<panel name="perms_build">
<text name="perm_modify">
- あなたはこのオブジェクトを修正できます
+ あなたは、このオブジェクトを修正することができます。
</text>
<text name="Anyone can:">
全員:
@@ -226,59 +226,59 @@
<check_box label="移動" name="checkbox allow everyone move" tool_tip="オブジェクトは誰でも動かすことができます。"/>
<check_box label="コピー" name="checkbox allow everyone copy" tool_tip="オブジェクトのコピーは誰でも受け取ることができます。オブジェクトとそのオブジェクトの中身はすべて、コピーまたは譲渡できるように設定する必要があります。"/>
<text name="Next owner can:">
- 次の所有者:
+ 譲渡先の所有者:
</text>
- <check_box label="修正" name="checkbox next owner can modify" tool_tip="次の所有者は、アイテム名などのプロパティ内容を編集したり、このオブジェクトのサイズを変更することができます。"/>
- <check_box label="コピー" name="checkbox next owner can copy" tool_tip="次の所有者は、このオブジェクトを無制限にコピーできます。コピーには制作者の情報が含まれ、コピー元のアイテムと違って許可などに関し制限があります。"/>
- <check_box label="再販・プレゼント" name="checkbox next owner can transfer" tool_tip="次の所有者はこのオブジェクトを他人にあげたり再販できます。"/>
+ <check_box label="修正" name="checkbox next owner can modify" tool_tip="譲渡先の所有者は、アイテム名などのプロパティ内容を編集したり、このオブジェクトのサイズを変更することができます。"/>
+ <check_box label="コピー" name="checkbox next owner can copy" tool_tip="譲渡先の所有者は、このオブジェクトを無制限にコピーできます。コピーには制作者の情報が含まれ、コピー元のアイテムと違って許可などに関し制約があります。"/>
+ <check_box label="再販・譲渡" name="checkbox next owner can transfer" tool_tip="譲渡先の所有者は、このオブジェクトを他人に譲渡したり再販することができます。"/>
<text name="B:">
- B:
+ B:
</text>
<text name="O:">
- O:
+ C:
</text>
<text name="G:">
- G:
+ G:
</text>
<text name="E:">
- E:
+ E:
</text>
<text name="N:">
- N:
+ N:
</text>
<text name="F:">
- F:
+ F:
</text>
</panel>
<panel name="pathfinding_attrs_panel">
<text name="pathfinding_attributes_label">
- パスファインディング属性:
+ 経路探索属性:
</text>
</panel>
</panel>
<panel label="形状" name="Object">
- <check_box label="ロック" name="checkbox locked" tool_tip="オブジェクトの移動と削除を禁止します。 この機能を使うと、制作中の意図せぬ編集を防ぐことができます"/>
- <check_box label="物理" name="Physical Checkbox Ctrl" tool_tip="オブジェクトに対する重力の作用と影響を有効にします"/>
- <check_box label="臨時" name="Temporary Checkbox Ctrl" tool_tip="制作後 1 分でオブジェクトは削除されます"/>
- <check_box label="ファントム" name="Phantom Checkbox Ctrl" tool_tip="オブジェクト同士の衝突またはオブジェクトとアバターの衝突を回避します"/>
+ <check_box label="ロック" name="checkbox locked" tool_tip="オブジェクトの移動と削除を禁止します。この機能を使うと、制作中の意図せぬ編集を防ぐことができます。"/>
+ <check_box label="物理" name="Physical Checkbox Ctrl" tool_tip="オブジェクトに対する重力の作用と影響を有効にします。"/>
+ <check_box label="臨時" name="Temporary Checkbox Ctrl" tool_tip="制作後1分でオブジェクトは削除されます。"/>
+ <check_box label="ファントム" name="Phantom Checkbox Ctrl" tool_tip="オブジェクト同士の衝突、またはオブジェクトとアバターの衝突を回避します。"/>
<text name="label position">
位置(メートル)
</text>
- <spinner label="X" name="Pos X"/>
- <spinner label="Y" name="Pos Y"/>
- <spinner label="Z" name="Pos Z"/>
+ <spinner label="X" name="Pos X"/>
+ <spinner label="Y" name="Pos Y"/>
+ <spinner label="Z" name="Pos Z"/>
<text name="label size">
サイズ(メートル)
</text>
- <spinner label="X" name="Scale X"/>
- <spinner label="Y" name="Scale Y"/>
- <spinner label="Z" name="Scale Z"/>
+ <spinner label="X" name="Scale X"/>
+ <spinner label="Y" name="Scale Y"/>
+ <spinner label="Z" name="Scale Z"/>
<text name="label rotation">
回転(度)
</text>
- <spinner label="X" name="Rot X"/>
- <spinner label="Y" name="Rot Y"/>
- <spinner label="Z" name="Rot Z"/>
+ <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="ボックス" name="Box"/>
<combo_box.item label="シリンダー" name="Cylinder"/>
@@ -292,8 +292,8 @@
<text name="text cut">
パスカット(始点と終点)
</text>
- <spinner label="B" name="cut begin"/>
- <spinner label="E" name="cut end"/>
+ <spinner label="始" name="cut begin"/>
+ <spinner label="終" name="cut end"/>
<text name="text hollow">
中空(空洞)
</text>
@@ -312,21 +312,21 @@
<text name="text twist">
ひねり(始点と終点)
</text>
- <spinner label="B" name="Twist Begin"/>
- <spinner label="E" name="Twist End"/>
+ <spinner label="始" name="Twist Begin"/>
+ <spinner label="終" name="Twist End"/>
<text name="scale_taper">
テーパー
</text>
<text name="scale_hole">
穴寸法
</text>
- <spinner label="X" name="Taper Scale X"/>
- <spinner label="Y" name="Taper Scale Y"/>
+ <spinner label="X" name="Taper Scale X"/>
+ <spinner label="Y" name="Taper Scale Y"/>
<text name="text topshear">
上部層
</text>
- <spinner label="X" name="Shear X"/>
- <spinner label="Y" name="Shear Y"/>
+ <spinner label="X" name="Shear X"/>
+ <spinner label="Y" name="Shear Y"/>
<text name="advanced_cut">
プロフィールカット(始点と終点)
</text>
@@ -336,21 +336,21 @@
<text name="advanced_slice">
切り取り(始点と終点)
</text>
- <spinner label="B" name="Path Limit Begin"/>
- <spinner label="E" name="Path Limit End"/>
+ <spinner label="始" name="Path Limit Begin"/>
+ <spinner label="終" name="Path Limit End"/>
<text name="text taper2">
テーパー
</text>
- <spinner label="X" name="Taper X"/>
- <spinner label="Y" name="Taper Y"/>
+ <spinner label="X" name="Taper X"/>
+ <spinner label="Y" name="Taper Y"/>
<text name="text radius delta">
半径
</text>
<text name="text revolutions">
回転体
</text>
- <texture_picker label="スカルプトテクスチャ" name="sculpt texture control" tool_tip="クリックして写真を選択してください"/>
- <check_box label="ミラー" name="sculpt mirror control" tool_tip="スカルプトプリムを X 軸上で反転させます"/>
+ <texture_picker label="スカルプトテクスチャ" name="sculpt texture control" tool_tip="クリックして画像を選択してください。"/>
+ <check_box label="ミラー" name="sculpt mirror control" tool_tip="スカルプトプリムをX軸上で反転させます"/>
<check_box label="裏返し" name="sculpt invert control" tool_tip="スカルプトプリムを反転させて裏返します"/>
<text name="label sculpt type">
縫い目のタイプ
@@ -373,26 +373,26 @@
凸状の外殻構造
</panel.string>
<text name="select_single">
- プリムを 1 つだけ選択して編集してください
+ プリムを1つだけ選択して編集してください。
</text>
<text name="edit_object">
オブジェクトの特徴を編集:
</text>
- <check_box label="アニメーションメッシュ" name="Animated Mesh Checkbox Ctrl" tool_tip="リグ入りメッシュオブジェクトをそれぞれアニメーションさせることができるようになります"/>
- <check_box label="フレキシブルパス" name="Flexible1D Checkbox Ctrl" tool_tip="Z 軸を中心にオブジェクトの屈曲を有効にします(クライアント側のみ)"/>
+ <check_box label="アニメーションメッシュ" name="Animated Mesh Checkbox Ctrl" tool_tip="リグ入りメッシュオブジェクトを、それぞれアニメーションさせることができるようになります。"/>
+ <check_box label="フレキシブルパス" name="Flexible1D Checkbox Ctrl" tool_tip="Z軸を中心に、オブジェクトの屈曲を有効にします。(クライアント側のみ)"/>
<spinner label="柔軟性" name="FlexNumSections"/>
<spinner label="重力" name="FlexGravity"/>
<spinner label="ドラッグ" name="FlexFriction"/>
<spinner label="風" name="FlexWind"/>
<spinner label="緊張" name="FlexTension"/>
- <spinner label="X 軸方向の力" name="FlexForceX"/>
- <spinner label="Y 軸方向の力" name="FlexForceY"/>
- <spinner label="Z 軸方向の力" name="FlexForceZ"/>
- <check_box label="光" name="Light Checkbox Ctrl" tool_tip="オブジェクトが発光します"/>
+ <spinner label="X軸方向の力" name="FlexForceX"/>
+ <spinner label="Y軸方向の力" name="FlexForceY"/>
+ <spinner label="Z軸方向の力" name="FlexForceZ"/>
+ <check_box label="発光" name="Light Checkbox Ctrl" tool_tip="オブジェクトが発光します"/>
<color_swatch label="" name="colorswatch" tool_tip="クリックしてカラーピッカーを開きます"/>
<texture_picker label="" name="light texture control" tool_tip="クリックで投影画を選択します(遅延レンダリング有効時のみ)"/>
<spinner label="輝度" name="Light Intensity"/>
- <spinner label="FOV" name="Light FOV"/>
+ <spinner label="FOV" name="Light FOV"/>
<spinner label="半径" name="Light Radius"/>
<spinner label="焦点" name="Light Focus"/>
<spinner label="弱まる" name="Light Falloff"/>
@@ -412,12 +412,12 @@
</combo_box>
<spinner label="重力" name="Physics Gravity"/>
<spinner label="摩擦" name="Physics Friction"/>
- <spinner label="密度(100 kg/m^3)" name="Physics Density"/>
+ <spinner label="密度(100㎏/㎥)" name="Physics Density"/>
<spinner label="復元" name="Physics Restitution"/>
</panel>
<panel label="材質" name="Texture"/>
<panel label="中身" name="Contents">
- <button label="新しいスクリプト" label_selected="新規スクリプト" name="button new script"/>
+ <button label="新規スクリプト" label_selected="新規スクリプト" name="button new script"/>
<button label="権限" name="button permissions"/>
</panel>
</tab_container>
@@ -426,13 +426,13 @@
区画情報
</text>
<text name="label_area_price">
- 価格: [AREA] 平方メートル L$ [PRICE]
+ 価格:[AREA]㎡ L$ [PRICE]
</text>
<text name="label_area">
- 面積: [AREA] 平方メートル
+ 面積:[AREA]㎡
</text>
<button label="土地情報" label_selected="土地情報" name="button about land"/>
- <check_box label="所有者を表示" name="checkbox show owners" tool_tip="所有者の種類別に区画を色づけます: 緑 = あなたの土地 アクア = あなたのグループ所有地 赤 = 他人が所有する土地 黄色 = 売り出し中 紫 = オークション グレー = パブリック"/>
+ <check_box label="所有者を表示" name="checkbox show owners" tool_tip="所有者の種類別に区画を色づけます:緑色=あなたの土地 水色=あなたのグループ所有地 赤色=他人が所有する土地 黄色 = 売り出し中 紫色=オークション 灰色=公共領域"/>
<text name="label_parcel_modify">
区画の編集
</text>
diff --git a/indra/newview/skins/default/xui/ja/floater_top_objects.xml b/indra/newview/skins/default/xui/ja/floater_top_objects.xml
index c57f91f619..86ab64cb3e 100644
--- a/indra/newview/skins/default/xui/ja/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/ja/floater_top_objects.xml
@@ -4,7 +4,7 @@
トップ・スクリプト
</floater.string>
<floater.string name="top_scripts_text">
- [COUNT] スクリプトには合計で [TIME] 分かかり、[MEMORY] KB 使用しています。
+ [COUNT]個のスクリプトの実行に[TIME]分かかり、[MEMORY]㎅使用しています。
</floater.string>
<floater.string name="scripts_score_label">
時間
@@ -22,13 +22,13 @@
何も見つかりませんでした。
</floater.string>
<floater.string name="URLs">
- URL
+ URL
</floater.string>
<floater.string name="memory">
- メモリ(KB)
+ メモリ(㎅)
</floater.string>
<text name="title_text">
- ロード中...
+ 読み込んでいます…
</text>
<scroll_list name="objects_list">
<scroll_list.columns label="数" name="score"/>
@@ -38,10 +38,10 @@
<scroll_list.columns label="区画" name="parcel"/>
<scroll_list.columns label="日付" name="time"/>
<scroll_list.columns label="URL" name="URLs"/>
- <scroll_list.columns label="メモリ(KB)" name="memory"/>
+ <scroll_list.columns label="メモリ(㎅)" name="memory"/>
</scroll_list>
<text name="id_text">
- 物体ID:
+ 物体ID:
</text>
<button label="標識を表示" name="show_beacon_btn"/>
<text name="obj_name_text">
@@ -55,7 +55,7 @@
<text name="parcel_name_text">
区画:
</text>
- <button label="フィルター" name="filter_parcel_btn"/>
+ <button label="フィルタ" name="filter_parcel_btn"/>
<button label="更新" name="refresh_btn"/>
<button label="選択内容を返却" name="return_selected_btn"/>
<button label="すべて返却" name="return_all_btn"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_tos.xml b/indra/newview/skins/default/xui/ja/floater_tos.xml
index 8a6a6ff58a..7ec5886dca 100644
--- a/indra/newview/skins/default/xui/ja/floater_tos.xml
+++ b/indra/newview/skins/default/xui/ja/floater_tos.xml
@@ -4,10 +4,11 @@
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
+ 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>
<text name="tos_heading">
- 次の Second Life の利用規約、プライバシーポリシー、およびサービス規約(仲裁の利用および紛争解決のためのいかなるクラスまたはグループの請求の放棄に関する必要条件を含む)をお読みください。[SECOND_LIFE] へのログインを続けるには、これらの規約に同意する必要があります。
+ 次の Second Lifeの利用規約、プライバシーポリシー、およびサービス規約(仲裁の利用および紛争解決のためのいかなるクラスまたはグループの請求の放棄に関する必要条件を含む)をお読みください。
+[SECOND_LIFE]へのログインを続けるには、これらの規約に同意する必要があります。
</text>
<text name="external_tos_required">
操作を続けるに、https://my.secondlife.com に移動し、利用規約に同意する必要があります。
@@ -16,6 +17,6 @@
<text name="agree_list">
私は、Second Life の利用規約、プライバシーポリシー、およびサービス規約(紛争解決のための必要条件を含む)を読み、同意しました。
</text>
- <button label="続行" label_selected="続行" name="Continue"/>
- <button label="取り消し" label_selected="取り消し" name="Cancel"/>
+ <button label="続ける" label_selected="続ける" name="Continue"/>
+ <button label="キャンセル" label_selected="キャンセル" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_translation_settings.xml b/indra/newview/skins/default/xui/ja/floater_translation_settings.xml
index 27143086ac..8bbcbcdfed 100644
--- a/indra/newview/skins/default/xui/ja/floater_translation_settings.xml
+++ b/indra/newview/skins/default/xui/ja/floater_translation_settings.xml
@@ -1,18 +1,24 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_translation_settings" title="チャットの翻訳設定">
- <string name="bing_api_key_not_verified">
- Bing appID を認証できませんでした。もう一度お試しください。
+ <string name="azure_api_key_not_verified">
+ Azureサービス識別子の認証ができませんでした。ステータス:[STATUS] 設定をお確かめの上、もう一度やり直してください。
</string>
<string name="google_api_key_not_verified">
- Google API キーを認証できませんでした。もう一度お試しください。
+ Google APIキーの認証ができませんでした。ステータス:[STATUS] 設定をお確かめの上、もう一度やり直してください。
</string>
- <string name="bing_api_key_verified">
- Bing appID が認証されました。
+ <string name="deepl_api_key_not_verified">
+ DeepL Authキーの認証ができませんでした。ステータス:[STATUS] 設定をお確かめの上、もう一度やり直してください。
+ </string>
+ <string name="azure_api_key_verified">
+ Azureサービス識別子が認証されました。
</string>
<string name="google_api_key_verified">
- Google API キーが認証されました。
+ Google APIキーが認証されました。
+ </string>
+ <string name="deepl_api_key_verified">
+ DeepL APIキーが認証されました。
</string>
- <check_box label="チャット中の機械翻訳機能を有効にする" name="translate_chat_checkbox"/>
+ <check_box label="チャット時の機械翻訳機能を有効にする" name="translate_chat_checkbox"/>
<text name="translate_language_label">
翻訳する言語:
</text>
@@ -39,20 +45,54 @@
翻訳サービスを選択してください:
</text>
<radio_group name="translation_service_rg">
- <radio_item initial_value="bing" label="Bing Translator" name="bing"/>
- <radio_item initial_value="google" label="Google Translate" name="google"/>
+ <radio_item initial_value="azure" label="Azure翻訳" name="azure"/>
+ <radio_item initial_value="google" label="Google翻訳" name="google"/>
+ <radio_item initial_value="deepl" label="DeepL翻訳" name="deepl"/>
</radio_group>
- <text name="bing_api_key_label">
- Bing AppID [http://www.bing.com/developers/createapp.aspx AppID]:
+ <text name="azure_links_text">
+ [https://learn.microsoft.com/ja-jp/azure/cognitive-services/translator/create-translator-resource セットアップ]
+ </text>
+ <text name="azure_api_endoint_label">
+ エンドポイント:
+ </text>
+ <combo_box name="azure_api_endpoint_combo" value="https://api.cognitive.microsofttranslator.com">
+ <combo_box.item label="https://api.cognitive.microsofttranslator.com" name="global" value="https://api.cognitive.microsofttranslator.com"/>
+ <combo_box.item label="https://api-apc.cognitive.microsofttranslator.com" name="api-apc" value="https://api-apc.cognitive.microsofttranslator.com"/>
+ <combo_box.item label="https://api-eur.cognitive.microsofttranslator.com" name="api-eur" value="https://api-eur.cognitive.microsofttranslator.com"/>
+ <combo_box.item label="https://api-nam.cognitive.microsofttranslator.com" name="api-nam" value="https://api-nam.cognitive.microsofttranslator.com"/>
+ </combo_box>
+ <text name="azure_api_key_label">
+ Azureキー:
</text>
- <button label="認証" name="verify_bing_api_key_btn"/>
+ <line_editor default_text="翻訳キーを入力して「確認」ボタンをクリックしてください。" name="azure_api_key"/>
+ <text name="azure_api_region_label">
+ 地域:
+ </text>
+ <line_editor default_text="グローバルサービスの場合は空のままにすることができます。"/>
+ <button label="認証" name="verify_azure_api_key_btn"/>
<text name="google_api_key_label">
- Google API key [http://code.google.com/apis/language/translate/v2/getting_started.html#auth API key]:
+ Google [http://code.google.com/apis/language/translate/v2/getting_started.html#auth APIキー]:
</text>
+ <line_editor default_text="Google APIキーを入力して「確認」ボタンをクリックしてください。" name="google_api_key"/>
<button label="認証" name="verify_google_api_key_btn"/>
<text name="google_links_text">
- [http://code.google.com/apis/language/translate/v2/pricing.html 価格] | [https://code.google.com/apis/console 統計]
+ [http://code.google.com/apis/language/translate/v2/pricing.html 価格]|[https://code.google.com/apis/console 統計]
+ </text>
+ <text name="deepl_api_domain_label">
+ エンドポイント:
+ </text>
+ <combo_box name="deepl_api_domain_combo" value="https://api-free.deepl.com">
+ <combo_box.item label="DeepL無料版" name="global" value="https://api-free.deepl.com"/>
+ <combo_box.item label="DeepL Pro" name="api-apc" value="https://api.deepl.com"/>
+ </combo_box>
+ <text name="deepl_api_key_label">
+ DeepL APIキー:
+ </text>
+ <line_editor default_text="DeepL APIのキーを入力して「認証」をクリックしてください。" name="deepl_api_key"/>
+ <button label="認証" name="verify_deepl_api_key_btn"/>
+ <text name="deepl_links_text">
+ [https://www.deepl.com/pro/select-country?cta=header-prices 価格]
</text>
- <button label="OK" name="ok_btn"/>
- <button label="取り消し" name="cancel_btn"/>
+ <button label=" OK" name=" ok_btn"/>
+ <button label=" キャンセル" name=" cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_ui_preview.xml b/indra/newview/skins/default/xui/ja/floater_ui_preview.xml
new file mode 100644
index 0000000000..b907b4e8d7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_ui_preview.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="gui_preview_tool" title="XUIプレビューツール">
+ <string name="ExternalEditorNotSet">
+ 環境変数LL_XUI_EDITORまたはExternalEditor設定を設定するか、[EDITOR PATH]フィールドにそのパスを指定して、エディターを選択します。
+ </string>
+ <panel name="main_panel">
+ <text name="select_language_label">
+ 優先言語:
+ </text>
+ <combo_box name="language_select_combo">
+ <combo_box.item label="ja" name="item1" value="ja"/>
+ </combo_box>
+ <button label="表示" label_selected="表示" name="display_floater" tool_tip="選択したXMLファイルで定義されたXUIフロータを表示します。"/>
+ <button label="非表示" label_selected="非表示" name="close_displayed_floater" tool_tip="現在表示されているフローターが存在する場合は、それを閉じます。"/>
+ <button label="編集…" label_selected="編集…" name="edit_floater" tool_tip="選択したXMLファイルによって定義されたXUIフローターを編集します。(外部エディターを開きます)ローカライズされたバージョンが存在しない場合は、enバージョンを開きます。"/>
+ <button label="保存" label_selected="保存" name="save_floater" tool_tip="選択したXMLファイルで定義されたXUIフロータを保存します。"/>
+ <button label="全て保存" label_selected="全て保存" name="save_all_floaters" tool_tip="選択した言語で定義されたすべてのXUIフロータを保存します。"/>
+ <button label="≫" label_selected="≪" name="toggle_overlap_panel" tool_tip="重なっている要素の強調表示と表示パネルを切り替えます。要素を右クリックして、この機能用に選択します。選択した要素は、赤い四角形でマークされます。"/>
+ <text name="select_language_label_2">
+ 二次言語:
+ </text>
+ <combo_box name="language_select_combo_2">
+ <combo_box.item label="en" name="item1" value="en"/>
+ </combo_box>
+ <button label="表示" name="display_floater_2" tool_tip="選択したXMLファイルで定義されたXUIフロータを表示します。"/>
+ <button enabled="false" label="非表示" name="close_displayed_floater_2" tool_tip="現在表示されているフローターが存在する場合は、それを閉じます。"/>
+ <button label="スキーマをエクスポート" name="export_schema"/>
+ <check_box label="四角形を表示" name="show_rectangles"/>
+ <scroll_list name="name_list">
+ <scroll_list.columns label="タイトル" name="title_column"/>
+ <scroll_list.columns label="ファイル名" name="file_column"/>
+ <scroll_list.columns label="トップレベルのノード" name="top_level_node_column"/>
+ </scroll_list>
+ <panel name="editor_panel">
+ <text name="editor_path_label">
+ エディタのパス:
+ </text>
+ <line_editor name="executable_path_field" tool_tip="フローターXMLファイルを編集するためのエディター(実行可能ファイル)へのフルパス。(引用符は必要ありません)"/>
+ <button follows="left|bottom" label="ブラウズ…" label_selected="ブラウズ…" name="browse_for_executable" tool_tip="フローターXMLファイルを編集するためのエディター(実行可能ファイル)を参照します。"/>
+ <text name="executable_args_label">
+ エディタの引数:
+ </text>
+ <line_editor name="executable_args_field" tool_tip="エディターへのコマンドライン引数。'%FILE%'を使用してターゲット ファイルを参照します。このフィールドが空の場合、「YourProgram.exe FileName.xml」が実行されます"/>
+ </panel>
+ <panel name="vlt_panel">
+ <text name="diff_file_label">
+ 差分ファイル:
+ </text>
+ <line_editor name="vlt_diff_path_field" tool_tip="Viewer Localization Toolkitによって生成されたXMLのD0、D1言語差分ファイルへのフルパス"/>
+ <button label="ブラウズ…" label_selected="ブラウズ…" name="browse_for_vlt_diffs" tool_tip="VLTで生成されたD0、D1差分ファイルを参照して、変更されたファイルと要素を強調表示します。"/>
+ <button label="差分をハイライト" label_selected="ハイライトを解除" name="toggle_vlt_diff_highlight" tool_tip="変更された言語データを含むファイルと要素の強調表示を切り替えます。"/>
+ </panel>
+ </panel>
+ <scroll_container follows="top|right|bottom" height="600" layout="topleft" name="overlap_scroll">
+ <panel name="overlap_dummy_panel">
+ <overlap_panel label="オーバーラップパネル" ame="overlap_panel" tool_tip="このパネルには、現在選択されている要素と、それに重なっているすべての要素が水平線で区切られて表示されます。"/>
+ <text name="overlap_panel_label">
+ 重なる要素:
+ </text>
+ </panel>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_url_entry.xml b/indra/newview/skins/default/xui/ja/floater_url_entry.xml
index 8e09e4748a..3ff50854a5 100644
--- a/indra/newview/skins/default/xui/ja/floater_url_entry.xml
+++ b/indra/newview/skins/default/xui/ja/floater_url_entry.xml
@@ -1,13 +1,13 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="url_entry">
<text name="media_label">
- メディア URL:
+ メディアURL:
</text>
<combo_box name="media_entry"/>
- <button label="OK" name="ok_btn" width="38"/>
- <button label="キャンセル" name="cancel_btn" width="80"/>
- <button label="クリア" name="clear_btn" left_pad="76"/>
- <text name="loading_label" left="140">
- ロード中...
+ <button label="OK" 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/ja/floater_voice_controls.xml b/indra/newview/skins/default/xui/ja/floater_voice_controls.xml
deleted file mode 100644
index f7d3fd11e0..0000000000
--- a/indra/newview/skins/default/xui/ja/floater_voice_controls.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_voice_controls" title="ボイスコントロール">
- <string name="title_nearby">
- ボイス設定
- </string>
- <string name="title_group">
- [GROUP] とグループコール
- </string>
- <string name="title_adhoc">
- コンファレンスコール
- </string>
- <string name="title_peer_2_peer">
- [NAME] とコール
- </string>
- <string name="no_one_near">
- 近くにボイスを有効にしている人はいません。
- </string>
- <layout_stack name="my_call_stack">
- <layout_panel name="my_panel">
- <text name="user_text" value="マイ アバター:"/>
- </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="コール終了" name="leave_call_btn"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_voice_volume.xml b/indra/newview/skins/default/xui/ja/floater_voice_volume.xml
index a380615d5a..40be12ffba 100644
--- a/indra/newview/skins/default/xui/ja/floater_voice_volume.xml
+++ b/indra/newview/skins/default/xui/ja/floater_voice_volume.xml
@@ -1,8 +1,4 @@
<?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="floater_voice_volume" title="ボイス音量">
<slider name="volume_slider" tool_tip="ボイス音量" value="0.5"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/ja/floater_whitelist_entry.xml
index 34aba9d485..be59547bf3 100644
--- a/indra/newview/skins/default/xui/ja/floater_whitelist_entry.xml
+++ b/indra/newview/skins/default/xui/ja/floater_whitelist_entry.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="whitelist_entry" title="ホワイトリストの入力">
<text name="media_label">
- URL か URL パターンを入力して、許可するドメインをリストに追加します。
+ URLかURLパターンを入力して、許可するドメインをリストに追加します。
</text>
- <line_editor name="whitelist_entry" tool_tip="URL か URL パターンをホワイトリストに入力します"/>
- <button label="OK" name="ok_btn"/>
+ <line_editor name="whitelist_entry" tool_tip="URLかURLパターンをホワイトリストに入力します。"/>
+ <button label="OK" name="ok_btn"/>
<button label="キャンセル" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_window_size.xml b/indra/newview/skins/default/xui/ja/floater_window_size.xml
index 416813d6cc..c3a37a92de 100644
--- a/indra/newview/skins/default/xui/ja/floater_window_size.xml
+++ b/indra/newview/skins/default/xui/ja/floater_window_size.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="window_size" title="ウィンドウサイズ">
<string name="resolution_format">
- [RES_X] x [RES_Y]
+ [RES_X]x[RES_Y]
</string>
<text name="windowsize_text">
ウィンドウのサイズを設定:
diff --git a/indra/newview/skins/default/xui/ja/floater_world_map.xml b/indra/newview/skins/default/xui/ja/floater_world_map.xml
index cc07596adc..52410882aa 100644
--- a/indra/newview/skins/default/xui/ja/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/ja/floater_world_map.xml
@@ -1,85 +1,117 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="worldmap" title="世界地図">
- <panel name="layout_panel_1">
- <text name="events_label">
- 表記・記号
- </text>
- </panel>
- <panel name="layout_panel_2">
- <button label="現在地を表示" label_selected="現在地を表示" name="Show My Location" tool_tip="アバターの位置を地図の中心に表示します"/>
- <text name="me_label">
- 自分
- </text>
- <check_box label="住人" name="people_chk"/>
- <text name="person_label">
- 住人
- </text>
- <check_box label="インフォハブ" name="infohub_chk"/>
- <text name="infohub_label">
- インフォハブ
- </text>
- <check_box label="売り地" name="land_for_sale_chk"/>
- <text name="land_sale_label">
- 土地販売
- </text>
- <text name="auction_label">
- 土地オークション
- </text>
- <text name="by_owner_label">
- 所有者の販売
- </text>
- <button label="ホームへ" label_selected="ホームへ" name="Go Home" tool_tip="「ホーム」にテレポートします"/>
- <text name="Home_label">
- ホーム
- </text>
- <text name="events_label">
- イベント:
- </text>
- <check_box label="PG" name="event_chk"/>
- <text name="pg_label">
- General
- </text>
- <check_box initial_value="true" label="Mature" name="events_mature_chk"/>
- <text name="events_mature_label">
- Moderate
- </text>
- <check_box label="Adult" name="events_adult_chk"/>
- <text name="events_adult_label">
- Adult
- </text>
- </panel>
- <panel name="layout_panel_3">
- <text name="find_on_map_label">
- 地図上で見つける
- </text>
- </panel>
- <panel name="layout_panel_4">
- <combo_box label="オンラインのフレンド" name="friend combo" tool_tip="フレンドを地図に表示">
- <combo_box.item label="オンラインのフレンド" name="item1"/>
- </combo_box>
- <combo_box label="マイ ランドマーク" name="landmark combo" tool_tip="地図上に表示するランドマーク">
- <combo_box.item label="マイ ランドマーク" name="item1"/>
- </combo_box>
- <search_editor label="リージョン名" name="location" tool_tip="リージョン名を入力します"/>
- <button label="検索" name="DoSearch" tool_tip="リージョン検索"/>
- <button name="Clear" tool_tip="追跡ラインをクリアして地図をリセットします"/>
- <scroll_list name="search_results">
- <scroll_list.columns label="" name="icon"/>
- <scroll_list.columns label="" name="sim_name"/>
- </scroll_list>
- <text name="events_label">
- 場所:
- </text>
- <button label="テレポート" label_selected="テレポート" name="Teleport" tool_tip="選択した場所にテレポートします"/>
- <button label="SLurl をコピー" name="copy_slurl" tool_tip="現在地の SLurl をコピーして Web で使用します"/>
- <button label="選択を表示する" label_selected="目的地を表示" name="Show Destination" tool_tip="選択した場所を地図の中心に表示します"/>
- </panel>
- <panel name="layout_panel_5">
- <text name="zoom_label">
- ズーム
- </text>
- </panel>
- <panel name="layout_panel_6">
- <slider label="ズーム" name="zoom slider"/>
- </panel>
+<floater name="worldmap" title="ワールドマップ">
+ <string name="collapse_icon" value="map_ui_collapse_icon.png"/>
+ <string name="expand_icon" value="map_ui_expand_icon.png"/>
+ <string name="collapse_tooltip" value="マップ操作パネルを隠す"/>
+ <string name="expand_tooltip" value="マップ操作を表示"/>
+ <layout_stack name="floater_map_stack">
+ <layout_panel name="map_lp">
+ <panel filename="panel_world_map.xml" name="objects_mapview"/>
+ <panel name="expand_btn_panel" tool_tip="マップ操作パネルを隠す">
+ <icon name="expand_collapse_icon" tool_tip="マップ操作パネルを隠す"/>
+ </panel>
+ </layout_panel>
+ <layout_panel name="controls_lp">
+ <panel name="layout_panel_1">
+ <text name="events_label">
+ 凡例
+ </text>
+ </panel>
+ <panel name="layout_panel_2">
+ <button name="Show My Location" tool_tip="現在、自分のアバターがいる場所をマップの中心にする。"/>
+ <text name="me_label">
+ 自分
+ </text>
+ <check_box control_name="MapShowPeople" name="people_chk"/>
+ <icon name="person"/>
+ <text name="person_label">
+ 人物
+ </text>
+ <check_box name="infohub_chk"/>
+ <icon name="infohub"/>
+ <text name="infohub_label">
+ 情報ハブ
+ </text>
+ <check_box name="land_for_sale_chk"/>
+ <icon name="landforsale"/>
+ <text name="land_sale_label">
+ 販売中の土地
+ </text>
+ <icon name="square2"/>
+ <text name="auction_label">
+ オークション中の土地
+ </text>
+ <icon name="square2"/>
+ <text name="by_owner_label">
+ 所有者で
+ </text>
+ <button name="Go Home" tool_tip="自分のホームの場所にテレポート"/>
+ <text name="Home_label">
+ ホーム
+ </text>
+ <text name="events_label">
+ イベント:
+ </text>
+ <check_box name="event_chk"/>
+ <icon name="event"/>
+ <text name="pg_label">
+ General
+ </text>
+ <check_box name="events_mature_chk"/>
+ <icon name="events_mature_icon"/>
+ <text name="events_mature_label">
+ Moderate
+ </text>
+ <check_box name="events_adult_chk"/>
+ <icon name="events_adult_icon"/>
+ <text name="events_adult_label">
+ Adult
+ </text>
+ </panel>
+ <panel name="layout_panel_3">
+ <text name="find_on_map_label">
+ マップから探す
+ </text>
+ </panel>
+ <panel name="layout_panel_4">
+ <icon name="friends_icon"/>
+ <combo_box label="オンラインのフレンド" name="friend combo" tool_tip="マップにフレンドを表示する。">
+ <combo_box.item label="オンラインのフレンド" name="item1" value="None"/>
+ <combo_box.commit_callback function="WMap.AvatarCombo"/>
+ </combo_box>
+ <icon name="landmark_icon"/>
+ <combo_box label="ランドマーク" name="landmark combo" tool_tip="マップにランドマークを表示する。">
+ <combo_box.item label="ランドマーク" name="item1" value="None"/>
+ <combo_box.commit_callback function="WMap.Landmark"/>
+ </combo_box>
+ <icon name="location_icon"/>
+ <search_editor label="リージョン(地域)名で" tool_tip="リージョン(地域)名を入力してください"/>
+ <button label="探す" name="DoSearch" tool_tip="リージョン(地域)を検索する。"/>
+ <button name="Clear" tool_tip="追跡ラインをクリアしてマップをリセットする。"/>
+ <scroll_list name="search_results">
+ <scroll_list.columns label="" name="icon"/>
+ <scroll_list.columns label="" name="sim_name"/>
+ <scroll_list.commit_callback function="WMap.SearchResult"/>
+ </scroll_list>
+ <text name="events_label">
+ 場所:
+ </text>
+ <spinner name="teleport_coordinate_x"/>
+ <spinner name="teleport_coordinate_y"/>
+ <spinner name="teleport_coordinate_z"/>
+ <button label="テレポート" name="Teleport" tool_tip="選択した場所にテレポートする。"/>
+ <button label="SLurlをコピー" layout="topleft" name="copy_slurl" tool_tip="現在の場所をWebで使えるSLurlにしてコピーする。"/>
+ <button label="選択を表示" name="Show Destination" tool_tip="選択した場所をマップの中心にする。"/>
+ </panel>
+ <panel name="layout_panel_5">
+ <text name="zoom_label">
+ 縮尺
+ </text>
+ </panel>
+ <panel name="layout_panel_6">
+ <icon name="zoom_icon"/>
+ <slider name="zoom slider"/>
+ </panel>
+ </layout_panel>
+ </layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/fonts.xml b/indra/newview/skins/default/xui/ja/fonts.xml
new file mode 100644
index 0000000000..2085e916c8
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/fonts.xml
@@ -0,0 +1,239 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<fonts>
+ <font name="default" comment="default font files (global fallbacks)">
+ <file>
+ NotoSansCJKjp-Medium.otf
+ </file>
+ <file>
+ DejaVuSans.ttf
+ </file>
+ <os name="Windows">
+ <file load_collection="true">
+ YuGothM.ttc
+ </file>
+ <file>
+ meiryo.TTC
+ </file>
+ <file>
+ MSGOTHIC.TTC
+ </file>
+ <file>
+ gulim.ttc
+ </file>
+ <file>
+ simhei.ttf
+ </file>
+ <file>
+ ArialUni.ttf
+ </file>
+ <file>
+ msyh.ttc
+ </file>
+ <file load_collection="true">
+ Cambria.ttc
+ </file>
+ <file>
+ malgun.ttf
+ </file>
+ <file>
+ micross.ttf
+ </file>
+ </os>
+ <os name="Mac">
+ <file>
+ YuGothic-Medium.otf
+ </file>
+ <file>
+ ヒラギノ角ゴシック W3.ttc
+ </file>
+ <file>
+ ヒラギノ角ゴ Pro W3.otf
+ </file>
+ <file>
+ ヒラギノ角ゴ ProN W3.otf
+ </file>
+ <file>
+ AppleGothic.dfont
+ </file>
+ <file>
+ AppleGothic.ttf
+ </file>
+ <file>
+ AppleSDGothicNeo-Regular.otf
+ </file>
+ <file>
+ AppleSDGothicNeo.ttc
+ </file>
+ <file>
+ 华文细黑.ttf
+ </file>
+ <file>
+ PingFang.ttc
+ </file>
+ <file>
+ STIXGeneral.otf
+ </file>
+ <file>
+ Thonburi.ttc
+ </file>
+ </os>
+ </font>
+ <font name="SansSerifBold" comment="Name of bold sans-serif font">
+ <file>
+ NotoSansCJKjp-Bold.otf
+ </file>
+ <file>
+ DejaVuSans-Bold.ttf
+ </file>
+ <os name="Windows">
+ <file load_collection="true">
+ YuGothB.ttc
+ </file>
+ <file>
+ arialbd.ttf
+ </file>
+ </os>
+ <os name="Mac">
+ <file>
+ YuGothic-Bold.otf
+ </file>
+ <file>
+ Helvetica.dfont
+ </file>
+ </os>
+ </font>
+ <font name="SansSerif" comment="Name of san-serif font (Truetype file name)">
+ <file>
+ NotoSansCJKjp-Bold.otf
+ </file>
+ <file>
+ DejaVuSans.ttf
+ </file>
+ <os name="Windows">
+ <file>
+ arial.ttf
+ </file>
+ </os>
+ <os name="Mac">
+ <file>
+ Helvetica.dfont
+ </file>
+ </os>
+ </font>
+ <font name="SansSerif" comment="Name of bold sans-serif font" font_style="BOLD">
+ <file>
+ DejaVuSans-Bold.ttf
+ </file>
+ </font>
+ <font name="SansSerif" comment="Name of italic sans-serif font" font_style="ITALIC">
+ <file>
+ DejaVuSans-Oblique.ttf
+ </file>
+ </font>
+ <font name="SansSerif" comment="Name of bold italic sans-serif font" font_style="BOLD|ITALIC">
+ <file>
+ DejaVuSans-BoldOblique.ttf
+ </file>
+ </font>
+ <font name="Monospace" comment="Name of monospace font">
+ <file>
+ NotoSansMonoCJKjp-Regular.otf
+ </file>
+ <file>
+ DejaVuSansMono.ttf
+ </file>
+ </font>
+ <font name="DejaVu" comment="Name of DejaVu font">
+ <file>
+ DejaVuSans.ttf
+ </file>
+ </font>
+ <font name="DejaVu" comment="Name of DejaVu font (bold)" font_style="BOLD">
+ <file>
+ DejaVuSans-Bold.ttf
+ </file>
+ </font>
+ <font name="DejaVu" comment="Name of DejaVu font (italic)" font_style="ITALIC">
+ <file>
+ DejaVuSans-Oblique.ttf
+ </file>
+ </font>
+ <font name="DejaVu" comment="Name of DejaVu font (bold italic)" font_style="BOLD|ITALIC">
+ <file>
+ DejaVuSans-BoldOblique.ttf
+ </file>
+ </font>
+ <font name="Helvetica" comment="Name of Helvetica font">
+ <file>
+ DejaVuSans.ttf
+ </file>
+ <os name="Windows">
+ <file>
+ arial.ttf
+ </file>
+ </os>
+ <os name="Mac">
+ <file>
+ arial.ttf
+ </file>
+ </os>
+ </font>
+ <font name="Helvetica" comment="Name of Helvetica font (bold)" font_style="BOLD">
+ <file>
+ DejaVuSans-Bold.ttf
+ </file>
+ <os name="Windows">
+ <file>
+ arialbd.ttf
+ </file>
+ </os>
+ <os name="Mac">
+ <file>
+ arialbd.ttf
+ </file>
+ </os>
+ </font>
+ <font name="Helvetica" comment="Name of Helvetica font (italic)" font_style="ITALIC">
+ <file>
+ DejaVuSans-Oblique.ttf
+ </file>
+ <os name="Windows">
+ <file>
+ ariali.ttf
+ </file>
+ </os>
+ <os name="Mac">
+ <file>
+ ariali.ttf
+ </file>
+ </os>
+ </font>
+ <font name="Helvetica" comment="Name of Helvetica font (bold italic)" font_style="BOLD|ITALIC">
+ <file>
+ DejaVuSans-BoldOblique.ttf
+ </file>
+ <os name="Windows">
+ <file>
+ arialbi.ttf
+ </file>
+ </os>
+ <os name="Mac">
+ <file>
+ arialbi.ttf
+ </file>
+ </os>
+ </font>
+ <font name="OverrideTest" comment="Name of font to test overriding">
+ <file>
+ times.ttf
+ </file>
+ <file>
+ DejaVuSans.ttf
+ </file>
+ </font>
+ <font_size name="Monospace" comment="Size for monospaced font (points, or 1/72 of an inch)" size="8.0"/>
+ <font_size name="Huge" comment="Size of huge font (points, or 1/72 of an inch)" size="16.0"/>
+ <font_size name="Large" comment="Size of large font (points, or 1/72 of an inch)" size="10.6"/>
+ <font_size name="Medium" comment="Size of medium font (points, or 1/72 of an inch)" size="8.6"/>
+ <font_size name="Small" comment="Size of small font (points, or 1/72 of an inch)" size="7.6"/>
+</fonts>
diff --git a/indra/newview/skins/default/xui/ja/inspect_avatar.xml b/indra/newview/skins/default/xui/ja/inspect_avatar.xml
index 42b67cd333..6ab235c8f3 100644
--- a/indra/newview/skins/default/xui/ja/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/ja/inspect_avatar.xml
@@ -1,8 +1,4 @@
<?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]
@@ -10,18 +6,13 @@
<string name="Details">
[SL_PROFILE]
</string>
- <text name="user_name_small" value="Grumpity ProductEngine with a long name"/>
+ <text name="user_name_small" value="長い名前のGrumpity ProductEngine"/>
<text name="user_slid" value="james.linden"/>
- <text name="user_subtitle" value="11 Months, 3 days old"/>
+ <text name="user_subtitle" value="11ヶ月3日"/>
<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
+ これは私のSecondLifeの説明であり、本当に素晴らしいと思います。しかし、どういうわけか、私の説明は非常に長くなっています。なぜなら、私はたくさん話すのが好きだからです。
</text>
<slider name="volume_slider" tool_tip="ボイス音量" value="0.5"/>
- <button label="フレンド登録" name="add_friend_btn"/>
- <button label="IM" name="im_btn"/>
- <button label="プロフィール" name="view_profile_btn"/>
- <panel name="moderator_panel">
- <button label="ボイスを無効" name="disable_voice"/>
- <button label="ボイスを有効" name="enable_voice"/>
- </panel>
+ <text name="avatar_profile_link" value="[[LINK] プロフィールを閲覧]"/>
+ <avatar_icon name="avatar_icon"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/inspect_group.xml b/indra/newview/skins/default/xui/ja/inspect_group.xml
index be628befdf..2e8e6c0db2 100644
--- a/indra/newview/skins/default/xui/ja/inspect_group.xml
+++ b/indra/newview/skins/default/xui/ja/inspect_group.xml
@@ -1,8 +1,4 @@
<?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">
プライベートグループ
@@ -11,17 +7,17 @@
参加費無料
</string>
<string name="CostToJoin">
- 参加費 L$[AMOUNT]
+ 参加費L$ [AMOUNT]
</string>
<string name="YouAreMember">
- あなたはメンバーです
+ あなたはメンバーです。
</string>
<text name="group_subtitle">
- 123 メートル
+ 123メートル
</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
diff --git a/indra/newview/skins/default/xui/ja/inspect_object.xml b/indra/newview/skins/default/xui/ja/inspect_object.xml
index e6999ac9b1..ec3ef5cd42 100644
--- a/indra/newview/skins/default/xui/ja/inspect_object.xml
+++ b/indra/newview/skins/default/xui/ja/inspect_object.xml
@@ -1,11 +1,7 @@
<?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">
- 制作者: [CREATOR]
+ 制作者:[CREATOR]
</string>
<string name="CreatorAndOwner">
[CREATOR]によるチェック
@@ -32,7 +28,8 @@ owner secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
L$30,000
</text>
<text name="object_description">
- This is a really long description for an object being as how it is at least 80 characters in length and so but maybe more like 120 at this point. Who knows, really?
+ これは、オブジェクトがどのようなものであるかについての非常に長い説明であり、少なくとも80文字は含まれます。
+長さなどですが、この時点ではおそらく120くらいです。本当のところは、誰にも分かりません。
</text>
<text name="object_media_url">
http://www.superdupertest.com
@@ -43,6 +40,6 @@ owner secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
<button label="触る" name="touch_btn"/>
<button label="座る" name="sit_btn"/>
<button label="開く" name="open_btn"/>
- <icon name="secure_browsing" tool_tip="安全な閲覧"/>
+ <icon name="secure_browsing" tool_tip="セキュアブラウジング"/>
<button label="詳細" name="more_info_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/inspect_remote_object.xml b/indra/newview/skins/default/xui/ja/inspect_remote_object.xml
index 483d3fec52..888e24bcd5 100644
--- a/indra/newview/skins/default/xui/ja/inspect_remote_object.xml
+++ b/indra/newview/skins/default/xui/ja/inspect_remote_object.xml
@@ -1,11 +1,7 @@
<?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
+ 非常に長いテスト オブジェクト名
</text>
<text name="object_owner_label">
所有者:
@@ -19,7 +15,7 @@
<text name="object_slurl">
http://slurl.com/Ahern/50/50/50
</text>
- <button label="地図" name="map_btn"/>
+ <button label="マップ" name="map_btn"/>
<button label="ブロック" name="block_btn"/>
<button label="閉じる" name="close_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/language_settings.xml b/indra/newview/skins/default/xui/ja/language_settings.xml
index 91e8f4be7c..facae22acf 100644
--- a/indra/newview/skins/default/xui/ja/language_settings.xml
+++ b/indra/newview/skins/default/xui/ja/language_settings.xml
@@ -1,57 +1,87 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<!-- This file contains strings that used to be hardcoded in the source.-->
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<strings>
-
- <!-- Locale Information -->
- <string name="MicrosoftLocale">japanese</string>
- <string name="MacLocale">ja_JP.UTF-8</string>
- <string name="DarwinLocale">ja_JP.UTF-8</string>
- <string name="LinuxLocale">ja_JP.UTF-8</string>
-
- <!--
- datetimeToCodes["wkday"] = "%a"; // Thu
- datetimeToCodes["weekday"] = "%A"; // Thursday
- datetimeToCodes["year4"] = "%Y"; // 2009
- datetimeToCodes["year"] = "%Y"; // 2009
- datetimeToCodes["year2"] = "%y"; // 09
- datetimeToCodes["mth"] = "%b"; // Aug
- datetimeToCodes["month"] = "%B"; // August
- datetimeToCodes["mthnum"] = "%m"; // 08
- datetimeToCodes["day"] = "%d"; // 31
- datetimeToCodes["sday"] = "%-d"; // 9
- datetimeToCodes["hour24"] = "%H"; // 14
- datetimeToCodes["hour"] = "%H"; // 14
- datetimeToCodes["hour12"] = "%I"; // 02
- datetimeToCodes["min"] = "%M"; // 59
- datetimeToCodes["ampm"] = "%p"; // AM
- datetimeToCodes["second"] = "%S"; // 59
- datetimeToCodes["timezone"] = "%Z"; // PST
- -->
-
- <string name="TimeHour">hour,datetime,slt</string>
- <string name="TimeMin">min,datetime,slt</string>
- <string name="TimeYear">year,datetime,slt</string>
- <string name="TimeDay">day,datetime,slt</string>
- <string name="TimeMonth">mthnum,datetime,slt</string>
- <string name="TimeWeek">wkday,datetime,slt</string>
- <string name="TimeAMPM">ampm,datetime,slt</string>
- <string name="TimeHour12">hour12,datetime,slt</string>
-
- <string name="LTimeMthNum">mthnum,datetime,local</string>
- <string name="LTimeWeek">wkday,datetime,local</string>
- <string name="LTimeMonth">mth,datetime,local</string>
- <string name="LTimeDay">day,datetime,local</string>
- <string name="LTimeSec">second,datetime,local</string>
- <string name="LTimeHour">hour,datetime,local</string>
- <string name="LTimeMin">min,datetime,local</string>
- <string name="LTimeYear">year,datetime,local</string>
-
- <string name="UTCTimeWeek">weekday,datetime,utc</string>
- <string name="UTCTimeDay">day,datetime,utc</string>
- <string name="UTCTimeMth">mth,datetime,utc</string>
- <string name="UTCTimeYr">year,datetime,utc</string>
- <string name="UTCTimeHr">hour,datetime,utc</string>
- <string name="UTCTimeMin">min,datetime,utc</string>
- <string name="UTCTimeSec">second,datetime,utc</string>
- <string name="UTCTimeTimezone">timezone,datetime,utc</string>
+ <string name="MicrosoftLocale">
+ japanese
+ </string>
+ <string name="MacLocale">
+ ja_JP.UTF-8
+ </string>
+ <string name="DarwinLocale">
+ ja_JP.UTF-8
+ </string>
+ <string name="LinuxLocale">
+ ja_JP.UTF-8
+ </string>
+ <string name="TimeHour">
+ hour,datetime,slt
+ </string>
+ <string name="TimeMin">
+ min,datetime,slt
+ </string>
+ <string name="TimeYear">
+ year,datetime,slt
+ </string>
+ <string name="TimeDay">
+ day,datetime,slt
+ </string>
+ <string name="TimeMonth">
+ mthnum,datetime,slt
+ </string>
+ <string name="TimeWeek">
+ wkday,datetime,slt
+ </string>
+ <string name="TimeAMPM">
+ ampm,datetime,slt
+ </string>
+ <string name="TimeHour12">
+ hour12,datetime,slt
+ </string>
+ <string name="LTimeMthNum">
+ mthnum,datetime,local
+ </string>
+ <string name="LTimeWeek">
+ wkday,datetime,local
+ </string>
+ <string name="LTimeMonth">
+ mth,datetime,local
+ </string>
+ <string name="LTimeDay">
+ day,datetime,local
+ </string>
+ <string name="LTimeSec">
+ second,datetime,local
+ </string>
+ <string name="LTimeHour">
+ hour,datetime,local
+ </string>
+ <string name="LTimeMin">
+ min,datetime,local
+ </string>
+ <string name="LTimeYear">
+ year,datetime,local
+ </string>
+ <string name="UTCTimeWeek">
+ weekday,datetime,utc
+ </string>
+ <string name="UTCTimeDay">
+ day,datetime,utc
+ </string>
+ <string name="UTCTimeMth">
+ mth,datetime,utc
+ </string>
+ <string name="UTCTimeYr">
+ year,datetime,utc
+ </string>
+ <string name="UTCTimeHr">
+ hour,datetime,utc
+ </string>
+ <string name="UTCTimeMin">
+ min,datetime,utc
+ </string>
+ <string name="UTCTimeSec">
+ second,datetime,utc
+ </string>
+ <string name="UTCTimeTimezone">
+ timezone,datetime,utc
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/ja/menu_add_wearable_gear.xml b/indra/newview/skins/default/xui/ja/menu_add_wearable_gear.xml
index 982a03c6a8..1b6971418d 100644
--- a/indra/newview/skins/default/xui/ja/menu_add_wearable_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_add_wearable_gear.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Add Wearable Gear Menu">
- <menu_item_check label="新しい順に並べ替え" name="sort_by_most_recent"/>
+ <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"/>
+ <menu_item_check label="種別で並べ替え" name="sort_by_type"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_attachment_other.xml b/indra/newview/skins/default/xui/ja/menu_attachment_other.xml
index b9e10c071c..284449d59d 100644
--- a/indra/newview/skins/default/xui/ja/menu_attachment_other.xml
+++ b/indra/newview/skins/default/xui/ja/menu_attachment_other.xml
@@ -1,26 +1,30 @@
<?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="プロフィールの表示" name="Profile..."/>
- <menu_item_call label="フレンド登録" name="Add Friend"/>
- <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="プロフィールを見る" name="Profile..."/>
+ <menu_item_call label="フレンドに追加" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
<menu_item_call label="コール" name="Call"/>
- <menu_item_call label="グループに招待" name="Invite..."/>
+ <menu_item_call label="グループに招待…" name="Invite..."/>
+ <menu_item_separator/>
<menu_item_call label="スケルトンをリセット" name="Reset Skeleton"/>
<menu_item_call label="スケルトンとアニメーションをリセット" name="Reset Skeleton And Animations"/>
+ <menu_item_separator/>
<menu_item_call label="ブロック" name="Avatar Mute"/>
<menu_item_call label="報告" name="abuse"/>
<menu_item_call label="フリーズ" name="Freeze..."/>
<menu_item_call label="追放" name="Eject..."/>
<menu_item_call label="テクスチャのデバッグ" name="Debug..."/>
- <menu_item_call label="ダンプ XML" name="Dump XML"/>
+ <menu_item_call label="XMLとしてダンプ" name="Dump XML"/>
<menu_item_call label="ズームイン" name="Zoom In"/>
<menu_item_call label="支払う" name="Pay..."/>
- <menu_item_call label="オブジェクトのプロフィール" name="Object Inspect"/>
+ <menu_item_separator/>
+ <menu_item_call label="オブジェクトの調査" name="Object Inspect"/>
+ <menu_item_separator/>
<context_menu label="アバターを描画" name="Render Avatar">
- <menu_item_check label="デフォルト" name="RenderNormally"/>
- <menu_item_check label="常に使用する" name="AlwaysRenderFully"/>
- <menu_item_check label="使用しない" name="DoNotRender"/>
+ <menu_item_check name="常に完全描画する" label="Always full detail"/>
+ <menu_item_check name="描画しない" label="Never full detail"/>
+ <menu_item_call name="通常の描画設定" label="Remove from exceptions"/>
+ <menu_item_separator/>
<menu_item_call label="例外…" name="RenderExceptions"/>
</context_menu>
<menu_item_call label="パーティクル所有者をブロック" name="Mute Particle"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_attachment_self.xml b/indra/newview/skins/default/xui/ja/menu_attachment_self.xml
index fa1137c7c5..d2e46447a0 100644
--- a/indra/newview/skins/default/xui/ja/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/ja/menu_attachment_self.xml
@@ -1,21 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Attachment Pie">
<menu_item_call label="触る" name="Attachment Object Touch"/>
- <menu_item_call label="編集" name="Edit..."/>
+ <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="容姿" name="Change Outfit"/>
- <menu_item_call label="アウトフィットの編集" name="Edit Outfit"/>
+ <menu_item_call label="アウトフィットを変更" name="Change Outfit"/>
+ <menu_item_call label="アウトフィットを編集" name="Edit Outfit"/>
<menu_item_call label="シェイプの編集" name="Edit My Shape"/>
<menu_item_call label="ホバー高さ" name="Hover Height"/>
<menu_item_call label="スケルトンをリセット" name="Reset Skeleton"/>
<menu_item_call label="スケルトンとアニメーションをリセット" name="Reset Skeleton And Animations"/>
- <menu_item_call label="フレンド" name="Friends..."/>
- <menu_item_call label="グループ" name="Groups..."/>
- <menu_item_call label="プロフィール" name="Profile..."/>
- <menu_item_call label="テクスチャのデバッグ" name="Debug..."/>
- <menu_item_call label="ダンプ XML" name="Dump XML"/>
- <menu_item_call label="下に落とす" name="Drop"/>
- <menu_item_call label="パーティクル所有者をブロック" name="Mute Particle"/>
+ <menu_item_call label="フレンド…" name="Friends..."/>
+ <menu_item_call label="グループ…" name="Groups..."/>
+ <menu_item_call label="プロフィール…" name="Profile..."/>
+ <menu_item_call label="テクスチャのデバッグ…" name="Debug..."/>
+ <menu_item_call label="XMLとしてダンプ" name="Dump XML"/>
+ <menu_item_call label="下に置く" name="Drop"/>
+ <menu_item_call label="パーティクルの所有者をブロック" name="Mute Particle"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml b/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml
index 01699d1593..f032327dd9 100644
--- a/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml
+++ b/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="Avatar Icon Menu">
<menu_item_call label="プロフィールの表示" name="Show Profile"/>
- <menu_item_call label="IMを送信..." name="Send IM"/>
+ <menu_item_call label="IMを送信…" name="Send IM"/>
<menu_item_call label="テレポートをリクエスト" name="Request Teleport"/>
- <menu_item_call label="フレンドを追加..." name="Add Friend"/>
- <menu_item_call label="フレンドを削除..." name="Remove Friend"/>
+ <menu_item_call label="フレンドを追加…" name="Add Friend"/>
+ <menu_item_call label="フレンドを削除…" name="Remove Friend"/>
<context_menu label="モデレーターのオプション" name="Moderator Options">
<menu_item_check label="文字チャットを許可" name="AllowTextChat"/>
<menu_item_call label="この参加者をミュートする" name="ModerateVoiceMuteSelected"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_other.xml b/indra/newview/skins/default/xui/ja/menu_avatar_other.xml
index 3e706cd403..a7989b35c8 100644
--- a/indra/newview/skins/default/xui/ja/menu_avatar_other.xml
+++ b/indra/newview/skins/default/xui/ja/menu_avatar_other.xml
@@ -1,25 +1,28 @@
<?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="プロフィールの表示" name="Profile..."/>
- <menu_item_call label="フレンド登録" name="Add Friend"/>
- <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="プロフィールを見る" name="Profile..."/>
+ <menu_item_call label="フレンドに追加" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
<menu_item_call label="コール" name="Call"/>
- <menu_item_call label="グループに招待" name="Invite..."/>
+ <menu_item_call label="グループへ招待" name="Invite..."/>
+ <menu_item_separator/>
<menu_item_call label="スケルトンをリセット" name="Reset Skeleton"/>
<menu_item_call label="スケルトンとアニメーションをリセット" name="Reset Skeleton And Animations"/>
+ <menu_item_separator/>
<menu_item_call label="ブロック" name="Avatar Mute"/>
<menu_item_call label="報告" name="abuse"/>
<menu_item_call label="フリーズ" name="Freeze..."/>
<menu_item_call label="追放" name="Eject..."/>
<menu_item_call label="テクスチャのデバッグ" name="Debug..."/>
- <menu_item_call label="ダンプ XML" name="Dump XML"/>
+ <menu_item_call label="XMLとしてダンプ" name="Dump XML"/>
<menu_item_call label="ズームイン" name="Zoom In"/>
<menu_item_call label="支払う" name="Pay..."/>
- <context_menu label="アバターを描画" name="Render Avatar">
- <menu_item_check label="デフォルト" name="RenderNormally"/>
- <menu_item_check label="常に使用する" name="AlwaysRenderFully"/>
- <menu_item_check label="使用しない" name="DoNotRender"/>
+ <menu_item_separator/>
+ <context_menu label="このアバターの描画" name="Render Avatar">
+ <menu_item_check name="常に完全描画する" label="Always full detail"/>
+ <menu_item_check name="描画しない" label="Never full detail"/>
+ <menu_item_call name="通常の描画設定" label="Remove from exceptions"/>
+ <menu_item_separator/>
<menu_item_call label="例外…" name="RenderExceptions"/>
</context_menu>
<menu_item_call label="パーティクル所有者をブロック" name="Mute Particle"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings.xml b/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings.xml
index 59c80bdb0e..3c824840a5 100644
--- a/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings.xml
+++ b/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Settings">
- <menu_item_check label="デフォルト" name="default"/>
<menu_item_check label="常に描画" name="always_render"/>
<menu_item_check label="描画しない" name="never_render"/>
+ <menu_item_check label="例外から削除" name="default"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings_add.xml b/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings_add.xml
index e4f78cad31..15021859bb 100644
--- a/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings_add.xml
+++ b/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings_add.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="menu_settings_add.xml">
- <menu_item_call label="常に住人を描画する..." name="add_avatar_always_render"/>
- <menu_item_call label="住人を描画しない..." name="add_avatar_never_render"/>
+ <menu_item_call label="常に詳細まで全て描画…" name="add_avatar_always_render"/>
+ <menu_item_call label="詳細まで全て描画しない…" name="add_avatar_never_render"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
index b0a619bcb0..f0100f6f08 100644
--- a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
@@ -2,36 +2,36 @@
<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="衣類" name="Clothes &gt;">
+ <context_menu label="脱ぐ" name="Take Off &gt;">
+ <context_menu label="服装" name="Clothes &gt;">
<menu_item_call label="シャツ" name="Shirt"/>
- <menu_item_call label="パンツ" name="Pants"/>
+ <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 Undershirt"/>
+ <menu_item_call label="下着(下半身)" name="Self Underpants"/>
<menu_item_call label="タトゥ" name="Self Tattoo"/>
<menu_item_call label="物理作用" name="Self Physics"/>
<menu_item_call label="アルファ" name="Self Alpha"/>
- <menu_item_call label="すべての衣類" name="All Clothes"/>
+ <menu_item_call label="すべての服装" 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="容姿" name="Chenge Outfit"/>
- <menu_item_call label="アウトフィットを編集" name="Edit Outfit"/>
+ <menu_item_call label="アウトフィットを変更" name="Chenge Outfit"/>
+ <menu_item_call label="アウトフィットの編集" name="Edit Outfit"/>
<menu_item_call label="シェイプを編集" name="Edit My Shape"/>
<menu_item_call label="ホバー高さ" name="Hover Height"/>
<menu_item_call label="スケルトンをリセット" name="Reset Skeleton"/>
<menu_item_call label="スケルトンとアニメーションをリセット" name="Reset Skeleton And Animations"/>
- <menu_item_call label="フレンド" name="Friends..."/>
- <menu_item_call label="グループ" name="Groups..."/>
- <menu_item_call label="プロフィール" name="Profile..."/>
- <menu_item_call label="テクスチャのデバッグ" name="Debug..."/>
- <menu_item_call label="ダンプ XML" name="Dump XML"/>
+ <menu_item_call label="フレンド…" name="Friends..."/>
+ <menu_item_call label="グループ…" name="Groups..."/>
+ <menu_item_call label="プロフィール…" name="Profile..."/>
+ <menu_item_call label="テクスチャのデバッグ…" name="Debug..."/>
+ <menu_item_call label="XMLとしてダンプ" name="Dump XML"/>
<menu_item_call label="パーティクル所有者をブロック" name="Mute Particle"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_cof_attachment.xml b/indra/newview/skins/default/xui/ja/menu_cof_attachment.xml
index aa07b9476e..154db254da 100644
--- a/indra/newview/skins/default/xui/ja/menu_cof_attachment.xml
+++ b/indra/newview/skins/default/xui/ja/menu_cof_attachment.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="COF Attachment">
- <menu_item_call label="触る" name="touch_attach" />
- <menu_item_call label="編集" name="edit_item" />
+ <menu_item_call label="触る" name="touch_attach"/>
+ <menu_item_call label="編集" name="edit_item"/>
<menu_item_call label="取り外す" name="detach"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_cof_clothing.xml b/indra/newview/skins/default/xui/ja/menu_cof_clothing.xml
index d984342896..f94e5d393c 100644
--- a/indra/newview/skins/default/xui/ja/menu_cof_clothing.xml
+++ b/indra/newview/skins/default/xui/ja/menu_cof_clothing.xml
@@ -1,6 +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="take_off"/>
<menu_item_call label="編集" name="edit"/>
- <menu_item_call label="交換" name="replace"/>
+ <menu_item_call label="着替える" name="replace"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_cof_gear.xml b/indra/newview/skins/default/xui/ja/menu_cof_gear.xml
index 07bcefd9b3..c60b27111e 100644
--- a/indra/newview/skins/default/xui/ja/menu_cof_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_cof_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="Gear COF">
- <menu label="衣類" name="COF.Gear.New_Clothes"/>
+ <menu label="新しい服装" name="COF.Gear.New_Clothes"/>
<menu label="新しい身体部位" name="COF.Gear.New_Body_Parts"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_conversation.xml b/indra/newview/skins/default/xui/ja/menu_conversation.xml
index 0de6a5f22f..047f5d57cf 100644
--- a/indra/newview/skins/default/xui/ja/menu_conversation.xml
+++ b/indra/newview/skins/default/xui/ja/menu_conversation.xml
@@ -5,29 +5,30 @@
<menu_item_call label="ボイスチャットを切断する" name="disconnect_from_voice"/>
<menu_item_call label="選択した項目を閉じる" name="close_selected_conversations"/>
<menu_item_call label="プロフィールを表示" name="view_profile"/>
- <menu_item_call label="IM" name="im"/>
- <menu_item_call label="テレポートを送る" name="offer_teleport"/>
+ <menu_item_call label="IM" name="im"/>
+ <menu_item_call label="テレポートのオファー" name="offer_teleport"/>
<menu_item_call label="ボイスコール" name="voice_call"/>
- <menu_item_call label="チャットの履歴..." name="chat_history"/>
- <menu_item_call label="フレンドを追加" name="add_friend"/>
- <menu_item_call label="フレンドを削除" name="remove_friend"/>
- <menu_item_call label="フレンドを削除" name="remove_friends"/>
- <menu_item_call label="グループに招待..." name="invite_to_group"/>
+ <menu_item_call label="チャットの履歴…" name="chat_history"/>
+ <menu_item_call label="フレンド追加" name="add_friend"/>
+ <menu_item_call label="フレンド削除" name="remove_friend"/>
+ <menu_item_call label="フレンド削除" name="remove_friends"/>
+ <menu_item_call label="グループに招待…" name="invite_to_group"/>
<menu_item_call label="ズームイン" name="zoom_in"/>
- <menu_item_call label="地図" name="map"/>
+ <menu_item_call label="マップ" name="map"/>
<menu_item_call label="共有" name="share"/>
<menu_item_call label="支払い" name="pay"/>
+ <menu_item_call label="嫌がらせの報告" name="report_abuse"/>
<menu_item_check label="ボイスをブロック" name="block_unblock"/>
- <menu_item_check label="文字をブロックする" name="MuteText"/>
- <menu_item_call label="グループ情報" name="group_profile"/>
- <menu_item_call label="グループをアクティブにする" name="activate_group"/>
- <menu_item_call label="グループから脱退する" name="leave_group"/>
+ <menu_item_check label="テキストをブロックする" name="MuteText"/>
+ <menu_item_call label="グループのプロフィール" name="group_profile"/>
+ <menu_item_call label="このグループをアクティブ化" name="activate_group"/>
+ <menu_item_call label="このグループから脱退する" name="leave_group"/>
<context_menu label="モデレーターのオプション" name="Moderator Options">
- <menu_item_check label="文字チャットを許可" name="AllowTextChat"/>
+ <menu_item_check label="テキストチャットを許可" name="AllowTextChat"/>
<menu_item_call label="この参加者をミュートする" name="ModerateVoiceMuteSelected"/>
<menu_item_call label="この参加者のミュートを解除する" name="ModerateVoiceUnMuteSelected"/>
- <menu_item_call label="全員の音声をミュートする" name="ModerateVoiceMute"/>
+ <menu_item_call label="全員のボイスをミュートする" name="ModerateVoiceMute"/>
<menu_item_call label="全員のミュートを解除する" name="ModerateVoiceUnmute"/>
</context_menu>
- <menu_item_call label="メンバーを立入禁止" name="BanMember"/>
+ <menu_item_call label="メンバーをバンする" name="BanMember"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml
index c9d4f947a4..78c46d13b4 100644
--- a/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="Conversation Context Menu">
- <menu_item_call label="IM..." name="IM"/>
- <menu_item_call label="ボイスコール..." name="Call"/>
- <menu_item_call label="チャットの履歴を開く..." name="Chat history"/>
+ <menu_item_call label="IM…" name="IM"/>
+ <menu_item_call label="ボイスコール…" name="Call"/>
+ <menu_item_call label="チャットの履歴を開く…" name="Chat history"/>
<menu_item_call label="プロフィールを表示" name="View Profile"/>
- <menu_item_call label="テレポートを送る" name="teleport"/>
+ <menu_item_call label="テレポートのオファー" name="teleport"/>
<menu_item_call label="フレンド登録" name="add_friend"/>
<menu_item_call label="フレンドを削除" name="remove_friend"/>
- <menu_item_call label="グループに招待..." name="Invite"/>
- <menu_item_call label="地図" name="Map"/>
+ <menu_item_call label="グループに招待…." name="Invite"/>
+ <menu_item_call label="マップ" name="Map"/>
<menu_item_call label="共有" name="Share"/>
<menu_item_call label="支払い" name="Pay"/>
<menu_item_check label="ブロック・ブロック解除" name="Block/Unblock"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml
index bd4812603f..bcda112d2f 100644
--- a/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml
+++ b/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml
@@ -3,5 +3,5 @@
<menu_item_check label="名前で並べ替え" name="sort_by_name"/>
<menu_item_check label="日付で並べ替え" name="sort_by_date"/>
<menu_item_check label="上位のフレンドを並べ替え" name="sort_by_friends"/>
- <menu_item_call label="近くのチャットの履歴を表示..." name="view_nearby_chat_history"/>
+ <menu_item_call label="近隣チャットの履歴を表示…" name="view_nearby_chat_history"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_color.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_color.xml
new file mode 100644
index 0000000000..b58b08ebb2
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_color.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Copy Paste Color Menu">
+ <menu_item_call label="コピー" name="params_copy"/>
+ <menu_item_call label="ペースト" name="params_paste"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_features.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_features.xml
new file mode 100644
index 0000000000..6105fd5296
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_features.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu layout="topleft" name="Copy Paste Features Menu">
+ <menu_item_call label="コピー" name="params_copy"/>
+ <menu_item_call label="ペースト" name="params_paste"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_light.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_light.xml
new file mode 100644
index 0000000000..0f069dfffa
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_light.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Copy Paste Light Menu">
+ <menu_item_call label="コピー" name="params_copy"/>
+ <menu_item_call label="ペースト" name="params_paste"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_object.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_object.xml
new file mode 100644
index 0000000000..b2d3672019
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_object.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Copy Paste Object Menu">
+ <menu_item_call label="コピー" name="params_copy"/>
+ <menu_item_call label="ペースト" name="params_paste"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_pos.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_pos.xml
new file mode 100644
index 0000000000..3589d7bd4c
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_pos.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Copy Paste Position Menu">
+ <menu_item_call label="すべてをコピー" name="psr_copy"/>
+ <menu_item_call label="位置をコピー" name="pos_copy"/>
+ <menu_item_call label="すべてペースト" name="psr_paste"/>
+ <menu_item_call label="位置をペースト" name="pos_paste"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_rot.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_rot.xml
new file mode 100644
index 0000000000..7a77a74b67
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_rot.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Copy Paste Rotation Menu">
+ <menu_item_call label="すべてをコピー" name="psr_copy"/>
+ <menu_item_call label="回転をコピー" name="rot_copy"/>
+ <menu_item_call label="すべてをペースト" name="psr_paste"/>
+ <menu_item_call label="回転をペースト" name="rot_paste"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_size.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_size.xml
new file mode 100644
index 0000000000..3b813ba97f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_size.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Copy Paste Size Menu">
+ <menu_item_call label="すべてをコピー" name="psr_copy"/>
+ <menu_item_call label="サイズをコピー" name="size_copy"/>
+ <menu_item_call label="すべてをペースト" name="psr_paste"/>
+ <menu_item_call label="サイズをペースト" name="size_paste"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_texture.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_texture.xml
new file mode 100644
index 0000000000..0947a66b9a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_texture.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Copy Paste Texture Menu">
+ <menu_item_call label="コピー" name="params_copy"/>
+ <menu_item_call label="ペースト" name="params_paste"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_edit.xml b/indra/newview/skins/default/xui/ja/menu_edit.xml
index c2ef0179b2..121b3d699b 100644
--- a/indra/newview/skins/default/xui/ja/menu_edit.xml
+++ b/indra/newview/skins/default/xui/ja/menu_edit.xml
@@ -2,9 +2,9 @@
<menu label="編集" name="Edit">
<menu_item_call label="元に戻す" name="Undo"/>
<menu_item_call label="やり直し" name="Redo"/>
- <menu_item_call label="切り取り" name="Cut"/>
+ <menu_item_call label="カット" name="Cut"/>
<menu_item_call label="コピー" name="Copy"/>
- <menu_item_call label="貼り付け" name="Paste"/>
+ <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"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_favorites.xml b/indra/newview/skins/default/xui/ja/menu_favorites.xml
index 4708b1446c..58347b55fb 100644
--- a/indra/newview/skins/default/xui/ja/menu_favorites.xml
+++ b/indra/newview/skins/default/xui/ja/menu_favorites.xml
@@ -1,10 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
<menu_item_call label="テレポート" name="Teleport To Landmark"/>
- <menu_item_call label="ランドマークを表示・編集" name="Landmark Open"/>
- <menu_item_call label="SLurl をコピー" name="Copy slurl"/>
- <menu_item_call label="地図に表示" name="Show On Map"/>
+ <menu_item_call label="ランドマークの表示/編集" name="Landmark Open"/>
+ <menu_item_call label="ランドマークに移動" name="Move to Landmarks"/>
+ <menu_item_call label="マップに表示" name="Show On Map"/>
+ <menu_item_call label="SLurlをコピー" name="Copy slurl"/>
+ <menu_item_call label="ピックを作成" name="create_pick"/>
+ <menu_item_separator/>
<menu_item_call label="コピー" name="Landmark Copy"/>
- <menu_item_call label="貼り付け" name="Landmark Paste"/>
+ <menu_item_call label="ペースト" name="Landmark Paste"/>
+ <menu_item_call label="名前変更" name="rename"/>
<menu_item_call label="削除" name="Delete"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_gallery_outfit_tab.xml b/indra/newview/skins/default/xui/ja/menu_gallery_outfit_tab.xml
index 88c3aee042..5540c9a234 100644
--- a/indra/newview/skins/default/xui/ja/menu_gallery_outfit_tab.xml
+++ b/indra/newview/skins/default/xui/ja/menu_gallery_outfit_tab.xml
@@ -1,23 +1,35 @@
-<?xml version="1.0" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Outfit">
- <menu name="New Clothes" label="新しい洋服">
- <menu_item_call name="New Skirt" label="新しいスカート"/>
- <menu_item_call name="New Underpants" label="新しい下着"/>
- <menu_item_call name="New Undershirt" label="新しい肌着"/>
- <menu_item_call name="New Shirt" label="新しいシャツ"/>
- <menu_item_call name="New Pants" label="新しいパンツ"/>
- <menu_item_call name="New Tattoo" label="新しいタトゥー"/>
- <menu_item_call name="New Physics" label="新しい体"/>
- <menu_item_call name="New Jacket" label="新しいジャケット"/>
- <menu_item_call name="New Shoes" label="新しい靴"/>
- <menu_item_call name="New Gloves" label="新しいグローブ"/>
- <menu_item_call name="New Alpha" label="新しいアルファ"/>
- <menu_item_call name="New Socks" label="新しい靴下"/>
+ <menu_item_call label="着る-このアウトフィットに着替える" name="wear_replace"/>
+ <menu_item_call label="着る-このアウトフィットに追加する" name="wear_add"/>
+ <menu_item_call label="脱ぐ-このアウトフィットから取り外す" name="take_off"/>
+ <menu_item_call label="画像をアップロード(L$ [UPLOAD_COST])" name="upload_photo"/>
+ <menu_item_call label="画像を選択" name="select_photo"/>
+ <menu_item_call label="スナップショットを撮影" name="take_snapshot"/>
+ <menu_item_call label="画像を削除" name="remove_photo"/>
+ <menu_item_separator name="sepatator1"/>
+ <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="新しいアルファ" name="New Alpha"/>
+ <menu_item_call label="新しい物理作用" name="New Physics"/>
+ <menu_item_call label="新しいタトゥ" name="New Tattoo"/>
</menu>
- <menu name="New Body Parts" label="新しいボディーパーツ">
- <menu_item_call name="New Hair" label="新しい髪"/>
- <menu_item_call name="New Eyes" label="新しい目"/>
- <menu_item_call name="New Shape" label="新しいシェイプ"/>
- <menu_item_call name="New Skin" label="新しい皮膚"/>
+ <menu label="新しい身体部位" 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_item_separator name="sepatator2"/>
+ <menu_item_call label="アウトフィットを編集" name="edit"/>
+ <menu_item_call label="アウトフィットの名前変更" name="rename"/>
+ <menu_item_call label="アウトフィットを削除" name="delete"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml b/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml
index 3eacfb3507..e1f24cdb39 100644
--- a/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml
@@ -1,9 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_gesture_gear">
- <menu_item_call label="選択したジェスチャーのアクティベートの有無" name="activate"/>
+ <menu_item_call label="選択したジェスチャーの有効化/無効化" name="activate"/>
+ <menu_item_call label="名前変更" name="rename"/>
<menu_item_call label="コピー" name="copy_gesture"/>
- <menu_item_call label="貼り付け" name="paste"/>
- <menu_item_call label="UUID をコピー" name="copy_uuid"/>
+ <menu_item_call label="ペースト" name="paste"/>
+ <menu_item_call label="UUIDをコピー" name="copy_uuid"/>
<menu_item_call label="現在のアウトフィットに保存" name="save_to_outfit"/>
<menu_item_call label="編集" name="edit_gesture"/>
<menu_item_call label="調べる" name="inspect"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_group_plus.xml b/indra/newview/skins/default/xui/ja/menu_group_plus.xml
index 3787f7d645..db403ac938 100644
--- a/indra/newview/skins/default/xui/ja/menu_group_plus.xml
+++ b/indra/newview/skins/default/xui/ja/menu_group_plus.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_group_plus">
- <menu_item_call label="グループに参加..." name="item_join"/>
- <menu_item_call label="新しいグループ..." name="item_new"/>
+ <menu_item_call label="グループに参加…" name="item_join"/>
+ <menu_item_call label="新しいグループ…" name="item_new"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml b/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml
index 2e633ae1b2..d9d6e51867 100644
--- a/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml
+++ b/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_navbar_menu">
<menu_item_check label="ナビゲーションバーとお気に入りバーを表示" name="ShowNavbarNavigationPanel"/>
- <menu_item_check label="お気に入りバーを表示" name="ShowNavbarFavoritesPanel"/>
<menu_item_check label="「場所」のミニフィールドを表示" name="ShowMiniLocationPanel"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_im_conversation.xml b/indra/newview/skins/default/xui/ja/menu_im_conversation.xml
index 55cd6610f7..b3d3917965 100644
--- a/indra/newview/skins/default/xui/ja/menu_im_conversation.xml
+++ b/indra/newview/skins/default/xui/ja/menu_im_conversation.xml
@@ -3,13 +3,14 @@
<menu_item_call label="プロフィールを表示" name="View Profile"/>
<menu_item_call label="フレンド登録" name="Add Friend"/>
<menu_item_call label="フレンドを削除" name="remove_friend"/>
- <menu_item_call label="テレポートを送る" name="offer_teleport"/>
- <menu_item_call label="グループに招待..." name="invite_to_group"/>
- <menu_item_call label="チャットの履歴..." name="chat_history"/>
+ <menu_item_call label="テレポートをオファー" name="offer_teleport"/>
+ <menu_item_call label="グループに招待…" name="invite_to_group"/>
+ <menu_item_call label="チャットの履歴…" name="chat_history"/>
<menu_item_call label="ズームイン" name="zoom_in"/>
- <menu_item_call label="地図" name="map"/>
+ <menu_item_call label="マップ" name="map"/>
<menu_item_call label="共有" name="Share"/>
<menu_item_call label="支払い" name="Pay"/>
- <menu_item_check label="ボイスをブロック" name="Block/Unblock"/>
- <menu_item_check label="文字をブロックする" name="MuteText"/>
+ <menu_item_call label="迷惑行為の報告" name="Report Abuse"/>
+ <menu_item_check label="ボイスのブロック/解除" name="Block/Unblock"/>
+ <menu_item_check label="テキストをブロックする" name="MuteText"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_im_session_showmodes.xml b/indra/newview/skins/default/xui/ja/menu_im_session_showmodes.xml
index 222a741718..73e4164407 100644
--- a/indra/newview/skins/default/xui/ja/menu_im_session_showmodes.xml
+++ b/indra/newview/skins/default/xui/ja/menu_im_session_showmodes.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="menu_modes">
- <menu_item_check label="簡略表示" name="compact_view"/>
+ <menu_item_check label="簡易表示" name="compact_view"/>
<menu_item_check label="詳細表示" name="expanded_view"/>
<menu_item_check label="時間を表示" name="IMShowTime"/>
- <menu_item_check label="1対1の会話で名前を表示" name="IMShowNamesForP2PConv"/>
+ <menu_item_check label="1対1の会話で名前を表示" name="IMShowNamesForP2PConv"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/ja/menu_imchiclet_group.xml
index 5bcb96f083..e7f5cb310a 100644
--- a/indra/newview/skins/default/xui/ja/menu_imchiclet_group.xml
+++ b/indra/newview/skins/default/xui/ja/menu_imchiclet_group.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="IMChiclet Group Menu">
- <menu_item_call label="グループ情報" name="Show Profile"/>
+ <menu_item_call label="プロフィールを表示" name="Show Profile"/>
<menu_item_call label="セッションを表示" name="Chat"/>
<menu_item_call label="セッション終了" name="End Session"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/ja/menu_imchiclet_p2p.xml
index 5453f998fa..edcc0f751a 100644
--- a/indra/newview/skins/default/xui/ja/menu_imchiclet_p2p.xml
+++ b/indra/newview/skins/default/xui/ja/menu_imchiclet_p2p.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="IMChiclet P2P Menu">
<menu_item_call label="プロフィールの表示" name="Show Profile"/>
- <menu_item_call label="フレンド登録" name="Add Friend"/>
+ <menu_item_call label="フレンドに追加" name="Add Friend"/>
<menu_item_call label="セッションを表示" name="Send IM"/>
<menu_item_call label="セッション終了" name="End Session"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml
deleted file mode 100644
index 9d0d0f10a6..0000000000
--- a/indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="プロフィールの表示" name="view_profile"/>
- <menu_item_call label="フレンド登録" name="add_friend"/>
- <menu_item_call label="IM" name="im"/>
- <menu_item_call label="コール" name="call"/>
- <menu_item_call label="テレポート" name="teleport"/>
- <menu_item_call label="グループに招待" name="invite_to_group"/>
- <menu_item_call label="ブロック" name="block"/>
- <menu_item_call label="ブロック解除" name="unblock"/>
- <menu_item_call label="報告" name="report"/>
- <menu_item_call label="フリーズ" name="freeze"/>
- <menu_item_call label="追放" name="eject"/>
- <menu_item_call label="追放" name="kick"/>
- <menu_item_call label="CSR" name="csr"/>
- <menu_item_call label="テクスチャのデバッグ" name="debug"/>
- <menu_item_call label="地図で探す" name="find_on_map"/>
- <menu_item_call label="ズームイン" name="zoom_in"/>
- <menu_item_call label="支払う" name="pay"/>
- <menu_item_call label="共有" name="share"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/ja/menu_inspect_object_gear.xml
index 5a0519ba19..55b2e8b21b 100644
--- a/indra/newview/skins/default/xui/ja/menu_inspect_object_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inspect_object_gear.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="Gear Menu">
<menu_item_call label="触る" name="touch"/>
<menu_item_call label="座る" name="sit"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml
deleted file mode 100644
index e3e206f3aa..0000000000
--- a/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="Gear Menu">
- <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="衣類" 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="アルファ" name="Self Alpha"/>
- <menu_item_call label="すべての衣類" 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="アウトフィットの変更" name="Chenge Outfit"/>
- <menu_item_call label="アウトフィットの編集" name="Edit Outfit"/>
- <menu_item_call label="シェイプの編集" name="Edit My Shape"/>
- <menu_item_call label="フレンド" name="Friends..."/>
- <menu_item_call label="グループ" name="Groups..."/>
- <menu_item_call label="プロフィール" name="Profile..."/>
- <menu_item_call label="テクスチャのデバッグ" name="Debug..."/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_inventory.xml b/indra/newview/skins/default/xui/ja/menu_inventory.xml
index 7f68c18e0b..c7cba4845d 100644
--- a/indra/newview/skins/default/xui/ja/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inventory.xml
@@ -7,21 +7,23 @@
<menu_item_call label="リストを編集" name="Marketplace Edit Listing"/>
<menu_item_call label="リスト" name="Marketplace List"/>
<menu_item_call label="リストから取り除く" name="Marketplace Unlist"/>
- <menu_item_call label="有効にする" name="Marketplace Activate"/>
- <menu_item_call label="無効にする" name="Marketplace Deactivate"/>
+ <menu_item_call label="有効に" name="Marketplace Activate"/>
+ <menu_item_call label="無効に" name="Marketplace Deactivate"/>
+ <menu_item_separator name="Marketplace Listings Separator"/>
<menu_item_call label="共有" name="Share"/>
<menu_item_call label="開く" name="Task Open"/>
<menu_item_call label="再生" name="Task Play"/>
<menu_item_call label="プロパティ" 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="紛失物フォルダを空にする" name="Empty Lost And Found"/>
+ <menu_item_call label="ごみ箱を空に" name="Empty Trash"/>
+ <menu_item_call label="遺失物フォルダを空に" name="Empty Lost And Found"/>
<menu_item_call label="新しいフォルダ" name="New Folder"/>
+ <menu_item_call label="新しいアウトフィット" name="New Outfit"/>
<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 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"/>
@@ -29,8 +31,8 @@
<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="新しい下着(上)" name="New Undershirt"/>
+ <menu_item_call label="新しい下着(下)" name="New Underpants"/>
<menu_item_call label="新しいアルファマスク" name="New Alpha Mask"/>
<menu_item_call label="新しいタトゥ" name="New Tattoo"/>
<menu_item_call label="新しいユニバーサル" name="New Universal"/>
@@ -44,7 +46,7 @@
</menu>
<menu label="新しい設定" name="New Settings">
<menu_item_call label="新しい空" name="New Sky"/>
- <menu_item_call label="新しい水" name="New Water"/>
+ <menu_item_call label="新しい水面" name="New Water"/>
<menu_item_call label="新しいデイサイクル" name="New Day Cycle"/>
</menu>
<menu label="次のデフォルトとして使用" name="upload_def">
@@ -56,62 +58,72 @@
<menu label="種類を変更" 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="上着" name="Jacket"/>
+ <menu_item_call label="ズボン" name="Pants"/>
<menu_item_call label="シェイプ" 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_item_call label="下着(上半身)" name="Underpants"/>
+ <menu_item_call label="下着(下半身)" name="Undershirt"/>
</menu>
<menu_item_call label="テレポート" name="Landmark Open"/>
<menu_item_call label="開く" name="Animation Open"/>
<menu_item_call label="開く" name="Sound Open"/>
- <menu_item_call label="着用中のアウトフィットを入れ替える" name="Replace Outfit"/>
- <menu_item_call label="着用中のアウトフィットに追加する" name="Add To Outfit"/>
- <menu_item_call label="着用中のアウトフィットから取り除く" name="Remove From Outfit"/>
- <menu_item_call label="アウトフィットのリストをクリップボードにコピー" name="Copy outfit list to clipboard"/>
+ <menu_item_call label="着用中のアウトフィットと入れ替え" name="Replace Outfit"/>
+ <menu_item_call label="着用中のアウトフィットに追加" name="Add To Outfit"/>
+ <menu_item_call label="着用中のアウトフィットから取り外す" name="Remove From Outfit"/>
+ <menu_item_call label="アウトフィット一覧をクリップボードにコピー" name="Copy outfit list to clipboard"/>
+ <menu_item_separator name="Outfit Separator"/>
<menu_item_call label="オリジナルを探す" name="Find Original"/>
- <menu_item_call label="アイテムを除外する" name="Purge Item"/>
- <menu_item_call label="アイテムを復元する" name="Restore Item"/>
+ <menu_item_call label="アイテムを除外" name="Purge Item"/>
+ <menu_item_call label="アイテムを復元" name="Restore Item"/>
<menu_item_call label="開く" name="Open"/>
- <menu_item_call label="オリジナルを開きます" name="Open Original"/>
+ <menu_item_call label="オリジナルを開く" name="Open Original"/>
<menu_item_call label="プロパティ" name="Properties"/>
- <menu_item_call label="名前を変更する" name="Rename"/>
- <menu_item_call label="UUID をコピーする" name="Copy Asset UUID"/>
- <menu_item_call label="メイン画面で表示する" name="Show in Main Panel"/>
+ <menu_item_call label="名前を変更" name="Rename"/>
+ <menu_item_call label="アセットのUUIDをコピー" name="Copy Asset UUID"/>
+ <menu_item_call label="メインパネルで表示" name="Show in Main Panel"/>
<menu_item_call label="カット" name="Cut"/>
<menu_item_call label="コピー" name="Copy"/>
- <menu_item_call label="貼り付け" name="Paste"/>
- <menu_item_call label="リンクを貼り付ける" name="Paste As Link"/>
+ <menu_item_call label="ペースト" name="Paste"/>
+ <menu_item_call label="リンクとしてペースト" name="Paste As Link"/>
<menu_item_call label="リンクを置き換える" name="Replace Links"/>
+ <menu_item_separator name="Paste Separator"/>
<menu_item_call label="削除" name="Delete"/>
- <menu_item_call label="システムフォルダを削除する" name="Delete System Folder"/>
- <menu_item_call label="コンファレンスチャットを開始する" name="Conference Chat Folder"/>
- <menu_item_call label="再生する" name="Sound Play"/>
- <menu_item_call label="SLurl をコピー" name="url_copy"/>
+ <menu_item_call label="システムフォルダを削除" name="Delete System Folder"/>
+ <menu_item_separator/>
+ <menu_item_separator/>
+ <menu_item_call label="会話チャットを開始" name="Conference Chat Folder"/>
+ <menu_item_call label="再生" name="Sound Play"/>
+ <menu_item_call label="SLurlをコピー" name="url_copy"/>
<menu_item_call label="ランドマークの情報" name="About Landmark"/>
- <menu_item_call label="地図に表示" name="show_on_map"/>
- <menu_item_call label="インワールドで再生する" name="Animation Play"/>
- <menu_item_call label="ローカルで再生する" name="Animation Audition"/>
- <menu_item_call label="インスタントメッセージを送信する" name="Send Instant Message"/>
- <menu_item_call label="テレポートを送る..." name="Offer Teleport..."/>
- <menu_item_call label="コンファレンスチャットを開始する" name="Conference Chat"/>
- <menu_item_call label="アクティブ" name="Activate"/>
- <menu_item_call label="非アクティブ" name="Deactivate"/>
- <menu_item_call label="別名で保存する" name="Save As"/>
- <menu_item_call label="自分から取り外す" name="Detach From Yourself"/>
+ <menu_item_call label="マップに表示" name="show_on_map"/>
+ <menu_item_separator name="Animation Separator"/>
+ <menu_item_call label="インワールドで再生" name="Animation Play"/>
+ <menu_item_call label="ローカルで再生" name="Animation Audition"/>
+ <menu_item_call label="インスタントメッセージを送信" name="Send Instant Message"/>
+ <menu_item_call label="テレポートをオファー…" name="Offer Teleport..."/>
+ <menu_item_call label="テレポートをリクエスト…" name="Request Teleport..."/>
+ <menu_item_call label="会話チャットを開始" name="Conference Chat"/>
+ <menu_item_call label="有効化" name="Activate"/>
+ <menu_item_call label="無効化" name="Deactivate"/>
+ <menu_item_call label="名前をつけて保存" name="Save As"/>
+ <menu_item_call label="選択を名前をつけて保存" layout="topleft" name="Save Selected As"/>
+ <menu_item_separator name="Wearable And Object Separator"/>
<menu_item_call label="装着" name="Wearable And Object Wear"/>
<menu label="装着先" name="Attach To"/>
<menu label="HUD 装着先" name="Attach To HUD"/>
- <menu_item_call label="触る" name="Attachment Touch" />
+ <menu_item_call label="触る" name="Attachment Touch"/>
<menu_item_call label="編集" name="Wearable Edit"/>
<menu_item_call label="追加" name="Wearable Add"/>
- <menu_item_call label="取り外す" name="Take Off"/>
+ <menu_item_call label="取り外す" name="Detach From Yourself"/>
+ <menu_item_call label="脱ぐ" name="Take Off"/>
+ <menu_item_separator name="Settings Separator"/>
<menu_item_call label="自分にのみ適用" name="Settings Apply Local"/>
<menu_item_call label="区画に適用" name="Settings Apply Parcel"/>
+ <menu_item_separator layout="topleft"/>
<menu_item_call label="マーケットプレイスのリストにコピー" name="Marketplace Copy"/>
<menu_item_call label="マーケットプレイスのリストに移動" name="Marketplace Move"/>
- <menu_item_call label="--オプションなし--" name="--no options--"/>
+ <menu_item_call label="-オプションなし-" name="--no options--"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_inventory_add.xml b/indra/newview/skins/default/xui/ja/menu_inventory_add.xml
index eecf166a70..0de24d1c7a 100644
--- a/indra/newview/skins/default/xui/ja/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inventory_add.xml
@@ -1,30 +1,30 @@
<?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="Upload Image"/>
+ <menu_item_call label="サウンド (L$ [COST])…" name="Upload Sound"/>
+ <menu_item_call label="アニメーション (L$ [COST])…" name="Upload Animation"/>
<menu_item_call label="モデル" name="Upload Model"/>
- <menu_item_call label="一括 (ファイルにつき L$[COST] )..." name="Bulk Upload"/>
+ <menu_item_call label="一括 (ファイルにつき L$ [COST])…" name="Bulk Upload"/>
</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 label="新しい服装" name="New Clothes">
<menu_item_call label="新しいシャツ" name="New Shirt"/>
- <menu_item_call label="新しいパンツ" name="New Pants"/>
+ <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="新しい下着(上半身)" name="New Undershirt"/>
+ <menu_item_call label="新しい下着(下半身)" name="New Underpants"/>
<menu_item_call label="新しいアルファ" name="New Alpha"/>
- <menu_item_call label="新しいタトゥー" name="New Tattoo"/>
+ <menu_item_call label="新しいタトゥ" name="New Tattoo"/>
<menu_item_call label="新しいユニバーサル" name="New Universal"/>
- <menu_item_call label="新規の物理作用" name="New Physics"/>
+ <menu_item_call label="新しい物理作用" name="New Physics"/>
</menu>
<menu label="新しい身体部位" name="New Body Parts">
<menu_item_call label="新しいシェイプ(体型)" name="New Shape"/>
@@ -32,9 +32,9 @@
<menu_item_call label="新しい髪" name="New Hair"/>
<menu_item_call label="新しい目" name="New Eyes"/>
</menu>
- <menu label="新しい設定" name="New Settings">
+ <menu label="新しい環境設定" name="New Settings">
<menu_item_call label="新しい空" name="New Sky"/>
- <menu_item_call label="新しい水" name="New Water"/>
+ <menu_item_call label="新しい水面" name="New Water"/>
<menu_item_call label="新しいデイサイクル" name="New Day Cycle"/>
</menu>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml
index ad60b0d01f..975e1b147a 100644
--- a/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml
@@ -5,14 +5,17 @@
<menu_item_check label="新しい順に並べ替え" name="sort_by_recent"/>
<menu_item_check label="フォルダを常に名前順に並べる" name="sort_folders_by_name"/>
<menu_item_check label="システムフォルダを上にソートする" name="sort_system_folders_to_top"/>
- <menu_item_call label="フィルターを表示..." name="show_filters"/>
- <menu_item_call label="フィルターをリセット" name="reset_filters"/>
+ <menu_item_separator/>
+ <menu_item_call label="フィルタを表示…" name="show_filters"/>
+ <menu_item_call label="フィルタをリセット" name="reset_filters"/>
<menu_item_call label="すべてのフォルダを閉じる" name="close_folders"/>
- <menu_item_call label="紛失物を空にする" name="empty_lostnfound"/>
+ <menu_item_separator/>
+ <menu_item_call label="遺失物を空にする" name="empty_lostnfound"/>
<menu_item_call label="別名でテクスチャを保存" name="Save Texture As"/>
<menu_item_call label="共有" name="Share"/>
<menu_item_call label="オリジナルを表示" name="Find Original"/>
<menu_item_call label="すべてのリンクを表示" name="Find All Links"/>
<menu_item_call label="リンクを置き換える" name="Replace Links"/>
+ <menu_item_separator/>
<menu_item_call label="ごみ箱を空にする" name="empty_trash"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_inventory_search_visibility.xml b/indra/newview/skins/default/xui/ja/menu_inventory_search_visibility.xml
new file mode 100644
index 0000000000..2395c9e7b3
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_inventory_search_visibility.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_search_visibility">
+ <menu_item_check label="ゴミ箱を検索" name="search_trash"/>
+ <menu_item_check label="ライブラリを検索" name="search_library"/>
+ <menu_item_separator/>
+ <menu_item_check label="リンクを含む" name="include_links"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_land.xml b/indra/newview/skins/default/xui/ja/menu_land.xml
index 3754bd7fa4..bef249d203 100644
--- a/indra/newview/skins/default/xui/ja/menu_land.xml
+++ b/indra/newview/skins/default/xui/ja/menu_land.xml
@@ -1,10 +1,10 @@
<?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="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="Create"/>
<menu_item_call label="地形を編集" name="Edit Terrain"/>
<menu_item_call label="パーティクル所有者をブロック" name="Mute Particle"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_login.xml b/indra/newview/skins/default/xui/ja/menu_login.xml
index 61b473858b..f59b0b7e5e 100644
--- a/indra/newview/skins/default/xui/ja/menu_login.xml
+++ b/indra/newview/skins/default/xui/ja/menu_login.xml
@@ -1,29 +1,29 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Login Menu">
- <menu label="ミー" name="File">
- <menu_item_call label="環境設定..." name="Preferences..."/>
+ <menu label="私" name="File">
+ <menu_item_call label="初期設定…" name="Preferences..."/>
<menu_item_call label="ウィンドウを閉じる" name="Close Window"/>
<menu_item_check label="グリッドピッカーを表示する" name="Show Grid Picker"/>
- <menu_item_call label="[APP_NAME] を終了" name="Quit"/>
+ <menu_item_call label="[APP_NAME]を終了" name="Quit"/>
</menu>
<menu label="ヘルプ" name="Help">
- <menu_item_call label="ハウツー..." name="How To"/>
+ <menu_item_call label="ハウツー…" name="How To"/>
<menu_item_call label="クイックスタート" name="Quickstart"/>
<menu_item_call label="ナレッジベース" name="Knowledge Base"/>
<menu_item_call label="Wiki" name="Wiki"/>
<menu_item_call label="コミュニティ フォーラム" name="Community Forums"/>
<menu_item_call label="日本語サポートページ" name="Support portal"/>
- <menu_item_call label="[SECOND_LIFE] ニュース" name="Second Life News"/>
- <menu_item_call label="[SECOND_LIFE] ブログ" name="Second Life Blogs"/>
+ <menu_item_call label="[SECOND_LIFE]ニュース" name="Second Life News"/>
+ <menu_item_call label="[SECOND_LIFE]ブログ" name="Second Life Blogs"/>
<menu_item_call label="バグを報告する" name="Report Bug"/>
- <menu_item_call label="[APP_NAME] について" name="About Second Life"/>
+ <menu_item_call label="[APP_NAME]について" name="About Second Life"/>
</menu>
<menu_item_check label="デバッグメニューを表示する" name="Show Debug Menu"/>
<menu label="デバッグ" name="Debug">
<menu_item_call label="デバッグ設定を表示" name="Debug Settings"/>
- <menu_item_call label="XUI プレビューツール" name="UI Preview Tool"/>
+ <menu_item_call label="XUIプレビューツール" name="UI Preview Tool"/>
<menu label="UI テスト" name="UI Tests"/>
- <menu_item_call label="ウィンドウのサイズを設定..." name="Set Window Size..."/>
+ <menu_item_call label="ウィンドウのサイズを設定…" name="Set Window Size..."/>
<menu_item_call label="利用規約を表示" name="TOS"/>
<menu_item_call label="クリティカルメッセージを表示" name="Critical"/>
<menu_item_call label="メディアブラウザ" name="Media Browser"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_marketplace_view.xml b/indra/newview/skins/default/xui/ja/menu_marketplace_view.xml
index bf38075556..ad02ada4b9 100644
--- a/indra/newview/skins/default/xui/ja/menu_marketplace_view.xml
+++ b/indra/newview/skins/default/xui/ja/menu_marketplace_view.xml
@@ -2,6 +2,6 @@
<toggleable_menu name="menu_marketplace_sort">
<menu_item_check label="名前による並べ替え" name="sort_by_name"/>
<menu_item_check label="新しい順に並べ替え" name="sort_by_recent"/>
- <menu_item_check label="在庫高順に並べ替え (低から高へ)" name="sort_by_stock_amount"/>
+ <menu_item_check label="在庫数順に並べ替え (低から高へ)" name="sort_by_stock_amount"/>
<menu_item_check label="リストフォルダのみ表示" name="show_only_listing_folders"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_media_ctrl.xml b/indra/newview/skins/default/xui/ja/menu_media_ctrl.xml
index faae4ef717..3c566a87a4 100644
--- a/indra/newview/skins/default/xui/ja/menu_media_ctrl.xml
+++ b/indra/newview/skins/default/xui/ja/menu_media_ctrl.xml
@@ -2,6 +2,7 @@
<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"/>
- <menu_item_call label="ウェブインスペクターを開く" name="open_webinspector"/>
+ <menu_item_call label="ペースト" name="Paste"/>
+ <menu_item_separator name="debug_separator"/>
+ <menu_item_call label="Webインスペクターを開く" name="open_webinspector"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_mini_map.xml b/indra/newview/skins/default/xui/ja/menu_mini_map.xml
index 2e733ee24b..eee3fb7690 100644
--- a/indra/newview/skins/default/xui/ja/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/ja/menu_mini_map.xml
@@ -4,8 +4,8 @@
<menu_item_call label="ズーム(中)" name="Zoom Medium"/>
<menu_item_call label="ズーム(遠)" name="Zoom Far"/>
<menu_item_call label="ズーム(デフォルト)" name="Zoom Default"/>
- <menu_item_check label="地図を回転" name="Rotate Map"/>
+ <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_item_call label="ワールドマップ" name="World Map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/ja/menu_model_import_gear_default.xml
index 43f86e84bf..9472255128 100644
--- a/indra/newview/skins/default/xui/ja/menu_model_import_gear_default.xml
+++ b/indra/newview/skins/default/xui/ja/menu_model_import_gear_default.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="model_menu_gear_default">
- <menu_item_check label="稜を表示" name="show_edges"/>
+ <menu_item_check label="縁を表示" name="show_edges"/>
<menu_item_check label="物理効果を表示" name="show_physics"/>
<menu_item_check label="テクスチャを表示" name="show_textures"/>
- <menu_item_check label="スキンの重さを表示" name="show_skin_weight"/>
+ <menu_item_check label="スキンのウエイトを表示" name="show_skin_weight"/>
<menu_item_check label="ジョイントポジションを表示" name="show_joint_positions"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_mute_particle.xml b/indra/newview/skins/default/xui/ja/menu_mute_particle.xml
index 8dab025309..8befe0cf57 100644
--- a/indra/newview/skins/default/xui/ja/menu_mute_particle.xml
+++ b/indra/newview/skins/default/xui/ja/menu_mute_particle.xml
@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- *NOTE: See also menu_attachment_other.xml -->
<context_menu name="Mute Particle Pie">
<menu_item_call label="パーティクル所有者をブロック" name="Mute Particle"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_name_field.xml b/indra/newview/skins/default/xui/ja/menu_name_field.xml
deleted file mode 100644
index 8c37d95073..0000000000
--- a/indra/newview/skins/default/xui/ja/menu_name_field.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="CopyMenu">
- <menu_item_call label="表示名をコピー" name="copy_display"/>
- <menu_item_call label="エージェント名をコピー" name="copy_name"/>
- <menu_item_call label="エージェント ID をコピー" name="copy_id"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_navbar.xml b/indra/newview/skins/default/xui/ja/menu_navbar.xml
index 9ae2e58198..9954c17ddc 100644
--- a/indra/newview/skins/default/xui/ja/menu_navbar.xml
+++ b/indra/newview/skins/default/xui/ja/menu_navbar.xml
@@ -3,9 +3,9 @@
<menu_item_check label="座標を表示" name="Show Coordinates"/>
<menu_item_check label="区画のプロパティを表示" name="Show Parcel Properties"/>
<menu_item_call label="ランドマーク" name="Landmark"/>
- <menu_item_call label="切り取り" name="Cut"/>
+ <menu_item_call label="カット" name="Cut"/>
<menu_item_call label="コピー" name="Copy"/>
- <menu_item_call label="貼り付け" name="Paste"/>
+ <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/ja/menu_nearby_chat.xml b/indra/newview/skins/default/xui/ja/menu_nearby_chat.xml
index c2e4a27686..1665efe46a 100644
--- a/indra/newview/skins/default/xui/ja/menu_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/ja/menu_nearby_chat.xml
@@ -1,9 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="NearBy Chat Menu">
- <menu_item_call label="近くの人を表示する..." name="nearby_people"/>
+ <menu_item_call label="近隣の人物を表示する…" name="nearby_people"/>
+ <menu_item_separator/>
<menu_item_check label="ブロックされた文字を表示" name="muted_text"/>
+ <menu_item_separator/>
<menu_item_check label="バディアイコンを表示" name="show_buddy_icons"/>
<menu_item_check label="名前を表示" name="show_names"/>
<menu_item_check label="アイコンと名前を表示" name="show_icons_and_names"/>
+ <menu_item_separator/>
<menu_item_call label="文字の大きさ" name="font_size"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_object.xml b/indra/newview/skins/default/xui/ja/menu_object.xml
index 8da1d5d000..14db32081b 100644
--- a/indra/newview/skins/default/xui/ja/menu_object.xml
+++ b/indra/newview/skins/default/xui/ja/menu_object.xml
@@ -1,35 +1,36 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Object Pie">
- <menu_item_call label="触る" name="Object Touch">
- <menu_item_call.on_enable name="EnableTouch" parameter="触る"/>
- </menu_item_call>
- <menu_item_call label="編集" name="Edit..."/>
+ <menu_item_call label="触る" name="Object Touch"/>
+ <menu_item_call label="編集…" name="Edit..."/>
<menu_item_call label="制作" name="Build"/>
<menu_item_call label="開く" name="Open"/>
<menu_item_call label="ここに座る" name="Object Sit"/>
<menu_item_call label="立ち上がる" name="Object Stand Up"/>
- <menu_item_call label="オブジェクトのプロフィール" name="Object Inspect"/>
+ <menu_item_call label="オブジェクトの調査" name="Object Inspect"/>
<menu_item_call label="ズームイン" name="Zoom In"/>
<menu_item_call label="リンクセットで表示" name="show_in_linksets"/>
<menu_item_call label="キャラクターで表示" name="show_in_characters"/>
- <context_menu label="装着" name="Put On">
- <menu_item_call label="装着" name="Wear"/>
+ <menu_item_separator/>
+ <context_menu label="取り付ける" name="Put On">
+ <menu_item_call label="着用" name="Wear"/>
<menu_item_call label="追加" name="Add"/>
- <context_menu label="取り付ける" name="Object Attach"/>
- <context_menu label="HUD を取り付ける" name="Object Attach HUD"/>
+ <context_menu label="装着" name="Object Attach"/>
+ <context_menu label="HUDに装着" name="Object Attach HUD"/>
</context_menu>
<context_menu label="管理" name="Remove">
- <menu_item_call label="嫌がらせの報告" name="Report Abuse..."/>
+ <menu_item_call label="嫌がらせの報告…" name="Report Abuse..."/>
<menu_item_call label="ブロック" name="Object Mute"/>
<menu_item_call label="ブロック解除" name="Object Unmute"/>
- <menu_item_call label="返却" name="Return..."/>
+ <menu_item_call label="返却…" name="Return..."/>
</context_menu>
+ <menu_item_separator/>
<menu_item_call label="取る" name="Pie Object Take"/>
<menu_item_call label="コピーを取る" name="Take Copy"/>
- <menu_item_call label="支払う" name="Pay..."/>
- <menu_item_call label="買う" name="Buy..."/>
+ <menu_item_call label="支払う…" name="Pay..."/>
+ <menu_item_call label="購入…" name="Buy..."/>
<menu_item_call label="削除" name="Delete"/>
+ <menu_item_separator/>
<menu_item_call label="パーティクル所有者をブロック" name="Mute Particle"/>
- <menu_item_call label="ダンプ XML" name="Dump XML"/>
+ <menu_item_call label="XMLとしてダンプ" name="Dump XML"/>
<menu_item_call label="スケルトンをリセット" name="Reset Skeleton"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_object_icon.xml b/indra/newview/skins/default/xui/ja/menu_object_icon.xml
index 7b55a64eef..e7cd4b40b8 100644
--- a/indra/newview/skins/default/xui/ja/menu_object_icon.xml
+++ b/indra/newview/skins/default/xui/ja/menu_object_icon.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Object Icon Menu">
- <menu_item_call label="オブジェクトのプロフィール..." name="Object Profile"/>
- <menu_item_call label="ブロック..." name="Block"/>
+ <menu_item_call label="オブジェクトのプロフィール…" name="Object Profile"/>
+ <menu_item_call label="ブロック…" name="Block"/>
<menu_item_call label="ブロック解除" name="Unblock"/>
- <menu_item_call label="地図に表示" name="show_on_map"/>
+ <menu_item_separator/>
+ <menu_item_call label="マップに表示" name="show_on_map"/>
<menu_item_call label="オブジェクトの場所にテレポート" name="teleport_to_object"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml b/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml
index 4946d58fd8..b869e67923 100644
--- a/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml
@@ -1,36 +1,39 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="Gear Outfit">
- <menu_item_call label="着る - 着用中のアウトフィットを入れ替える" name="wear"/>
- <menu_item_call label="着る - 着用中のアウトフィットに追加する" name="wear_add"/>
- <menu_item_call label="取り外す - 着用中のアウトフィットから取り除く" name="take_off"/>
- <menu_item_call label="写真をアップロード(L$10)" name="upload_photo"/>
- <menu_item_call label="写真を選択" name="select_photo"/>
+ <menu_item_call label="着る-現在ののアウトフィットと入れ替え" name="wear"/>
+ <menu_item_call label="着る-着用中のアウトフィットに追加" name="wear_add"/>
+ <menu_item_call label="脱ぐ-着用中のアウトフィットから取り外す" name="take_off"/>
+ <menu_item_call label="画像をアップロード(L$ 10)" name="upload_photo"/>
+ <menu_item_call label="画像を選択" name="select_photo"/>
<menu_item_call label="スナップショットを撮る" name="take_snapshot"/>
- <menu_item_call label="写真を削除" name="remove_photo"/>
- <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="アルファ" name="New Alpha"/>
- <menu_item_call label="新規の物理作用" name="New Physics"/>
+ <menu_item_call label="画像を削除" name="remove_photo"/>
+ <menu_item_separator name="sepatator1"/>
+ <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="新しいアルファ" name="New Alpha"/>
+ <menu_item_call label="新しい物理作用" name="New Physics"/>
<menu_item_call label="新しいタトゥ" name="New Tattoo"/>
<menu_item_call label="新しいユニバーサル" name="New Universal"/>
</menu>
<menu label="新しい身体部位" 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_item_call label="新しいスキン" name="New Skin"/>
+ <menu_item_call label="新しい髪型" name="New Hair"/>
+ <menu_item_call label="新しい目" name="New Eyes"/>
</menu>
- <menu_item_call label="フォルダをすべて開く" name="expand"/>
- <menu_item_call label="フォルダをすべて閉じる" name="collapse"/>
- <menu_item_call label="アウトフィットの名前を変更する" name="rename"/>
- <menu_item_call label="アウトフィットを削除する" name="delete_outfit"/>
+ <menu_item_separator name="sepatator2"/>
+ <menu_item_call label="全てのフォルダを開く" name="expand"/>
+ <menu_item_call label="全てのフォルダを閉じる" name="collapse"/>
+ <menu_item_call label="アウトフィットの名前を変更" name="rename"/>
+ <menu_item_call label="アウトフィットを削除" name="delete_outfit"/>
+ <menu_item_separator name="sepatator3"/>
<menu_item_check label="フォルダを常に名前順に並べる" name="sort_folders_by_name"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_outfit_tab.xml b/indra/newview/skins/default/xui/ja/menu_outfit_tab.xml
index 9491c22f31..cc04ac6dcf 100644
--- a/indra/newview/skins/default/xui/ja/menu_outfit_tab.xml
+++ b/indra/newview/skins/default/xui/ja/menu_outfit_tab.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Outfit">
- <menu_item_call label="着る - 着用中のアウトフィットを入れ替える" name="wear_replace"/>
- <menu_item_call label="着る - 着用中のアウトフィットに追加する" name="wear_add"/>
- <menu_item_call label="取り外す - 着用中のアウトフィットから取り除く" name="take_off"/>
+ <menu_item_call label="着る-現在ののアウトフィットと入れ替え" name="wear_replace"/>
+ <menu_item_call label="着る-着用中のアウトフィットに追加" name="wear_add"/>
+ <menu_item_call label="脱ぐ-着用中のアウトフィットから取り外す" name="take_off"/>
<menu_item_call label="アウトフィットの編集" name="edit"/>
- <menu_item_call label="アウトフィットの名前を変更する" name="rename"/>
- <menu_item_call label="アウトフィットを削除する" name="delete"/>
+ <menu_item_call label="アウトフィットの名前を変更" name="rename"/>
+ <menu_item_call label="アウトフィットを削除" name="delete"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_participant_list.xml b/indra/newview/skins/default/xui/ja/menu_participant_list.xml
index 64d8ded722..ebce5f7e6b 100644
--- a/indra/newview/skins/default/xui/ja/menu_participant_list.xml
+++ b/indra/newview/skins/default/xui/ja/menu_participant_list.xml
@@ -4,17 +4,21 @@
<menu_item_check label="最近の発言者で並べ替え" name="SortByRecentSpeakers"/>
<menu_item_call label="プロフィールの表示" name="View Profile"/>
<menu_item_call label="フレンド登録" name="Add Friend"/>
- <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="IM" name="IM"/>
<menu_item_call label="コール" name="Call"/>
<menu_item_call label="共有" name="Share"/>
<menu_item_call label="支払う" name="Pay"/>
- <menu_item_check label="人のアイコン表示" name="View Icons"/>
- <menu_item_check label="ボイスをブロック" name="Block/Unblock"/>
+ <menu_item_separator name="View Icons Separator"/>
+ <menu_item_check label="人物のアイコン表示" name="View Icons"/>
+ <menu_item_separator/>
+ <menu_item_check label="ボイスをブロック/解除" name="Block/Unblock"/>
<menu_item_check label="文字をブロック" name="MuteText"/>
+ <menu_item_separator name="Moderator Options Separator"/>
<context_menu label="モデレーターのオプション" name="Moderator Options">
+ <menu_item_separator name="moderate_voice_separator"/>
<menu_item_check label="文字チャットを許可" name="AllowTextChat"/>
- <menu_item_call label="この参加者をミュートする" name="ModerateVoiceMuteSelected"/>
- <menu_item_call label="この参加者のミュートを解除する" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="この参加者をミュート" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="この参加者のミュートを解除" name="ModerateVoiceUnMuteSelected"/>
<menu_item_call label="全員をミュート" name="ModerateVoiceMute"/>
<menu_item_call label="全員のミュート解除" name="ModerateVoiceUnmute"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_participant_view.xml b/indra/newview/skins/default/xui/ja/menu_participant_view.xml
index 5816351d9d..be9fffae04 100644
--- a/indra/newview/skins/default/xui/ja/menu_participant_view.xml
+++ b/indra/newview/skins/default/xui/ja/menu_participant_view.xml
@@ -3,11 +3,14 @@
<menu_item_check label="会話をタイプで並べ替え" name="sort_sessions_by_type"/>
<menu_item_check label="会話を名前で並べ替え" name="sort_sessions_by_name"/>
<menu_item_check label="会話を最新アクティビティで並べ替え" name="sort_sessions_by_recent"/>
+ <menu_item_separator/>
<menu_item_check label="参加者を名前で並べ替え" name="sort_participants_by_name"/>
<menu_item_check label="参加者を最新アクティビティで並べ替え" name="sort_participants_by_recent"/>
- <menu_item_call label="チャットの環境設定..." name="chat_preferences"/>
- <menu_item_call label="プライバシーの環境設定..." name="privacy_preferences"/>
- <menu_item_check label="会話ログ..." name="Conversation"/>
- <menu_item_check label="近くのチャットを翻訳" name="Translate_chat"/>
- <menu_item_check label="翻訳の設定..." name="Translation_settings"/>
+ <menu_item_separator/>
+ <menu_item_call label="チャットの初期設定…" name="chat_preferences"/>
+ <menu_item_call label="プライバシーの初期設定…" name="privacy_preferences"/>
+ <menu_item_check label="会話ログ…" name="Conversation"/>
+ <menu_item_separator/>
+ <menu_item_check label="近隣のチャットを翻訳" name="Translate_chat"/>
+ <menu_item_check label="翻訳の設定…" name="Translation_settings"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml
index f74399f2ba..ac1757cc48 100644
--- a/indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml
@@ -5,5 +5,6 @@
<menu_item_check label="文字をブロック" name="MuteText"/>
<menu_item_check label="パーティクルをブロック" name="MuteParticles"/>
<menu_item_check label="オブジェクトのサウンドをブロック" name="BlockObjectSounds"/>
- <menu_item_call label="プロフィール..." name="profile"/>
+ <menu_item_separator/>
+ <menu_item_call label="プロフィール…" name="profile"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_blocked_plus.xml b/indra/newview/skins/default/xui/ja/menu_people_blocked_plus.xml
index 3e74b2ddff..a87c55038f 100644
--- a/indra/newview/skins/default/xui/ja/menu_people_blocked_plus.xml
+++ b/indra/newview/skins/default/xui/ja/menu_people_blocked_plus.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="menu_blocked_plus">
- <menu_item_call label="名前で住人をブロック..." name="block_resident_by_name"/>
- <menu_item_call label="名前でオブジェクトをブロック..." name="block_object_by_name"/>
+ <menu_item_call label="名前で住人をブロック…" name="block_resident_by_name"/>
+ <menu_item_call label="名前でオブジェクトをブロック…" name="block_object_by_name"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_blocked_view.xml b/indra/newview/skins/default/xui/ja/menu_people_blocked_view.xml
index 4b86a353f4..80d9d43005 100644
--- a/indra/newview/skins/default/xui/ja/menu_people_blocked_view.xml
+++ b/indra/newview/skins/default/xui/ja/menu_people_blocked_view.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="menu_blocked_view">
<menu_item_check label="名前で並べ替え" name="sort_by_name"/>
- <menu_item_check label="タイプによる並べ替え" name="sort_by_type"/>
+ <menu_item_check label="種類で並べ替え" name="sort_by_type"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_friends_view.xml b/indra/newview/skins/default/xui/ja/menu_people_friends_view.xml
index f290bec652..e761c506bf 100644
--- a/indra/newview/skins/default/xui/ja/menu_people_friends_view.xml
+++ b/indra/newview/skins/default/xui/ja/menu_people_friends_view.xml
@@ -2,8 +2,8 @@
<toggleable_menu name="menu_group_plus">
<menu_item_check label="名前で並べ替え" name="sort_name"/>
<menu_item_check label="オンライン状況で並べ替え" name="sort_status"/>
- <menu_item_check label="人のアイコン表示" name="view_icons"/>
+ <menu_item_check label="人物のアイコン表示" name="view_icons"/>
<menu_item_check label="与えられた権限を表示" name="view_permissions"/>
<menu_item_check label="ユーザー名を非表示" name="view_usernames"/>
- <menu_item_check label="会話ログを表示..." name="view_conversation"/>
+ <menu_item_check label="会話ログを表示…" name="view_conversation"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/ja/menu_people_friends_view_sort.xml
deleted file mode 100644
index 76340e4d76..0000000000
--- a/indra/newview/skins/default/xui/ja/menu_people_friends_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="名前で並べ替え" name="sort_name"/>
- <menu_item_check label="オンライン状態で並べ替え" name="sort_status"/>
- <menu_item_check label="人のアイコン表示" name="view_icons"/>
- <menu_item_check label="与えられた権限を表示" name="view_permissions"/>
- <menu_item_call label="ブロックされた住人とオブジェクトを表示" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/ja/menu_people_groups_view_sort.xml
deleted file mode 100644
index bfc7d15017..0000000000
--- a/indra/newview/skins/default/xui/ja/menu_people_groups_view_sort.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="グループアイコンを表示" name="Display Group Icons"/>
- <menu_item_call label="選択したグループから脱退" name="Leave Selected Group"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby.xml
index 87f1d26ca4..bbe842a37e 100644
--- a/indra/newview/skins/default/xui/ja/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/ja/menu_people_nearby.xml
@@ -1,18 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Avatar Context Menu">
<menu_item_call label="プロフィールを表示" name="view_profile"/>
- <menu_item_call label="IM" name="im"/>
+ <menu_item_call label="IM" name="im"/>
<menu_item_call label="テレポートを送る" name="offer_teleport"/>
<menu_item_call label="ボイスコール" name="voice_call"/>
- <menu_item_call label="チャットの履歴を表示..." name="chat_history"/>
+ <menu_item_call label="チャットの履歴を表示…" name="chat_history"/>
<menu_item_call label="フレンド登録" name="add_friend"/>
<menu_item_call label="フレンドを削除" name="remove_friend"/>
- <menu_item_call label="グループに招待..." name="invite_to_group"/>
+ <menu_item_call label="グループに招待…" name="invite_to_group"/>
<menu_item_call label="ズームイン" name="zoom_in"/>
- <menu_item_call label="地図" name="map"/>
+ <menu_item_call label="マップ" name="map"/>
<menu_item_call label="共有" name="share"/>
- <menu_item_call label="支払い" name="pay"/>
- <menu_item_check label="ブロック・ブロック解除" name="block_unblock"/>
+ <menu_item_call label="支払う" name="pay"/>
+ <menu_item_check label="ブロック/解除" name="block_unblock"/>
<menu_item_call label="フリーズ" name="freeze"/>
<menu_item_call label="追放" name="eject"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml
index fe85e278cf..4e3dbd3279 100644
--- a/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml
+++ b/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml
@@ -2,9 +2,9 @@
<context_menu name="Multi-Selected People Context Menu">
<menu_item_call label="フレンド登録" name="add_friends"/>
<menu_item_call label="フレンドを削除" name="remove_friends"/>
- <menu_item_call label="IM" name="im"/>
+ <menu_item_call label="IM" name="im"/>
<menu_item_call label="コール" name="call"/>
<menu_item_call label="共有" name="share"/>
<menu_item_call label="支払い" name="pay"/>
- <menu_item_call label="テレポートを送る" name="offer_teleport"/>
+ <menu_item_call label="テレポートをオファー" name="offer_teleport"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml
index 2217288987..68e5ec88bf 100644
--- a/indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml
+++ b/indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml
@@ -4,7 +4,7 @@
<menu_item_check label="名前で並べ替え" name="sort_name"/>
<menu_item_check label="距離で並べ替え" name="sort_distance"/>
<menu_item_check label="到着した順に並べ替え" name="sort_arrival"/>
- <menu_item_check label="人のアイコン表示" name="view_icons"/>
- <menu_item_check label="地図を表示" name="view_map"/>
+ <menu_item_check label="人物のアイコン表示" name="view_icons"/>
+ <menu_item_check label="マップを表示" name="view_map"/>
<menu_item_check label="ユーザー名を非表示" name="view_usernames"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby_view_sort.xml
deleted file mode 100644
index 44c5438509..0000000000
--- a/indra/newview/skins/default/xui/ja/menu_people_nearby_view_sort.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_group_plus">
- <menu_item_check label="最近の発言者で並べ替え" name="sort_by_recent_speakers"/>
- <menu_item_check label="名前で並べ替え" name="sort_name"/>
- <menu_item_check label="距離で並べ替え" name="sort_distance"/>
- <menu_item_check label="人のアイコン表示" name="view_icons"/>
- <menu_item_check label="地図を表示" name="view_map"/>
- <menu_item_call label="ブロックされた住人とオブジェクトを表示" name="show_blocked_list"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_recent_view.xml b/indra/newview/skins/default/xui/ja/menu_people_recent_view.xml
index feaeba4398..84b24726f4 100644
--- a/indra/newview/skins/default/xui/ja/menu_people_recent_view.xml
+++ b/indra/newview/skins/default/xui/ja/menu_people_recent_view.xml
@@ -2,5 +2,5 @@
<toggleable_menu name="menu_group_plus">
<menu_item_check label="新しい順に並べ替え" name="sort_most"/>
<menu_item_check label="名前で並べ替え" name="sort_name"/>
- <menu_item_check label="人のアイコン表示" name="view_icons"/>
+ <menu_item_check label="人物のアイコン表示" name="view_icons"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/ja/menu_people_recent_view_sort.xml
deleted file mode 100644
index b4f177a068..0000000000
--- a/indra/newview/skins/default/xui/ja/menu_people_recent_view_sort.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="新しい順に並べ替え" name="sort_most"/>
- <menu_item_check label="名前で並べ替え" name="sort_name"/>
- <menu_item_check label="人のアイコン表示" name="view_icons"/>
- <menu_item_call label="ブロックされた住人とオブジェクトを表示" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_picks.xml b/indra/newview/skins/default/xui/ja/menu_picks.xml
index 011d3d2526..ef4d9bc369 100644
--- a/indra/newview/skins/default/xui/ja/menu_picks.xml
+++ b/indra/newview/skins/default/xui/ja/menu_picks.xml
@@ -1,8 +1,10 @@
<?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="テレポート" name="pick_teleport"/>
- <menu_item_call label="地図" name="pick_map"/>
+ <menu_item_call label="ピックの情報" name="pick_info"/>
+ <menu_item_call label="ピックを編集" name="pick_edit"/>
+ <menu_item_call label="テレポート" name="pick_teleport"/>
+ <menu_item_call label="マップに表示" name="pick_map"/>
+ <menu_item_separator name="pick_separator"/>
<menu_item_call label="削除" name="pick_delete"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_place.xml b/indra/newview/skins/default/xui/ja/menu_place.xml
index a9f05e126d..fc1ec43c6c 100644
--- a/indra/newview/skins/default/xui/ja/menu_place.xml
+++ b/indra/newview/skins/default/xui/ja/menu_place.xml
@@ -2,6 +2,4 @@
<toggleable_menu name="place_overflow_menu">
<menu_item_call label="ランドマークを作成" name="landmark"/>
<menu_item_call label="ピックを作成" name="pick"/>
- <menu_item_call label="入場許可を購入" name="pass"/>
- <menu_item_call label="編集" name="edit"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_place_add_button.xml b/indra/newview/skins/default/xui/ja/menu_place_add_button.xml
index d19bc44451..575b61ffa5 100644
--- a/indra/newview/skins/default/xui/ja/menu_place_add_button.xml
+++ b/indra/newview/skins/default/xui/ja/menu_place_add_button.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="menu_create">
- <menu_item_call label="フォルダを追加" name="add_folder"/>
- <menu_item_call label="ランドマークを追加" name="add_landmark"/>
+ <menu_item_call label="現在の場所にランドマーク作成" name="add_landmark"/>
+ <menu_item_call label="フォルダ作成" name="add_folder"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml
index c455204722..9b1bd4f18b 100644
--- a/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml
+++ b/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml
@@ -1,16 +1,15 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="menu_folder_gear">
<menu_item_call label="ランドマークを追加" name="add_landmark"/>
<menu_item_call label="フォルダを追加" name="add_folder"/>
<menu_item_call label="アイテムを復元" name="restore_item"/>
- <menu_item_call label="切り取り" name="cut"/>
+ <menu_item_separator/>
+ <menu_item_call label="カット" name="cut"/>
<menu_item_call label="コピー" name="copy_folder"/>
- <menu_item_call label="貼り付け" name="paste"/>
+ <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"/>
+ <menu_item_separator/>
+ <menu_item_call label="広げる" name="expand"/>
+ <menu_item_call label="閉じる" name="collapse"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml
index 579f2c2cbd..594a2016b1 100644
--- a/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml
+++ b/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml
@@ -1,19 +1,22 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="menu_ladmark_gear">
<menu_item_call label="テレポート" name="teleport"/>
- <menu_item_call label="もっと詳しく" name="more_info"/>
- <menu_item_call label="地図に表示" name="show_on_map"/>
- <menu_item_call label="ランドマークを追加" name="add_landmark"/>
- <menu_item_call label="フォルダを追加" name="add_folder"/>
- <menu_item_call label="アイテムを復元" name="restore_item"/>
- <menu_item_call label="切り取り" name="cut"/>
+ <menu_item_call label="共有" name="share"/>
+ <menu_item_call label="ランドマークの表示/編集" name="more_info"/>
<menu_item_call label="ランドマークをコピー" name="copy_landmark"/>
- <menu_item_call label="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="Move to Landmarks"/>
+ <menu_item_call label="お気に入りに移動" name="Move to Favorites"/>
<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="マップに表示" name="show_on_map"/>
+ <menu_item_call label="SLurlをコピー" name="copy_slurl"/>
<menu_item_call label="ピックを作成" name="create_pick"/>
+ <menu_item_call label="アイテムを復元" name="restore_item"/>
+ <menu_item_separator/>
+ <menu_item_call label="カット" name="cut"/>
+ <menu_item_call label="コピー" name="copy_landmark"/>
+ <menu_item_call label="ペースト" name="paste"/>
+ <menu_item_call label="名前の変更" name="rename"/>
+ <menu_item_call label="削除" name="delete"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_places_gear_sorting.xml b/indra/newview/skins/default/xui/ja/menu_places_gear_sorting.xml
new file mode 100644
index 0000000000..70dd50c25d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_places_gear_sorting.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_sorter_gear">
+ <menu_item_call label="全てのフォルダを開く" name="expand_all"/>
+ <menu_item_call label="全てのフォルダを閉じる" name="collapse_all"/>
+ <menu_item_separator/>
+ <menu_item_check label="日付でソート" name="sort_by_date"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_profile_other.xml b/indra/newview/skins/default/xui/ja/menu_profile_other.xml
new file mode 100644
index 0000000000..0247a60803
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_profile_other.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Avatar Profile Menu">
+ <menu_item_call label="IM" name="im"/>
+ <menu_item_call label="テレポートのオファー" name="offer_teleport"/>
+ <menu_item_call label="テレポートのリクエスト" name="request_teleport"/>
+ <menu_item_call label="ボイスコール" name="voice_call"/>
+ <menu_item_separator/>
+ <menu_item_call label="チャット履歴を表示…" name="chat_history"/>
+ <menu_item_separator name="separator_chat_history"/>
+ <menu_item_call label="フレンド追加" name="add_friend"/>
+ <menu_item_call label="フレンド削除" name="remove_friend"/>
+ <menu_item_call label="グループに招待…" name="invite_to_group"/>
+ <menu_item_separator name="separator_invite_to_group"/>
+ <menu_item_call label="権限" name="agent_permissions"/>
+ <menu_item_call label="マップ" name="map"/>
+ <menu_item_call label="共有" name="share"/>
+ <menu_item_call label="支払い" name="pay"/>
+ <menu_item_check label="ブロック/解除" name="block_unblock"/>
+ <menu_item_separator name="separator_copy_options"/>
+ <menu_item_call label="表示名をコピー" name="copy_display_name"/>
+ <menu_item_call label="エージェント名をコピー" name="copy_name"/>
+ <menu_item_call label="エージェントIDをコピー" name="copy_id"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml b/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml
index 9d3a5dda1c..24304689ce 100644
--- a/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml
+++ b/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml
@@ -1,6 +1,6 @@
<?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="マップ" name="show_on_map"/>
<menu_item_call label="支払う" name="pay"/>
<menu_item_call label="共有" name="share"/>
<menu_item_call label="ブロック" name="block"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_profile_self.xml b/indra/newview/skins/default/xui/ja/menu_profile_self.xml
new file mode 100644
index 0000000000..7c9570378e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_profile_self.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Avatar Profile Menu Self">
+ <menu_item_call label="表示名を編集" name="edit_display_name"/>
+ <menu_item_call label="パートナーを編集" name="edit_partner"/>
+ <menu_item_call label="画像をアップロード" name="upload_photo"/>
+ <menu_item_call label="画像を変更" name="change_photo"/>
+ <menu_item_call label="画像を削除" name="remove_photo"/>
+ <menu_item_separator name="separator_copy_options"/>
+ <menu_item_call label="表示名をコピー" name="copy_display_name"/>
+ <menu_item_call label="エージェント名をコピー" name="copy_name"/>
+ <menu_item_call label="エージェントIDをコピー" name="copy_id"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_save_outfit.xml b/indra/newview/skins/default/xui/ja/menu_save_outfit.xml
index 6513d9264a..0533c8677b 100644
--- a/indra/newview/skins/default/xui/ja/menu_save_outfit.xml
+++ b/indra/newview/skins/default/xui/ja/menu_save_outfit.xml
@@ -1,5 +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"/>
+ <menu_item_call label="名前をつけて保存" name="save_as_new_outfit"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_save_settings.xml b/indra/newview/skins/default/xui/ja/menu_save_settings.xml
index 44fb1fb30b..0e8e25955f 100644
--- a/indra/newview/skins/default/xui/ja/menu_save_settings.xml
+++ b/indra/newview/skins/default/xui/ja/menu_save_settings.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="save_settings_menu">
<menu_item_check label="保存" name="save_settings"/>
- <menu_item_check label="別名で保存" name="save_as_new_settings"/>
- <menu_item_check label="約束する" name="commit_changes"/>
+ <menu_item_check label="名前をつけて保存" name="save_as_new_settings"/>
+ <menu_item_check label="変更をコミット" name="commit_changes"/>
<menu_item_check label="自分にのみ適用" name="apply_local"/>
<menu_item_check label="区画に適用" name="apply_parcel"/>
- <menu_item_check label="リージョンに適用" name="apply_region"/>
+ <menu_item_check label="リージョン(地域)に適用" name="apply_region"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_settings_gear.xml b/indra/newview/skins/default/xui/ja/menu_settings_gear.xml
index 064eae95bf..a8ff0d3721 100644
--- a/indra/newview/skins/default/xui/ja/menu_settings_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_settings_gear.xml
@@ -3,8 +3,8 @@
<menu_item_call label="編集" name="edit_settings"/>
<menu_item_call label="自分にのみ適用" name="Settings Apply Local"/>
<menu_item_call label="区画に適用" name="Settings Apply Parcel"/>
- <menu_item_call label="リージョンに適用" name="Settings Apply Region"/>
+ <menu_item_call label="リージョン(地域)に適用" name="Settings Apply Region"/>
<menu_item_call label="コピー" name="copy_settings"/>
- <menu_item_call label="貼り付け" name="paste_settings"/>
- <menu_item_call label="UUID をコピー" name="copy_uuid"/>
+ <menu_item_call label="ペースト" name="paste_settings"/>
+ <menu_item_call label="UUIDをコピー" name="copy_uuid"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_slurl.xml b/indra/newview/skins/default/xui/ja/menu_slurl.xml
index 61ba3085d9..820cc3cd53 100644
--- a/indra/newview/skins/default/xui/ja/menu_slurl.xml
+++ b/indra/newview/skins/default/xui/ja/menu_slurl.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
- <menu_item_call label="URL について" name="about_url"/>
- <menu_item_call label="URL にテレポートする" name="teleport_to_url"/>
- <menu_item_call label="地図" name="show_on_map"/>
+ <menu_item_call label="URLについて" name="about_url"/>
+ <menu_item_call label="URLにテレポートする" name="teleport_to_url"/>
+ <menu_item_call label="マップ" name="show_on_map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/ja/menu_teleport_history_gear.xml
index 901eab9166..e5e5b7b1ba 100644
--- a/indra/newview/skins/default/xui/ja/menu_teleport_history_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_teleport_history_gear.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<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_separator name="Landmark Separator"/>
+ <menu_item_call label="フォルダをすべて展開" name="Expand all folders"/>
+ <menu_item_call label="フォルダをすべて縮小" name="Collapse all folders"/>
<menu_item_call label="テレポートの履歴をクリア" name="Clear Teleport History"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/ja/menu_teleport_history_item.xml
index 1cc230e5b6..c26b70e9e1 100644
--- a/indra/newview/skins/default/xui/ja/menu_teleport_history_item.xml
+++ b/indra/newview/skins/default/xui/ja/menu_teleport_history_item.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="Teleport History Item Menu">
<menu_item_call label="テレポート" name="Teleport"/>
- <menu_item_call label="もっと詳しく" name="More Information"/>
- <menu_item_call label="SLurl をコピー" name="CopyToClipboard"/>
+ <menu_item_call label="より詳細な情報" name="More Information"/>
+ <menu_item_call label="SLurlをコピー" name="CopyToClipboard"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_text_editor.xml b/indra/newview/skins/default/xui/ja/menu_text_editor.xml
index eda973c888..3a5892bafc 100644
--- a/indra/newview/skins/default/xui/ja/menu_text_editor.xml
+++ b/indra/newview/skins/default/xui/ja/menu_text_editor.xml
@@ -9,7 +9,7 @@
<menu_item_call label="無視に追加" name="Add to Ignore"/>
<menu_item_call label="切り取り" name="Cut"/>
<menu_item_call label="コピー" name="Copy"/>
- <menu_item_call label="貼り付け" name="Paste"/>
+ <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/ja/menu_toolbars.xml b/indra/newview/skins/default/xui/ja/menu_toolbars.xml
index d5363a5131..a54f7bdef7 100644
--- a/indra/newview/skins/default/xui/ja/menu_toolbars.xml
+++ b/indra/newview/skins/default/xui/ja/menu_toolbars.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Toolbars Popup">
<menu_item_call label="このボタンを削除" name="Remove button"/>
- <menu_item_call label="ツールバーのボタン..." name="Choose Buttons"/>
+ <menu_item_call label="ツールバーのボタン…" name="Choose Buttons"/>
<menu_item_check label="アイコンとラベル" name="icons_with_text"/>
<menu_item_check label="アイコンのみ" name="icons_only"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_topinfobar.xml b/indra/newview/skins/default/xui/ja/menu_topinfobar.xml
index 1a67a2a8f7..326e6d232b 100644
--- a/indra/newview/skins/default/xui/ja/menu_topinfobar.xml
+++ b/indra/newview/skins/default/xui/ja/menu_topinfobar.xml
@@ -2,6 +2,8 @@
<menu name="menu_topinfobar">
<menu_item_check label="座標を表示" name="Show Coordinates"/>
<menu_item_check label="区画のプロパティを表示" name="Show Parcel Properties"/>
+ <menu_item_separator name="Separator"/>
<menu_item_call label="ランドマーク" name="Landmark"/>
+ <menu_item_separator name="Separator"/>
<menu_item_call label="コピー" name="Copy"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_agent.xml b/indra/newview/skins/default/xui/ja/menu_url_agent.xml
index 639602ce3c..9ce9a070f2 100644
--- a/indra/newview/skins/default/xui/ja/menu_url_agent.xml
+++ b/indra/newview/skins/default/xui/ja/menu_url_agent.xml
@@ -1,9 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
<menu_item_call label="プロフィールを表示" name="show_agent"/>
- <menu_item_call label="IM を送信..." name="send_im"/>
- <menu_item_call label="フレンドを追加..." name="add_friend"/>
- <menu_item_call label="フレンドを削除..." name="remove_friend"/>
+ <menu_item_call label="IMを送信…" name="send_im"/>
+ <menu_item_call label="フレンドを追加…" name="add_friend"/>
+ <menu_item_call label="フレンドを削除…" name="remove_friend"/>
+ <menu_item_call label="嫌がらせの報告" name="report_abuse"/>
<menu_item_call label="名前をクリップボードにコピー" name="url_copy_label"/>
<menu_item_call label="SLurl をクリップボードにコピー" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_experience.xml b/indra/newview/skins/default/xui/ja/menu_url_experience.xml
index 582784c2f0..09d4dce74d 100644
--- a/indra/newview/skins/default/xui/ja/menu_url_experience.xml
+++ b/indra/newview/skins/default/xui/ja/menu_url_experience.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
- <menu_item_call label="SLurl をクリップボードにコピー" name="url_copy"/>
+ <menu_item_call label="SLurlをクリップボードにコピー" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_group.xml b/indra/newview/skins/default/xui/ja/menu_url_group.xml
index 1dd3d79438..ebd7f25d6e 100644
--- a/indra/newview/skins/default/xui/ja/menu_url_group.xml
+++ b/indra/newview/skins/default/xui/ja/menu_url_group.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
<menu_item_call label="グループ情報を表示" name="show_group"/>
+ <menu_item_separator/>
<menu_item_call label="グループをクリップボードにコピー" name="url_copy_label"/>
- <menu_item_call label="SLurl をクリップボードにコピー" name="url_copy"/>
+ <menu_item_call label="SLurlをクリップボードにコピー" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_http.xml b/indra/newview/skins/default/xui/ja/menu_url_http.xml
index c3da8a8686..ae97e8bd8d 100644
--- a/indra/newview/skins/default/xui/ja/menu_url_http.xml
+++ b/indra/newview/skins/default/xui/ja/menu_url_http.xml
@@ -3,5 +3,5 @@
<menu_item_call label="Web ページを開く" name="url_open"/>
<menu_item_call label="内蔵ブラウザで開く" name="url_open_internal"/>
<menu_item_call label="外部ブラウザで開く" name="url_open_external"/>
- <menu_item_call label="URLをクリップボードにコピー" name="url_copy"/>
+ <menu_item_call label="URLをクリップボードにコピー" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_inventory.xml b/indra/newview/skins/default/xui/ja/menu_url_inventory.xml
index 147ab44a1b..1805fb03bb 100644
--- a/indra/newview/skins/default/xui/ja/menu_url_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/menu_url_inventory.xml
@@ -1,6 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
- <menu_item_call label="インベントリアイテムを表示" name="show_item"/>
+ <menu_item_call label="インベントリのアイテムを表示" name="show_item"/>
+ <menu_item_separator/>
<menu_item_call label="名前をクリップボードにコピー" name="url_copy_label"/>
- <menu_item_call label="SLurl をクリップボードにコピー" name="url_copy"/>
+ <menu_item_call label="SLurlをクリップボードにコピー" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_map.xml b/indra/newview/skins/default/xui/ja/menu_url_map.xml
index 8d41e1a571..041b30d05b 100644
--- a/indra/newview/skins/default/xui/ja/menu_url_map.xml
+++ b/indra/newview/skins/default/xui/ja/menu_url_map.xml
@@ -1,6 +1,8 @@
<?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="マップに表示" name="show_on_map"/>
+ <menu_item_separator/>
<menu_item_call label="現地にテレポート" name="teleport_to_location"/>
- <menu_item_call label="SLurl をクリップボードにコピー" name="url_copy"/>
+ <menu_item_separator/>
+ <menu_item_call label="SLurlをクリップボードにコピー" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_objectim.xml b/indra/newview/skins/default/xui/ja/menu_url_objectim.xml
index 96f8b3f7b1..06defa7aed 100644
--- a/indra/newview/skins/default/xui/ja/menu_url_objectim.xml
+++ b/indra/newview/skins/default/xui/ja/menu_url_objectim.xml
@@ -1,10 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
- <menu_item_call label="オブジェクトのプロフィール..." name="show_object"/>
- <menu_item_call label="ブロック..." name="block_object"/>
+ <menu_item_call label="オブジェクトのプロフィール…" name="show_object"/>
+ <menu_item_call label="ブロック…" name="block_object"/>
<menu_item_call label="ブロック解除" name="unblock_object"/>
- <menu_item_call label="地図に表示" name="show_on_map"/>
+ <menu_item_separator/>
+ <menu_item_call label="マップに表示" name="show_on_map"/>
<menu_item_call label="オブジェクトの場所にテレポート" name="teleport_to_object"/>
+ <menu_item_separator/>
<menu_item_call label="オブジェクト名をクリップボードにコピー" name="url_copy_label"/>
- <menu_item_call label="SLurl をクリップボードにコピー" name="url_copy"/>
+ <menu_item_call label="SLurlをクリップボードにコピー" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_parcel.xml b/indra/newview/skins/default/xui/ja/menu_url_parcel.xml
index 8d264059d3..93aa1372c5 100644
--- a/indra/newview/skins/default/xui/ja/menu_url_parcel.xml
+++ b/indra/newview/skins/default/xui/ja/menu_url_parcel.xml
@@ -1,6 +1,8 @@
<?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="SLurl をクリップボードにコピー" name="url_copy"/>
+ <menu_item_separator/>
+ <menu_item_call label="マップに表示" name="show_on_map"/>
+ <menu_item_separator/>
+ <menu_item_call label="SLurlをクリップボードにコピー" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_slapp.xml b/indra/newview/skins/default/xui/ja/menu_url_slapp.xml
index a516c5a075..c80351bdae 100644
--- a/indra/newview/skins/default/xui/ja/menu_url_slapp.xml
+++ b/indra/newview/skins/default/xui/ja/menu_url_slapp.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
<menu_item_call label="このコマンドを実行" name="run_slapp"/>
- <menu_item_call label="SLurl をクリップボードにコピー" name="url_copy"/>
+ <menu_item_separator/>
+ <menu_item_call label="SLurlをクリップボードにコピー" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_slurl.xml b/indra/newview/skins/default/xui/ja/menu_url_slurl.xml
index 2c857ec915..100dbd0f99 100644
--- a/indra/newview/skins/default/xui/ja/menu_url_slurl.xml
+++ b/indra/newview/skins/default/xui/ja/menu_url_slurl.xml
@@ -1,7 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
<menu_item_call label="場所の情報を表示" name="show_place"/>
- <menu_item_call label="地図に表示" name="show_on_map"/>
+ <menu_item_separator/>
+ <menu_item_call label="マップに表示" name="show_on_map"/>
<menu_item_call label="現地にテレポート" name="teleport_to_location"/>
- <menu_item_call label="SLurl をクリップボードにコピー" name="url_copy"/>
+ <menu_item_separator/>
+ <menu_item_call label="SLurlをクリップボードにコピー" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_teleport.xml b/indra/newview/skins/default/xui/ja/menu_url_teleport.xml
index c3507a9a33..a2097ec1f9 100644
--- a/indra/newview/skins/default/xui/ja/menu_url_teleport.xml
+++ b/indra/newview/skins/default/xui/ja/menu_url_teleport.xml
@@ -1,6 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
<menu_item_call label="この場所にテレポート" name="teleport"/>
- <menu_item_call label="地図に表示" name="show_on_map"/>
- <menu_item_call label="SLurl をクリップボードにコピー" name="url_copy"/>
+ <menu_item_separator/>
+ <menu_item_call label="マップに表示" name="show_on_map"/>
+ <menu_item_separator/>
+ <menu_item_call label="SLurlをクリップボードにコピー" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml
index d5ac67b9e6..a1f3980df4 100644
--- a/indra/newview/skins/default/xui/ja/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml
@@ -1,93 +1,133 @@
-<?xml version="1.0" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
- <menu label="ミー" name="Me">
- <menu_item_call label="プロフィール..." name="Profile"/>
- <menu_item_call label="容姿..." name="ChangeOutfit"/>
- <menu_item_call label="アバターを選択..." name="Avatar Picker"/>
- <menu_item_check label="インベントリ..." name="Inventory"/>
+ <menu label="私" name="Me">
+ <menu_item_call label="プロフィール…" name="Profile"/>
+ <menu_item_check label="インベントリ…" name="Inventory"/>
<menu_item_call label="新しいインベントリウィンドウ" name="NewInventoryWindow"/>
- <menu_item_call label="場所..." name="Places"/>
- <menu_item_call label="ピック..." name="Picks"/>
- <menu_item_call label="体験..." name="Experiences"/>
- <menu_item_call label="スクリプト…" name="MyScripts"/>
- <menu_item_call label="カメラコントロール..." name="Camera Controls"/>
- <menu label="ムーブメント" name="Movement">
- <menu_item_call label="座る" name="Sit Down Here"/>
- <menu_item_call label="立ち上がる" name="Stand up"/>
- <menu_item_check label="飛ぶ" name="Fly"/>
- <menu_item_check label="常に走る" name="Always Run"/>
- <menu_item_call label="私のアニメーションを停止する" name="Stop Animating My Avatar"/>
- <menu_item_call label="歩行/走行/飛行..." name="WalkRunFly"/>
- </menu>
- <menu label="ログイン" name="Status">
- <menu_item_check label="一時退席中" name="Away"/>
- <menu_item_check label="着信拒否" name="Do Not Disturb"/>
- </menu>
- <menu_item_call label="L$ の購入..." name="Buy and Sell L$"/>
- <menu_item_call label="マーケティングプレイスのリスト..." name="MarketplaceListings"/>
- <menu_item_call label="マイアカウント..." name="Manage My Account">
- <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=ja"/>
- </menu_item_call>
- <menu_item_call label="環境設定..." name="Preferences"/>
- <menu_item_call label="ツールバーのボタン..." name="Toolbars"/>
- <menu_item_call label="全てのコントロールを非表示にする" name="Hide UI"/>
- <menu_item_check label="HUD を表示" name="Show HUD Attachments"/>
- <menu_item_call label="[APP_NAME] を終了" name="Quit"/>
+ <menu_item_call label="場所…" name="Places"/>
+ <menu_item_call label="ピック…" name="Picks"/>
+ <menu_item_call label="体験…" name="Experiences"/>
+ <menu_item_call label="カメラコントロール…" name="Camera Controls"/>
+ <menu_item_separator/>
+ <menu_item_check name="Away" label="一時退席中"/>
+ <menu_item_check name="Do Not Disturb" label="着信拒否"/>
+ <menu_item_separator/>
+ <menu_item_call label="リンデンドルの購入…" name="Buy and Sell L$"/>
+ <menu_item_call label="マーケットプレイスのリスト…" name="MarketplaceListings"/>
+ <menu_item_call label="アカウントのダッシュボード…" name="Manage My Account"/>
+ <menu_item_call label="[Membership]" name="Membership"/>
+ <menu_item_separator/>
+ <menu_item_call label="初期設定…" name="Preferences"/>
+ <menu_item_call label="ツールバーのボタン…" name="Toolbars"/>
+ <menu_item_call label="全てのコントロールを隠す" name="Hide UI" shortcut="control|shift|U"/>
+ <menu_item_check label="HUDを表示" name="Show HUD Attachments" shortcut="alt|shift|H"/>
+ <menu_item_separator/>
+ <menu_item_call label="[APP_NAME]の終了" name="Quit"/>
+ </menu>
+ <menu label="アバター" name="Avatar">
+ <menu_item_call label="着用中…" name="NowWearing"/>
+ <menu_item_call label="アウトフィット…" name="ChangeOutfit"/>
+ <menu_item_call label="ホバーする高さ…" name="Hover Height"/>
+ <menu_item_call label="シェイプの編集…" name="Edit My Shape"/>
+ <menu_item_call label="アウトフィットパーツの編集…" name="Edit Outfit"/>
+ <menu label="脱ぐ" name="Take Off &gt;">
+ <menu label="服装" 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="物理作用" name="Self Physics"/>
+ <menu_item_call label="アルファ" name="Self Alpha"/>
+ <menu_item_separator/>
+ <menu_item_call label="すべての服装" name="All Clothes"/>
+ </menu>
+ <menu label="HUD" name="Avatar Detach HUD"/>
+ <menu label="取り外す" name="Avatar Detach"/>
+ <menu_item_call label="全てを取り外す" name="Detach All"/>
+ </menu>
+ <menu_item_separator/>
+ <menu_item_call label="アバターを選択…" name="Avatar Picker"/>
+ <menu_item_separator/>
+ <menu_item_call label="座る/立つ" name="Sit stand"/>
+ <menu_item_call label="飛行/歩行" name="Fly land" shortcut="HOME"/>
+ <menu_item_call label="アニメーション停止" name="Stop Animating My Avatar"/>
+ <menu_item_check label="歩行/走行/飛行…" name="WalkRunFly"/>
+ <menu_item_check label="常時走行" name="Always Run" shortcut="control|R"/>
+ <menu_item_separator/>
+ <menu_item_check label="ジェスチャー…" name="Gestures" shortcut="control|G"/>
+ <menu_item_separator/>
+ <menu_item_call label="スケルトンをリセット" name="Reset Skeleton"/>
+ <menu_item_call label="スケルトンとアニメーションをリセット" name="Reset Skeleton And Animations"/>
+ <menu_item_call label="スクリプトを装着…" name="MyScripts"/>
+ <menu_item_separator/>
+ <menu_item_call label="アバターに関するヘルプ…" name="Help with avatars"/>
</menu>
<menu label="コミュニケーション" name="Communicate">
- <menu_item_check label="会話..." name="Conversations"/>
- <menu_item_check label="近くのチャット..." name="Nearby Chat"/>
- <menu_item_check label="話す" name="Speak"/>
- <menu_item_check label="会話ログ..." name="Conversation Log..."/>
- <menu_item_call label="Facebook..." name="Facebook"/>
- <menu_item_call label="Twitter..." name="Twitter"/>
- <menu_item_call label="Flickr..." name="Flickr"/>
- <menu label="ボイスモーフィング" name="VoiceMorphing">
- <menu_item_check label="ボイスモーフィングなし" name="NoVoiceMorphing"/>
- <menu_item_check label="プレビュー..." name="Preview"/>
- <menu_item_call label="申し込む..." name="Subscribe"/>
- <menu_item_call label="プレミアム会員特典..." name="PremiumPerk"/>
- </menu>
- <menu_item_check label="ジェスチャー..." name="Gestures"/>
+ <menu_item_check label="会話…" name="Conversations"/>
+ <menu_item_check label="近隣のチャット…" name="Nearby Chat"/>
+ <menu_item_check label="ボイスチャット" name="Speak"/>
+ <menu_item_check name="Conversation Log..." label="会話ログ…"/>
+ <menu_item_separator/>
+ <menu label="ボイスモーフィング" name="VoiceMorphing"/>
+ <menu_item_check label="ジェスチャー…" name="Gestures"/>
+ <menu_item_separator/>
<menu_item_check label="フレンド" name="My Friends"/>
<menu_item_check label="グループ" name="My Groups"/>
- <menu_item_check label="近くにいる人" name="Active Speakers"/>
- <menu_item_check label="リストをブロック" name="Block List"/>
+ <menu_item_check label="近くにいる人物" name="Active Speakers"/>
+ <menu_item_check label="ブロックリスト" name="Block List"/>
+ <menu_item_separator/>
<menu_item_check label="着信拒否" name="Do Not Disturb"/>
</menu>
- <menu label="世界" name="World">
+ <menu label="ワールド" name="World">
<menu_item_call label="現在地をランドマーク" name="Create Landmark Here"/>
- <menu_item_call label="行き先..." name="Destinations"/>
- <menu_item_check label="世界地図" name="World Map"/>
+ <menu_item_call label="行き先…" name="Destinations"/>
+ <menu_item_check label="ワールドマップ" name="World Map"/>
<menu_item_check label="ミニマップ" name="Mini-Map"/>
<menu_item_call label="イベント" name="Events"/>
- <menu_item_check label="検索..." name="Search"/>
+ <menu_item_check label="検索…" name="Search"/>
+ <menu_item_separator/>
<menu_item_call label="ホームにテレポート" name="Teleport Home"/>
<menu_item_call label="現在地をホームに設定" name="Set Home to Here"/>
+ <menu_item_separator/>
<menu_item_call label="スナップショット" name="Take Snapshot"/>
+ <menu_item_call label="360度スナップショット" name="Capture 360"/>
+ <menu_item_separator/>
<menu_item_call label="場所のプロフィール" name="Place Profile"/>
<menu_item_call label="土地情報" name="About Land"/>
- <menu_item_call label="地域 / 不動産" name="RegionEstate"/>
- <menu_item_call label="保有地..." name="My Land"/>
+ <menu_item_call label="リージョン(地域)/不動産" name="RegionEstate"/>
+ <menu_item_call label="自分のLindenホーム…" name="Linden Home"/>
+ <menu_item_call label="自分の所有地…" name="My Land"/>
<menu_item_call label="この土地を購入" name="Buy Land"/>
+ <menu_item_separator/>
<menu label="表示" name="LandShow">
<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="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_item_check label="区画のプロパティ" name="Parcel Properties"/>
+ <menu_item_separator/>
+ <menu_item_check label="拡張メニュー" name="Show Advanced Menu"/>
</menu>
+ <menu_item_check label="グラフィック性能の最適化…" name="Performance"/>
+ <menu_item_separator/>
<menu label="環境" name="Environment">
- <menu_item_check label="日の出" name="Sunrise"/>
+ <menu_item_check label="夜明け" name="Sunrise"/>
<menu_item_check label="正午" name="Noon"/>
- <menu_item_check label="日没" name="Sunset"/>
+ <menu_item_check label="夕方" name="Sunset"/>
<menu_item_check label="深夜" name="Midnight"/>
<menu_item_check label="共有された環境を使用" name="Use Shared Environment"/>
- <menu_item_call label="私の環境…" name="my_environs"/>
- <menu_item_call label="個人的な照明…" name="adjustment_tool"/>
- <menu_item_check label="雲を一時停止" name="pause_clouds"/>
+ <menu_item_separator/>
+ <menu_item_call label="自分の環境…" name="my_environs"/>
+ <menu_item_call label="自分の光源…" name="adjustment_tool"/>
+ <menu_item_separator/>
+ <menu_item_check label="雲の動きを一時停止" name="pause_clouds"/>
</menu>
</menu>
<menu label="制作" name="BuildTools">
@@ -100,289 +140,328 @@
<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_item_call label="リンク解除" name="Unlink"/>
+ <menu_item_check label="リンクされた部分の編集" name="Edit Linked Parts"/>
<menu label="要素を選択" name="Select Elements">
<menu_item_call label="次のパーツまたは面を選択" name="Select Next Part or Face"/>
<menu_item_call label="前のパーツまたは面を選択" name="Select Previous Part or Face"/>
<menu_item_call label="次のパーツまたは面を含める" name="Include Next Part or Face"/>
<menu_item_call label="前のパーツまたは面を含める" name="Include Previous Part or Face"/>
</menu>
- <menu_item_call label="リージョンオブジェクト" name="pathfinding_linkset_menu_item"/>
- <menu_item_call label="選択したものに焦点を合わせる" name="Focus on Selection"/>
- <menu_item_call label="選択したものをズームする" name="Zoom to Selection"/>
+ <menu_item_call label="リージョン(地域)オブジェクト" name="pathfinding_linkset_menu_item"/>
+ <menu_item_separator/>
+ <menu_item_call label="選択をフォーカス" name="Focus on Selection"/>
+ <menu_item_call label="選択をズーム" name="Zoom to Selection"/>
+ <menu_item_separator/>
<menu label="オブジェクト" name="Object">
- <menu_item_call label="買う" name="Menu Object Buy"/>
- <menu_item_call label="取る" name="Menu Object Take"/>
- <menu_item_call label="コピーを取る" name="Take Copy"/>
+ <menu_item_call label="購入" name="Menu Object Buy"/>
+ <menu_item_call label="取得" name="Menu Object Take"/>
+ <menu_item_call label="コピーを取得" name="Take Copy"/>
<menu_item_call label="オブジェクトの中身に保存" name="Save Object Back to Object Contents"/>
- <menu_item_call label="オブジェクトを返却する" name="Return Object back to Owner"/>
+ <menu_item_call label="オブジェクトを返却" name="Return Object back to Owner"/>
<menu_item_call label="複製" name="DuplicateObject"/>
</menu>
<menu label="スクリプト" name="Scripts">
- <menu_item_check label="スクリプトの警告/エラー..." name="Script debug"/>
- <menu_item_call label="スクリプトのリコンパイル(Mono)" name="Mono"/>
- <menu_item_call label="スクリプトのリコンパイル(LSL)" name="LSL"/>
+ <menu_item_check label="スクリプトの警告/エラー…" name="Script debug"/>
+ <menu_item_call label="スクリプトの再コンパイル(Mono)" name="Mono"/>
+ <menu_item_call label="スクリプトの再コンパイル(LSL)" name="LSL"/>
<menu_item_call label="スクリプトのリセット" name="Reset Scripts"/>
<menu_item_call label="スクリプトを実行中にする" name="Set Scripts to Running"/>
<menu_item_call label="スクリプトを実行停止にする" name="Set Scripts to Not Running"/>
</menu>
- <menu label="パスファインディング" name="Pathfinding">
- <menu_item_call label="リージョンオブジェクト" name="pathfinding_linksets_menu_item"/>
- <menu_item_call label="キャラクター..." name="pathfinding_characters_menu_item"/>
- <menu_item_call label="表示/テスト..." name="pathfinding_console_menu_item"/>
- <menu_item_call label="地域の再構築" name="pathfinding_rebake_navmesh_item"/>
+ <menu label="経路探索" name="Pathfinding">
+ <menu_item_call label="リージョン(地域)のオブジェクト" name="pathfinding_linksets_menu_item"/>
+ <menu_item_call label="キャラクター…" name="pathfinding_characters_menu_item"/>
+ <menu_item_call label="表示/テスト…" name="pathfinding_console_menu_item"/>
+ <menu_item_call label="リージョン(地域)の再構築" name="pathfinding_rebake_navmesh_item"/>
</menu>
+ <menu_item_separator/>
<menu label="オプション" name="Options">
<menu_item_check label="権限の詳細を表示する" name="DebugPermissions"/>
- <menu_item_check label="私のオブジェクトだけを選択する" name="Select Only My Objects"/>
+ <menu_item_separator/>
+ <menu_item_check label="自分のオブジェクトだけを選択する" name="Select Only My Objects"/>
<menu_item_check label="動的オブジェクトだけを選択する" name="Select Only Movable Objects"/>
<menu_item_check label="範囲内を選択する" name="Select By Surrounding"/>
- <menu_item_check label="選択外形を表示" name="Show Selection Outlines"/>
+ <menu_item_separator/>
+ <menu_item_check label="選択のアウトラインを表示" name="Show Selection Outlines"/>
<menu_item_check label="隠れた位置の選択も表示する" name="Show Hidden Selection"/>
- <menu_item_check label="選択した光の半径範囲を表示する" name="Show Light Radius for Selection"/>
+ <menu_item_check label="選択した光の効果範囲を表示する" name="Show Light Radius for Selection"/>
<menu_item_check label="選択ビームを表示する" name="Show Selection Beam"/>
- <menu_item_check label="グリッドポイントにスナップする" name="Snap to Grid"/>
- <menu_item_call label="オブジェクトの XY 軸をグリッドにスナップする" name="Snap Object XY to Grid"/>
+ <menu_item_separator/>
+ <menu_item_check label="グリッド吸着" name="Snap to Grid"/>
+ <menu_item_call label="オブジェクトのXY軸をグリッドに吸着" name="Snap Object XY to Grid"/>
<menu_item_call label="選択をグリッドに使用する" name="Use Selection for Grid"/>
- <menu_item_call label="グリッドオプション..." name="Grid Options"/>
- <menu_item_call label="デフォルト権限の設定..." name="Set default permissions"/>
+ <menu_item_separator/>
+ <menu_item_call label="グリッドオプション…" name="Grid Options"/>
+ <menu_item_call label="デフォルトの権限設定…" name="Set default permissions"/>
</menu>
<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="モデル" name="Upload Model"/>
- <menu_item_call label="一括 (ファイルにつきL$[COST])..." name="Bulk Upload"/>
- </menu>
- <menu_item_call label="元に戻す" name="Undo"/>
+ <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="モデル…" name="Upload Model"/>
+ <menu_item_call label="一括…" name="Bulk Upload"/>
+ </menu>
+ <menu_item_separator/>
+ <menu_item_call label="取り消し" name="Undo"/>
<menu_item_call label="やり直し" name="Redo"/>
</menu>
<menu label="ヘルプ" name="Help">
- <menu_item_call label="ハウツー..." name="How To"/>
- <menu_item_call label="クイックスタート" name="Quickstart"/>
+ <menu_item_call label="ガイドブック" name="How To"/>
+ <menu_item_separator/>
<menu_item_call label="ナレッジベース" name="Knowledge Base"/>
<menu_item_call label="Wiki" name="Wiki"/>
<menu_item_call label="コミュニティフォーラム" name="Community Forums"/>
- <menu_item_call label="日本語サポートページ" name="Support portal"/>
- <menu_item_call label="[SECOND_LIFE] ニュース" name="Second Life News"/>
- <menu_item_call label="[SECOND_LIFE] ブログ" name="Second Life Blogs"/>
+ <menu_item_call label="サポートページ" name="Support portal"/>
+ <menu_item_call label="[SECOND_LIFE]ニュース" name="Second Life News"/>
+ <menu_item_call label="[SECOND_LIFE]ブログ" name="Second Life Blogs"/>
+ <menu_item_separator/>
<menu_item_call label="嫌がらせを報告する" name="Report Abuse"/>
<menu_item_call label="バグを報告する" name="Report Bug"/>
- <menu_item_call label="衝突・プッシュ・打撃" name="Bumps, Pushes &amp;amp; Hits"/>
- <menu_item_call label="[APP_NAME] について" name="About Second Life"/>
+ <menu_item_separator/>
+ <menu_item_call label="衝突・プッシュ&打撃" name="Bumps, Pushes &amp;amp; Hits"/>
+ <menu_item_call label="[APP_NAME]について" name="About Second Life"/>
</menu>
- <menu label="アドバンス" name="Advanced">
- <menu_item_call label="テクスチャのリベークをする" name="Rebake Texture"/>
- <menu_item_call label="UI のサイズをデフォルトに設定する" name="Set UI Size to Default"/>
- <menu_item_call label="ウィンドウのサイズを設定する" name="Set Window Size..."/>
- <menu_item_check label="遠くのオブジェクトを選択しない" name="Limit Select Distance"/>
+ <menu label="拡張" name="Advanced">
+ <menu_item_call label="テクスチャをリベークする" name="Rebake Texture"/>
+ <menu_item_call label="UIサイズをデフォルトにする" name="Set UI Size to Default"/>
+ <menu_item_call label="ウィンドウサイズ設定…" name="Set Window Size..."/>
+ <menu_item_separator/>
+ <menu_item_check label="オブジェクトの選択距離の制限" name="Limit Select Distance"/>
<menu_item_check label="カメラの距離移動を制限しない" name="Disable Camera Distance"/>
+ <menu_item_separator/>
<menu_item_check label="高解像度スナップショット" name="HighResSnapshot"/>
- <menu_item_check label="シャッター音とアニメーションなしでスナップショットをディスクに保存する" name="QuietSnapshotsToDisk"/>
+ <menu_item_check label="スナップショットをディスクに保存" name="QuietSnapshotsToDisk"/>
+ <menu_item_separator/>
<menu label="パフォーマンスツール" name="Performance Tools">
- <menu_item_call label="ラグ計測器" name="Lag Meter"/>
+ <menu_item_call label="遅延メーター" name="Lag Meter"/>
<menu_item_check label="統計バー" name="Statistics Bar"/>
- <menu_item_call label="シーン ロード統計情報" name="Scene Load Statistics"/>
- <menu_item_check label="アバターの複雑さ情報を表示" name="Avatar Draw Info"/>
+ <menu_item_call label="シーン負荷の統計情報" name="Scene Load Statistics"/>
+ <menu_item_check label="アバターの複雑度を表示" name="Avatar Draw Info"/>
</menu>
- <menu label="ハイライトと目に見えるもの" name="Highlighting and Visibility">
- <menu_item_check label="チージービーコン" name="Cheesy Beacon"/>
- <menu_item_check label="パーティクルを非表示にする" name="Hide Particles"/>
- <menu_item_check label="選択したものを非表示にする" name="Hide Selected"/>
- <menu_item_check label="透明部分をハイライトする" name="Highlight Transparent"/>
- <menu_item_check label="一人称視点のときに十字線を表示する" name="ShowCrosshairs"/>
+ <menu label="ハイライトと表示" name="Highlighting and Visibility">
+ <menu_item_check label="ビーコンを簡素化" name="Cheesy Beacon"/>
+ <menu_item_check label="パーティクルを非表示" name="Hide Particles"/>
+ <menu_item_check label="選択を非表示" name="Hide Selected"/>
+ <menu_item_check label="透明部分をハイライト" name="Highlight Transparent"/>
+ <menu_item_check label="マウスルックのときに十字線を表示" name="ShowCrosshairs"/>
</menu>
- <menu label="レンダリング(種類)" name="Rendering Types">
+ <menu label="レンダリング種別" name="Rendering Types">
<menu_item_check label="シンプル" name="Rendering Type Simple"/>
<menu_item_check label="アルファ" name="Rendering Type Alpha"/>
<menu_item_check label="木" name="Rendering Type Tree"/>
<menu_item_check label="アバター" name="Rendering Type Character"/>
+ <menu_item_check label="アニメッシュ" name="Rendering Type Control Avatar"/>
<menu_item_check label="サーフェスパッチ" name="Rendering Type Surface Patch"/>
<menu_item_check label="空" name="Rendering Type Sky"/>
- <menu_item_check label="水" name="Rendering Type Water"/>
+ <menu_item_check label="水面" name="Rendering Type Water"/>
<menu_item_check label="地面" name="Rendering Type Ground"/>
- <menu_item_check label="取引高" name="Rendering Type Volume"/>
+ <menu_item_check label="ボリューム" name="Rendering Type Volume"/>
<menu_item_check label="草" name="Rendering Type Grass"/>
<menu_item_check label="雲" name="Rendering Type Clouds"/>
<menu_item_check label="パーティクル" name="Rendering Type Particles"/>
<menu_item_check label="衝突" name="Rendering Type Bump"/>
</menu>
- <menu label="レンダリング(機能)" name="Rendering Features">
- <menu_item_check label="UI" name="ToggleUI"/>
+ <menu label="レンダリング機能" name="Rendering Features">
+ <menu_item_check label="UI" name="ToggleUI"/>
<menu_item_check label="選択済" name="Selected"/>
<menu_item_check label="ハイライト" name="Highlighted"/>
- <menu_item_check label="ダイナミックテクスチャ" name="Dynamic Textures"/>
+ <menu_item_check label="動的テクスチャ" name="Dynamic Textures"/>
<menu_item_check label="足の影" name="Foot Shadows"/>
- <menu_item_check label="くもり" name="Fog"/>
- <menu_item_check label="FRInfo のテスト" name="Test FRInfo"/>
+ <menu_item_check label="フォグ" name="Fog"/>
+ <menu_item_check label="FRInfoのテスト" name="Test FRInfo"/>
<menu_item_check label="フレキシブルオブジェクト" name="Flexible Objects"/>
</menu>
- <menu_item_check label="Use Plugin Read Thread" name="Use Plugin Read Thread"/>
+ <menu_item_check label="プラグイン読み取りスレッドを使用" name="Use Plugin Read Thread"/>
<menu_item_call label="グループキャッシュのクリア" name="ClearGroupCache"/>
<menu_item_check label="マウスの平滑化" name="Mouse Smoothing"/>
<menu_item_call label="リリースキー" name="Release Keys"/>
+ <menu_item_separator/>
<menu label="ショートカット" name="Shortcuts">
- <menu_item_check label="アドバンスメニューを表示 - レガシーのショートカット" name="Show Advanced Menu - legacy shortcut"/>
<menu_item_call label="ウィンドウを閉じる" name="Close Window"/>
<menu_item_call label="全てのウィンドウを閉じる" name="Close All Windows"/>
+ <menu_item_separator/>
<menu_item_call label="スナップショットをディスクに保存する" name="Snapshot to Disk"/>
- <menu_item_call label="一人称視点" name="Mouselook"/>
- <menu_item_check label="ジョイスティックフライカム" name="Joystick Flycam"/>
- <menu_item_call label="表示をリセットする" name="Reset View"/>
+ <menu_item_separator/>
+ <menu_item_call label="マウスルック" name="Mouselook"/>
+ <menu_item_check label="ジョイスティック・フライカム" name="Joystick Flycam"/>
+ <menu_item_call label="視界をリセット" name="Reset View"/>
<menu_item_call label="最後の発言者を見る" name="Look at Last Chatter"/>
- <menu_item_call label="ズームイン" name="Zoom In"/>
+ <menu_item_separator/>
+ <menu_item_call label="ズーム・イン" name="Zoom In"/>
<menu_item_call label="ズーム(デフォルト)" name="Zoom Default"/>
- <menu_item_call label="ズームアウト" name="Zoom Out"/>
+ <menu_item_call label="ズーム・アウト" name="Zoom Out"/>
</menu>
- <menu_item_call label="デバッグ設定を表示する" name="Debug Settings"/>
- <menu_item_check label="開発メニューを表示する" name="Debug Mode"/>
+ <menu_item_separator/>
+ <menu_item_call label="デバッグ設定を表示" name="Debug Settings"/>
+ <menu_item_check label="開発メニューを表示" name="Debug Mode"/>
</menu>
<menu label="開発" name="Develop">
<menu label="コンソール" name="Consoles">
<menu_item_check label="テクスチャのコンソール" name="Texture Console"/>
<menu_item_check label="デバッグコンソール" name="Debug Console"/>
<menu_item_call label="通知コンソール" name="Notifications"/>
- <menu_item_check label="地域デバッグコンソール" name="Region Debug Console"/>
+ <menu_item_check label="リージョン(地域)デバッグコンソール" name="Region Debug Console"/>
<menu_item_check label="ファーストタイマー" name="Fast Timers"/>
<menu_item_check label="メモリ" name="Memory"/>
- <menu_item_check label="風景の統計" name="Scene Statistics"/>
- <menu_item_check label="シーン ローディング モニター" name="Scene Loading Monitor"/>
+ <menu_item_check label="シーンの統計" name="Scene Statistics"/>
+ <menu_item_check label="シーンの読み込みモニター" name="Scene Loading Monitor"/>
<menu_item_call label="テクスチャ取得デバッグコンソール" name="Texture Fetch Debug Console"/>
+ <menu_item_separator/>
<menu_item_call label="リージョン情報をデバッグコンソールへ" name="Region Info to Debug Console"/>
<menu_item_call label="グループ情報をデバッグコンソールへ" name="Group Info to Debug Console"/>
<menu_item_call label="性能情報をデバッグコンソールへ" name="Capabilities Info to Debug Console"/>
+ <menu_item_separator/>
<menu_item_check label="カメラ" name="Camera"/>
<menu_item_check label="風" name="Wind"/>
- <menu_item_check label="FOV" name="FOV"/>
+ <menu_item_check label="FOV" name="FOV"/>
<menu_item_check label="バッジ" name="Badge"/>
</menu>
<menu label="情報を表示" name="Display Info">
<menu_item_check label="時間を表示する" name="Show Time"/>
- <menu_item_check label="アップロード代金を表示" name="Show Upload Cost"/>
+ <menu_item_check label="アップロードコストを表示" name="Show Upload Cost"/>
<menu_item_check label="描画情報を表示する" name="Show Render Info"/>
+ <menu_item_check label="アバターの描画情報を表示" name="Show Avatar Render Info"/>
<menu_item_check label="テクスチャ情報を表示" name="Show Texture Info"/>
<menu_item_check label="マトリックスを表示する" name="Show Matrices"/>
<menu_item_check label="カーソルを乗せた場所の色を表示する" name="Show Color Under Cursor"/>
- <menu_item_check label="メモリを表示:" name="Show Memory"/>
- <menu_item_check label="オブジェクトのアップデートを表示する" name="Show Updates"/>
+ <menu_item_check label="メモリを表示" name="Show Memory"/>
+ <menu_item_separator/>
+ <menu_item_check label="オブジェクトの更新を表示する" name="Show Updates"/>
</menu>
+ <menu_item_separator/>
<menu label="エラー実行" name="Force Errors">
<menu_item_call label="ブレークポイント" name="Force Breakpoint"/>
- <menu_item_call label="LLError とクラッシュを実行する" name="Force LLError And Crash"/>
+ <menu_item_call label="LLErrorとクラッシュを実行する" name="Force LLError And Crash"/>
<menu_item_call label="バッドメモリアクセスを実行する" name="Force Bad Memory Access"/>
+ <menu_item_call label="コルーチン内で不正なメモリアクセスを発生させる" name="Force Bad Memory Access in Coroutine"/>
<menu_item_call label="無限ループ" name="Force Infinite Loop"/>
- <menu_item_call label="ドライバのクラッシュを実行する" name="Force Driver Carsh"/>
- <menu_item_call label="ソフトウェア例外エラーの実行する" name="Force Software Exception"/>
- <menu_item_call label="ビューワの接続遮断を実行する" name="Force Disconnect Viewer"/>
+ <menu_item_call label="ドライバのクラッシュを発生させる" name="Force Driver Carsh"/>
+ <menu_item_call label="ソフトウェア例外エラーの発生させる" name="Force Software Exception"/>
+ <menu_item_call label="コルーチン内でクラッシュを発生させる" name="Force a Crash in a Coroutine"/>
+ <menu_item_call label="スレッド内でクラッシュを発生させる" name="Force a Crash in a Thread"/>
+ <menu_item_call label="ビューアーの接続遮断を実行する" name="Force Disconnect Viewer"/>
<menu_item_call label="メモリリークをシミュレートする" name="Memory Leaking Simulation"/>
</menu>
- <menu label="レンダーテスト" name="Render Tests">
- <menu_item_check label="カメラオフセット" name="Camera Offset"/>
+ <menu label="描画テスト" name="Render Tests">
+ <menu_item_check label="カメラのオフセット" name="Camera Offset"/>
<menu_item_check label="フレームレートをランダム化" name="Randomize Framerate"/>
- <menu_item_check label="定期的に遅いフレームを挿入する" name="Periodic Slow Frame"/>
+ <menu_item_check label="周期的な遅いフレーム" name="Periodic Slow Frame"/>
<menu_item_check label="フレームテスト" name="Frame Test"/>
- <menu_item_call label="フレームプロフィール" name="Frame Profile"/>
+ <menu_item_call label="フレームのプロフィール" name="Frame Profile"/>
<menu_item_call label="ベンチマーク" name="Benchmark"/>
</menu>
- <menu label="メタデータのレンダー" name="Render Metadata">
+ <menu label="メタデータの描画" name="Render Metadata">
<menu_item_check label="バウンディングボックス" name="Bounding Boxes"/>
<menu_item_check label="普通" name="Normals"/>
- <menu_item_check label="オクトリー" name="Octree"/>
+ <menu_item_check label="八分木" name="Octree"/>
<menu_item_check label="シャドウ円錐" name="Shadow Frusta"/>
<menu_item_check label="実像" name="Physics Shapes"/>
<menu_item_check label="オクルージョン" name="Occlusion"/>
<menu_item_check label="バッチの描画" name="Render Batches"/>
<menu_item_check label="タイプを更新" name="Update Type"/>
- <menu_item_check label="アニメーション部分をテクスチャで表示" name="Texture Anim"/>
+ <menu_item_check label="テクスチャのアニメ" name="Texture Anim"/>
<menu_item_check label="テクスチャ優先度" name="Texture Priority"/>
<menu_item_check label="テクスチャの範囲" name="Texture Area"/>
<menu_item_check label="側面" name="Face Area"/>
- <menu_item_check label="LOD 情報" name="LOD Info"/>
+ <menu_item_check label="LOD情報" name="LOD Info"/>
<menu_item_check label="三角形の数" name="Triangle Count"/>
- <menu_item_check label="制作キュー" name="Build Queue"/>
+ <menu_item_check label="制作・キュー" name="Build Queue"/>
<menu_item_check label="光" name="Lights"/>
<menu_item_check label="パーティクル" name="Particles"/>
<menu_item_check label="骨組みの衝突判定" name="Collision Skeleton"/>
<menu_item_check label="ジョイント" name="Joints"/>
<menu_item_check label="レイキャスト" name="Raycast"/>
<menu_item_check label="風のベクトル" name="Wind Vectors"/>
- <menu_item_check label="スカルプト" name="Sculpt"/>
+ <menu_item_check label="彫刻" name="Sculpt"/>
<menu label="テクスチャの密度" name="Texture Density">
- <menu_item_check label="なし" name="None"/>
- <menu_item_check label="現在" name="Current"/>
+ <menu_item_check label="無し" name="None"/>
+ <menu_item_check label="原行" name="Current"/>
<menu_item_check label="望ましい" name="Desired"/>
- <menu_item_check label="フル" name="Full"/>
+ <menu_item_check label="全て" name="Full"/>
</menu>
</menu>
<menu label="レンダリング" name="Rendering">
<menu_item_check label="軸" name="Axes"/>
- <menu_item_check label="接線基底" name="Tangent Basis"/>
- <menu_item_call label="選択したテクスチャ情報基底" name="Selected Texture Info Basis"/>
- <menu_item_call label="選択したマテリアル情報" name="Selected Material Info"/>
+ <menu_item_check label="接線基準" name="Tangent Basis"/>
+ <menu_item_call label="選択されたテクスチャ情報基準" name="Selected Texture Info Basis"/>
+ <menu_item_call label="選択したマテリアルの情報" name="Selected Material Info"/>
<menu_item_check label="ワイヤーフレーム" name="Wireframe"/>
- <menu_item_check label="オブジェクト間オクルージョン" name="Object-Object Occlusion"/>
- <menu_item_check label="高度なライティングモデル" name="Advanced Lighting Model"/>
- <menu_item_check label="太陽・月・プロジェクタからの影" name="Shadows from Sun/Moon/Projectors"/>
- <menu_item_check label="SSAO と影の平滑化" name="SSAO and Shadow Smoothing"/>
- <menu_item_check label="GL デバッグ" name="Debug GL"/>
- <menu_item_check label="経路をデバッグ" name="Debug Pipeline"/>
+ <menu_item_check label="オブジェクト間のオクルージョン" name="Object-Object Occlusion"/>
+ <menu_item_separator/>
+ <menu_item_check label="高度な光源モデル" name="Advanced Lighting Model"/>
+ <menu_item_check label=" 太陽・月・プロジェクタからの影" name="Shadows from Sun/Moon/Projectors"/>
+ <menu_item_check label=" SSAOと影のスムージング" name="SSAO and Shadow Smoothing"/>
+ <menu_item_separator/>
+ <menu_item_check label="次回起動時にGLをデバッグ" name="Debug GL"/>
+ <menu_item_check label="パイプラインをデバッグ" name="Debug Pipeline"/>
<menu_item_check label="自動アルファマスク(遅延)" name="Automatic Alpha Masks (deferred)"/>
<menu_item_check label="自動アルファマスク(遅延なし)" name="Automatic Alpha Masks (non-deferred)"/>
<menu_item_check label="アニメーションテクスチャ" name="Animation Textures"/>
<menu_item_check label="テクスチャを無効にする" name="Disable Textures"/>
<menu_item_check label="アンビエントを無効にする" name="Disable Ambient"/>
- <menu_item_check label="日の出を無効にする" name="Disable Sunlight"/>
+ <menu_item_check label="日の光を無効にする" name="Disable Sunlight"/>
<menu_item_check label="近くの光を無効にする" name="Disable Local Lights"/>
<menu_item_check label="フル解像度テクスチャ" name="Rull Res Textures"/>
<menu_item_check label="装着された光源を描画する" name="Render Attached Lights"/>
<menu_item_check label="取り付けられたパーティクルを描画する" name="Render Attached Particles"/>
<menu_item_check label="マウスオーバーで強調表示する" name="Hover Glow Objects"/>
- <menu_item_call label="キャッシュをすぐにクリア" name="Cache Clear"/>
+ <menu_item_separator/>
+ <menu_item_call label="キャッシュを直ちにクリア" name="Cache Clear"/>
</menu>
<menu label="ネットワーク" name="Network">
<menu_item_check label="エージェントを一時停止する" name="AgentPause"/>
+ <menu_item_separator/>
<menu_item_call label="メッセージログを有効にする" name="Enable Message Log"/>
<menu_item_call label="メッセージログを使用不可にする" name="Disable Message Log"/>
- <menu_item_check label="速力が挿入されたオブジェクト" name="Velocity Interpolate Objects"/>
- <menu_item_check label="挿入されたオブジェクトの位置の Ping" name="Ping Interpolate Object Positions"/>
- <menu_item_call label="パケットドロップ" name="Drop a Packet"/>
+ <menu_item_separator/>
+ <menu_item_check label="速度補間オブジェクト" name="Velocity Interpolate Objects"/>
+ <menu_item_check label="速度補間オブジェクトへPing" name="Ping Interpolate Object Positions"/>
+ <menu_item_separator/>
+ <menu_item_call label="パケットをドロップ" name="Drop a Packet"/>
+ </menu>
+ <menu label="キャッシュ" name="Cache">
+ <menu_item_call label="ディスクキャッシュをパージ" name="Purge Disk Cache"/>
</menu>
<menu_item_call label="スクリプト付きカメラをダンプ" name="Dump Scripted Camera"/>
<menu label="レコーダー" name="Recorder">
+ <menu_item_call label="イベントの記録開始" name="Start event recording"/>
+ <menu_item_call label="イベントの記録停止" name="Stop event recording"/>
+ <menu_item_call label="イベントの記録のプレイバック" name="Playback event recording"/>
<menu_item_call label="再生開始" name="Start Playback"/>
<menu_item_call label="再生停止" name="Stop Playback"/>
<menu_item_check label="再生をループ" name="Loop Playback"/>
<menu_item_call label="記録開始" name="Start Record"/>
<menu_item_call label="記録停止" name="Stop Record"/>
</menu>
- <menu label="世界" name="DevelopWorld">
+ <menu label="ワールド" name="DevelopWorld">
<menu_item_check label="シムの太陽の設定を無視する" name="Sim Sun Override"/>
<menu_item_check label="固定された天気" name="Fixed Weather"/>
<menu_item_call label="リージョンオブジェクトのキャッシュをダンプ" name="Dump Region Object Cache"/>
+ <menu_item_call label="関心リスト:フルアップデート" name="Interest List: Full Update"/>
</menu>
- <menu label="UI" name="UI">
+ <menu label="UI" name="UI">
<menu_item_call label="メディアブラウザ" name="Media Browser"/>
- <menu_item_call label="SelectMgr をダンプ" name="Dump SelectMgr"/>
<menu_item_call label="インベントリの出力" name="Dump Inventory"/>
<menu_item_call label="タイマーをダンプ" name="Dump Timers"/>
<menu_item_call label="フォーカスホールダーをダンプ" name="Dump Focus Holder"/>
<menu_item_call label="選択したオブジェクト情報をプリント" name="Print Selected Object Info"/>
<menu_item_call label="エージェント情報をプリント" name="Print Agent Info"/>
- <menu_item_check label="SelectMgr のデバッグ" name="Debug SelectMgr"/>
+ <menu_item_separator/>
+ <menu_item_check label="SelectMgrのデバッグ" name="Debug SelectMgr"/>
<menu_item_check label="ダブルクリック" name="Debug Clicks"/>
<menu_item_check label="デバッグ表示" name="Debug Views"/>
<menu_item_check label="デバッグ名ツールチップ" name="Debug Name Tooltips"/>
- <menu_item_check label="マウス操作で発生するもののデバッグ" name="Debug Mouse Events"/>
+ <menu_item_check label="マウスイベントのデバッグ" name="Debug Mouse Events"/>
<menu_item_check label="デバッグキー" name="Debug Keys"/>
- <menu_item_check label="WindowProc のデバッグ" name="Debug WindowProc"/>
+ <menu_item_check label="WindowProcのデバッグ" name="Debug WindowProc"/>
</menu>
- <menu label="XUI" name="XUI">
- <menu_item_call label="色の設定を更新する" name="Reload Color Settings"/>
- <menu_item_call label="フォントテストを表示する" name="Show Font Test"/>
- <menu_item_check label="XUI ネームを表示する" name="Show XUI Names"/>
- <menu_item_call label="テスト用 IM を送信する" name="Send Test IMs"/>
- <menu_item_call label="名前のキャッシュをフラッシュ" name="Flush Names Caches"/>
+ <menu label="XUI" name="XUI">
+ <menu_item_call label="色の設定をリロード" name="Reload Color Settings"/>
+ <menu_item_call label="フォントテストを表示" name="Show Font Test"/>
+ <menu_item_check label="XUI名を表示" name="Show XUI Names"/>
+ <menu_item_call label="テストIMを送信する" name="Send Test IMs"/>
+ <menu_item_call label="名前キャッシュをフラッシュ" name="Flush Names Caches"/>
</menu>
<menu label="アバター" name="Character">
<menu label="ベークドテクスチャを取得する" name="Grab Baked Texture">
@@ -393,16 +472,16 @@
<menu_item_call label="スカート" name="Grab Skirt"/>
</menu>
<menu label="キャラクターテスト" name="Character Tests">
- <menu_item_call label="容姿を XML に保存する" name="Appearance To XML"/>
+ <menu_item_call label="容姿をXMLに保存する" name="Appearance To XML"/>
<menu_item_call label="キャラクタジオメトリの切り替え" name="Toggle Character Geometry"/>
<menu_item_call label="男性アバターのテスト" name="Test Male"/>
<menu_item_call label="女性アバターのテスト" name="Test Female"/>
<menu_item_check label="選択アバター許可" name="Allow Select Avatar"/>
</menu>
- <menu label="アニメーションのスピード" name="Animation Speed">
- <menu_item_call label="すべてのアニメーションのスピードを 10% アップ" name="All Animations 10 Faster"/>
- <menu_item_call label="すべてのアニメーションのスピードを 10% ダウン" name="All Animations 10 Slower"/>
- <menu_item_call label="すべてのアニメーションのスピードをリセット" name="Reset All Animation Speed"/>
+ <menu label="アニメーションの速度" name="Animation Speed">
+ <menu_item_call label="すべてのアニメーションを10%速く" name="All Animations 10 Faster"/>
+ <menu_item_call label="すべてのアニメーションを10%遅く" name="All Animations 10 Slower"/>
+ <menu_item_call label="すべてのアニメーションの速度をリセット" name="Reset All Animation Speed"/>
<menu_item_check label="アニメーションをスローモーション" name="Slow Motion Animations"/>
</menu>
<menu_item_call label="パラメータを強制的にデフォルトにする" name="Force Params to Default"/>
@@ -410,19 +489,21 @@
<menu_item_check label="見ているものを表示する" name="Show Look At"/>
<menu_item_check label="クリックした場所を表示する" name="Show Point At"/>
<menu_item_check label="結合部のアップデートのデバッグ" name="Debug Joint Updates"/>
- <menu_item_check label="LOD を無効にする" name="Disable LOD"/>
- <menu_item_check label="キャラクター Vis のデバッグ" name="Debug Character Vis"/>
- <menu_item_check label="骨組みの衝突判定を表示する" name="Show Collision Skeleton"/>
- <menu_item_check label="骨を表示" name="Show Bones"/>
- <menu_item_check label="エージェントのターゲットを表示する" name="Display Agent Target"/>
+ <menu_item_check label="LODを無効にする" name="Disable LOD"/>
+ <menu_item_check label="キャラクターVisのデバッグ" name="Debug Character Vis"/>
+ <menu_item_check label="スケルトンの衝突判定を表示する" name="Show Collision Skeleton"/>
+ <menu_item_check label="ボーンを表示" name="Show Bones"/>
+ <menu_item_check label="エージェントの目標を表示する" name="Display Agent Target"/>
<menu_item_check label="インポスターの範囲を表示" name="Show Impostor Extents"/>
- <menu_item_call label="アタッチメントをダンプ" name="Dump Attachments"/>
- <menu_item_call label="アバターテクスチャをデバッグ" name="Debug Avatar Textures"/>
+ <menu_item_call label="装着物のダンプ" name="Dump Attachments"/>
+ <menu_item_call label="アバターのテクスチャをデバッグ" name="Debug Avatar Textures"/>
<menu_item_call label="ローカルテクスチャをダンプ" name="Dump Local Textures"/>
</menu>
- <menu_item_check label="HTTP Texture" name="HTTP Textures"/>
+ <menu_item_separator/>
+ <menu_item_check label="HTTPテスクチャ" name="HTTP Textures"/>
<menu_item_call label="圧縮画像" name="Compress Images"/>
- <menu_item_call label="Visual Leak Detector を有効にする" name="Enable Visual Leak Detector"/>
+ <menu_item_call label="圧縮ファイルテスト" name="Compress File Test"/>
+ <menu_item_call label="Visual Leak Detectorを有効にする" name="Enable Visual Leak Detector"/>
<menu_item_check label="デバッグ用のミニダンプを出力する" name="Output Debug Minidump"/>
<menu_item_check label="次回の起動時にコンソールウィンドウを表示する" name="Console Window"/>
<menu label="ログレベルを設定" name="Set Logging Level">
@@ -432,63 +513,60 @@
<menu_item_check label="エラー" name="Error"/>
<menu_item_check label="なし" name="None"/>
</menu>
+ <menu_item_separator/>
<menu_item_call label="管理者ステータスの呼び出し" name="Request Admin Options"/>
<menu_item_call label="管理者ステータス解除" name="Leave Admin Options"/>
<menu_item_check label="管理者メニューを表示する" name="View Admin Options"/>
- <menu_item_check name="Show Avatar Render Info" label="アバター描画情報を表示"/>
- <menu_item_call name="Playback event recording" label="イベントの記録を再生する"/>
- <menu_item_call name="FB Connect Test" label="FB コンテンツテスト"/>
- <menu_item_call name="Stop event recording" label="イベントの記録を停止する"/>
- <menu_item_call name="Start event recording" label="イベントの記録を開始する"/>
</menu>
- <menu label="管理者" name="Admin">
+ <menu label="管理" name="Admin">
<menu label="オブジェクト" name="AdminObject">
<menu_item_call label="コピーを取る" name="Admin Take Copy"/>
- <menu_item_call label="私を所有者にする" name="Force Owner To Me"/>
+ <menu_item_call label="自分を所有者にする" name="Force Owner To Me"/>
<menu_item_call label="所有者権限の実行" name="Force Owner Permissive"/>
<menu_item_call label="削除" name="Delete"/>
<menu_item_call label="ロック" name="Lock"/>
- <menu_item_call label="アセット ID を取得" name="Get Assets IDs"/>
+ <menu_item_call label="アセットのIDを取得" name="Get Assets IDs"/>
</menu>
<menu label="区画" name="Parcel">
- <menu_item_call label="私を所有者にする" name="Owner To Me"/>
- <menu_item_call label="リンデンコンテンツに設定する" name="Set to Linden Content"/>
+ <menu_item_call label="自分を所有者にする" name="Owner To Me"/>
+ <menu_item_call label="Lindenのコンテンツに設定する" name="Set to Linden Content"/>
<menu_item_call label="パブリックの土地を取得する" name="Claim Public Land"/>
</menu>
- <menu label="リージョン/地域" name="Region">
- <menu_item_call label="一時アセットデータをダンプ" name="Dump Temp Asset Data"/>
+ <menu label="リージョン(地域)" name="Region">
+ <menu_item_call label="一時アセットデータのダンプ" name="Dump Temp Asset Data"/>
<menu_item_call label="リージョンの状態を保存する" name="Save Region State"/>
</menu>
- <menu_item_call label="グリッドツール" name="God Tools"/>
+ <menu_item_call label="ゴッド・ツール" name="God Tools"/>
</menu>
- <menu label="管理者" name="Deprecated">
+ <menu label="管理" name="Deprecated">
<menu label="オブジェクトを取り付ける" name="Attach Object"/>
<menu label="オブジェクトを取り外す" name="Detach Object"/>
- <menu label="衣類を脱ぐ" name="Take Off Clothing">
+ <menu label="服装を脱ぐ" name="Take Off Clothing">
<menu_item_call label="シャツ" name="Shirt"/>
- <menu_item_call label="パンツ" name="Pants"/>
+ <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="Menu Undershirt"/>
+ <menu_item_call label="下着(下半身)" name="Menu Underpants"/>
<menu_item_call label="スカート" name="Skirt"/>
<menu_item_call label="アルファ" name="Alpha"/>
<menu_item_call label="タトゥ" name="Tattoo"/>
<menu_item_call label="ユニバーサル" name="Universal"/>
<menu_item_call label="物理作用" name="Physics"/>
- <menu_item_call label="すべての衣類" name="All Clothes"/>
+ <menu_item_call label="すべての服装" name="All Clothes"/>
</menu>
<menu label="ヘルプ" name="DeprecatedHelp">
<menu_item_call label="リンデン公式ブログ" name="Official Linden Blog"/>
<menu_item_call label="スクリプトポータル" name="Scripting Portal"/>
- <menu label="バグの報告" name="Bug Reporting">
+ <menu label="バグ報告" name="Bug Reporting">
<menu_item_call label="パブリック問題トラッカー" name="Public Issue Tracker"/>
<menu_item_call label="パブリック問題トラッカーヘルプ" name="Publc Issue Tracker Help"/>
+ <menu_item_separator/>
<menu_item_call label="バグ報告の基礎知識" name="Bug Reporing 101"/>
<menu_item_call label="セキュリティ問題" name="Security Issues"/>
- <menu_item_call label="QA Wiki" name="QA Wiki"/>
+ <menu_item_call label="品質保証ポータル" name="QA Wiki"/>
</menu>
</menu>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml
index 02029230ba..213a554bbd 100644
--- a/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml
+++ b/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml
@@ -1,13 +1,13 @@
<?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="装着" name="wear_wear"/>
+ <menu_item_call label="着替える" name="wear_replace"/>
+ <menu_item_call label="着る" name="wear_wear"/>
<menu_item_call label="追加" name="wear_add"/>
- <menu_item_call label="触る" name="touch" />
- <menu_item_call label="取り外す" name="take_off_or_detach"/>
+ <menu_item_call label="触る" name="touch"/>
+ <menu_item_call label="脱ぐ" name="take_off_or_detach"/>
<menu_item_call label="取り外す" name="detach"/>
<context_menu label="装着:" name="wearable_attach_to"/>
- <context_menu label="HUD に装着" name="wearable_attach_to_hud"/>
+ <context_menu label="HUDに装着" name="wearable_attach_to_hud"/>
<menu_item_call label="取り外す" name="take_off"/>
<menu_item_call label="編集" name="edit"/>
<menu_item_call label="アイテムのプロフィール" name="object_profile"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_wearing_gear.xml b/indra/newview/skins/default/xui/ja/menu_wearing_gear.xml
index 48aac2ed05..54c30757ea 100644
--- a/indra/newview/skins/default/xui/ja/menu_wearing_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_wearing_gear.xml
@@ -2,7 +2,7 @@
<toggleable_menu name="Gear Wearing">
<menu_item_call label="触る" name="touch"/>
<menu_item_call label="編集" name="edit_item"/>
- <menu_item_call label="アウトフットの編集" name="edit_outfit"/>
- <menu_item_call label="取り外す" name="takeoff"/>
+ <menu_item_call label="アウトフィットの編集" name="edit_outfit"/>
+ <menu_item_call label="脱ぐ" name="takeoff"/>
<menu_item_call label="アウトフィットのリストをクリップボードにコピー" name="copy"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_wearing_tab.xml b/indra/newview/skins/default/xui/ja/menu_wearing_tab.xml
index 8c331bc008..7d305e4e34 100644
--- a/indra/newview/skins/default/xui/ja/menu_wearing_tab.xml
+++ b/indra/newview/skins/default/xui/ja/menu_wearing_tab.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Wearing">
<menu_item_call label="触る" name="touch_attach"/>
- <menu_item_call label="取り外す" name="take_off"/>
+ <menu_item_call label="脱ぐ" name="take_off"/>
<menu_item_call label="取り外す" name="detach"/>
- <menu_item_call label="アウトフットの編集" name="edit_outfit"/>
+ <menu_item_call label="アウトフィットの編集" name="edit_outfit"/>
<menu_item_call label="編集" name="edit_item"/>
<menu_item_call label="オリジナルを表示" name="show_original"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/mime_types.xml b/indra/newview/skins/default/xui/ja/mime_types.xml
index 3b29a622a4..b25d4dd0cc 100644
--- a/indra/newview/skins/default/xui/ja/mime_types.xml
+++ b/indra/newview/skins/default/xui/ja/mime_types.xml
@@ -1,14 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<mimetypes name="default">
+ <defaultlabel>
+ (不明)
+ </defaultlabel>
+ <defaultwidget>
+ なし
+ </defaultwidget>
<widgetset name="web">
<label name="web_label">
Webコンテンツ
</label>
<tooltip name="web_tooltip">
- ここにWebコンテンツがあります。
+ この場所には、Webコンテンツが含まれています。
</tooltip>
<playtip name="web_playtip">
- Webコンテンツを表示
+ Web コンテンツを表示する
</playtip>
</widgetset>
<widgetset name="movie">
@@ -16,10 +22,10 @@
ムービー
</label>
<tooltip name="movie_tooltip">
- ここにはムービーがあります
+ この場所には、ムービーがあります。
</tooltip>
<playtip name="movie_playtip">
- ムービー再生
+ ムービーを再生する
</playtip>
</widgetset>
<widgetset name="image">
@@ -27,10 +33,10 @@
画像
</label>
<tooltip name="image_tooltip">
- ここには画像があります
+ この場所には、画像があります
</tooltip>
<playtip name="image_playtip">
- ここの画像を表示
+ この場所の画像を表示する
</playtip>
</widgetset>
<widgetset name="audio">
@@ -38,10 +44,10 @@
オーディオ
</label>
<tooltip name="audio_tooltip">
- ここではオーディオが聞けます
+ この場所には、オーディオがあります。
</tooltip>
<playtip name="audio_playtip">
- ここのオーディオを再生する
+ この場所のオーディオを再生する
</playtip>
</widgetset>
<widgetset name="none">
@@ -49,7 +55,7 @@
コンテンツなし
</label>
<tooltip name="none_tooltip">
- ここにメディアなし
+ この場所には、メディアがありません。
</tooltip>
</widgetset>
<scheme name="rtsp">
@@ -59,22 +65,22 @@
</scheme>
<scheme name="example">
<label name="example_label">
- 例 プラグイン スキーム トリガー
+ 例 プラグイン スキーム トリガー
</label>
</scheme>
<scheme name="libvlc">
<label name="libvlc_label">
- LibVLC 対応メディア
+ LibVLC対応メディア
</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/*">
@@ -94,17 +100,17 @@
</mimetype>
<mimetype menu="1" name="video/vnd.secondlife.qt.legacy">
<label name="vnd.secondlife.qt.legacy_label">
- ムービー (QuickTime)
+ ムービー(QuickTime)
</label>
</mimetype>
<mimetype name="application/javascript">
<label name="application/javascript_label">
- Javascript
+ JavaScript
</label>
</mimetype>
<mimetype name="application/ogg">
<label name="application/ogg_label">
- Oggオーディオ/ビデオ
+ Oggオーディオ/ビデオ
</label>
</mimetype>
<mimetype name="application/pdf">
@@ -114,22 +120,22 @@
</mimetype>
<mimetype name="application/postscript">
<label name="application/postscript_label">
- Postscriptドキュメント
+ PostScriptドキュメント
</label>
</mimetype>
<mimetype name="application/rtf">
<label name="application/rtf_label">
- リッチ・テキスト (RTF)
+ リッチ・テキスト(RTF)
</label>
</mimetype>
<mimetype name="application/smil">
<label name="application/smil_label">
- 同期マルチメディア統合言語(SMIL)
+ 同期マルチメディア統合言語(SMIL)
</label>
</mimetype>
<mimetype name="application/xhtml+xml">
<label name="application/xhtml+xml_label">
- Webページ (XHTML)
+ Webページ(XHTML)
</label>
</mimetype>
<mimetype name="application/x-director">
@@ -137,54 +143,59 @@
Macromedia Director
</label>
</mimetype>
+ <mimetype name="application/octet-stream">
+ <label name="application/octet-stream_label">
+ ストリーム
+ </label>
+ </mimetype>
<mimetype name="audio/mid">
<label name="audio/mid_label">
- オーディオ (MIDI)
+ オーディオ(MIDI)
</label>
</mimetype>
<mimetype name="audio/mpeg">
<label name="audio/mpeg_label">
- オーディオ (MP3)
+ オーディオ(MP3)
</label>
</mimetype>
<mimetype name="audio/x-aiff">
<label name="audio/x-aiff_label">
- オーディオ (AIFF)
+ オーディオ(AIFF)
</label>
</mimetype>
<mimetype name="audio/x-wav">
<label name="audio/x-wav_label">
- オーディオ (WAV)
+ オーディオ(WAV)
</label>
</mimetype>
<mimetype menu="1" name="image/bmp">
<label name="image/bmp_label">
- 画像 (BMP)
+ 画像(BMP)
</label>
</mimetype>
<mimetype menu="1" name="image/gif">
<label name="image/gif_label">
- 画像 (GIF)
+ 画像(GIF)
</label>
</mimetype>
<mimetype menu="1" name="image/jpeg">
<label name="image/jpeg_label">
- 画像 (JPEG)
+ 画像(JPEG)
</label>
</mimetype>
<mimetype menu="1" name="image/png">
<label name="image/png_label">
- 画像 (PNG)
+ 画像(PNG)
</label>
</mimetype>
<mimetype name="image/svg+xml">
<label name="image/svg+xml_label">
- 画像 (SVG)
+ 画像(SVG)
</label>
</mimetype>
<mimetype menu="1" name="image/tiff">
<label name="image/tiff_label">
- 画像 (TIFF)
+ 画像(TIFF)
</label>
</mimetype>
<mimetype menu="1" name="text/html">
@@ -204,12 +215,12 @@
</mimetype>
<mimetype menu="1" name="video/mpeg">
<label name="video/mpeg_label">
- ムービー (MPEG)
+ ムービー(MPEG)
</label>
</mimetype>
<mimetype name="video/mp4">
<label name="video/mp4_label">
- ムービー (MP4)
+ ムービー(MP4)
</label>
</mimetype>
<mimetype name="application/octet-stream">
@@ -219,22 +230,22 @@
</mimetype>
<mimetype menu="1" name="video/quicktime">
<label name="video/quicktime_label">
- ムービー (QuickTime)
+ ムービー(QuickTime)
</label>
</mimetype>
<mimetype name="video/x-ms-asf">
<label name="video/x-ms-asf_label">
- ムービー (Windows Media ASF)
+ ムービー(Windows Media ASF)
</label>
</mimetype>
<mimetype name="video/x-ms-wmv">
<label name="video/x-ms-wmv_label">
- ムービー (Windows Media WMV)
+ ムービー(Windows Media WMV)
</label>
</mimetype>
<mimetype menu="1" name="video/x-msvideo">
<label name="video/x-msvideo_label">
- ムービー (AVI)
+ ムービー(AVI)
</label>
</mimetype>
</mimetypes>
diff --git a/indra/newview/skins/default/xui/ja/mime_types_linux.xml b/indra/newview/skins/default/xui/ja/mime_types_linux.xml
index cb1e48148f..3bc18c65b0 100644
--- a/indra/newview/skins/default/xui/ja/mime_types_linux.xml
+++ b/indra/newview/skins/default/xui/ja/mime_types_linux.xml
@@ -1,11 +1,17 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<mimetypes name="default">
+ <defaultlabel>
+ (不明)
+ </defaultlabel>
+ <defaultwidget>
+ なし
+ </defaultwidget>
<widgetset name="web">
<label name="web_label">
- Web コンテンツ
+ Webコンテンツ
</label>
<tooltip name="web_tooltip">
- このロケーションには Web コンテンツが含まれています
+ この場所には、Webコンテンツが含まれています。
</tooltip>
<playtip name="web_playtip">
Web コンテンツを表示する
@@ -16,7 +22,7 @@
ムービー
</label>
<tooltip name="movie_tooltip">
- ここにはムービーがあります
+ この場所には、ムービーがあります。
</tooltip>
<playtip name="movie_playtip">
ムービーを再生する
@@ -27,10 +33,10 @@
画像
</label>
<tooltip name="image_tooltip">
- このロケーションには画像があります
+ この場所には、画像があります
</tooltip>
<playtip name="image_playtip">
- このロケーションの画像を表示する
+ この場所の画像を表示する
</playtip>
</widgetset>
<widgetset name="audio">
@@ -38,10 +44,10 @@
オーディオ
</label>
<tooltip name="audio_tooltip">
- このロケーションにはオーディオがあります
+ この場所には、オーディオがあります。
</tooltip>
<playtip name="audio_playtip">
- このロケーションのオーディオを再生する
+ この場所のオーディオを再生する
</playtip>
</widgetset>
<widgetset name="none">
@@ -49,7 +55,7 @@
コンテンツなし
</label>
<tooltip name="none_tooltip">
- ここにメディアなし
+ この場所には、メディアがありません。
</tooltip>
</widgetset>
<scheme name="rtsp">
@@ -59,12 +65,12 @@
</scheme>
<mimetype name="blank">
<label name="blank_label">
- - なし -
+ ─なし─
</label>
</mimetype>
<mimetype name="none/none">
<label name="none/none_label">
- - なし -
+ ─なし─
</label>
</mimetype>
<mimetype name="audio/*">
@@ -89,22 +95,22 @@
</mimetype>
<mimetype name="application/javascript">
<label name="application/javascript_label">
- Javascript
+ JavaScript
</label>
</mimetype>
<mimetype name="application/ogg">
<label name="application/ogg_label">
- Ogg オーディオ・ビデオ
+ Oggオーディオ/ビデオ
</label>
</mimetype>
<mimetype name="application/pdf">
<label name="application/pdf_label">
- PDF ドキュメント
+ PDFドキュメント
</label>
</mimetype>
<mimetype name="application/postscript">
<label name="application/postscript_label">
- Postscript ドキュメント
+ PostScriptドキュメント
</label>
</mimetype>
<mimetype name="application/rtf">
@@ -114,17 +120,17 @@
</mimetype>
<mimetype name="application/smil">
<label name="application/smil_label">
- Synchronized Multimedia Integration Language (SMIL)
+ 同期マルチメディア統合言語(SMIL)
</label>
</mimetype>
<mimetype name="application/xhtml+xml">
<label name="application/xhtml+xml_label">
- Web ページ(XHTML)
+ Webページ(XHTML)
</label>
</mimetype>
<mimetype name="application/x-director">
<label name="application/x-director_label">
- マクロメディアディレクター
+ Macromedia Director
</label>
</mimetype>
<mimetype name="audio/mid">
@@ -179,7 +185,7 @@
</mimetype>
<mimetype name="text/html">
<label name="text/html_label">
- Web ページ
+ Webページ
</label>
</mimetype>
<mimetype name="text/plain">
@@ -209,12 +215,12 @@
</mimetype>
<mimetype name="video/x-ms-asf">
<label name="video/x-ms-asf_label">
- ムービー(Windows Media ASF)
+ ムービー(Windows Media ASF)
</label>
</mimetype>
<mimetype name="video/x-ms-wmv">
<label name="video/x-ms-wmv_label">
- ムービー(Windows Media WMV)
+ ムービー(Windows Media WMV)
</label>
</mimetype>
<mimetype name="video/x-msvideo">
diff --git a/indra/newview/skins/default/xui/ja/mime_types_mac.xml b/indra/newview/skins/default/xui/ja/mime_types_mac.xml
index cb1e48148f..a76394703b 100644
--- a/indra/newview/skins/default/xui/ja/mime_types_mac.xml
+++ b/indra/newview/skins/default/xui/ja/mime_types_mac.xml
@@ -1,11 +1,17 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<mimetypes name="default">
+ <defaultlabel>
+ (不明)
+ </defaultlabel>
+ <defaultwidget>
+ なし
+ </defaultwidget>
<widgetset name="web">
<label name="web_label">
- Web コンテンツ
+ Webコンテンツ
</label>
<tooltip name="web_tooltip">
- このロケーションには Web コンテンツが含まれています
+ この場所には、Webコンテンツが含まれています。
</tooltip>
<playtip name="web_playtip">
Web コンテンツを表示する
@@ -16,7 +22,7 @@
ムービー
</label>
<tooltip name="movie_tooltip">
- ここにはムービーがあります
+ この場所には、ムービーがあります。
</tooltip>
<playtip name="movie_playtip">
ムービーを再生する
@@ -27,10 +33,10 @@
画像
</label>
<tooltip name="image_tooltip">
- このロケーションには画像があります
+ この場所には、画像があります
</tooltip>
<playtip name="image_playtip">
- このロケーションの画像を表示する
+ この場所の画像を表示する
</playtip>
</widgetset>
<widgetset name="audio">
@@ -38,10 +44,10 @@
オーディオ
</label>
<tooltip name="audio_tooltip">
- このロケーションにはオーディオがあります
+ この場所には、オーディオがあります。
</tooltip>
<playtip name="audio_playtip">
- このロケーションのオーディオを再生する
+ この場所のオーディオを再生する
</playtip>
</widgetset>
<widgetset name="none">
@@ -49,7 +55,7 @@
コンテンツなし
</label>
<tooltip name="none_tooltip">
- ここにメディアなし
+ この場所には、メディアがありません。
</tooltip>
</widgetset>
<scheme name="rtsp">
@@ -59,12 +65,12 @@
</scheme>
<mimetype name="blank">
<label name="blank_label">
- - なし -
+ ─なし─
</label>
</mimetype>
<mimetype name="none/none">
<label name="none/none_label">
- - なし -
+ ─なし─
</label>
</mimetype>
<mimetype name="audio/*">
@@ -89,22 +95,22 @@
</mimetype>
<mimetype name="application/javascript">
<label name="application/javascript_label">
- Javascript
+ JavasScript
</label>
</mimetype>
<mimetype name="application/ogg">
<label name="application/ogg_label">
- Ogg オーディオ・ビデオ
+ Oggオーディオ/ビデオ
</label>
</mimetype>
<mimetype name="application/pdf">
<label name="application/pdf_label">
- PDF ドキュメント
+ PDFドキュメント
</label>
</mimetype>
<mimetype name="application/postscript">
<label name="application/postscript_label">
- Postscript ドキュメント
+ PostScriptドキュメント
</label>
</mimetype>
<mimetype name="application/rtf">
@@ -114,17 +120,22 @@
</mimetype>
<mimetype name="application/smil">
<label name="application/smil_label">
- Synchronized Multimedia Integration Language (SMIL)
+ 同期マルチメディア統合言語(SMIL)
</label>
</mimetype>
<mimetype name="application/xhtml+xml">
<label name="application/xhtml+xml_label">
- Web ページ(XHTML)
+ Webページ(XHTML)
</label>
</mimetype>
<mimetype name="application/x-director">
<label name="application/x-director_label">
- マクロメディアディレクター
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="application/octet-stream">
+ <label name="application/octet-stream_label">
+ ストリーム
</label>
</mimetype>
<mimetype name="audio/mid">
@@ -179,7 +190,7 @@
</mimetype>
<mimetype name="text/html">
<label name="text/html_label">
- Web ページ
+ Webページ
</label>
</mimetype>
<mimetype name="text/plain">
@@ -209,12 +220,12 @@
</mimetype>
<mimetype name="video/x-ms-asf">
<label name="video/x-ms-asf_label">
- ムービー(Windows Media ASF)
+ ムービー(Windows Media ASF)
</label>
</mimetype>
<mimetype name="video/x-ms-wmv">
<label name="video/x-ms-wmv_label">
- ムービー(Windows Media WMV)
+ ムービー(Windows Media WMV)
</label>
</mimetype>
<mimetype name="video/x-msvideo">
diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml
index 72b4d21eb2..123e95df04 100644
--- a/indra/newview/skins/default/xui/ja/notifications.xml
+++ b/indra/newview/skins/default/xui/ja/notifications.xml
@@ -1,10 +1,18 @@
-<?xml version="1.0" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<notifications>
- <global name="skipnexttime">今後は表示しない</global>
- <global name="skipnexttimesessiononly">以後、これを表示しない
-(現セッションで)</global>
- <global name="alwayschoose">常にこのオプションを選択</global>
- <global name="implicitclosebutton">閉じる</global>
+ <global name="skipnexttime">
+ 次回からこのメッセージを表示しない
+ </global>
+ <global name="skipnexttimesessiononly">
+ 次回からこのメッセージを表示しない
+(現セッションで)
+ </global>
+ <global name="alwayschoose">
+ 常にこのオプションを選択
+ </global>
+ <global name="implicitclosebutton">
+ 閉じる
+ </global>
<template name="okbutton">
<form>
<button name="OK_okbutton" text="$yestext"/>
@@ -46,2357 +54,4368 @@
<button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
</form>
</template>
- <notification functor="GenericAcknowledge" label="不明の通知メッセージ" name="MissingAlert">
- あなたの [APP_NAME] のバージョンでは今受け取った通知メッセージを表示することができません。 最新ビューワがインストールされているかご確認ください。
+ <notification functor="GenericAcknowledge" label="不明な通知メッセージ" name="MissingAlert">現在使用中の[APP_NAME]のバージョンでは、受け取った通知メッセージを表示することができません。
+最新のビューアーがインストールされている事をご確認ください。
-エラー詳細: 「 [_NAME] 」という通知は notifications.xml にありませんでした。
- <usetemplate name="okbutton" yestext="OK"/>
+エラー詳細:「 [_NAME] 」という通知メッセージは、notifications.xmlに定義されていませんでした。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="FloaterNotFound">
- フロータエラー:下記のコントロールが見つかりませんでした:
+ <notification name="FloaterNotFound">フローターエラー:以下のコントロールが見つかりませんでした:
+
[CONTROLS]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="TutorialNotFound">
- 現在利用可能なチュートリアルはありません。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="GenericAlert">[MESSAGE]</notification>
- <notification name="GenericAlertYesCancel">
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TutorialNotFound">現在利用可能なチュートリアルはありません。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GenericAlert">
[MESSAGE]
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="はい"/>
</notification>
- <notification name="GenericAlertOK">
- [MESSAGE]
- <usetemplate name="okbutton" yestext="OK"/>
+ <notification name="GenericAlertYesCancel">[MESSAGE]
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="はい"/>
+ </notification>
+ <notification name="GenericAlertOK">[MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="BadInstallation">
- [APP_NAME] をアップデート中にエラーが発生しました。 ビューワの [http://get.secondlife.com 最新バージョンをダウンロード] してください。
- <usetemplate name="okbutton" yestext="OK"/>
+ <notification name="BadInstallation">[APP_NAME]のアップデート中にエラーが発生しました。[http://get.secondlife.com 最新バージョンのビューアーをダウンロード]してください。
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="LoginFailedNoNetwork">
- [SECOND_LIFE_GRID] に接続できませんでした。
-「[DIAGNOSTIC]」
+ <notification name="LoginFailedNoNetwork">[SECOND_LIFE_GRID]に接続できませんでした。
+[DIAGNOSTIC]
+
インターネット接続が正常かご確認ください。
- <usetemplate name="okbutton" yestext="OK"/>
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="LoginFailedToParse">ビューアがサーバーから不正な形式の応答を受け取りました。インターネット接続が正常に機能していることを確認してから、後でもう一度お試しください。
+
+これが誤りだと思われる場合は、サポートにお問い合わせください。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="MessageTemplateNotFound">
- メッセージテンプレート [PATH] がありませんでした。
- <usetemplate name="okbutton" yestext="OK"/>
+ <notification name="MessageTemplateNotFound">メッセージテンプレート[PATH]がありませんでした。
+ <usetemplate name="okbutton" yestext="OK"/>
+ <tag>
+ fail
+ </tag>
</notification>
- <notification name="WearableSave">
- 現在の衣類、身体部位の変更を保存しますか?
- <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="保存しない" yestext="保存"/>
+ <notification name="WearableSave">現在の服装/身体部位の変更を保存しますか?
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="保存しない" yestext="保存"/>
</notification>
- <notification name="ConfirmNoCopyToOutbox">
- これらのアイテムの 1 つまたは複数をマーチャントアウトボックスにコピーする許可がありません。移動するか、置き去りにすることはできます。
- <usetemplate name="okcancelbuttons" notext="アイテムを移動しない" yestext="アイテムを移動"/>
+ <notification name="ConfirmNoCopyToOutbox">これらのアイテムの1つ以上を販売用の送信トレイにコピーする権限がありません。移動したり残したままにすることはできます。
+ <usetemplate name="okcancelbuttons" notext="アイテムを販売ボックスに移動できなかった" yestext="アイテムを移動"/>
</notification>
- <notification name="OutboxFolderCreated">
- マーチャントアウトボックスの最上位に転送した各アイテムにつき、それぞれ 1 つの新しいフォルダが作成されました。
- <usetemplate ignoretext="新しいフォルダがマーチャントアウトボックス内に作成されました" name="okignore" yestext="OK"/>
+ <notification name="OutboxFolderCreated">販売ボックスの最上位に転送した各アイテムにつき、それぞれ1つの新しいフォルダが作成されました。
+ <unique/>
+ <usetemplate ignoretext="販売ボックス内に新しいフォルダを作成した" name="okignore" yestext="OK"/>
</notification>
- <notification name="OutboxImportComplete">
- 成功
+ <notification name="OutboxImportComplete">成功しました。
-マーケットプレイスに正常に送信されたすべてのフォルダ
- <usetemplate ignoretext="マーケットプレイスに送信されたすべてのフォルダ" name="okignore" yestext="OK"/>
+すべてのフォルダが、マーケットプレイスに正常に送信されました。
+ <usetemplate ignoretext="マーケットプレイスへフォルダの送信に成功した" name="okignore" yestext="OK"/>
</notification>
- <notification name="OutboxImportHadErrors">
- 一部のフォルダは転送されませんでした
+ <notification name="OutboxImportHadErrors">一部のフォルダは送信できていません。
-一部のフォルダがマーケットプレイスに送信されたときにエラーが発生しました。これらのフォルダはまだマーチャントアウトボックス内にあります。
+一部のフォルダが、マーケットプレイスに送信されるときにエラーが発生しました。これらのフォルダは、販売者の送信トレイにまだ残っています。
-詳細については、[[MARKETPLACE_IMPORTS_URL] エラーログ]をご覧ください。
- <usetemplate name="okbutton" yestext="OK"/>
+詳細につきましては、[[MARKETPLACE_IMPORTS_URL] エラーログ]をご確認ください。
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="OutboxImportFailed">
- '[ERROR_CODE]' エラーで転送できませんでした
+ <notification name="OutboxImportFailed">以下のエラーで転送できませんでした:[ERROR_CODE]
-システムまたはネットワークのエラーのため、フォルダはマーケットプレイスに送信されませんでした。後でもう一度お試しください。
- <usetemplate name="okbutton" yestext="OK"/>
+システムまたはネットワークのエラーのため、フォルダはマーケットプレイスに送信されませんでした。お手数ですが、後でもう一度やり直してください。
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="OutboxInitFailed">
- '[ERROR_CODE]' エラーでマーケットプレイスを初期化できませんでした
+ <notification name="OutboxInitFailed">以下のエラーでマーケットプレイスを初期化できませんでした:[ERROR_CODE]
-システムまたはネットワークのエラーのため、マーケットプレイスの初期化に失敗しました。後でもう一度お試しください。
- <usetemplate name="okbutton" yestext="OK"/>
+システムまたはネットワークのエラーのため、マーケットプレイスの初期化に失敗しました。お手数ですが、後でもう一度やり直してください。
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="StockPasteFailed">
- 在庫フォルダへのコピーまたは移動がエラーにより失敗しました:
-
-'[ERROR_CODE]'
- <usetemplate name="okbutton" yestext="OK"/>
+ <notification name="StockPasteFailed">在庫フォルダへのコピーまたは移動がエラーにより失敗しました:[ERROR_CODE]
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="MerchantPasteFailed">
- マーケットプレイスのリストへのコピーまたは移動がエラーにより失敗しました:
-
-'[ERROR_CODE]'
- <usetemplate name="okbutton" yestext="OK"/>
+ <notification name="MerchantPasteFailed">マーケットプレイスのリストへのコピーまたは移動が以下のエラーにより失敗しました:[ERROR_CODE]
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="MerchantTransactionFailed">
- マーケットプレイスによる取引が次のエラーにより失敗しました:
-
-[ERROR_REASON][ERROR_DESCRIPTION]
- <usetemplate name="okbutton" yestext="OK"/>
+ <notification name="MerchantTransactionFailed">マーケットプレイスによる取引が以下のエラーにより失敗しました:[ERROR_REASON]
+[ERROR_DESCRIPTION]
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="MerchantUnprocessableEntity">
- この製品をリストに表示できないか、バージョンフォルダを有効にできません。通常、これはリスト説明フォームに情報が不足しているために起こりますが、フォルダ構造のエラーが原因の場合もあります。リストを編集するか、リストフォルダにエラーがないか確認してください。
- <usetemplate name="okbutton" yestext="OK"/>
+ <notification name="MerchantUnprocessableEntity">この商品をリストに表示できないか、バージョンフォルダを有効にできません。通常、これはリスト説明フォームに情報が不足しているために起こりますが、フォルダ構造のエラーが原因の場合もあります。
+リストを編集するか、リストフォルダにエラーがないか確認してください。
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="MerchantListingFailed">
- マーケットプレイスへのリスト表示が次のエラーで失敗しました :
-
+ <notification name="MerchantListingFailed">マーケットプレイスへのリスト表示が次のエラーで失敗しました:
'[ERROR_CODE]'
- <usetemplate name="okbutton" yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="MerchantFolderActivationFailed">
- このバージョンフォルダの有効化が次のエラーにより失敗しました :
-
+ <notification name="MerchantFolderActivationFailed">このバージョンフォルダの有効化が次のエラーにより失敗しました:
'[ERROR_CODE]'
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="MerchantForceValidateListing">
- リストを作成するために、リストするコンテンツの階層を固定しました。
- <usetemplate ignoretext="リストの作成によりコンテンツの階層が修正されることを警告する" name="okignore" yestext="OK"/>
- </notification>
- <notification name="ConfirmMerchantActiveChange">
- この操作により、このリストの有効な内容が変更されます。続けますか?
- <usetemplate ignoretext="マーケットプレイスで有効なリストを変更する前に確認する" name="okcancelignore" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="ConfirmMerchantMoveInventory">
- マーケットプレイスのリストウィンドウにドラッグしたアイテムは元の場所からコピーされるのではなく、移動します。続けますか?
- <usetemplate ignoretext="アイテムをインベントリからマーケットプレイスに移動する前に確認する" name="okcancelignore" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="ConfirmListingCutOrDelete">
- リストフォルダを移動または削除すると、マーケットプレイスのリストが削除されます。マーケットプレイスのリストを維持する場合は、変更するバージョンフォルダの中身を移動または削除してください。続けますか?
- <usetemplate ignoretext="マーケットプレイスからリストを移動または削除する前に確認する" name="okcancelignore" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="ConfirmCopyToMarketplace">
- これらのアイテムの 1 つまたは複数をマーケットプレイスにコピーする権限がありません。移動するか、置き去りにすることはできます。
- <usetemplate canceltext="取り消し" ignoretext="コピー付加アイテムを含む選択内容をマーケットプレイスへコピーする前に確認する" name="yesnocancelbuttons" notext="アイテムを移動しない" yestext="アイテムを移動"/>
- </notification>
- <notification name="ConfirmMerchantUnlist">
- この操作により、このリストが削除されます。続けますか?
- <usetemplate ignoretext="マーケットプレイスで有効なリストを削除する前に確認する" name="okcancelignore" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="ConfirmMerchantClearVersion">
- この操作により、現在のリストのバージョンフォルダが無効になります。続けますか?
- <usetemplate ignoretext="マーケットプレイスでリストのバージョンフォルダを無効にする前に確認する" name="okcancelignore" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="AlertMerchantListingNotUpdated">
- このリストをアップデートできませんでした。
-[[URL] ここをクリック] してマーケットプレイスで編集します。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AlertMerchantListingCannotWear">マーケットプレイスのリストフォルダにある衣服やボディパーツを着用できません。</notification>
- <notification name="AlertMerchantListingInvalidID">リスト ID が無効です。</notification>
- <notification name="AlertMerchantListingActivateRequired">
- このリストには複数のバージョンフォルダがあるか、バージョンフォルダがありません。後で、単独でバージョンフォルダを選択して有効にする必要があります。
- <usetemplate ignoretext="複数のバージョンフォルダのあるリストを作成するときに、バージョンフォルダの有効化に関する警告が表示されます" name="okignore" yestext="OK"/>
- </notification>
- <notification name="AlertMerchantStockFolderSplit">
- 各種の在庫品目を別々の在庫フォルダに分けたため、フォルダはリストに表示できるように配置されています。
- <usetemplate ignoretext="リストに表示する前に在庫フォルダが分割されると、警告が表示されます" name="okignore" yestext="OK"/>
- </notification>
- <notification name="AlertMerchantStockFolderEmpty">
- 在庫が空のため、リストを削除しました。もう一度リストを表示するには、在庫フォルダにユニットを追加する必要があります。
- <usetemplate ignoretext="在庫フォルダが空のためにリストが表示されないと警告が表示されます" name="okignore" yestext="OK"/>
- </notification>
- <notification name="AlertMerchantVersionFolderEmpty">
- バージョンフォルダが空のため、リストを削除しました。もう一度リストを表示するには、バージョンフォルダにアイテムを追加する必要があります。
- <usetemplate ignoretext="バージョンフォルダが空のためにリストが表示されないと警告が表示されます" name="okignore" yestext="OK"/>
- </notification>
- <notification name="WriteAnimationFail">アニメーションデータの書き込みに問題があります。後でもう一度お試しください。</notification>
- <notification name="UploadAuctionSnapshotFail">次の理由で、オークションのスナップショットのアップロード時に問題が起こりました。
-[REASON]</notification>
- <notification name="UnableToViewContentsMoreThanOne">一度に複数のアイテムの中身を表示できません。
-アイテムを 1 つだけ選択して、もう一度お試しください。</notification>
- <notification name="SaveClothingBodyChanges">
- 衣服、身体部位に対する変更をすべて保存しますか?
- <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="保存しない" yestext="すべて保存"/>
- </notification>
- <notification name="FriendsAndGroupsOnly">
- フレンド以外の人からのコールや、インスタントメッセージを無視する設定にしたことを、相手に知られることはありません。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="FavoritesOnLogin">
- 注意:このオプションを有効にすると、このパソコンを使うユーザーは誰でも、あなたのお気に入りの場所を見ることができるようになります。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AllowMultipleViewers">
- 複数の Second Life ビューワを実行することはサポートされていません。テクスチャキャッシュのコリジョンや破損、およびビジュアルとパフォーマンスの低下につながる恐れがあります。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="GrantModifyRights">
- 他人に修正権限を与えると、権限を与えられた人はあなたが所有するインワールドのオブジェクトを変更、削除、持ち帰ることができます。この権限を与える際には十分に注意してください。
-[NAME] に修正権限を与えますか?
- <usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MerchantForceValidateListing">リストを作成するために、リストするコンテンツの階層を固定しました。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="リストの作成によりコンテンツの階層が修正されることを警告する" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmMerchantActiveChange">この操作により、このリストの有効な内容が変更されます。続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="マーケットプレイスで有効なリストを変更する前に確認する" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmMerchantMoveInventory">マーケットプレイスのリストウィンドウにドラッグしたアイテムは、元の場所からコピーされるのではなく移動となります。続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="アイテムをインベントリからマーケットプレイスに移動する前に確認する" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmListingCutOrDelete">リストフォルダを移動または削除すると、マーケットプレイスのリストが削除されます。マーケットプレイスのリストを維持する場合は、変更するバージョンフォルダの中身を移動または削除してください。続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="マーケットプレイスからリストを移動または削除する前に確認する" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmCopyToMarketplace">これらのアイテムの1つまたは複数をマーケットプレイスにコピーする権限がありません。移動するか、残したままにすることはできます。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate canceltext="キャンセル" ignoretext="マーケットプレイスへコピーする際に、コピー不可のアイテムが選択内容に含まれている場合の確認" name="yesnocancelbuttons" notext="アイテムを移動しない" yestext="アイテムを移動"/>
+ </notification>
+ <notification name="ConfirmMerchantUnlist">この操作により、このリストが削除されます。続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="マーケットプレイスで有効なリストを削除する前に確認する" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmMerchantClearVersion">この操作により、現在のリストのバージョンフォルダが無効になります。続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="マーケットプレイスでリストのバージョンフォルダを無効にする前に確認する" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantListingNotUpdated">このリストをアップデートできませんでした。
+[[URL] ここをクリック]してマーケットプレイスで編集します。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantListingCannotWear">マーケットプレイスのリストフォルダにある衣服装やボディパーツを着用できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="AlertMerchantListingInvalidID">リストIDが無効です。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="AlertMerchantListingActivateRequired">このリストには複数のバージョンフォルダがあるか、バージョンフォルダがありません。後で、単独でバージョンフォルダを選択して有効にする必要があります。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="複数のバージョンフォルダのあるリストを作成するときに、バージョンフォルダの有効化に関する警告を表示" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantStockFolderSplit">各種の在庫品目を別々の在庫フォルダに分けたため、フォルダはリストに表示できるように配置されています。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="商品リストで在庫フォルダを分割する際に警告を表示" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantStockFolderEmpty">在庫が空のため、リストを削除しました。もう一度リストを表示するには、在庫フォルダにユニットを追加する必要があります。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="商品リストで在庫フォルダが空だったときに警告を表示" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="AlertMerchantVersionFolderEmpty">バージョンフォルダが空のため、リストを削除しました。もう一度リストを表示するには、バージョンフォルダにアイテムを追加する必要があります。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="商品リストでバージョンフォルダが空で表示されないときに警告を表示" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="WriteAnimationFail">アニメーションデータの書き込みに問題があります。後でもう一度お試しください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="UploadAuctionSnapshotFail">以下の理由で、オークションのスナップショットのアップロード時に問題が起こりました:[REASON]
+ <tag>
+ fail
+ </tag>
</notification>
- <notification name="GrantModifyRightsMultiple">
- 他人に修正権限を与えると、権限を与えられた人はあなたが所有するインワールドのオブジェクトを変更することができます。 この権限を与える際には十分に注意してください。
-選択した住人に修正権限を与えますか?
+ <notification name="UnableToViewContentsMoreThanOne">一度に複数のアイテムの中身を表示できません。
+アイテムを1つだけ選択して、もう一度お試しください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SaveClothingBodyChanges">服装、身体部位に対する変更をすべて保存しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="保存しない" yestext="すべて保存"/>
+ </notification>
+ <notification name="FriendsAndGroupsOnly">フレンド以外の人からのコールや、インスタントメッセージを無視する設定にしたことを、相手に知られることはありません。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FavoritesOnLogin">注意:このオプションを有効にすると、このパソコンを使うユーザーは誰でも、あなたのお気に入りの場所を見ることができるようになります。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AllowMultipleViewers">Second Lifeビューアーの多重起動はサポートされていません。
+テクスチャキャッシュの競合による破損や、およびビジュアルとパフォーマンスの低下につながる恐れがあります。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GrantModifyRights">他人に修正権限を与えると、権限を与えられた人はあなたが所有する、インワールドのオブジェクトを変更、削除、持ち帰ることができます。この権限を与える際には十分に注意してください。
+[NAME]に修正権限を与えますか?
+ <usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+ </notification>
+ <notification name="GrantModifyRightsMultiple">他人に修正権限を与えると、権限を与えられた人はあなたが所有する、インワールドのオブジェクトを変更することができます。
+この権限を与える際には十分に注意してください。選択した住人に修正権限を与えますか?
+ <tag>
+ confirm
+ </tag>
<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
</notification>
- <notification name="RevokeModifyRights">
- [NAME] の修正権限を解約しますか?
+ <notification name="RevokeModifyRights">[NAME]の修正権限を解除しますか?
+ <tag>
+ confirm
+ </tag>
<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
</notification>
- <notification name="RevokeModifyRightsMultiple">
- 選択した住人から変更権限を取り下げますか?
+ <notification name="RevokeModifyRightsMultiple">選択した住人から変更権限を取り下げますか?
+ <tag>
+ confirm
+ </tag>
<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
</notification>
- <notification name="GroupNameLengthWarning">
- グループ名は [MIN_LEN] ~ [MAX_LEN] 文字である必要があります。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="UnableToCreateGroup">
- グループを作成できません。
-[MESSAGE]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="PanelGroupApply">
- [NEEDS_APPLY_MESSAGE]
+ <notification name="GroupNameLengthWarning">グループ名は[MIN_LEN]~[MAX_LEN]文字である必要があります。
+ <tag>
+ group
+ </tag>
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="UnableToCreateGroup">グループを作成できません。
+[MESSAGE]
+ <tag>
+ group
+ </tag>
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PanelGroupApply">[NEEDS_APPLY_MESSAGE]
[WANT_APPLY_MESSAGE]
- <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="変更を無視" yestext="変更を適用"/>
- </notification>
- <notification name="MustSpecifyGroupNoticeSubject">
- グループ通知の送信には、件名の記入が必要です。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AddGroupOwnerWarning">
- あなたは [ROLE_NAME] の役割にメンバーを与えようとしています。
-任命されたメンバーが自ら退任しない限り、
-役柄から削除できません。
+ <tag>
+ group
+ </tag>
+ <tag>
+ fail
+ </tag>
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="変更を無視" yestext="変更を適用"/>
+ </notification>
+ <notification name="MustSpecifyGroupNoticeSubject">グループ通知の送信には、件名の記入が必要です。
+ <tag>
+ group
+ </tag>
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AddGroupOwnerWarning">あなたは、[ROLE_NAME]の役割にメンバーを与えようとしています。任命されたメンバーが自ら退任しない限り、 役柄から削除できません。
操作を続行しますか?
- <usetemplate ignoretext="グループオーナーを新しく追加する前の確認" name="okcancelignore" notext="いいえ" yestext="はい"/>
+ <usetemplate ignoretext="グループオーナーを新しく追加する前の確認" name="okcancelignore" notext="いいえ" yestext="はい"/>
</notification>
- <notification name="AssignDangerousActionWarning">
- あなたは [ROLE_NAME] に [ACTION_NAME] の能力を
-与えようとしています。
+ <notification name="AssignDangerousActionWarning">あなたは[ROLE_NAME]に[ACTION_NAME]の能力を与えようとしています。
- *警告*
-この能力を持つ役割のメンバーは、
-自分と他のメンバーに現在より強力な権限を割り当て、
-自分をオーナーとほぼ同様の立場に任命することもできるようになります。
+*警告*
+この能力を持つ役割のメンバーは、 自分と他のメンバーに現在より強力な権限を割り当て、 自分をオーナーとほぼ同様の立場に任命することもできるようになります。
この行為の意味をよく理解してから実行してください。
-
この能力を [ROLE_NAME] に割り当てますか?
- <usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+ <usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
</notification>
- <notification name="AssignDangerousAbilityWarning">
- あなたは [ROLE_NAME] に [ACTION_NAME] の能力を
-与えようとしています。
+ <notification name="AssignDangerousAbilityWarning">あなたは、[ROLE_NAME]に[ACTION_NAME]の能力を与えようとしています。
- *警告*
-この能力をもつ役割のメンバーは、
-自分と他のメンバーにすべての能力を割り当て、
-自分をオーナーとほぼ同様の立場に任命できます。
-
-この能力を [ROLE_NAME] に割り当てますか?
- <usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+*警告*
+この能力をもつ役割のメンバーは、自分と他のメンバーにすべての能力を割り当て、自分をオーナーとほぼ同様の立場に任命できます。
+この能力を[ROLE_NAME] に割り当てますか?
+ <usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
</notification>
- <notification name="AssignBanAbilityWarning">
- 役割 '[ROLE_NAME]' に能力 '[ACTION_NAME]' を追加しようとしています。
+ <notification name="AssignBanAbilityWarning">役割「[ROLE_NAME]」に能力「[ACTION_NAME]」を追加しようとしています。
*警告*
-この能力を持つ役割のメンバーにも能力 '[ACTION_NAME_2]' と '[ACTION_NAME_3]' が許可されます
- <usetemplate name="okbutton" yestext="OK"/>
+この能力を持つ役割のメンバーにも能力「[ACTION_NAME_2]」と「[ACTION_NAME_3]」が許可されます。
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="RemoveBanAbilityWarning">
- 役割 '[ROLE_NAME]' から能力 '[ACTION_NAME]' を削除しようとしています。
+ <notification name="RemoveBanAbilityWarning">役割「[ROLE_NAME]」から能力「[ACTION_NAME]」を削除しようとしています。
*警告*
-この能力を削除しても能力 '[ACTION_NAME_2]' と '[ACTION_NAME_3]' は削除されません。
-
+この能力を削除しても能力「[ACTION_NAME_2]」と「[ACTION_NAME_3]」は削除されません。
これらの能力をこの役割に許可しない場合は、すぐに削除してください!
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="EjectGroupMemberWarning">
- [AVATAR_NAME] をグループから追放しようとしています。
- <usetemplate ignoretext="グループからの参加者の追放を確認します" name="okcancelignore" notext="取り消し" yestext="追放"/>
- </notification>
- <notification name="EjectGroupMembersWarning">
- [COUNT] 名のメンバーをグループから追放しようとしています。
- <usetemplate ignoretext="グループからの複数のメンバーの追放を確認します" name="okcancelignore" notext="取り消し" yestext="追放"/>
- </notification>
- <notification name="BanGroupMemberWarning">
- [AVATAR_NAME] をグループから追放しようとしています。
- <usetemplate ignoretext="グループからの参加者の追放を確認します" name="okcancelignore" notext="取り消し" yestext="禁止"/>
- </notification>
- <notification name="BanGroupMembersWarning">
- [COUNT] 名のメンバーをグループから追放しようとしています。
- <usetemplate ignoretext="グループからの複数のメンバーの追放を確認します" name="okcancelignore" notext="取り消し" yestext="禁止"/>
- </notification>
- <notification name="GroupBanUserOnBanlist">一部の住人がグループから追放されたため、招待状が送られませんでした。</notification>
- <notification name="AttachmentDrop">
- アタッチメントを下に置こうとしています。
-続けますか?
- <usetemplate ignoretext="アタッチメントを下に落とす前の確認" name="okcancelignore" notext="いいえ" yestext="はい"/>
- </notification>
- <notification name="JoinGroupCanAfford">
- このグループに参加するには、L$ [COST] かかります。
-続行しますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="参加"/>
- </notification>
- <notification name="JoinGroupNoCost">
- &lt;nolink&gt;[NAME]&lt;/nolink&gt; というグループに入ろうとしています。
-続けますか?
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="EjectGroupMemberWarning">[AVATAR_NAME]をグループから追放しようとしています。
+ <tag>
+ group
+ </tag>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="グループからの参加者の追放を確認します" name="okcancelignore" notext="キャンセル" yestext="追放"/>
+ </notification>
+ <notification name="EjectGroupMembersWarning">[COUNT]名のメンバーをグループから追放しようとしています。
+ <tag>
+ group
+ </tag>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="グループからの複数のメンバーの追放を確認します" name="okcancelignore" notext="キャンセル" yestext="追放"/>
+ </notification>
+ <notification name="BanGroupMemberWarning">[AVATAR_NAME]をグループから追放しようとしています。
+ <tag>
+ group
+ </tag>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="グループからの参加者の追放を確認します" name="okcancelignore" notext="キャンセル" yestext="禁止"/>
+ </notification>
+ <notification name="BanGroupMembersWarning">[COUNT]名のメンバーをグループから追放しようとしています。
+ <tag>
+ group
+ </tag>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="グループからの複数のメンバーの追放を確認します" name="okcancelignore" notext="キャンセル" yestext="禁止"/>
+ </notification>
+ <notification name="GroupBanUserOnBanlist">
+ 一部の住人がグループから追放されたため、招待状が送られませんでした。
+ </notification>
+ <notification name="AttachmentDrop">装着物を下に置こうとしています。
+このまま続けてもよろしいですか?
+ <usetemplate ignoretext="装着物を下に落とす前の確認" name="okcancelignore" notext="いいえ" yestext="はい"/>
+ </notification>
+ <notification name="JoinGroupCanAfford">このグループに参加するには、L$ [COST]かかります。
+このまま続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <tag>
+ funds
+ </tag>
+ <tag>
+ group
+ </tag>
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="参加"/>
</notification>
- <notification name="JoinGroupCannotAfford">このグループに加入するには、L$ [COST] 必要です。
-L$ が不足しているのでこのグループに参加することができません。</notification>
- <notification name="CreateGroupCost">
- このグループ作成にかかる費用:L$[COST]
+ <notification name="JoinGroupNoCost">「&lt;nolink&gt;[NAME]&lt;/nolink&gt;」というグループに入ろうとしています。
+このまま続けてもよろしいですか?
+ <tag>
+ group
+ </tag>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="参加"/>
+ </notification>
+ <notification name="JoinGroupCannotAfford">このグループに加入するには、L$ [COST]必要です。
+L$が不足しているので、このグループに参加することができません。
+ <tag>
+ group
+ </tag>
+ <tag>
+ fail
+ </tag>
+ <tag>
+ funds
+ </tag>
+ </notification>
+ <notification name="CreateGroupCost">このグループ作成にかかる費用:L$ [COST]
一人ではグループにならないので、永久に削除されてしまいます。
-48 時間以内にメンバーを勧誘し、入会してもらってください。
+48時間以内にメンバーを勧誘し、入会してもらってください。
+ <tag>
+ group
+ </tag>
+ <tag>
+ funds
+ </tag>
<usetemplate canceltext="キャンセル" name="okcancelbuttons" notext="キャンセル" yestext="L$100 でグループを作成"/>
</notification>
- <notification name="JoinGroupInaccessible">
- あなたはグループに参加することはできません。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="JoinGroupError">
- グループ参加リクエスト中にエラーが発生しました。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="JoinGroupErrorReason">
- グループに参加できません: [reason]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="JoinGroupTrialUser">
- 申し訳ありませんが、トライアルユーザーはグループに参加できません。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="JoinGroupMaxGroups">
- 「&lt;nolink&gt;[group_name]&lt;/nolink&gt;」に参加できません:
-既に [group_count] グループのメンバーになっています。参加できるのは最大 [max_groups] グループまでです。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="JoinGroupClosedEnrollment">
- 「&lt;nolink&gt;[group_name]&lt;/nolink&gt;」に参加できません:
+ <notification name="JoinGroupInaccessible">あなたはグループに参加することはできません。
+ <tag>
+ group_id
+ </tag>
+ <tag>
+ success
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="JoinGroupError">グループ参加リクエスト中にエラーが発生しました。
+ <tag>
+ group_id
+ </tag>
+ <tag>
+ success
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="JoinGroupErrorReason">以下のグループに参加できませんでした:[reason]
+ <tag>
+ group_id
+ </tag>
+ <tag>
+ success
+ </tag>
+ <tag>
+ reason
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="JoinGroupTrialUser">申し訳ありませんが、トライアルユーザーはグループに参加できません。
+ <tag>
+ group_id
+ </tag>
+ <tag>
+ success
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="JoinGroupMaxGroups">「&lt;nolink&gt;[group_name]&lt;/nolink&gt;」に参加できません:
+既に[group_count]個のグループのメンバーになっています。参加できるのは最大[max_groups]グループまでです。
+ <tag>
+ success
+ </tag>
+ <tag>
+ group_id
+ </tag>
+ <tag>
+ group_name
+ </tag>
+ <tag>
+ group_count
+ </tag>
+ <tag>
+ max_groups
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="JoinGroupClosedEnrollment">「&lt;nolink&gt;[group_name]&lt;/nolink&gt;」に参加できません:
このグループは現在、参加が制限されています。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="JoinGroupSuccess">
- このユーザーグループに追加されました
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="JoinGroupInsufficientFunds">
- 会員料金として必要な L$ [membership_fee] を送金することができません。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="LandBuyPass">
- L$ [COST] で [TIME] 時間 [PARCEL_NAME] に入ることができます。
-入場許可を購入しますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="SalePriceRestriction">不特定の人に売却する場合には、
-売却価格はL$ 0 以上に設定する必要があります。
-売却価格をL$ 0 に設定する場合は、
-売却する個人を選択してください。</notification>
- <notification name="ConfirmLandSaleChange">
- 選択した [LAND_SIZE] 平方メートルの土地は、売り出し中に設定されています。
-売却価格 L$ [SALE_PRICE] で、[NAME] に売却を認可します。
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="ConfirmLandSaleToAnyoneChange">
- 注意: 「誰にでも販売」をクリックすることで、あなたの土地はこのリージョンにいる人に限らず [SECOND_LIFE] コミュニティ全体で利用可能となります。
-
-選択した [LAND_SIZE] 平方メートルの土地は、販売対象に設定されました。
-販売価格 L$ [SALE_PRICE] で、[NAME] が販売対象者となります。
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsDeededToGroup">
- グループ「&lt;nolink&gt;[NAME]&lt;/nolink&gt;」と共有するこのにある区画のすべてのオブジェクトを前のオーナーのインベントリに返却しますか?
-
-*注意*この操作をすると、グループに譲渡された譲渡禁止のオブジェクトを削除することになります。
-
-オブジェクト: [N]
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsOwnedByUser">
- この区画で、
-住人 [NAME] が所有する全てのオブジェクトを
-本人のインベントリに本当に返却してもよいですか?
-
-オブジェクト: [N]
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsOwnedBySelf">
- この土地区画内にある、あなたが所有するすべてのオブジェクトを、
-あなたのインベントリに戻そうとしています。続けますか?
+ <tag>
+ group_id
+ </tag>
+ <tag>
+ success
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="JoinGroupSuccess">このユーザーグループに入会しました。
+ <tag>
+ group_id
+ </tag>
+ <tag>
+ success
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="JoinGroupInsufficientFunds">会員料金として必要なL$ [membership_fee]を送金することができません。
+ <tag>
+ group_id
+ </tag>
+ <tag>
+ success
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="LandBuyPass">この区画([PARCEL_NAME])は、L$ [COST]で[TIME]時間入ることができます。入場許可証を購入しますか?
+ <tag>
+ fail
+ </tag>
+ <tag>
+ funds
+ </tag>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="SalePriceRestriction">不特定の人に売却する場合には、売却価格はL$ 0以上に設定する必要があります。
+売却価格をL$ 0に設定する場合は、売却する個人を選択してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ConfirmLandSaleChange">選択した[LAND_SIZE]㎡の土地は、売り出し中に設定されています。
+売却価格L$ [SALE_PRICE]で、[NAME]に売却を認可します。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmLandSaleToAnyoneChange">注意:「誰にでも販売」をクリックすることで、あなたの土地はこのリージョンにいる人に限らず、[SECOND_LIFE]コミュニティ全体で利用可能となります。
+選択した[LAND_SIZE]㎡の土地は、販売対象に設定されました。
+販売価格L$ [SALE_PRICE]で、[NAME]が販売対象者となります。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsDeededToGroup">グループ「&lt;nolink&gt;[NAME]&lt;/nolink&gt;」と共有するこのにある区画のすべてのオブジェクトを前のオーナーのインベントリに返却しますか?
+*警告*
+この操作をすると、グループに譲渡された譲渡禁止のオブジェクトを削除することになります。
+オブジェクト:[N]
+ <tag>
+ confirm
+ </tag>
+ <tag>
+ group
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsOwnedByUser">この区画で、住人[NAME]が所有する全てのオブジェクトを本人のインベントリに本当に返却してもよいですか?
+オブジェクト:[N]
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsOwnedBySelf">この土地区画内にある、あなたが所有するすべてのオブジェクトを、あなたのインベントリに戻そうとしています。このまま続けてもよろしいですか?
+オブジェクト:[N]
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedBySelf">この土地区画内にある、あなた以外が所有するすべてのオブジェクトを、それぞれの所有者のインベントリに戻そうとしています。このまま操作を続行してもよろしいですか?
+グループに譲渡された「再販・譲渡可」のオブジェクトは、以前の所有者に返却されます。
-オブジェクト: [N]
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsNotOwnedBySelf">
- この土地区画内にある、あなた以外が所有するすべてのオブジェクトを、
-それぞれの所有者のインベントリに戻そうとしています。
-操作を続行しますか?
-グループに譲渡された「再販・プレゼント可」のオブジェクトは、以前の所有者に返却されます。
+*警告*
-*警告* これにより、
-グループに譲渡された「再販・プレゼント不可」のオブジェクトは削除されます!
-オブジェクト: [N]
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+これにより、グループに譲渡された「再販・譲渡不可」のオブジェクトは削除されます!
+オブジェクト:[N]
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="ReturnObjectsNotOwnedByUser">
- この土地区画内にある、
-[NAME]以外による所有のオブジェクトをすべてそれぞれの所有者のインベントリに返却しようとしています。
-操作を続行しますか?グループに譲渡された「再販・プレゼント可」のオブジェクトは、以前の所有者に返却されます。
+ <notification name="ReturnObjectsNotOwnedByUser">この土地区画内にある、[NAME]以外による所有のオブジェクトをすべてそれぞれの所有者のインベントリに返却しようとしています。このまま操作を続行してもよろしいですか?
+グループに譲渡された「再販・譲渡可」のオブジェクトは、以前の所有者に返却されます。
-*警告* これにより、
-グループに譲渡された「再販・プレゼント不可」のオブジェクトは削除されます!
-オブジェクト: [N]
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="ReturnAllTopObjects">
- リストされた全てのオブジェクトを所有者の持ち物に戻しますか?これによりすべてのスクリプト化されたオブジェクトがリージョンに戻ります!
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="DisableAllTopObjects">
- このリージョン(地域)内のすべてのオブジェクトを無効にしようとしています。操作を続行しますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="ReturnObjectsNotOwnedByGroup">
- グループ &lt;nolink&gt;[NAME]&lt;/nolink&gt; と共有されていない、この区画にあるオブジェクトを前のオーナーに返却しますか?
+*警告*
-オブジェクト: [N]
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+これにより、グループに譲渡された「再販・譲渡不可」のオブジェクトは削除されます!
+オブジェクト:[N]
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ReturnAllTopObjects">リストされた全てのオブジェクトを所有者のインベントリに戻しますか?
+これによりすべてのスクリプト化されたオブジェクトがリージョンに戻ります!
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="DisableAllTopObjects">このリージョン(地域)内のすべてのオブジェクトを無効にしようとしています。このまま操作を続行してもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedByGroup">グループ &lt;nolink&gt;[NAME]&lt;/nolink&gt;と共有されていない、この区画にあるオブジェクトを前のオーナーに返却しますか?
+オブジェクト:[N]
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="UnableToDisableOutsideScripts">スクリプトを無効にできません。
このリージョン(地域)全体が「ダメージ有効」に設定されています。
-武器を使用するにはスクリプトの実行を許可する必要があります。</notification>
- <notification name="MultipleFacesSelected">
- 現在複数の面が選択されています。
+武器を使用するには、スクリプトの実行を許可する必要があります。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="MultipleFacesSelected">現在複数の面が選択されています。
このまま続けた場合、メディアの別々のインスタンスがオブジェクトの複数の面に設定されます。
-メディアを 1 つの面だけに取り付けるには、「面を選択」を選んでオブジェクトの希望する面をクリック、それから「追加」をクリックしてください。
- <usetemplate ignoretext="メディアが選択した複数の面にセットされるとき" name="okcancelignore" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="MustBeInParcel">着地点を設定するには、この区画の内側に
-立ってください。</notification>
- <notification name="PromptRecipientEmail">受信者の有効なメールアドレスを入力してください。</notification>
- <notification name="PromptSelfEmail">あなたのメールアドレスを入力してください。</notification>
- <notification name="PromptMissingSubjMsg">
- デフォルトの件名またはメッセージを付けて、スナップショットを送信しますか?
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="ErrorProcessingSnapshot">スナップショットデータの処理エラー</notification>
- <notification name="ErrorEncodingSnapshot">スナップショットのエンコード化でエラーが出ました!</notification>
- <notification name="ErrorCannotAffordUpload">このアイテムをアップロードするには L$[COST] が必要です。</notification>
- <notification name="ErrorPhotoCannotAfford">インベントリに写真を保存するには L$[COST] が必要です。L$ を購入するか、代わりに写真をっコンピュータに保存できます。</notification>
- <notification name="ErrorTextureCannotAfford">インベントリにテクスチャを保存するには L$[COST] が必要です。L$ を購入するか、代わりに写真をコンピュータに保存できます。</notification>
- <notification name="ErrorUploadingPostcard">次の理由で、スナップショットの送信時に問題が起こりました: [REASON]</notification>
- <notification name="ErrorUploadingReportScreenshot">次の理由で、レポートのスクリーンショットのアップロード時に問題が起こりました。 [REASON]</notification>
- <notification name="MustAgreeToLogIn">[SECOND_LIFE] へのログインを続けるには、Second Life の利用規約、プライバシーポリシー、およびサービス規約に同意する必要があります。</notification>
+メディアを1つの面だけに取り付けるには、「面を選択」を選んでオブジェクトの希望する面をクリック、それから「追加」をクリックしてください。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="メディアが選択した複数の面にセットされるとき" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="MustBeInParcel">着地点を設定するには、この区画の内側に立ってください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="PromptRecipientEmail">受信者の有効なメールアドレスを入力してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="PromptSelfEmail">あなたのメールアドレスを入力してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="PromptMissingSubjMsg">デフォルトの件名またはメッセージを付けて、スナップショットを送信しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ErrorProcessingSnapshot">スナップショットデータの処理エラー
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ErrorEncodingSnapshot">スナップショットのエンコードエラー
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ErrorCannotAffordUpload">このアイテムをアップロードするには、L$ [COST]が必要です。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ErrorPhotoCannotAfford">インベントリに写真を保存するには、L$ [COST]が必要です。L$を購入するか、代わりに写真をコンピュータに保存できます。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ErrorTextureCannotAfford">インベントリにテクスチャを保存するには、L$ [COST]が必要です。L$を購入するか、代わりに写真をコンピュータに保存できます。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ErrorUploadingPostcard">以下の理由でスナップショットの送信時に問題が起こりました:[REASON]
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ErrorUploadingReportScreenshot">以下の理由で、レポートのスクリーンショットのアップロード時に問題が起こりました:[REASON]
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="MustAgreeToLogIn">[SECOND_LIFE]へのログインを続けるには、Second Lifeの利用規約、プライバシーポリシー、およびサービス規約に同意する必要があります。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CouldNotPutOnOutfit">アウトフィットを装着できません。
-アウトフィットフォルダに衣類、身体部位、アタッチメントがありません。</notification>
- <notification name="CannotWearTrash">ごみ箱にある衣類や身体部位の着用はできません。</notification>
- <notification name="MaxAttachmentsOnOutfit">オブジェクトを付けられませんでした。
-最大数の [MAX_ATTACHMENTS] 個を越えています。 どれか取り外してからお試しください。</notification>
- <notification name="CannotWearInfoNotComplete">まだ読み込まれていないため、そのアイテムを装着できません。後でやり直してください。</notification>
- <notification name="MustEnterPasswordToLogIn">ログインするためにパスワードを入力してください</notification>
- <notification name="MustHaveAccountToLogIn">
- 注意:記入漏れの箇所があります。
+アウトフィットフォルダに服装、身体部位、装着物がありません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CannotWearTrash">ごみ箱にある服装や身体部位は、着用できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="MaxAttachmentsOnOutfit">オブジェクトを装着できませんでした。
+最大装着数[MAX_ATTACHMENTS]個を越えています。どれか取り外してからお試しください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CannotWearInfoNotComplete">まだ読み込まれていないため、そのアイテムを装着できません。後でやり直してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="MustEnterPasswordToLogIn">ログインするためにパスワードを入力してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="MustHaveAccountToLogIn">おっと、記入漏れがあります。
アバターのユーザー名を入力してください。
-[SECOND_LIFE] に入るにはアカウントが必要です。今すぐアカウントを作成しますか?
- <url name="url">[create_account_url]</url>
+[SECOND_LIFE]に入るにはアカウントが必要です。今すぐアカウントを作成しますか?
+ <tag>
+ confirm
+ </tag>
+ <url name="url">
+ [create_account_url]
+ </url>
<usetemplate name="okcancelbuttons" notext="もう一度試す" yestext="新しいアカウントを作成"/>
</notification>
- <notification name="InvalidCredentialFormat">ユーザー名のフィールドにアバターのユーザー名もしくは氏名を入力してから、再度ログインする必要があります。</notification>
- <notification name="InvalidGrid">'[GRID]' は有効なグリッド ID ではありません。</notification>
- <notification name="InvalidLocationSLURL">ログイン位置で有効なグリッドが指定されませんでした。</notification>
- <notification name="DeleteClassified">
- クラシファイド広告 [NAME] を削除しますか?
-支払い済みの料金は返金されません。
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ <notification name="InvalidCredentialFormat">ユーザー名のフィールドにアバターのユーザー名もしくは氏名を入力してから、再度ログインする必要があります。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="InvalidGrid">「[GRID]」は、有効なグリッドIDではありません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="InvalidLocationSLURL">ログイン位置で有効なグリッドが指定されませんでした。
+ <tag>
+ fail
+ </tag>
</notification>
- <notification name="DeleteMedia">
- この面にあるメディアを削除する選択をしました。
-続けますか?
+ <notification name="DeleteClassified">クラシファイド広告『[NAME]』を削除してもよろしいですか?
+支払い済みの料金は返金されません。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="DeleteMedia">この顔に紐づけられたメディアの削除を選択しました。
+続行してもよろしいですか?
+ <tag>
+ confirm
+ </tag>
<usetemplate ignoretext="オブジェクトからメディアを削除する前の確認" name="okcancelignore" notext="いいえ" yestext="はい"/>
</notification>
- <notification name="ClassifiedSave">
- クラシファイド広告 [NAME] への変更を保存しますか?
+ <notification name="ClassifiedSave">クラシファイド広告[NAME]への変更を保存しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="保存しない" yestext="保存"/>
+ </notification>
+ <notification name="ClassifiedInsufficientFunds">クラシファイド広告を出すには、資金が足りません。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ProfileDeleteClassified">クラシファイド広告&lt;nolink&gt;[CLASSIFIED]&lt;/nolink&gt;を削除してもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ProfileDeletePick">ピック&lt;nolink&gt;[PICK]&lt;/nolink&gt;を削除してもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ProfileUnpublishedClassified">未公開のクラシファイド広告があります。
+ウィンドウを閉じると変更が失われます。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ProfileUnsavedChanges">保存されていない変更があります。
+ <tag>
+ confirm
+ </tag>
+ <tag>
+ save
+ </tag>
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="破棄" yestext="保存"/>
+ </notification>
+ <notification name="DeleteAvatarPick">「&lt;nolink&gt;[PICK]&lt;/nolink&gt;」を削除してもよろしいですか?
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="DeleteOutfits">このアウトフィットを削除してもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="PromptGoToEventsPage">[SECOND_LIFE]イベントWebページに移動しますか?
+ <url name="url">
+ https://secondlife.com/my/community/events/?lang=ja-JP
+ </url>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="SelectProposalToView">表示する提案を選択してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SelectHistoryItemToView">表示する履歴アイテムを選択してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CacheWillClear">
+ キャッシュは、[APP_NAME]再起動後にクリアされます。
+ </notification>
+ <notification name="CacheWillBeMoved">
+ キャッシュは、[APP_NAME]再起動後が移動されます。
+注意:キャッシュがクリアされます。
+ </notification>
+ <notification name="ChangeConnectionPort">
+ ポートの設定は、[APP_NAME]再起動後に反映されます。
+ </notification>
+ <notification name="ChangeDeferredDebugSetting">
+ デバッグ設定の変更は、[APP_NAME]再起動後に反映されます。
+ </notification>
+ <notification name="ChangeSkin">
+ 新しいスキンは、[APP_NAME]再起動後に表示されます。
+ </notification>
+ <notification name="ChangeLanguage">
+ 言語の変更は、[APP_NAME]再起動後に反映されます。
+ </notification>
+ <notification name="GoToAuctionPage">[SECOND_LIFE]のWebページに移動し、入札あるいはオークションの詳細を確認しますか?
+ <tag>
+ confirm
+ </tag>
+ <url name="url">
+ http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID]&amp;lang=ja-JP
+ </url>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="SaveChanges">変更を保存しますか?
+ <tag>
+ confirm
+ </tag>
<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="保存しない" yestext="保存"/>
</notification>
- <notification name="ClassifiedInsufficientFunds">
- クラシファイド広告を出すには、資金が足りません。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="DeleteAvatarPick">
- &lt;nolink&gt;[PICK]&lt;/nolink&gt; を削除しますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="DeleteOutfits">
- 選択したアウトフィットを削除しますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="PromptGoToEventsPage">
- [SECOND_LIFE] イベント Web ページに移動しますか?
- <url name="url">http://secondlife.com/events/?lang=ja-JP</url>
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="SelectProposalToView">表示する提案を選択してください。</notification>
- <notification name="SelectHistoryItemToView">表示する履歴アイテムを選択してください。</notification>
- <notification name="CacheWillClear">[APP_NAME] を再起動後にキャッシュがクリアされます。</notification>
- <notification name="CacheWillBeMoved">[APP_NAME] を再起動後にキャッシュが移動されます。
-ご注意: キャッシュがクリアされます。</notification>
- <notification name="ChangeConnectionPort">ポートの設定は [APP_NAME] を再起動後に反映されます。</notification>
- <notification name="ChangeDeferredDebugSetting">デバッグ設定の変更は [APP_NAME] を再起動後に反映されます。</notification>
- <notification name="ChangeSkin">新しいスキンは [APP_NAME] を再起動後に表示されます。</notification>
- <notification name="ChangeLanguage">言語の変更は [APP_NAME] を再起動後に反映されます。</notification>
- <notification name="GoToAuctionPage">
- [SECOND_LIFE]の Web ページに移動し、入札あるいはオークションの詳細を確認しますか?
- <url name="url">http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID]</url>
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="SaveChanges">
- 変更を保存しますか?
- <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="保存しない" yestext="保存"/>
- </notification>
- <notification name="DeleteNotecard">
- ノートカードを削除しますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="LoadPreviousReportScreenshot">
- 以前のスクリーンショットをレポートに使用しますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ <notification name="DeleteNotecard">このノートカードを削除してもよろしいですか?
+ <unique/>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="LoadPreviousReportScreenshot">以前のスクリーンショットをレポートに使用しますか?
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="GestureSaveFailedTooManySteps">ジェスチャーの保存に失敗しました。
ステップが多すぎます。
-ステップをいくつか削除してから再保存してください</notification>
- <notification name="GestureSaveFailedTryAgain">ジェスチャーの保存に失敗しました。少し待ってからもう一度試してください。</notification>
+ステップをいくつか削除してから再保存してください
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="GestureSaveFailedTryAgain">ジェスチャーの保存に失敗しました。
+少し待ってからもう一度試してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="GestureSaveFailedObjectNotFound">ジェスチャーの保存に失敗しました。オブジェクト、または関連するオブジェクトインベントリが見つかりません。
-オブジェクトが範囲内に存在しないか、または削除された可能性があります。</notification>
- <notification name="GestureSaveFailedReason">次の理由で、ジェスチャーの保存時に問題が起こりました。 [REASON]。 後でもう一度試してください。</notification>
+オブジェクトが範囲内に存在しないか、削除された可能性があります。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="GestureSaveFailedReason">以下の理由で、ジェスチャーの保存時に問題が起こりました:[REASON]
+お手数ですが、後でもう一度試してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="SaveNotecardFailObjectNotFound">ノートカードの保存に失敗しました。オブジェクト、または関連するオブジェクトインベントリが見つかりません。
-オブジェクトが範囲内に存在しないか、または削除された可能性があります。</notification>
- <notification name="SaveNotecardFailReason">次の理由で、ノートカードの保存時に問題が起こりました。 [REASON]。 後でもう一度試してください。</notification>
- <notification name="ScriptCannotUndo">
- あなたのスクリプトのバージョンでは、変更を元に戻すことはできませんでした。
+オブジェクトが範囲内に存在しないか、削除された可能性があります。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SaveNotecardFailReason">以下の理由で、ノートカードの保存時に問題が起こりました:[REASON]
+お手数ですが、後でもう一度試してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ScriptCannotUndo">あなたのスクリプトのバージョンでは、変更を元に戻すことはできませんでした。
サーバーの最新保存バージョンをロードしますか?
(**警告**:この操作後元に戻すことはできません)
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="SaveScriptFailObjectNotFound">スクリプトの保存に失敗しました。スクリプトが入ったオブジェクトが見つかりません。
-オブジェクトは範囲外か、または削除されているかもしれません。</notification>
- <notification name="StartRegionEmpty">
- ログイン位置が指定されていません。
+オブジェクトは範囲外か、または削除されているかもしれません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="StartRegionEmpty">ログイン位置が指定されていません。
ログイン位置の欄にリージョン名を入力するか、「最後にログアウトした場所」か「自宅(ホーム)」を選択してください。
- <usetemplate name="okbutton" yestext="OK"/>
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="CouldNotStartStopScript">スクリプトの起動または停止に失敗しました。スクリプトが格納されているオブジェクトが見つかりません。
-オブジェクトが範囲内に存在しないか、または削除された可能性があります。</notification>
- <notification name="CannotDownloadFile">ファイルをダウンロードできません。</notification>
- <notification label="" name="MediaFileDownloadUnsupported">
- [SECOND_LIFE] でサポートされていないファイルのダウンロードを要求しました。
- <usetemplate ignoretext="サポートされていないファイルのダウンロードを警告する" name="okignore" yestext="OK"/>
- </notification>
- <notification name="CannotWriteFile">ファイル [[FILE]] を書き込めません。</notification>
- <notification name="UnsupportedHardware">
- お使いのコンピューターは [APP_NAME] の必要最低限の動作環境を満たしていません。 パフォーマンスの低下を感じるかもしれません。 恐れ入りますが [SUPPORT_SITE] ではサポート対象外のシステムに関する技術的サポートは行っておりません。
-
-[_URL] に移動して確認をしますか?
- <url name="url" option="0">http://secondlife.com/support/sysreqs.php?lang=ja</url>
+オブジェクトが範囲内に存在しないか、または削除された可能性があります。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CannotDownloadFile">ファイルをダウンロードできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification label="" name="MediaFileDownloadUnsupported">ダウンロードをリクエストしたファイルは、[SECOND_LIFE]でサポートされていません。
+ <unique/>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="サポートされていないファイルのダウンロードを警告する" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="CannotWriteFile">ファイル[[FILE]]に書き込むことができませんでした。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="UnsupportedHardware">お使いのコンピュータは、[APP_NAME]の最小システム要件を満たしていません。
+このためパフォーマンスが低下する場合があります。恐れ入りますが[SUPPORT_SITE]は、サポートされていないシステム構成に対する技術的サポートを提供できません。
+
+詳細について、[_URL] を確認しますか?
+ <url name="url" option="0">
+ https://secondlife.com/system-requirements?lang=ja
+ </url>
+ <tag>
+ fail
+ </tag>
<usetemplate ignoretext="使用中のコンピューターのハードウェアがサポートされていないとき" name="okcancelignore" notext="いいえ" yestext="はい"/>
</notification>
- <notification name="RunLauncher">ビューワ実行ファイルを直接実行しないでください。代わりに、既存のショートカットの内のどれかをアップデートし、SL_Launcher を実行してください。</notification>
- <notification name="OldGPUDriver">
- グラフィックスチップに最新のドライバがある可能性があります。グラフィックドライバを更新することにより、大幅にパフォーマンスが向上します。
-
- ドライバの更新を確認するために [URL] にアクセスしますか?
- <url name="url">[URL]</url>
+ <notification name="OldGPUDriver">グラフィックスチップに最新のドライバがある可能性があります。グラフィックドライバを更新することにより、大幅にパフォーマンスが向上します。
+ドライバの更新を確認するために[URL] にアクセスしますか?
+ <url name="url">
+ [URL]
+ </url>
+ <tag>
+ confirm
+ </tag>
+ <tag>
+ fail
+ </tag>
<usetemplate ignoretext="使用中のグラフィックドライバが古くなっています" name="okcancelignore" notext="いいえ" yestext="はい"/>
</notification>
- <notification name="UnknownGPU">
- お使いのシステムには、[APP_NAME] が認識できないグラフィックカードが搭載されています。
-[APP_NAME] でまだテストされていない最新ハードウェアのためだと考えられます。 問題ないとは思いますが、グラフィックの設定を調整する必要があるかもしれません。
-(ミー > 環境設定 > グラフィック)
+ <notification name="UnknownGPU">お使いのシステムには、[APP_NAME]が認識できないグラフィックカードが搭載されています。[APP_NAME]でまだテストされていない最新ハードウェアのためだと考えられます。
+問題ないとは思いますが、グラフィックの設定を調整する必要があるかもしれません。
+(「私」>「初期設定」>「グラフィック」)
+ <tag>
+ fail
+ </tag>
<form name="form">
<ignore name="ignore" text="使用中のグラフックカードが認識されないとき"/>
</form>
</notification>
- <notification name="DisplaySettingsNoShaders">グラフィックドライバを初期化中に [APP_NAME] がクラッシュしました。
-ドライバの一般的なエラーを防ぐために、画質が低に設定されます。 そのため、一部のグラフィック特性に制限が出ます。
+ <notification name="DisplaySettingsNoShaders">グラフィックドライバを初期化中に[APP_NAME]がクラッシュしました。
+ドライバの一般的なエラーを防ぐために、画質が低に設定されます。このため、一部のグラフィック特性に制限が出ます。
お使いのグラフィックカードのドライバをアップデートするようおすすめします。
-画質は、環境設定 > グラフィック で設定できます。</notification>
- <notification name="RegionNoTerraforming">[REGION] では、地形の変更ができません。</notification>
- <notification name="ParcelNoTerraforming">あなたには [PARCEL] 区画を地形編集する許可がありません。</notification>
- <notification name="CannotCopyWarning">
- あなたには次アイテムをコピーする権限がありません:
-&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
-他の住人に譲ると、そのアイテムはあなたの持ち物から削除されます。本当にこれらのアイテムを譲りますか?
+画質は、「初期設定」>「グラフィック」で設定できます。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="AutoFPSConfirmDisable">この設定を変更すると、「自動調整」の設定が無効になります。
+続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="続ける"/>
+ </notification>
+ <notification name="AdvancedLightingConfirm">高度な照明をオンにするには、品質をレベル4以上にする必要があります。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ShadowsConfirm">影を有効にするには、品質をレベルを4以上にする必要があります。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="RegionNoTerraforming">[REGION]では、地形の変更ができません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ParcelNoTerraforming">[PARCEL]区画の地形を編集する権限がありません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CannotCopyWarning">以下のアイテムをコピーする権限がありません:
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+他の人に譲ると、そのアイテムはあなたのインベントリから削除されます。本当にこれらのアイテムを譲ってもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <tag>
+ fail
+ </tag>
<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
</notification>
- <notification name="CannotGiveItem">インベントリのアイテムを渡せません。</notification>
- <notification name="TransactionCancelled">取引がキャンセルされました。</notification>
- <notification name="TooManyItems">一度に 42 個以上のアイテムは渡せません。</notification>
- <notification name="NoItems">選択したアイテムを渡す権限がありません。</notification>
- <notification name="CannotCopyCountItems">
- あなたは選択した [COUNT] 個のアイテムののコピーを許されていません。
+ <notification name="CannotGiveItem">インベントリのアイテムを渡すことができません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="TransactionCancelled">取引がキャンセルされました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="TooManyItems">一度に42個以上のアイテムを渡すことはできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoItems">選択したアイテムを渡す権限がありません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CannotCopyCountItems">あなたは選択した[COUNT]個のアイテムをコピーする権限がありません。
これらのアイテムはあなたのインベントリから失われます。
-本当にアイテムを渡したいですか?
+本当にアイテムを渡してもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <tag>
+ fail
+ </tag>
<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
</notification>
- <notification name="CannotGiveCategory">選択したフォルダを渡す権限がありません</notification>
- <notification name="FreezeAvatar">
- このアバターをフリーズしますか?
+ <notification name="CannotGiveCategory">選択したフォルダを渡す権限がありません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="FreezeAvatar">このアバターをフリーズしますか?
アバターは一時的に動けなくなり、チャットを含めインワールドで何もできなくなります。
- <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="解除" yestext="フリーズ"/>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="解除" yestext="フリーズ"/>
</notification>
- <notification name="FreezeAvatarFullname">
- [AVATAR_NAME]をフリーズしますか?
+ <notification name="FreezeAvatarFullname">[AVATAR_NAME]をフリーズしますか?
フリーズされた人は一時的に動けなくなり、チャットなど、この世界に対する関わりを持つことができなくなります。
+ <tag>
+ confirm
+ </tag>
<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="解除" yestext="フリーズ"/>
</notification>
- <notification name="EjectAvatarFullname">
- あなたの土地から [AVATAR_NAME] を追放しますか?
- <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="追放と禁止" yestext="追放"/>
+ <notification name="EjectAvatarFullname">あなたの土地から[AVATAR_NAME]を追放しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="追放しバンする" yestext="追放する"/>
</notification>
- <notification name="EjectAvatarNoBan">
- このアバターをあなたの土地から追放しますか?
+ <notification name="EjectAvatarNoBan">このアバターをあなたの土地から追放しますか?
+ <tag>
+ confirm
+ </tag>
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="追放"/>
</notification>
- <notification name="EjectAvatarFullnameNoBan">
- [AVATAR_NAME] をあなたの土地から追放しますか?
+ <notification name="EjectAvatarFullnameNoBan">[AVATAR_NAME]をあなたの土地から追放しますか?
+ <tag>
+ confirm
+ </tag>
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="追放"/>
</notification>
- <notification name="EjectAvatarFromGroup">&lt;nolink&gt;[GROUP_NAME]&lt;/nolink&gt; から [AVATAR_NAME] を追放しました</notification>
- <notification name="AcquireErrorTooManyObjects">取得エラー:選択したオブジェクトの数が多すぎます。</notification>
- <notification name="AcquireErrorObjectSpan">取得エラー:
-オブジェクトが複数のリージョン(地域)にまたがって存在しています。
-すべて同じリージョン内に移動させてから取得してください。</notification>
- <notification name="PromptGoToCurrencyPage">
- [EXTRA]
-
-[_URL] に移動してリンデンドル購入に関する情報を確認しますか?
- <url name="url">http://secondlife.com/app/currency/?lang=ja-JP</url>
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="MuteLimitReached">[MUTE_LIMIT] エントリの制限に達したため、ブロックリストに新しいエントリを追加できません。</notification>
- <notification name="UnableToLinkObjects">[COUNT] 個のオブジェクトをリンクできません。
-リンクできるのは最大 [MAX] 個です。</notification>
- <notification name="CannotLinkIncompleteSet">セットで揃っているオブジェクトのみリンクできます。
-複数のオブジェクトを選択してください。</notification>
+ <notification name="EjectAvatarFromGroup">&lt;nolink&gt;[GROUP_NAME]&lt;/nolink&gt;から[AVATAR_NAME]を追放しました。
+ <tag>
+ group
+ </tag>
+ </notification>
+ <notification name="AcquireErrorTooManyObjects">取得エラー:選択したオブジェクトの数が多すぎます。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="AcquireErrorObjectSpan">取得エラー:オブジェクトが複数のリージョン(地域)にまたがって存在しています。
+すべて同じリージョン内に移動させてから取得してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="PromptGoToCurrencyPage">[EXTRA]
+
+[_URL] に移動してリンデンドル購入に関する情報を確認しますか?
+ <url name="url">
+ https://secondlife.com/my/lindex/?lang=ja-JP
+ </url>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="MuteLimitReached">[MUTE_LIMIT]エントリの制限に達したため、ブロックリストに新しいエントリを追加できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="UnableToLinkObjects">[COUNT]個のオブジェクトをリンクできませんでした。
+リンクできるオブジェクトは最大[MAX]個です。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CannotLinkIncompleteSet">セットが揃っているオブジェクトのみリンクできます。複数のオブジェクトを選択してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotLinkModify">すべてのオブジェクトの修正許可がないためリンクできません。
-どのオブジェクトもロックされておらず、あなたのものであることを確認してください。</notification>
- <notification name="CannotLinkPermanent">地域(リージョン)の境界を越えてオブジェクトをリンクできません。</notification>
- <notification name="CannotLinkAcrossRegions">地域(リージョン)の境界を越えてオブジェクトをリンクできません。</notification>
+どのオブジェクトもロックされておらず、あなたのものであることを確認してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CannotLinkPermanent">リージョン(地域)の境界を越えてオブジェクトをリンクできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CannotLinkAcrossRegions">リージョン(地域)の境界を越えてオブジェクトをリンクできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotLinkDifferentOwners">所有者が異なるため、オブジェクトをリンクできません。
+自分が所有しているオブジェクトだけを選択してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoFileExtension">
+ ファイル「[FILE]」は、無効な拡張子です。
-自分が所有しているオブジェクトだけを選択してください。</notification>
- <notification name="NoFileExtension">「 [FILE] 」の拡張子が無効です。
-
-このファイルの拡張子が正しいかどうかを確認してください。</notification>
- <notification name="InvalidFileExtension">
- [EXTENSION] は無効です。
-正しい拡張子:[VALIDS]
- <usetemplate name="okbutton" yestext="OK"/>
+このファイルの拡張子が正しいかどうかを確認してください。
+ </notification>
+ <notification name="InvalidFileExtension">「[EXTENSION]」は、無効な拡張子です。
+有効な拡張子:[VALIDS]
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="CannotUploadSoundFile">読み込みのためにアップロードされたサウンドファイルを開けません:
-[FILE]</notification>
- <notification name="SoundFileNotRIFF">RIFF WAVE ファイルとして認識されません:
-[FILE]</notification>
- <notification name="SoundFileNotPCM">PCM WAVE オーディオファイルとして認識されません:
-[FILE]</notification>
- <notification name="SoundFileInvalidChannelCount">ファイルのチャンネル数が無効です(モノラルまたはステレオを使用する必要があります):
-[FILE]</notification>
- <notification name="SoundFileInvalidSampleRate">ファイルのサンプルレートがサポートされていません(44.1k である必要があります):
-[FILE]</notification>
- <notification name="SoundFileInvalidWordSize">ファイルのワードサイズがサポートされていません(8 または 16 ビットである必要があります):
-[FILE]</notification>
- <notification name="SoundFileInvalidHeader">WAV ヘッダーにデータチャンクが見つかりません:
-[FILE]</notification>
- <notification name="SoundFileInvalidChunkSize">WAV ファイルのチャンクサイズが間違っています:
-[FILE]</notification>
- <notification name="SoundFileInvalidTooLong">オーディオファイルが長すぎます。(最大 10 秒):
-[FILE]</notification>
- <notification name="ProblemWithFile">「 [FILE] 」に問題があります。
-
-[ERROR]</notification>
- <notification name="CannotOpenTemporarySoundFile">書き込み用の一時圧縮サウンドファイルを開くことができません:[FILE]</notification>
- <notification name="UnknownVorbisEncodeFailure">不明の Vorbis のエンコードに失敗: [FILE]</notification>
- <notification name="CannotEncodeFile">次のファイルのエンコードができません: [FILE]</notification>
- <notification name="CorruptedProtectedDataStore">
- ユーザー名とパスワードを自動入力できません。これはネットワーク設定が変更された場合に起こります
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CorruptResourceFile">破損したリソースファイル: [FILE]</notification>
- <notification name="UnknownResourceFileVersion">不明のリンデンリソースファイルのバージョン: [FILE]</notification>
- <notification name="UnableToCreateOutputFile">出力ファイルを作成できません: [FILE]</notification>
- <notification name="DoNotSupportBulkAnimationUpload">現在 [APP_NAME] では、BVH 形式のアニメーションファイルの一括アップロードはサポートされていません。</notification>
- <notification name="CannotUploadReason">次の理由で、「 [FILE] 」をアップロードできません: [REASON]
-あとでもう一度試してください。</notification>
- <notification name="LandmarkCreated">「 [LANDMARK_NAME] 」を「 [FOLDER_NAME] 」フォルダに追加しました。</notification>
- <notification name="LandmarkAlreadyExists">
- 現在地のランドマークを既に持っています。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CannotCreateLandmarkNotOwner">土地の所有者が許可していないため、ランドマークを作成することはできません。</notification>
- <notification name="CannotRecompileSelectObjectsNoScripts">「リコンパイル」できません。
-スクリプトのオブジェクトを選択してください。</notification>
- <notification name="CannotRecompileSelectObjectsNoPermission">「リコンパイル」できません。
-
-修正修正権限のあるスクリプトのオブジェクトを選択してください。</notification>
+[FILE]
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SoundFileNotRIFF">RIFF WAVEファイルとして認識されません:
+[FILE]
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SoundFileNotPCM">PCM WAVEオーディオファイルとして認識されません:
+[FILE]
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SoundFileInvalidChannelCount">このファイルのチャンネル数は無効です(モノラルか、ステレオである必要があります):
+[FILE]
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SoundFileInvalidSampleRate">このファイルのサンプリングレートはサポートされていません(44.1kである必要があります):
+[FILE]
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SoundFileInvalidWordSize">このファイルのビットサイズはサポートされていません(8bitか、16bitである必要があります):
+[FILE]
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SoundFileInvalidHeader">WAVヘッダーにデータチャンクが見つかりません:
+[FILE]
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SoundFileInvalidChunkSize">WAVファイルのチャンクサイズが間違っています:
+[FILE]
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SoundFileInvalidTooLong">オーディオファイルが長すぎます。(最大10秒):
+[FILE]
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ProblemWithFile">「[FILE]」に問題があります。
+
+[ERROR]
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CannotOpenTemporarySoundFile">書き込み用の一時圧縮サウンドファイルを開くことができません:
+[FILE]
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="UnknownVorbisEncodeFailure">不明なVorbisのエンコードに失敗しました:
+[FILE]
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CannotEncodeFile">次のファイルのエンコードができません:
+[FILE]
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CorruptedProtectedDataStore">ユーザー名とパスワードを自動入力できません。これはネットワーク設定が変更された場合に起こります
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CorruptResourceFile">破損したリソースファイル:
+[FILE]
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="UnknownResourceFileVersion">不明なLindenリソースファイルのバージョンです:
+[FILE]
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="UnableToCreateOutputFile">出力ファイルを作成できません:
+[FILE]
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="DoNotSupportBulkAnimationUpload">現在[APP_NAME]では、BVH形式のアニメーションファイルの一括アップロードはサポートされていません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CannotUploadReason">以下の理由で「[FILE]」をアップロードできませんでした:
+[REASON]
+
+お手数ですがもう一度やり直してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="LandmarkCreated">
+ 「[LANDMARK_NAME]」を「[FOLDER_NAME]」フォルダに追加しました。
+ </notification>
+ <notification name="LandmarkAlreadyExists">この場所のランドマークは、既に持っています。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification label="フォルダ作成" name="CreateLandmarkFolder">
+ <unique/>
+フォルダ名を入力してください:
+ <tag>
+ confirm
+ </tag>
+ <form name="form">
+ <input name="message" type="text">
+ </input>
+ <button default="true" index="0" name="OK" text="OK"/>
+ <button index="1" name="Cancel" text="キャンセル"/>
+ </form>
+ </notification>
+ <notification name="CannotRecompileSelectObjectsNoScripts">「再コンパイル」できませんでした。
+スクリプトが入ったオブジェクトを選択してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CannotRecompileSelectObjectsNoPermission">「再コンパイル」できませんでした。
+修正権限のある、スクリプトが入ったオブジェクトを選択してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotResetSelectObjectsNoScripts">「再設定」ができません。
-スクリプトのオブジェクトを選択してください。</notification>
+スクリプトが入ったオブジェクトを選択してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotResetSelectObjectsNoPermission">「再設定」ができません。
-
-修正権限のあるスクリプトのオブジェクトを選択してください。</notification>
- <notification name="CannotOpenScriptObjectNoMod">修正権限のないオブジェクトのスクリプトは開くことはできません。</notification>
+修正権限のある、スクリプトが入ったオブジェクトを選択してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CannotOpenScriptObjectNoMod">修正権限のないオブジェクトのスクリプトは開くことはできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotSetRunningSelectObjectsNoScripts">スクリプトの「実行」ができません。
-
-スクリプトのオブジェクトを選択してください。</notification>
+スクリプトが入ったオブジェクトを選択してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotSetRunningNotSelectObjectsNoScripts">スクリプトを「実行しない」設定にできません。
+スクリプトが入ったオブジェクトを選択してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoFrontmostFloater">
+ 保存するfrontmostフロータがありません。
+ </notification>
+ <notification name="SeachFilteredOnShortWords">
+ 指定した検索クエリは変更され、短すぎる語句は取り除かれています。
-スクリプトのオブジェクトを選択してください。</notification>
- <notification name="NoFrontmostFloater">保存する frontmost フロータがありません。</notification>
- <notification name="SeachFilteredOnShortWords">指定した検索クエリは変更され、短すぎる語句は取り除かれています。
-
-検索語句: [FINALQUERY]</notification>
- <notification name="SeachFilteredOnShortWordsEmpty">指定した検索語句が短すぎたため、検索は行われませんでした。</notification>
+検索語句:[FINALQUERY]
+ </notification>
+ <notification name="SeachFilteredOnShortWordsEmpty">指定した検索語句が短すぎたため、検索は行われませんでした。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CouldNotTeleportReason">テレポートに失敗しました。
-[REASON]</notification>
- <notification name="invalid_tport">テレポート処理中に問題が発生しました。 ログインし直す必要があるかもしれません。
-このメッセージが何度も出る場合は、[SUPPORT_SITE] をご確認ください。</notification>
- <notification name="invalid_region_handoff">リージョン間の移動中に問題が発生しました。 ログインし直す必要があるかもしれません。
-このメッセージが何度も出る場合は、[SUPPORT_SITE] をご確認ください。</notification>
- <notification name="blocked_tport">申し訳ございません。テレポートは現在、ブロックされています。しばらくしてから再度お試しください。
-それでもテレポートできない場合は、ログアウトし、ログインし直して問題を解決してください。</notification>
- <notification name="nolandmark_tport">申し訳ございません。ランドマークの目的地が見つかりませんでした。</notification>
+[REASON]
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="invalid_tport">テレポートの試行は1分間に6回までと制限されています。1分待ってからもう一度テレポートしてみてください。問題が解決しない場合は、ログインし直してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="invalid_region_handoff">リージョン間の移動中に問題が発生しました。ログインし直す必要があるかもしれません。
+このメッセージが何度も出る場合は、[SUPPORT_SITE]をご確認ください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="blocked_tport">申し訳ございません。テレポートは現在ブロックされています。お手数ですが、しばらくしてから再度お試しください。
+それでもテレポートできない場合は、ログアウトし、ログインし直して問題を解決してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="nolandmark_tport">申し訳ございません。ランドマークの目的地が見つかりませんでした。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="timeout_tport">申し訳ございません。システムによるテレポート接続が完了できませんでした。
-しばらくしてから再度お試しください。</notification>
- <notification name="noaccess_tport">残念ながら、目的地へアクセスが許可されていないため、テレポートできません。</notification>
- <notification name="missing_attach_tport">添付物がまだ届いていません。テレポートをする前にあと数秒間お待ちいただくか、いったんログアウトし、再度ログインしてください。</notification>
+しばらくしてから再度お試しください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="noaccess_tport">残念ながら、目的地へアクセスが許可されていないため、テレポートできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="missing_attach_tport">添付物がまだ届いていません。テレポートをする前にあと数秒間お待ちいただくか、いったんログアウトし、再度ログインしてください。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="too_many_uploads_tport">このリージョンのアセットキューが現在混み合っているため、テレポートのリクエストをすぐに処理することが難しい状況です。
-数分後にやり直すか、混雑していない他のリージョンでお試しください。</notification>
- <notification name="expired_tport">申し訳ございません。システムはテレポートのリクエストを時間どおりに完了できませんでした。数分後にやり直してください。</notification>
+数分後にやり直すか、混雑していない他のリージョンでお試しください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="expired_tport">申し訳ございません。システムはテレポートのリクエストを時間どおりに完了できませんでした。
+数分後にやり直してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="expired_region_handoff">申し訳ございません。システムはリージョン間の移動を時間どおりに完了できませんでした。
-数分後にやり直してください。</notification>
- <notification name="no_host">テレポート目的地を見つけられません。目的地が一時的に利用できない状態か、すでに消滅している可能性があります。数分後にやり直してください。</notification>
- <notification name="no_inventory_host">インベントリシステムは現在利用できません。</notification>
+数分後にやり直してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="no_host">テレポート目的地を見つけられません。目的地が一時的に利用できない状態か、すでに消滅している可能性があります。
+ 数分後にやり直してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="no_inventory_host">インベントリシステムは現在利用できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotSetLandOwnerNothingSelected">土地所有者設定ができません:
-区画が選定されていません。</notification>
+区画が選定されていません。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotSetLandOwnerMultipleRegions">複数のリージョンが選択されたため、土地の所有権を取得できません。
-選択する面積を小さくして、もう一度お試しください。</notification>
- <notification name="ForceOwnerAuctionWarning">
- この区画はオークションに出されています。 所有権を変更するとオークションはキャンセルとなり、既にオークションに参加している住人がいればその人に迷惑をかけてしまいます。
+選択する面積を小さくして、もう一度お試しください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ForceOwnerAuctionWarning">この区画はオークションに出されています。所有権を変更するとオークションはキャンセルとなり、既にオークションに参加している住人がいればその人に迷惑をかけてしまいます。
所有権を変更しますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="CannotContentifyNothingSelected">コンテンツ化は不可能です:
-区画が選定されていません。</notification>
+区画が選定されていません。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotContentifyNoRegion">コンテンツ化は不可能です:
-土地が選択されていません。</notification>
+土地が選択されていません。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotReleaseLandNothingSelected">土地を破棄できません:
-区画が選定されていません。</notification>
+区画が選定されていません。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotReleaseLandNoRegion">土地を破棄できません:
-リージョンが見つかりません。</notification>
+リージョンが見つかりません。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotBuyLandNothingSelected">土地を購入できません:
-区画が選定されていません。</notification>
+区画が選定されていません。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotBuyLandNoRegion">土地を購入できません:
-この土地があるリージョンを見つけることができません</notification>
- <notification name="CannotCloseFloaterBuyLand">[APP_NAME] がこの取引価格を見積もるまでは、土地の購入ウィンドウを閉じることはできません。</notification>
+この土地があるリージョンを見つけることができません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CannotCloseFloaterBuyLand">[APP_NAME] がこの取引価格を見積もるまでは、土地の購入ウィンドウを閉じることはできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotDeedLandNothingSelected">土地を譲渡できません:
-区画が選定されていません。</notification>
+区画が選定されていません。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotDeedLandNoGroup">土地を譲渡できません:
-グループが選択されていません。</notification>
+グループが選択されていません。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotDeedLandNoRegion">土地を譲渡できません:
-この土地があるリージョンが見つかりません。</notification>
+この土地があるリージョンが見つかりません。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotDeedLandMultipleSelected">土地を譲渡できません:
複数の区画が選択されています。
-区画を 1 つ選択してください。</notification>
+区画を1つ選択してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotDeedLandWaitingForServer">土地を譲渡できません:
サーバーからの所有権情報を待っています。
-再度、試みてください。</notification>
+お手数ですが、もう一度やり直してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotDeedLandNoTransfer">土地を譲渡できません:
-[REGION] では土地の譲渡が許されていません。</notification>
+[REGION]では、土地の譲渡が許可されていません。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotReleaseLandWatingForServer">土地を破棄できません:
サーバーが区画情報を更新するのを待っています。
-もう少し後でやり直してください。</notification>
+お手数ですが、もう一度やり直してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotReleaseLandSelected">土地を破棄できません:
あなたは、選択した区画のすべてを所有していません。
-区画を 1 つ選択してください。</notification>
+区画を1つ選択してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotReleaseLandDontOwn">土地を破棄できません:
あなたはこの土地を手放すことを許可されていません。
-あなたの区画は緑色で表示されています。</notification>
+あなたの区画は緑色で表示されています。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotReleaseLandRegionNotFound">土地を放棄できません:
-この土地があるリージョンが見つかりません。</notification>
+この土地があるリージョンが見つかりません。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotReleaseLandNoTransfer">土地を破棄できません:
-[REGION] では土地の譲渡が許されていません。</notification>
+[REGION]では土地の譲渡が許可されていません。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotReleaseLandPartialSelection">土地を破棄できません:
区画全体を選択して破棄する必要があります。
-区画全体を選択するか、または、まず最初に区画を分割してください。</notification>
- <notification name="ReleaseLandWarning">
- あなたは、[AREA] 平方メートルの土地を破棄しようとしています。
-この区画を破棄するとあなたの土地ではなくなりますが、
-L$ は返金されません。
+区画全体を選択するか、まず最初に区画を分割してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ReleaseLandWarning">あなたは、[AREA]㎡の土地を破棄しようとしています。
+この区画を破棄するとあなたの土地ではなくなりますが、L$ は返金されません。
-土地を破棄しますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+土地を破棄してもよろしいですか?
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="CannotDivideLandNothingSelected">土地を分割できません:
-区画が選定されていません。</notification>
+区画が選定されていません。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotDivideLandPartialSelection">土地を分割できません:
区画全体が選択されています。
-区画の一部を選択してください。</notification>
- <notification name="LandDivideWarning">
- この土地を分割すると、2 つの区画に別れます。
-区画ごとの設定が可能になります。 この操作を行うと、一部の設定がデフォルトにリセットされます。
+区画の一部を選択してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="LandDivideWarning">この土地を分割すると、2つの区画に分割され各々の設定が可能になります。
+この操作を行うと、一部の設定がデフォルトにリセットされます。
-土地の分割操作を続行しますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+土地を分割してもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="CannotDivideLandNoRegion">土地を分割できません:
-この土地があるリージョンが見つかりません。</notification>
- <notification name="CannotJoinLandNoRegion">土地を統合できません:
-この土地があるリージョンが見つかりません。</notification>
- <notification name="CannotJoinLandNothingSelected">土地を統合できませんでした:
-区画が選定されていません。</notification>
- <notification name="CannotJoinLandEntireParcelSelected">土地を統合できません:
-区画が 1 つしか選択されていません。
-
-両方の区画をまたいで土地を選択してください。</notification>
- <notification name="CannotJoinLandSelection">土地を統合できません:
-区画を 1 つ以上選択する必要があります。
-
-両方の区画をまたいで土地を選択してください。</notification>
- <notification name="JoinLandWarning">
- この土地を統合すると、選択された長方形に交差する全ての区画を基にして、大きな区画が 1 つ作成されます。
+この土地があるリージョンが見つかりません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CannotJoinLandNoRegion">土地を結合できません:
+この土地があるリージョンが見つかりません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CannotJoinLandNothingSelected">土地を結合できませんでした:
+区画が選定されていません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CannotJoinLandEntireParcelSelected">土地を結合できません:
+区画が1つしか選択されていません。
+
+両方の区画をまたいで土地を選択してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CannotJoinLandSelection">土地を結合できません:
+区画を1つ以上選択する必要があります。
+
+両方の区画をまたいで土地を選択してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="JoinLandWarning">この土地を結合すると、選択された長方形に交差する全ての区画を基にして、大きな区画が1つ作成されます。
新しい区画の名前とオプションを再設定する必要があります。
-土地を統合しますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="ConfirmNotecardSave">
- このアイテムをコピー、表示する前に、ノートカードの保存が必要です。 保存しますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="ConfirmItemCopy">
- このアイテムをあなたのインベントリにコピーしますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="コピー"/>
- </notification>
- <notification name="ResolutionSwitchFail">解像度を [RESX]x[RESY] に切り替えることができませんでした。</notification>
- <notification name="ErrorUndefinedGrasses">エラー:未定義の植物:[SPECIES]</notification>
- <notification name="ErrorUndefinedTrees">エラー:未定義の樹木:[SPECIES]</notification>
- <notification name="CannotSaveWearableOutOfSpace">「 [NAME] 」を衣類のファイルに保存できません。
-コンピューターのディスクスペースを少し増やしてから、もう一度保存してみてください。</notification>
- <notification name="CannotSaveToAssetStore">「 [NAME] 」を保存できません。
-通常これは一時的なエラーです。 数分後にもう一度着用物をカスタマイズ・保存してください。</notification>
- <notification name="YouHaveBeenLoggedOut">
- しまった、[SECOND_LIFE] からログアウトされてしまいました。
-
-[MESSAGE]
- <usetemplate name="okcancelbuttons" notext="終了" yestext="IMとチャットを表示"/>
+土地を結合してもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmNotecardSave">このアイテムをコピー、表示する前に、ノートカードの保存が必要です。
+保存してもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmItemCopy">このアイテムをあなたのインベントリにコピーしますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="コピー"/>
+ </notification>
+ <notification name="ResolutionSwitchFail">解像度を[RESX]✕[RESY]に変更することができませんでした。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ErrorUndefinedGrasses">エラー:未定義の植物:[SPECIES]
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ErrorUndefinedTrees">エラー:未定義の樹木:[SPECIES]
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CannotSaveWearableOutOfSpace">「[NAME]」を服装のファイルに保存できません。
+コンピューターのディスクスペースを少し増やしてから、もう一度保存してみてください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CannotSaveToAssetStore">「[NAME]」を保存できません。
+通常これは一時的なエラーです。数分後にもう一度着用物をカスタマイズ・保存してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="YouHaveBeenLoggedOut">しまった、[SECOND_LIFE]からログアウトされてしまいました。[MESSAGE]
+ <usetemplate name="okcancelbuttons" notext="終了" yestext="IMでチャット"/>
+ </notification>
+ <notification name="InventoryUnusable">インベントリの読み込み中に問題が発生しました。まず、ログアウトして再度ログインし直してみてください。
+このメッセージが再度表示される場合は、サポートに連絡して問題を解決してください。
+ <tag>
+ fail
+ </tag>
</notification>
<notification name="OnlyOfficerCanBuyLand">グループ用の土地の購入ができません:
-あなたにはアクティブなグループのために土地を購入する権限がありません。</notification>
- <notification label="フレンド登録" name="AddFriendWithMessage">
- フレンド登録すると、お互いの現在地の地図への表示許可、オンライン状態の表示設定ができます。
-
-[NAME] にフレンドシップを申し出ますか?
+あなたにはアクティブなグループのために土地を購入する権限がありません。
+ <tag>
+ group
+ </tag>
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification label="フレンド登録" name="AddFriendWithMessage">フレンド登録すると、お互いの現在いる場所のマップへの表示許可や、オンライン状態の表示設定ができます。
+
+[NAME]にフレンドの申請を行いますか?
+ <tag>
+ friendship
+ </tag>
+ <tag>
+ confirm
+ </tag>
<form name="form">
- <input name="message">フレンド登録してくれますか?</input>
- <button name="Offer" text="OK"/>
+ <input name="message">
+ フレンド登録してくれますか?
+ </input>
+ <button name="Offer" text="OK"/>
<button name="Cancel" text="キャンセル"/>
</form>
</notification>
- <notification label="自動置換リストを追加" name="AddAutoReplaceList">
- 新しいリストの名前:
+ <notification label="自動置換リストを追加" name="AddAutoReplaceList">新しいリストの名前:
+ <tag>
+ addlist
+ </tag>
+ <tag>
+ confirm
+ </tag>
<form name="form">
- <button name="SetName" text="OK"/>
+ <button name="SetName" text="OK"/>
</form>
</notification>
- <notification label="自動置換リストの名前を変更" name="RenameAutoReplaceList">
- 名前 '[DUPNAME]' は既に使われています
-一意の名前を入力してください:
+ <notification label="自動置換リストの名前を変更" name="RenameAutoReplaceList">名前「[DUPNAME]」は既に使われています。
+一意の名前を入力してください:
+ <tag>
+ confirm
+ </tag>
<form name="form">
<button name="ReplaceList" text="着用中のリストを入れ替える"/>
<button name="SetName" text="新しい名前を使用"/>
</form>
</notification>
- <notification name="InvalidAutoReplaceEntry">キーワードは一語でなければならず、置換は空にできません。</notification>
- <notification name="InvalidAutoReplaceList">その置換リストは無効です。</notification>
- <notification name="SpellingDictImportRequired">ファイル、名前および言語を指定する必要があります。</notification>
- <notification name="SpellingDictIsSecondary">辞書 [DIC_NAME] に「aff」ファイルがないようです。これはこの辞書が「セカンダリ」辞書であることを意味します。
-この辞書は追加辞書として使用できますが、メイン辞書としては使用できません。
-
-https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries を参照してください。</notification>
- <notification name="SpellingDictImportFailed">[FROM_NAME] から
-
-[TO_NAME] へコピーできません</notification>
- <notification label="アウトフィットを保存する" name="SaveOutfitAs">
- 着用中のアウトフィットを新しいアウトフットとして保存:
+ <notification name="InvalidAutoReplaceEntry">キーワードは一語でなければならず、置換は空にできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="InvalidAutoReplaceList">その置換リストは無効です。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SpellingDictImportRequired">ファイル、名前および言語を指定する必要があります。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SpellingDictIsSecondary">辞書 [DIC_NAME]に「aff」ファイルがないようです。これはこの辞書が「セカンダリ」辞書であることを意味します。
+この辞書は追加辞書として使用できますが、メイン辞書としては使用できません。詳細については下記をご覧ください。
+https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SpellingDictImportFailed">[FROM_NAME]から[TO_NAME]へコピーすることはできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification label="アウトフィットの保存" name="SaveOutfitAs">着用中のアウトフィットを新しいアウトフィットとして保存:
+ <unique/>
+ <tag>
+ confirm
+ </tag>
<form name="form">
- <input name="message">[DESC] (新)</input>
- <button name="OK" text="OK"/>
+ <input name="message">
+ [DESC] (new)
+ </input>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="キャンセル"/>
</form>
</notification>
- <notification label="着用物を保存" name="SaveWearableAs">
- アイテムを別名でインベントリに保存:
+ <notification label="着用物の保存" name="SaveWearableAs">アイテムを別名でインベントリに保存:
+ <tag>
+ confirm
+ </tag>
<form name="form">
- <input name="message">[DESC](新規)</input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="取り消し"/>
+ <input name="message">
+ [DESC] (new)
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="キャンセル"/>
</form>
</notification>
- <notification label="アウトフィットの名前を変更する" name="RenameOutfit">
- 新しいアウトフィットの名前:
+ <notification label="アウトフィットの名前変更" name="RenameOutfit">新しいアウトフィット名:
+ <tag>
+ confirm
+ </tag>
<form name="form">
- <input name="new_name">[NAME]</input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="取り消し"/>
+ <input name="new_name">
+ [NAME]
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="キャンセル"/>
+ </form>
+ </notification>
+ <notification label="ジェスチャーの名前変更" name="RenameGesture">新しいジェスチャー名:
+ <tag>
+ confirm
+ </tag>
+ <form name="form">
+ <input name="new_name">
+ [NAME]
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="キャンセル"/>
</form>
</notification>
- <notification name="RemoveFromFriends">
- フレンドリストから &lt;nolink&gt;[NAME]&lt;/nolink&gt; を削除しますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ <notification label="ランドマークの名前変更" name="RenameLandmark">[NAME]の新しい名前を入力してください。
+ <tag>
+ confirm
+ </tag>
+ <form name="form">
+ <input name="new_name">
+ [NAME]
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="キャンセル"/>
+ </form>
</notification>
- <notification name="RemoveMultipleFromFriends">
- フレンドリストから複数のフレンドを削除しますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ <notification name="RemoveFromFriends">フレンドリストから&lt;nolink&gt;[NAME]&lt;/nolink&gt;を削除しますか?
+ <tag>
+ friendship
+ </tag>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="RemoveMultipleFromFriends">フレンドリストから複数のフレンドを削除しますか?
+ <tag>
+ friendship
+ </tag>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="GodDeleteAllScriptedPublicObjectsByUser">**[AVATAR_NAME]**
+が所有するすべてのスクリプトオブジェクトを、このシム内の他のすべての土地から削除しようとしています。
+操作を続行しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="GodDeleteAllScriptedPublicObjectsByUser">
- **[AVATAR_NAME]**
-所有のすべてのスクリプトオブジェクトをこのシム内の他のすべての土地から削除しようとしています。操作を続行しますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ <notification name="GodDeleteAllScriptedObjectsByUser">**[AVATAR_NAME]**
+が所有するすべてのスクリプトオブジェクトを、このシム内の他のすべての土地から削除しようとしています。
+操作を続行しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="GodDeleteAllScriptedObjectsByUser">
- **[AVATAR_NAME]**
-所有のすべてのスクリプトオブジェクトをこのシム内のすべての土地から削除しようとしています。操作を続行しますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ <notification name="GodDeleteAllObjectsByUser">**[AVATAR_NAME]**
+が所有するすべてのオブジェクト(スクリプトオブジェクトと非スクリプトオブジェクト)を、このシム内のすべての土地から削除しようとしています。
+操作を続行しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="GodDeleteAllObjectsByUser">
- **[AVATAR_NAME]**
-所有のすべてのオブジェクト(スクリプトオブジェクトと非スクリプトオブジェクト)を
-このシム内のすべての土地から削除しようとしています。操作を続行しますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ <notification name="BlankClassifiedName">クラシファイド広告の名前を指定してください。
+ <tag>
+ fail
+ </tag>
</notification>
- <notification name="BlankClassifiedName">クラシファイドの名前を指定してください。</notification>
- <notification name="MinClassifiedPrice">広告料は最低 L$ [MIN_PRICE] 必要です。
-
-金額を増やしてください。</notification>
- <notification name="ConfirmItemDeleteHasLinks">
- 1 つ以上のアイテムにポイントするリンクがあります。このアイテムを削除する場合、そのリンクは永久に機能しなくなります。まず最初にリンクを削除することを強くお勧めします。
+ <notification name="MinClassifiedPrice">クラシファイド広告掲載料は最低L$ [MIN_PRICE]必要です。
+金額を増やしてください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ConfirmItemDeleteHasLinks">1つ以上のアイテムにポイントするリンクがあります。このアイテムを削除する場合、そのリンクは永久に機能しなくなります。
+まず最初にリンクを削除することを強くお勧めします。
+
これらのアイテムを削除しますか?
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="ConfirmObjectDeleteLock">
- 選択したアイテムのうち、少なくとも 1 つがロックされています。
+ <notification name="ConfirmObjectDeleteLock">選択したアイテムのうち、少なくとも1つがロックされています。
本当に削除しますか?
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="ConfirmObjectDeleteNoCopy">
- 選択したアイテムのうち、少なくとも 1 つがコピーできません。
-
+ <notification name="ConfirmObjectDeleteNoCopy">選択したアイテムのうち、少なくとも1つがコピーできません。
+
本当に削除しますか?
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="ConfirmObjectDeleteNoOwn">
- 選択したアイテムの 1 つ以上を所有していません。
-
+ <notification name="ConfirmObjectDeleteNoOwn">選択したアイテムの1つ以上を所有していません。
+
これらのアイテムを削除しますか?
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="ConfirmObjectDeleteLockNoCopy">
- 少なくとも 1 つのオブジェクトがロックされています。
-少なくとも 1 つのオブジェクトがコピーできません。
+ <notification name="ConfirmObjectDeleteLockNoCopy">少なくとも1つのオブジェクトがロックされています。
+少なくとも1つのオブジェクトがコピーできません。
本当に削除しますか?
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="ConfirmObjectDeleteLockNoOwn">
- 1 つ以上のオブジェクトがロックされました。
-1 つ以上のオブジェクトを所有していません。
+ <notification name="ConfirmObjectDeleteLockNoOwn">1つ以上のオブジェクトがロックされました。
+1つ以上のオブジェクトを所有していません。
これらのアイテムを削除しますか?
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="ConfirmObjectDeleteNoCopyNoOwn">
- 1 つ以上のオブジェクトがコピーできません。
-1 つ以上のオブジェクトを所有していません。
+ <notification name="ConfirmObjectDeleteNoCopyNoOwn">1つ以上のオブジェクトがコピーできません。
+1つ以上のオブジェクトを所有していません。
これらのアイテムを削除しますか?
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
- 1 つ以上のオブジェクトがロックされています。
-1 つ以上のオブジェクトがコピーできません。
-1 つ以上のオブジェクトを所有していません。
+ <notification name="ConfirmObjectDeleteLockNoCopyNoOwn">1つ以上のオブジェクトがロックされています。
+1つ以上のオブジェクトがコピーできません。
+1つ以上のオブジェクトを所有していません。
これらのアイテムを削除しますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectTakeLock">
- 少なくとも 1 つのオブジェクトがロックされています。
-
-本当にこのまま取得を続けますか?
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="ConfirmObjectTakeNoOwn">
- 取得しようとしているオブジェクトには、あなたの所有物ではないオブジェクトが含まれています。
-あなたの所有物ではないオブジェクトを取得すると、次の所有者の権限がそのオブジェクトに適用されます。
-そのため、将来、修正やコピーの能力が制限される可能性があります。
-
-本当にこのまま取得を続けますか?
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="ConfirmObjectTakeLockNoOwn">
- 少なくとも 1 つのオブジェクトがロックされています。
-取得しようとしているオブジェクトには、あなたの所有物ではないオブジェクトが含まれています。
-あなたの所有物ではないオブジェクトを取得すると、次の所有者の権限がそのオブジェクトに適用されます。
+ <notification name="ConfirmObjectTakeLock">少なくとも1つのオブジェクトがロックされています。
+
+本当にこのまま取得を続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectTakeNoOwn">取得しようとしているオブジェクトには、あなたの所有物ではないオブジェクトが含まれています。
+あなたの所有物ではないオブジェクトを取得すると、次の所有者の権限がそのオブジェクトに適用されます。そのため、将来、修正やコピーの能力が制限される可能性があります。
+
+本当にこのまま取得を続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectTakeLockNoOwn">少なくとも1つのオブジェクトがロックされています。
+取得しようとしているオブジェクトには、あなたの所有物ではないオブジェクトが含まれています。あなたの所有物ではないオブジェクトを取得すると、次の所有者の権限がそのオブジェクトに適用されます。
そのため、将来、編集やコピーの能力が制限される可能性があります。
-この選択内容のままで続行することは可能ですが、
-本当にこのまま取得を続けますか?
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+この選択内容のままで続行することは可能ですが、本当にこのまま取得を続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="CantBuyLandAcrossMultipleRegions">複数のリージョンが選択されたため、土地を購入できません。
-
-選択する面積を小さくしてもう一度試してください。</notification>
- <notification name="DeedLandToGroup">
- この区画が譲渡されると、グループはその土地利用料として十分な残高を維持していく必要があります。
+選択する面積を小さくしてもう一度試してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="DeedLandToGroup">この区画が譲渡されると、グループはその土地利用料として十分な残高を維持していく必要があります。
土地の購入価格は所有者に返金されません。譲渡された区画が売却されると、販売価格はグループメンバーの間で均等に分配されます。
-この [AREA] m² の土地を「&lt;nolink&gt;[GROUP_NAME]&lt;/nolink&gt;」というグループに譲渡しますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+この[AREA]㎡の土地を「&lt;nolink&gt;[GROUP_NAME]&lt;/nolink&gt;」というグループに譲渡しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="DeedLandToGroupWithContribution">
- この区画が譲渡されると、グループはその土地利用料として十分な残高を維持していく必要があります。
-譲渡には同時に [NAME] からグループへの土地の貢献が含まれます。土地の購入価格は所有者に返金されません。
+ <notification name="DeedLandToGroupWithContribution">この区画が譲渡されると、グループはその土地利用料として十分な残高を維持していく必要があります。
+譲渡には同時に [NAME]からグループへの土地の貢献が含まれます。土地の購入価格は所有者に返金されません。
譲渡された区画が売却されると、販売価格はグループメンバーの間で均等に分配されます。
-この [AREA] m² の土地を「&lt;nolink&gt;[GROUP_NAME]&lt;/nolink&gt;」というグループに譲渡しますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+この[AREA]㎡の土地を「&lt;nolink&gt;[GROUP_NAME]&lt;/nolink&gt;」というグループに譲渡しますか?
+ <tag>
+ group
+ </tag>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="DisplaySetToSafe">
+ -safe オプションを指定したので、表示設定はセーフレベルに設定されています。
+ </notification>
+ <notification name="DisplaySetToRecommendedGPUChange">
+ グラフィックの変更により、画面設定は推奨レベルに設定されました。
+「[LAST_GPU]」から
+「[THIS_GPU]」まで
+ </notification>
+ <notification name="DisplaySetToRecommendedFeatureChange">
+ レンダリングサブシステムの変更により、画面設定は推奨レベルに設定されました。
</notification>
- <notification name="DisplaySetToSafe">-safe オプションを指定したので、
-表示設定はセーフレベルに設定されています。</notification>
- <notification name="DisplaySetToRecommendedGPUChange">グラフィックの変更により、画面設定は推奨レベルに設定されました。
-'[LAST_GPU]' から
-'[THIS_GPU]' まで</notification>
- <notification name="DisplaySetToRecommendedFeatureChange">レンダリングサブシステムの変更により、画面設定は推奨レベルに設定されました。</notification>
<notification name="ErrorMessage">
- [ERROR_MESSAGE]
- <usetemplate name="okbutton" yestext="OK"/>
+[ERROR_MESSAGE]
+ <unique>
+ <context>
+ ERROR_MESSAGE
+ </context>
+ </unique>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AvatarMovedDesired">目的地は現在ご利用いただけません。
-近くのリージョンに移動しました。</notification>
+近くのリージョンに移動しました。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="AvatarMovedLast">リクエストされた場所は現在ご利用いただけません。
-近くのリージョンに移動しました。</notification>
+近くのリージョンに移動しました。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="AvatarMovedHome">ホームロケーションは現在ご利用いただけません。
近くのリージョンに移動しました。
-新たにホームを設定し直す必要があるかもしれません。</notification>
- <notification name="ClothingLoading">
- 現在衣類をダウンロード中です。
-このまま [SECOND_LIFE] を通常通りご使用いただけます。他人からはあなたは正しく表示されます。
- <form name="form">
- <ignore name="ignore" text="衣類がダウンロードされるまで時間がかかっているとき"/>
+新たにホームを設定し直す必要があるかもしれません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ClothingLoading">現在服装をダウンロード中です。
+このまま[SECOND_LIFE]を通常通りご使用いただけます。他人からはあなたは正しく表示されます。
+ <form name="form">
+ <ignore name="ignore" text="服装がダウンロードされるまで時間がかかっているとき"/>
</form>
</notification>
- <notification name="AgentComplexityWithVisibility">
- あなたの [https://community.secondlife.com/t5/English-Knowledge-Base/Avatar-Rendering-Complexity/ta-p/2967838 avatar complexity] は [AGENT_COMPLEXITY] です。
+ <notification name="AgentComplexityWithVisibility">あなたの[https://community.secondlife.com/knowledgebase/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B8%E3%83%99%E3%83%BC%E3%82%B9/%E3%82%A2%E3%83%90%E3%82%BF%E3%83%BC%E3%81%AE%E8%A4%87%E9%9B%91%E3%81%95%E3%81%A8%E3%81%AF-r1417/ アバター複雑度]は、[AGENT_COMPLEXITY]です。
[OVERLIMIT_MSG]
- <usetemplate ignoretext="アバターの複雑度が高すぎる場合は警告する" name="notifyignore"/>
- </notification>
- <notification name="AgentComplexity">
- あなたの [https://community.secondlife.com/t5/English-Knowledge-Base/Avatar-Rendering-Complexity/ta-p/2967838 avatar complexity] は [AGENT_COMPLEXITY] です。
- <usetemplate ignoretext="アバターの複雑さの変更について警告する" name="notifyignore"/>
- </notification>
- <notification name="HUDComplexityWarning">
- [HUD_REASON]、パフォーマンスに悪影響を与える恐れがあります。
- <usetemplate ignoretext="HUD が複雑すぎる場合はお知らせください" name="notifyignore"/>
- </notification>
- <notification name="FirstRun">
- [APP_NAME] のインストールが完了しました。
-
-[SECOND_LIFE] を使ったことがない場合は、ログインする前にアカウントの作成を行ってください。
- <usetemplate name="okcancelbuttons" notext="続行" yestext="アカウントを作成..."/>
- </notification>
- <notification name="LoginPacketNeverReceived">
- 接続がなかなかできません。 お使いのインターネット接続か、[SECOND_LIFE_GRID] の問題と考えられます。
-
-インターネット接続を確認してから数分後に再接続するか、ヘルプをクリックして [SUPPORT_SITE] をご覧になるか、テレポートをクリックしてホームに移動してみてください。
- <url name="url">http://jp.secondlife.com/support/</url>
+ <unique combine="cancel_old">
+ <context>
+ AgentComplexityNotice
+ </context>
+ </unique>
+ <usetemplate ignoretext="アバターの複雑度が高すぎる場合の警告" name="notifyignore"/>
+ </notification>
+ <notification name="AgentComplexity">あなたの[https://community.secondlife.com/knowledgebase/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B8%E3%83%99%E3%83%BC%E3%82%B9/%E3%82%A2%E3%83%90%E3%82%BF%E3%83%BC%E3%81%AE%E8%A4%87%E9%9B%91%E3%81%95%E3%81%A8%E3%81%AF-r1417/ アバター複雑度]は、[AGENT_COMPLEXITY]です。
+ <unique combine="cancel_old">
+ <context>
+ AgentComplexityNotice
+ </context>
+ </unique>
+ <usetemplate ignoretext="アバターの複雑さの変更についての警告" name="notifyignore"/>
+ </notification>
+ <notification name="HUDComplexityWarning">[HUD_REASON]
+このため、パフォーマンスに悪影響を与える恐れがあります。
+ <unique combine="cancel_old">
+ <context>
+ HUDComplexityWarning
+ </context>
+ </unique>
+ <usetemplate ignoretext="HUDが複雑すぎる場合の警告" name="notifyignore"/>
+ </notification>
+ <notification name="FirstRun">[APP_NAME]のインストールが完了しました。
+[SECOND_LIFE]を使ったことがない場合は、ログインする前にアカウントの作成を行ってください。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="続行" yestext="アカウントを作成…"/>
+ </notification>
+ <notification name="LoginCantRemoveUsername">すでに記憶されているユーザーは「私」メニューの「初期設定」>「拡張設定」>「記憶されたユーザー名」から削除することができます。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="LoginCantRemoveCurUsername">ログインしているユーザーを忘れた場合は、ログアウトする必要があります。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="Confirm and log out"/>
+ </notification>
+ <notification name="LoginPacketNeverReceived">接続に時間がかかっております。お使いのインターネット接続か、[SECOND_LIFE_GRID]の問題と考えられます。
+
+インターネット接続を確認してから数分後に再接続するか、ヘルプをクリックして [SUPPORT_SITE]をご覧になるか、テレポートをクリックしてホームに移動してみてください。
+ <tag>
+ fail
+ </tag>
+ <url name="url">
+ https://support.secondlife.com/
+ </url>
<form name="form">
- <button name="OK" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Help" text="ヘルプ"/>
<button name="Teleport" text="テレポート"/>
</form>
</notification>
- <notification name="WelcomeChooseSex">
- まもなくあなたのアバターが表示されます。
-
-矢印キーを使用して歩きます。
-ヘルプが必要なときや [SECOND_LIFE] について知りたいときは、
-F1 キーを押してください。
-男性あるいは女性のアバターを選択してください。
-あなたの決定は後で変更できます。
+ <notification name="WelcomeChooseSex">まもなく、あなたのアバターが表示されます。矢印キーを使用して歩きます。
+ヘルプが必要なときや、[SECOND_LIFE]について知りたいときは、F1キーを押してください。
+男性あるいは女性のアバターを選択してください。この設定は後で変更できます。
+ <tag>
+ confirm
+ </tag>
<usetemplate name="okcancelbuttons" notext="女性" yestext="男性"/>
</notification>
- <notification name="CantTeleportToGrid">
- 現在のグリッド([CURRENT_GRID])とはグリッド([GRID])が異なるため、[SLURL] にテレポートできませんでした。 ビューワを閉じてからもう一度お試しください。
- <usetemplate name="okbutton" yestext="OK"/>
+ <notification name="CantTeleportToGrid">現在のグリッド([CURRENT_GRID])とはグリッド([GRID])が異なるため、[SLURL] にテレポートできませんでした。ビューアーを閉じてからもう一度お試しください。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="GeneralCertificateError">
- サーバーに接続できませんでした。
+ <notification name="GeneralCertificateErrorShort">サーバーに接続できませんでした。
[REASON]
-
-サブジェクト名: [SUBJECT_NAME_STRING]
-発行元: [ISSUER_NAME_STRING]
-有効日: [VALID_FROM]
-次の更新日: [VALID_TO]
-MD5 フィンガープリント: [SHA1_DIGEST]
-SHA1 フィンガープリント: [MD5_DIGEST]
-キー使用法: [KEYUSAGE]
-拡張キー使用法: [EXTENDEDKEYUSAGE]
-サブジェクトキー認識別子: [SUBJECTKEYIDENTIFIER]
- <usetemplate name="okbutton" yestext="OK"/>
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="TrustCertificateError">
- このサーバーの認証機関は不明です。
+ <notification name="GeneralCertificateError">サーバーに接続できませんでした。
+[REASON]
+サブジェクト名:[SUBJECT_NAME_STRING]
+発行元:[ISSUER_NAME_STRING]
+有効日:[VALID_FROM]
+次の更新日:[VALID_TO]
+MD5フィンガープリント:[SHA1_DIGEST]
+SHA1フィンガープリント:[MD5_DIGEST]
+キー使用法:[KEYUSAGE]
+拡張キー使用法:[EXTENDEDKEYUSAGE]
+サブジェクトキー認識別子:[SUBJECTKEYIDENTIFIER]
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TrustCertificateError">このサーバーの認証機関は不明です。
認証情報:
-サブジェクト名: [SUBJECT_NAME_STRING]
-発行元: [ISSUER_NAME_STRING]
-有効日: [VALID_FROM]
-次の更新日: [VALID_TO]
-MD5 フィンガープリント: [SHA1_DIGEST]
-SHA1 フィンガープリント: [MD5_DIGEST]
-キー使用法: [KEYUSAGE]
-拡張キー使用法: [EXTENDEDKEYUSAGE]
-サブジェクトキー認識別子: [SUBJECTKEYIDENTIFIER]
+ サブジェクト名:[SUBJECT_NAME_STRING]
+ 発行元:[ISSUER_NAME_STRING]
+ 有効日:[VALID_FROM]
+ 次の更新日:[VALID_TO]
+ MD5フィンガープリント:[SHA1_DIGEST]
+ SHA1フィンガープリント:[MD5_DIGEST]
+ キー使用法:[KEYUSAGE]
+ 拡張キー使用法:[EXTENDEDKEYUSAGE]
+ サブジェクトキー認識別子:[SUBJECTKEYIDENTIFIER]
この認証局を信頼しますか?
+ <tag>
+ confirm
+ </tag>
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="信用する"/>
</notification>
- <notification name="NotEnoughCurrency">[NAME] L$[PRICE] 残高不足のため実行不可です。</notification>
- <notification name="GrantedModifyRights">[NAME] は、あなたにオブジェクトの編集権限を与えました。</notification>
- <notification name="RevokedModifyRights">[NAME] のオブジェクトを編集する権限は取り消されました。</notification>
- <notification name="FlushMapVisibilityCaches">
- このリージョンの地図のキャッシュを消去します。
-デバッグ目的のみに便利な操作です。
-(作成中は 5 分間経つと、全員の地図が再度ログイン後に更新されます)
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="BuyOneObjectOnly">一度に 1 つ以上のオブジェクトを買うことはできません。 オブジェクトを 1 つだけ選んでもう一度お試しください。</notification>
- <notification name="OnlyCopyContentsOfSingleItem">
- 一度に複数のアイテムの中身をコピーできません。
-オブジェクトを 1 つだけ選択して、もう一度お試しください。
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="KickUsersFromRegion">
- このリージョンにいる全ての住人をホームにテレポートしますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="ChangeObjectBonusFactor">
- 地域(リージョン)内でビルドが確立された後にオブジェクトボーナスを下げると、オブジェクトが返されたり、削除されたりします。本当にオブジェクトボーナスを変更しますか?
- <usetemplate ignoretext="オブジェクトボーナス係数の変更を確認" name="okcancelignore" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="EstateObjectReturn">
- [USER_NAME] が所有しているオブジェクトを返却しますか?
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="InvalidTerrainBitDepth">地域テクスチャを設定できませんでした:
-地形テクスチャ[TEXTURE_NUM]は、無効のビット深度[TEXTURE_BIT_DEPTH]です。
-
-テクスチャ[TEXTURE_NUM]を24ビット512x512かそれ以下のイメージと交換し、「適用」を再度クリックしてください。</notification>
- <notification name="InvalidTerrainSize">地域テクスチャを設定できませんでした:
-地形テクスチャ「 [TEXTURE_NUM] 」は、[TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y] では大きすぎます。
-
-「 [TEXTURE_NUM] 」を 24 ビット 512x512 かそれ以下のイメージと交換し、「適用」を再度クリックしてください。</notification>
- <notification name="RawUploadStarted">アップロードを開始しました。 接続速度によっては、最大 2 分間かかります。</notification>
- <notification name="ConfirmBakeTerrain">
- 現在の地形を構築しようとしています。
-この操作を行うと、現在の地形が上昇・下降の制限範囲の中心となり、「復元」ツールのデフォルトになります。
-操作を続行しますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="ConfirmTextureHeights">
- 使用しようとしている隆起範囲の低い値は高い値よりも大きくなっています。それでも続けますか?
- <usetemplate canceltext="聞かないでください" name="yesnocancelbuttons" notext="取り消し" yestext="Ok"/>
- </notification>
- <notification name="MaxAllowedAgentOnRegion">許可住人は [MAX_AGENTS] 人までです。</notification>
- <notification name="MaxBannedAgentsOnRegion">禁止住人は [MAX_BANNED] 人までです。</notification>
- <notification name="MaxAgentOnRegionBatch">[NUM_ADDED] 個のエージェントを追加しようとして失敗しました: [MAX_AGENTS] [LIST_TYPE] 制限を [NUM_EXCESS] 個超過しています。</notification>
- <notification name="MaxAllowedGroupsOnRegion">
- 許可グループは [MAX_GROUPS] グループまでです。
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="構築する"/>
- </notification>
- <notification name="MaxManagersOnRegion">不動産マネージャーは [MAX_MANAGER] 人までです。</notification>
- <notification name="OwnerCanNotBeDenied">不動産オーナーを不動産の「禁止住人」リストに追加できません。</notification>
- <notification name="ProblemAddingEstateManagerBanned">追放された住人を不動産管理者リストに追加できません。</notification>
- <notification name="ProblemBanningEstateManager">禁止リストに不動産マネージャー [AGENT] を追加できません。</notification>
- <notification name="GroupIsAlreadyInList">&lt;nolink&gt;[GROUP]&lt;/nolink&gt; はすでに許可されたグループのリストに追加されています。</notification>
- <notification name="AgentIsAlreadyInList">[AGENT] はすでにあなたの [LIST_TYPE] リストに追加されています。</notification>
- <notification name="AgentsAreAlreadyInList">[AGENT] はすでにあなたの [LIST_TYPE] リストに追加されています。</notification>
- <notification name="AgentWasAddedToList">[AGENT] が [ESTATE] の [LIST_TYPE] リストに追加されました。</notification>
- <notification name="AgentsWereAddedToList">[AGENT] が [ESTATE] の [LIST_TYPE] リストに追加されました。</notification>
- <notification name="AgentWasRemovedFromList">[AGENT] が [ESTATE] の [LIST_TYPE] リストから削除されました。</notification>
- <notification name="AgentsWereRemovedFromList">[AGENT] が [ESTATE] の [LIST_TYPE] リストから削除されました。</notification>
- <notification name="CanNotChangeAppearanceUntilLoaded">衣類およびシェイプが読み込まれるまでは、容姿の変更はできません。</notification>
- <notification name="ClassifiedMustBeAlphanumeric">クラシファイド広告の名前は、アルファベットか数字で始めます。句読点では始められません。</notification>
- <notification name="CantSetBuyObject">オブジェクトが販売対象ではないため、オブジェクトの購入ができません。
-販売対象のオブジェクトを指定してもう一度試してください。</notification>
- <notification name="FinishedRawDownload">未加工の地形ファイルをダウンロードしました:
-[DOWNLOAD_PATH]</notification>
- <notification name="RequiredUpdate">
- ログインするには、バージョン [VERSION] が必要です。
-https://secondlife.com/support/downloads/ からダウンロードしてください。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="PauseForUpdate">
- ログインするには、バージョン [VERSION] が必要です。
-[OK] をクリックして、ダウンロードとインストールを開始します。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="OptionalUpdateReady">
- バージョン [VERSION] のダウンロードが完了し、インストールの準備ができました。
-[OK] をクリックして、インストールを開始します。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="PromptOptionalUpdate">
- バージョン [VERSION] のダウンロードが完了し、インストールの準備ができました。
-続けますか?
- <usetemplate canceltext="あとで" name="yesnocancelbuttons" notext="スキップ" yestext="インストール"/>
+ <notification name="NotEnoughCurrency">[NAME]は、L$ [PRICE]残高不足のため実行不可です。
+ <tag>
+ fail
+ </tag>
+ <tag>
+ funds
+ </tag>
+ </notification>
+ <notification name="GrantedModifyRights">
+ [NAME]は、あなたにオブジェクトの編集権限を与えました。
+ </notification>
+ <notification name="RevokedModifyRights">
+ [NAME]は、オブジェクトを編集する権限を取り消されました。
</notification>
- <notification name="LoginFailedUnknown">
- 申し訳ありませんが、不明な理由によってログインに失敗しました。このメッセージが何度も出る場合は、[SUPPORT_SITE] をご確認ください。
- <usetemplate name="okbutton" yestext="終了"/>
+ <notification name="FlushMapVisibilityCaches">このリージョンのマップのキャッシュを消去します。デバッグ目的のみに便利な操作です。
+(作成中は5分経過すると、全員のマップが再度ログイン後に更新されます)
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="BuyOneObjectOnly">一度に1つ以上のオブジェクトを買うことはできません。オブジェクトを1つだけ選んでもう一度お試しください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="OnlyCopyContentsOfSingleItem">一度に複数のアイテムの中身をコピーできません。
+オブジェクトを1つだけ選択して、もう一度お試しください。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="DeedObjectToGroup">
- このオブジェクトを譲渡するとグループは以下のことが可能です:
-* オブジェクトに支払われた L$ を受領します。
- <usetemplate ignoretext="オブジェクトをグループに譲渡する前の確認" name="okcancelignore" notext="取り消し" yestext="譲渡"/>
+ <notification name="KickUsersFromRegion">このリージョンにいる全ての住人をホームにテレポートさせますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="WebLaunchExternalTarget">
- Web ブラウザを開いてこのコンテンツを表示しますか?
- <usetemplate ignoretext="ブラウザを起動して Web ページを見るとき" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ <notification name="ChangeObjectBonusFactor">リージョン(地域)のオブジェクトボーナスを下げると、制作されたオブジェクトが返却されたり、削除されます。本当にオブジェクトボーナスを変更してもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="オブジェクトボーナス係数変更の確認" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="WebLaunchJoinNow">
- [http://jp.secondlife.com/account/ マイアカウント] ページに移動してアカウントを管理しますか?
- <usetemplate ignoretext="ブラウザを起動してアカウントを管理するとき" name="okcancelignore" notext="取り消し" yestext="OK"/>
+ <notification name="EstateObjectReturn">[USER_NAME]が、所有しているオブジェクトを返却しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="WebLaunchSecurityIssues">
- [SECOND_LIFE] Wiki で、セキュリティ問題を報告する方法をご覧ください。
- <usetemplate ignoretext="ブラウザを起動してセキュリティ問題の報告の仕方を確認するとき" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ <notification name="InvalidTerrainBitDepth">
+ 地域テクスチャを設定できませんでした:
+地形テクスチャ「[TEXTURE_NUM]」は、無効なビット深度([TEXTURE_BIT_DEPTH]ビット)です。
+
+テクスチャは、24ビットの512✕512以下の画像を選択し、「適用」ボタンを再度クリックしてください。
</notification>
- <notification name="WebLaunchQAWiki">
- [SECOND_LIFE] 品質保証関連 Wiki をご覧ください。
- <usetemplate ignoretext="ブラウザを起動して QA Wiki を見るとき" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ <notification name="InvalidTerrainSize">
+ 地域テクスチャを設定できませんでした:
+地形テクスチャ「[TEXTURE_NUM]」は、[TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y] では大きすぎます。
+
+テクスチャは、24ビットの512✕512以下の画像を選択し、「適用」ボタンを再度クリックしてください。
</notification>
- <notification name="WebLaunchPublicIssue">
- [SECOND_LIFE] のパブリック問題トラッカーで、
-バグやその他の問題を報告できます。
- <usetemplate ignoretext="ブラウザを起動してパブリック問題トラッカーを使用するとき" name="okcancelignore" notext="キャンセル" yestext="ページへ行く"/>
+ <notification name="RawUploadStarted">
+ アップロードを開始しました。接続速度によっては、最大2分程度かかります。
</notification>
- <notification name="WebLaunchSupportWiki">
- Linden 公式ブログで、最新のニュースや情報を入手してください。
- <usetemplate ignoretext="ブラウザを起動して公式ブログを見るとき" name="okcancelignore" notext="取り消し" yestext="OK"/>
+ <notification name="ConfirmBakeTerrain">現在の地形を構築しようとしています。この操作を行うと現在の地形が、土地の隆起と沈降の制限範囲の基準となり、「復元」ツールのデフォルトになります。操作を続行しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="WebLaunchLSLGuide">
- スクリプトガイドを開きますか?
- <usetemplate ignoretext="ブラウザを起動してスクリプトガイドを見るとき" name="okcancelignore" notext="取り消し" yestext="OK"/>
+ <notification name="ConfirmTextureHeights">標高範囲に、最高値よりも大きい値を最低値にしようとしています。このまま続行してもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate canceltext="聞かないでください" name="yesnocancelbuttons" notext="キャンセル" yestext="Ok"/>
</notification>
- <notification name="WebLaunchLSLWiki">
- LSL ポータルでスクリプトに関する情報を確認しますか?
- <usetemplate ignoretext="ブラウザを起動して LSL ポータルを見るとき" name="okcancelignore" notext="取り消し" yestext="ページに移動"/>
+ <notification name="MaxAllowedAgentOnRegion">
+ 許可できる住人は、[MAX_AGENTS]人までです。
</notification>
- <notification name="ReturnToOwner">
- 選択したオブジェクトを、所有者に返却しますか?
-「再販・プレゼント可」の譲渡されたオブジェクトは、以前の所有者に返却されます。
-
-*警告* 「再販・プレゼント不可」の譲渡されたオブジェクトは、削除されます!
- <usetemplate ignoretext="オブジェクトを所有者に返却する前の確認" name="okcancelignore" notext="取り消し" yestext="OK"/>
+ <notification name="MaxBannedAgentsOnRegion">
+ バンできる住人は、[MAX_BANNED]人までです。
</notification>
- <notification name="GroupLeaveConfirmMember">
- 現在、あなたは &lt;nolink&gt;[GROUP]&lt;/nolink&gt; グループのメンバーです。
-グループから脱退しますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ <notification name="MaxAgentOnRegionBatch">
+ [NUM_ADDED]人のエージェントを追加しようとして失敗しました:[MAX_AGENTS]
+[LIST_TYPE]人中[NUM_EXCESS]人超過しています。
</notification>
- <notification name="GroupDepart">グループ「&lt;nolink&gt;[group_name]&lt;/nolink&gt;」を抜けました。</notification>
- <notification name="OwnerCannotLeaveGroup">
- グループを抜けることができません。グループの最後のオーナーであるため、グループを抜けることができません。最初に、別のメンバーをオーナーの役割に割り当ててください。
- <usetemplate name="okbutton" yestext="OK"/>
+ <notification name="MaxAllowedGroupsOnRegion">許可グループは、[MAX_GROUPS]グループまでです。
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="構築する"/>
</notification>
- <notification name="GroupDepartError">
- グループを抜けることができません。
- <usetemplate name="okbutton" yestext="OK"/>
+ <notification name="MaxManagersOnRegion">
+ 不動産マネージャーは、[MAX_MANAGER]人までです。
</notification>
- <notification name="ConfirmKick">
- 本当に住人全員をグリッドから追い出しますか?
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="住人全員を追い出す"/>
+ <notification name="OwnerCanNotBeDenied">
+ 不動産所有者を不動産の「バンした住人」リストに追加することはできません。
+ </notification>
+ <notification name="ProblemAddingEstateManagerBanned">
+ 「バンした住人」を不動産管理者リストに追加することはできません。
+ </notification>
+ <notification name="ProblemBanningEstateManager">
+ 「バンした住民」リストに不動産マネージャー[AGENT]を追加することはできません。
+ </notification>
+ <notification name="GroupIsAlreadyInList">
+ 「&lt;nolink&gt;[GROUP]&lt;/nolink&gt;」は、すでに許可されたグループのリストに追加されています。
+ </notification>
+ <notification name="AgentIsAlreadyInList">
+ [AGENT]は、すでにあなたの[LIST_TYPE]リストに追加されています。
+ </notification>
+ <notification name="AgentsAreAlreadyInList">
+ [AGENT]は、すでにあなたの[LIST_TYPE]リストに追加されています。
</notification>
- <notification name="MuteLinden">
- リンデンをブロックすることはできません。
- <usetemplate name="okbutton" yestext="OK"/>
+ <notification name="AgentWasAddedToList">
+ [AGENT]が、[ESTATE]の[LIST_TYPE]リストに追加されました。
</notification>
- <notification name="CannotStartAuctionAlreadyForSale">既に売り出し中の区画なのでオークションにかけることはできません。 オークションにかけたい場合は売り出し設定を解除してから行ってください。</notification>
- <notification label="名前でのオブジェクトのブロックに失敗しました" name="MuteByNameFailed">
- この名前は既にブロック済みです。
- <usetemplate name="okbutton" yestext="OK"/>
+ <notification name="AgentsWereAddedToList">
+ [AGENT]が、[ESTATE]の[LIST_TYPE]リストに追加されました。
</notification>
- <notification name="RemoveItemWarn">
- コンテンツを削除すると、許可があってもオブジェクトに損傷を与えることがあります。
-削除を続けますか?
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ <notification name="AgentWasRemovedFromList">
+ [AGENT]が、[ESTATE]の[LIST_TYPE]リストから削除されました。
</notification>
- <notification name="CantOfferCallingCard">
- 現在コーリングカードを送れません。数分後にもう一度お試しください。
- <usetemplate name="okbutton" yestext="OK"/>
+ <notification name="AgentsWereRemovedFromList">
+ [AGENT]が、[ESTATE]の[LIST_TYPE]リストから削除されました。
</notification>
- <notification name="CantOfferFriendship">
- 現在フレンドシップを送れません。数分後にもう一度お試しください。
- <usetemplate name="okbutton" yestext="OK"/>
+ <notification name="CanNotChangeAppearanceUntilLoaded">
+ 服装およびシェイプが読み込まれるまでは、容姿の変更はできません。
</notification>
- <notification name="DoNotDisturbModeSet">
- 着信拒否がオンになっています。着信する通信が通知されません。
+ <notification name="ClassifiedMustBeAlphanumeric">
+ クラシファイド広告の名前は、アルファベットか数字で始めます。句読点から始めることはできません。
+ </notification>
+ <notification name="CantSetBuyObject">
+ オブジェクトが販売対象ではないため、オブジェクトの購入ができません。
+販売対象のオブジェクトを指定してもう一度試してください。
+ </notification>
+ <notification name="FinishedRawDownload">
+ 未加工の地形ファイルをダウンロードしました:[DOWNLOAD_PATH]
+ </notification>
+ <notification name="RequiredUpdate">ログインするには、バージョン[VERSION]が必要です。以下からダウンロードしてください。
+https://secondlife.com/support/downloads/
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PauseForUpdate">ログインするには、バージョン[VERSION]が必要です。
+リリースノート:[URL]
-- 他の住人は「着信拒否」応答を受け取ります (「環境設定」 &gt; 「一般」で設定)。
-- 音声通話は拒否されます。
- <usetemplate ignoretext="マイ ログイン状態を「通知を受けない」モードに変更しました。" name="okignore" yestext="OK"/>
+OKをクリックして、ダウンロードとインストールを開始します。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="JoinedTooManyGroupsMember">
- 加入できるグループの最大限に達しました。 このグループに加入するために他のグループを脱退するか、この申し入れを断ってください。
-[NAME] があなたをグループのメンバーとして勧誘しています。
- <usetemplate name="okcancelbuttons" notext="辞退" yestext="参加"/>
+ <notification name="OptionalUpdateReady">バージョン[VERSION]のダウンロードが完了し、インストールの準備ができました。
+リリースノート:[URL]
+
+OKをクリックして、ダウンロードとインストールを開始します。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="JoinedTooManyGroups">
- 加入できるグループの最大限に達しました。 新しくグループに参加、または作成する前に、どれかグループから抜けてください。
- <usetemplate name="okbutton" yestext="OK"/>
+ <notification name="PromptOptionalUpdate">バージョン[VERSION]のダウンロードが完了し、インストールの準備ができました。
+リリースノート:[URL]
+
+このまま続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate canceltext="あとで" name="yesnocancelbuttons" notext="スキップ" yestext="インストール"/>
</notification>
- <notification name="GroupLimitInfo">
- ベーシック会員の住民は、最大 [MAX_BASIC] グループまで参加することができます。
-プレミアム会員は、最大 [MAX_PREMIUM] まで可能です。[https://secondlife.com/my/account/membership.php? 詳細、またはアップグレード]
+ <notification name="LoginFailedUnknown">申し訳ありませんが、不明な理由によってログインに失敗しました。
+このメッセージが何度も出る場合は、[SUPPORT_SITE] をご確認ください。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okbutton" yestext="終了"/>
+ </notification>
+ <notification name="DeedObjectToGroup">このオブジェクトを譲渡するとグループは以下のことが可能です:
+・オブジェクトに支払われたL$を受領します。
+ <tag>
+ group
+ </tag>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="オブジェクトをグループに譲渡する前の確認" name="okcancelignore" notext="キャンセル" yestext="譲渡する"/>
+ </notification>
+ <notification name="WebLaunchExternalTarget">Webブラウザを開いてこのコンテンツを表示しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="ブラウザを起動して、Webページを閲覧するとき" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchJoinNow">[https://secondlife.com/my/account/?lang=ja-JP マイアカウント]ページに移動してアカウントを管理しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="ブラウザを起動して、アカウントを管理するとき" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchSecurityIssues">[SECOND_LIFE] Wikiで、セキュリティ問題を報告する方法をご覧ください。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="ブラウザを起動して、セキュリティ問題の報告方法を確認するとき" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchQAWiki">[SECOND_LIFE] QA(品質保証)Wikiをご覧ください。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="ブラウザを起動して、QA Wikiを閲覧するとき" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchPublicIssue">[SECOND_LIFE] Public Issue Trackerにアクセスして、バグやその他の問題を報告できます。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="ブラウザを起動して、Public Issue Trackerにアクセスするとき" name="okcancelignore" notext="キャンセル" yestext="ページへ行く"/>
+ </notification>
+ <notification name="WebLaunchSupportWiki">Linden公式ブログで、最新のニュースや情報を入手してください。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="ブラウザを起動して、公式ブログを閲覧するとき" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchLSLGuide">スクリプトガイドを開きますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="ブラウザを起動して、スクリプトガイドを閲覧するとき" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchLSLWiki">LSLポータルでスクリプトに関する情報を確認しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="ブラウザを起動して LSL ポータルを見るとき" name="okcancelignore" notext="キャンセル" yestext="ページに移動"/>
+ </notification>
+ <notification name="ReturnToOwner">選択したオブジェクトを、所有者に返却しますか?「再販・譲渡可」の譲渡されたオブジェクトは、以前の所有者に返却されます。
+
+*警告*「再販・譲渡不可」の譲渡されたオブジェクトは、削除されます!
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="オブジェクトを所有者に返却するとき" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="GroupLeaveConfirmMember">現在、あなたは &lt;nolink&gt;[GROUP]&lt;/nolink&gt;グループのメンバーです。グループから脱退しますか?
+ <tag>
+ group
+ </tag>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="GroupDepart">
+ グループ「&lt;nolink&gt;[group_name]&lt;/nolink&gt;」から抜けました。
+ </notification>
+ <notification name="OwnerCannotLeaveGroup">グループを抜けることができません。グループの最後のオーナーであるため、グループを抜けることができません。最初に、別のメンバーをオーナーの役割に割り当ててください。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GroupDepartError">グループを抜けることができません。
+ <tag>
+ group
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmKick">本当に住人全員をグリッドから追い出してもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="住人全員を追い出す"/>
+ </notification>
+ <notification name="MuteLinden">リンデンをブロックすることはできません。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CannotStartAuctionAlreadyForSale">既に売り出し中の区画なので、オークションにかけることはできません。
+オークションにかけたい場合は、売り出し設定を解除してから行ってください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification label="名前でのオブジェクトのブロックに失敗しました" name="MuteByNameFailed">この名前は既にブロック済みです。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RemoveItemWarn">コンテンツを削除すると、許可があってもオブジェクトに損傷を与えることがあります。削除を続けてもよろしいですか?
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="CantOfferCallingCard">現在コーリングカードを送れません。数分後にもう一度お試しください。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CantOfferFriendship">現在フレンド申請を送れません。数分後にもう一度お試しください。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="DoNotDisturbModeSet">「着信拒否」がオンになっています。通信の受信は通知されません。
+
+・他の居住者はあなたの「着信拒否」応答を受け取ります。(「初期設定」>「全般」で設定)
+・音声通話は拒否されます。
+ <usetemplate ignoretext="ログイン状態を「着信拒否」モードに変更したとき" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="JoinedTooManyGroupsMember">グループの最大数に達しました。このグループに参加する前に別のグループから退会するか、オファーを断ってください。
+[NAME]さんが、あなたをグループのメンバーに参加するよう招待しました。
+ <tag>
+ group
+ </tag>
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="辞退" yestext="参加"/>
+ </notification>
+ <notification name="JoinedTooManyGroups">グループの最大数に達しました。新しいグループに参加、作成する前に、グループから退出してください。
+ <tag>
+ group
+ </tag>
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GroupLimitInfo">ベーシック会員の住民は、最大[MAX_BASIC]個のグループまで参加することができます。プレミアム会員は最大[MAX_PREMIUM]個まで参加可能です。[https://accounts.secondlife.com/change_membership/?lang=ja-JP 詳細またはアップグレード]
+ <tag>
+ group
+ </tag>
+ <tag>
+ fail
+ </tag>
<usetemplate name="okbutton" yestext="閉じる"/>
</notification>
- <notification name="GroupLimitInfoPlus">
- ベーシック会員の住人は最大 [MAX_BASIC] までグループに参加できます。
-プレミアム会員は最大 [MAX_PREMIUM] です。プレミアムプラス会員
-は最大 [MAX_PREMIUM_PLUS] です。 [https://secondlife.com/my/account/membership.php? 詳細またはアップグレード]
+ <notification name="GroupLimitInfoPlus">ベーシック会員の住人は、最大[MAX_BASIC]個までグループに参加できます。プレミアム会員は最大[MAX_PREMIUM]個まで参加可能です。プレミアム・プラス会員は最大[MAX_PREMIUM_PLUS]個です。[https://accounts.secondlife.com/change_membership/?lang=ja-JP 詳細またはアップグレード]
+ <tag>
+ group
+ </tag>
+ <tag>
+ fail
+ </tag>
<usetemplate name="okbutton" yestext="閉じる"/>
</notification>
- <notification name="KickUser">
- どのようなメッセージを添えてこの住人を追い出しますか?
+ <notification name="KickUser">どのようなメッセージを添えて、この住人を追い出しますか?
+ <tag>
+ win
+ </tag>
+ <tag>
+ confirm
+ </tag>
<form name="form">
- <input name="message">あなたは管理者によりログオフされました。</input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="取り消し"/>
+ <input name="message">
+ あなたは管理者によりログオフされました。
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="キャンセル"/>
</form>
</notification>
- <notification name="KickAllUsers">
- どのようなメッセージをつけてグリッドにいる全員を追い出しますか?
+ <notification name="KickAllUsers">どのようなメッセージをつけて、グリッドにいる全員を追い出しますか?
+ <tag>
+ win
+ </tag>
+ <tag>
+ confirm
+ </tag>
<form name="form">
- <input name="message">あなたは管理者によりログオフされました。</input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="取り消し"/>
+ <input name="message">
+ あなたは管理者によりログオフされました。
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="キャンセル"/>
</form>
</notification>
- <notification name="FreezeUser">
- どのようなメッセージを添えてこの住人をフリーズしますか?
+ <notification name="FreezeUser">どのようなメッセージを添えて、この住人をフリーズしますか?
+ <tag>
+ win
+ </tag>
+ <tag>
+ confirm
+ </tag>
<form name="form">
- <input name="message">あなたはフリーズされています。 動くこともチャットすることもできません。 管理者が IM であなたに連絡します。</input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="取り消し"/>
+ <input name="message">
+ あなたはフリーズされています。動くこともチャットすることもできません。管理者がIMであなたに連絡します。
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="キャンセル"/>
</form>
</notification>
- <notification name="UnFreezeUser">
- どのようなメッセージを添えてこの住人のフリーズを解除しますか?
+ <notification name="UnFreezeUser">どのようなメッセージを添えて、この住人のフリーズを解除しますか?
+ <tag>
+ win
+ </tag>
+ <tag>
+ confirm
+ </tag>
<form name="form">
- <input name="message">もうフリーズされていません。</input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="取り消し"/>
+ <input name="message">
+ もうフリーズされていません。
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="キャンセル"/>
</form>
</notification>
- <notification name="SetDisplayNameSuccess">[DISPLAY_NAME] さん、
+ <notification name="SetDisplayNameSuccess">
+ [DISPLAY_NAME]さん、
-現実の世界と同じく、Second Life でも新しい名前が浸透するには時間がかかります。オブジェクト、スクリプト、検索などで名前が更新されるまでに([http://wiki.secondlife.com/wiki/Setting_your_display_name your name to update])数日かかりますのでご了承ください。</notification>
- <notification name="SetDisplayNameBlocked">申し訳ありませんが、現在表示名は変更できません。システムのエラーだと思われる場合は、サポートにお問い合わせください。</notification>
- <notification name="SetDisplayNameFailedLength">申し訳ありませんが、その名前は長すぎます。表示名は最長 [LENGTH] 文字までです。
+現実の世界と同じく、Second Lifeでも新しい名前が浸透するには時間がかかります。
+[https://community.secondlife.com/knowledgebase/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B8%E3%83%99%E3%83%BC%E3%82%B9/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%90%8D%E3%81%A8%E8%A1%A8%E7%A4%BA%E5%90%8D-r1333/ ユーザー名と表示名]が、オブジェクトやスクリプト、検索結果などに更新されるまで、数日かかりますのでご了承ください。
+ </notification>
+ <notification name="SetDisplayNameBlocked">
+ 申し訳ありませんが、現在表示名は変更できません。システムエラーと思われる場合は、サポートにお問い合わせください。
+ </notification>
+ <notification name="SetDisplayNameFailedLength">
+ 申し訳ありませんが、その名前は長すぎます。表示名で使用できる文字数は、[LENGTH]文字までです。
-もう少し短い名前をお試しください。</notification>
- <notification name="SetDisplayNameFailedGeneric">申し訳ありませんが、表示名を設定できませんでした。あとでもう一度お試しください。</notification>
- <notification name="SetDisplayNameMismatch">入力した表示名が一致しません。もう一度入力してください。</notification>
- <notification name="AgentDisplayNameUpdateThresholdExceeded">しばらくは表示名を変更できません。
+もう少し短い名前をお試しください。
+ </notification>
+ <notification name="SetDisplayNameFailedGeneric">
+ 申し訳ありませんが、表示名を設定できませんでした。あとでもう一度お試しください。
+ </notification>
+ <notification name="SetDisplayNameMismatch">入力した表示名が一致しません。もう一度入力してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="AgentDisplayNameUpdateThresholdExceeded">申し訳ありませんが、表示名を変更できるようになるまで、さらに長く待つ必要があります。
-http://wiki.secondlife.com/wiki/Setting_your_display_name を参照してください。
+https://community.secondlife.com/knowledgebase/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B8%E3%83%99%E3%83%BC%E3%82%B9/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%90%8D%E3%81%A8%E8%A1%A8%E7%A4%BA%E5%90%8D-r1333/ を参照してください。
-あとでもう一度お試しください。</notification>
- <notification name="AgentDisplayNameSetBlocked">申し訳ありませんが、リクエストされた名前は禁句を含むために設定できませんでした。
-
-別の名前をお試しください。</notification>
- <notification name="AgentDisplayNameSetInvalidUnicode">設定しようとする表示名には使えない文字が含まれます。</notification>
- <notification name="AgentDisplayNameSetOnlyPunctuation">表示名には句読点以外の文字を含む必要があります。</notification>
- <notification name="DisplayNameUpdate">[OLD_NAME] ([SLID]) は [NEW_NAME] に変更されました。</notification>
- <notification name="OfferTeleport">
- 次のメッセージを添えて現在地にテレポートを送りますか?
- <form name="form">
- <input name="message">[REGION] に来ませんか?</input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="取り消し"/>
- </form>
+あとでもう一度お試しください。
+ <tag>
+ fail
+ </tag>
</notification>
- <notification name="TooManyTeleportOffers">
- [OFFERS] 回にわたってテレポートを送ろうとしましたが、
-それは限度数 [LIMIT] を超えています。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="OfferTeleportFromGod">
- 現在地に住人をゴッドサモンしますか?
- <form name="form">
- <input name="message">[REGION] に来ませんか?</input>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="取り消し"/>
- </form>
+ <notification name="AgentDisplayNameSetBlocked">申し訳ありませんが、要求された名前には禁止ワードが含まれているため、設定できませんでした。
+
+別の名前をお試しください。
+ <tag>
+ fail
+ </tag>
</notification>
- <notification name="TeleportFromLandmark">
- このまま &lt;nolink&gt;[LOCATION]&lt;/nolink&gt; にテレポートしますか?
- <usetemplate ignoretext="ランドマークにテレポートしたいかどうかの確認" name="okcancelignore" notext="キャンセル" yestext="テレポート"/>
+ <notification name="AgentDisplayNameSetInvalidUnicode">設定しようとしている表示名に、使用できない文字が含まれます。
+ <tag>
+ fail
+ </tag>
</notification>
- <notification name="TeleportViaSLAPP">
- このまま &lt;nolink&gt;[LOCATION]&lt;/nolink&gt; にテレポートしますか?
- <usetemplate ignoretext="SLAPP でテレポートすることを確認" name="okcancelignore" notext="取り消し" yestext="テレポート"/>
+ <notification name="AgentDisplayNameSetOnlyPunctuation">設定しようとしている表示名には、句読点以外の文字を含む必要があります。
+ <tag>
+ fail
+ </tag>
</notification>
- <notification name="TeleportToPick">
- [PICK] にテレポートしますか?
- <usetemplate ignoretext="ピックの場所にテレポートしたいかどうかの確認" name="okcancelignore" notext="キャンセル" yestext="テレポート"/>
+ <notification name="DisplayNameUpdate">[OLD_NAME] ([SLID]) は、[NEW_NAME]に変更されました。
+ <tag>
+ fail
+ </tag>
</notification>
- <notification name="TeleportToClassified">
- [CLASSIFIED] にテレポートしますか?
- <usetemplate ignoretext="クラシファイド広告の場所にテレポートしたいかどうかの確認" name="okcancelignore" notext="キャンセル" yestext="テレポート"/>
+ <notification name="OfferTeleport">次のメッセージを使用して、あなたのいる場所へのテレポートのオファーしますか?
+ <tag>
+ confirm
+ </tag>
+ <form name="form">
+ <input name="message">
+ [REGION]に来てみませんか?
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="キャンセル"/>
+ </form>
</notification>
- <notification name="TeleportToHistoryEntry">
- [HISTORY_ENTRY] にテレポートしますか?
- <usetemplate ignoretext="履歴の場所にテレポートしたいかどうかの確認" name="okcancelignore" notext="キャンセル" yestext="テレポート"/>
+ <notification name="TooManyTeleportOffers">[OFFERS]回にわたってテレポートを送ろうとしましたが、限度数[LIMIT]を超えてしましました。
+ <tag>
+ group
+ </tag>
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="OfferTeleportFromGod">現在地に住人をゴッド・サモンしますか?
+ <tag>
+ confirm
+ </tag>
+ <form name="form">
+ <input name="message">
+ [REGION]に来てみませんか?
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="キャンセル"/>
+ </form>
</notification>
- <notification label="あなたの不動産内の全員にメッセージを送信" name="MessageEstate">
- 今あなたの不動産にいる人全員に送る、短いメッセージを入力してください。
+ <notification name="TeleportFromLandmark">&lt;nolink&gt;[LOCATION]&lt;/nolink&gt;にテレポートしてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="ランドマークに指定されている場所へテレポートする前の確認" name="okcancelignore" notext="キャンセル" yestext="テレポート"/>
+ </notification>
+ <notification name="TeleportViaSLAPP">&lt;nolink&gt;[LOCATION]&lt;/nolink&gt;にテレポートしてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="SLAPPからテレポートする前の確認" name="okcancelignore" notext="キャンセル" yestext="テレポート"/>
+ </notification>
+ <notification name="TeleportToPick">[PICK]にテレポートしますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="ピックに指定されてる場所にテレポートする前の確認" name="okcancelignore" notext="キャンセル" yestext="テレポート"/>
+ </notification>
+ <notification name="TeleportToClassified">[CLASSIFIED]にテレポートしますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="クラシファイド広告で指定されている場所へテレポートする前の確認" name="okcancelignore" notext="キャンセル" yestext="テレポート"/>
+ </notification>
+ <notification name="TeleportToHistoryEntry">[HISTORY_ENTRY]にテレポートしますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="履歴の場所にテレポートする前の確認" name="okcancelignore" notext="キャンセル" yestext="テレポート"/>
+ </notification>
+ <notification label="あなたの不動産にいる全員に送信するメッセージ" name="MessageEstate">今あなたの不動産にいる人全員に送る、短いメッセージを入力してください。
+ <tag>
+ confirm
+ </tag>
<form name="form">
<input name="message"/>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="取り消し"/>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="キャンセル"/>
</form>
</notification>
- <notification label="Lindenの不動産を変更" name="ChangeLindenEstate">
- リンデンが所有するエステート(メインランド、ティーングリッド、オリエンテーションなど)を変更しようとしています。
+ <notification label="Lindenの不動産を変更" name="ChangeLindenEstate">リンデンが所有する不動産(メインランド、ティーングリッド、オリエンテーションなど)を変更しようとしています。住人の体験に根本的に影響を与えるため、非常に危険な行為です。
-住人の体験に根本的に影響を与えるため、非常に危険な行為です。 メインランドでは、何千というリージョンが変更による影響を受け、そのためスペースサーバーに負担をかけることになります。
+メインランドでは、何千というリージョンが変更による影響を受け、そのためスペースサーバーに負担をかけることになります。
-それでも続けますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+それでも続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
- <notification label="Lindenの不動産へのアクセスを変更" name="ChangeLindenAccess">
- あなたはリンデン所有の不動産(メインランド、ティーングリッド、オリエンテーションなど)へのアクセスリストを変更しようとしています。
+ <notification label="Lindenの不動産へのアクセスを変更" name="ChangeLindenAccess">あなたはリンデン所有の不動産(メインランド、ティーングリッド、オリエンテーションなど)へのアクセスリストを変更しようとしています。
この行為は「危険」であり、グリッドからオブジェクトやお金の転送をもたらすハッキングを引き起こす可能性があるため、完全にそれを意図した場合のみ行うべきものです。
+
これにより多数のリージョン(地域)が変更され、スペースサーバーに悪影響が生じます。
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification label="不動産を選択" name="EstateAllowedAgentAdd">
- この不動産限定の許可リストに追加しますか? それとも [ALL_ESTATES] の許可リストに追加しますか?
- <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
- </notification>
- <notification label="不動産を選択" name="EstateAllowedAgentRemove">
- この不動産限定の許可リストから削除しますか? それとも、[ALL_ESTATES] から削除しますか?
- <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
- </notification>
- <notification label="不動産を選択" name="EstateAllowedGroupAdd">
- この不動産限定のグループ許可リストに追加しますか? それとも [ALL_ESTATES] のグループ許可リストに追加しますか?
- <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
- </notification>
- <notification label="不動産を選択" name="EstateAllowedGroupRemove">
- この不動産限定の許可リストから削除しますか? それとも、[ALL_ESTATES] から削除しますか?
- <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
- </notification>
- <notification label="不動産を選択" name="EstateBannedAgentAdd">
- この不動産限定でアクセスを拒否しますか? それとも [ALL_ESTATE] へのアクセスを拒否しますか?
- <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
- </notification>
- <notification label="不動産を選択" name="EstateBannedAgentRemove">
- この住人をこの不動産の立入禁止リストからのみ削除しますか?それとも [ALL_ESTATES] の立入禁止リストから削除しますか?
- <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
- </notification>
- <notification label="不動産を選択" name="EstateManagerAdd">
- この不動産限定、または [ALL_ESTATES] の不動産マネージャーを追加しますか?
- <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
- </notification>
- <notification label="不動産を選択" name="EstateManagerRemove">
- 不動産マネージャーを、この不動産限定、または [ALL_ESTATES] から、削除しますか?
- <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
- </notification>
- <notification label="不動産を選択" name="EstateAllowedExperienceAdd">
- この不動産の許可リストにのみ追加しますか、それとも [ALL_ESTATES] の許可リストに追加しますか?
- <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
- </notification>
- <notification label="不動産を選択" name="EstateAllowedExperienceRemove">
- この不動産の許可リストからのみ削除しますか、それとも [ALL_ESTATES] の許可リストから削除しますか?
- <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
- </notification>
- <notification label="不動産を選択" name="EstateBlockedExperienceAdd">
- この不動産のブロックされたリストにのみ追加しますか、それとも [ALL_ESTATES] のブロックされたリストに追加しますか?
- <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
- </notification>
- <notification label="不動産を選択" name="EstateBlockedExperienceRemove">
- この不動産のブロックされたリストからのみ削除しますか、それとも [ALL_ESTATES] のブロックされたリストから削除しますか?
- <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
- </notification>
- <notification label="不動産を選択" name="EstateTrustedExperienceAdd">
- この不動産のキー リストにのみ追加しますか、それとも [ALL_ESTATES] のキー リストに追加しますか?
- <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
- </notification>
- <notification label="不動産を選択" name="EstateTrustedExperienceRemove">
- この不動産のキーリストからのみ削除しますか、それとも [ALL_ESTATES] のキーリストから削除しますか?
- <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
- </notification>
- <notification label="キックを確認" name="EstateKickUser">
- この不動産から [EVIL_USER] を追い出しますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="EstateChangeCovenant">
- 不動産約款を変更しようとしています。続けますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="EstateParcelAccessOverride">
- このオプションをオフにすると、嫌がらせの防止やプライバシーの維持、18 才以下の住人を Adult コンテンツから守るために区画所有者が加えた制限が解除される可能性があります。必要に応じて区画所有者と相談してください。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="EstateParcelEnvironmentOverride">
- このオプションをオフにすると、区画所有者がその区画に加えたカスタム環境が削除されます。必要に応じて区画所有者と相談してください。
-続けますか?
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="RegionEntryAccessBlocked">
- 訪問しようとしている地域(リージョン)には現在の環境設定を超えるコンテンツが含まれています。「ミー」 &gt; 「環境設定」 &gt; 「一般」を選択して、環境設定を変更できます。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="SLM_UPDATE_FOLDER">[MESSAGE]</notification>
- <notification name="RegionEntryAccessBlocked_AdultsOnlyContent">
- 訪問しようとしている地域(リージョン)には、成人のみアクセスできる [REGIONMATURITY] コンテンツが含まれています。
- <url name="url">http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview</url>
- <usetemplate ignoretext="リージョン(地域)の横断:訪問しようとしている地域(リージョン)には、成人のみアクセスできるコンテンツが含まれています。" name="okcancelignore" notext="閉じる" yestext="ナレッジベースを開く"/>
- </notification>
- <notification name="RegionEntryAccessBlocked_Notify">訪問しようとしている地域(リージョン)には [REGIONMATURITY] コンテンツが含まれていますが、現在の環境設定は [REGIONMATURITY] コンテンツ除外するように設定されています。</notification>
- <notification name="RegionEntryAccessBlocked_NotifyAdultsOnly">訪問しようとしている地域(リージョン)には、成人のみアクセスできる [REGIONMATURITY] コンテンツが含まれています。</notification>
- <notification name="RegionEntryAccessBlocked_Change">
- 訪問しようとしている地域(リージョン)には [REGIONMATURITY] コンテンツが含まれていますが、現在の環境設定は [REGIONMATURITY] コンテンツを除外するように設定されています。環境設定を変更するか、取り消すことができます。環境設定を変更した後、もう一度、地域(リージョン)に入ることができます。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification label="不動産を選択" name="EstateAllowedAgentAdd">この不動産限定の許可リストに追加しますか?それとも、[ALL_ESTATES]の許可リストに追加しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+ </notification>
+ <notification label="不動産を選択" name="EstateAllowedAgentRemove">この不動産限定の許可リストから削除しますか?それとも、[ALL_ESTATES]から削除しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+ </notification>
+ <notification label="不動産を選択" name="EstateAllowedGroupAdd">この不動産限定のグループ許可リストに追加しますか?それとも、[ALL_ESTATES]のグループ許可リストに追加しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+ </notification>
+ <notification label="不動産を選択" name="EstateAllowedGroupRemove">この不動産限定の許可リストから削除しますか?それとも、[ALL_ESTATES] から削除しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+ </notification>
+ <notification label="不動産を選択" name="EstateBannedAgentAdd">この不動産限定でアクセスを拒否しますか?それとも、[ALL_ESTATE]へのアクセスを拒否しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+ </notification>
+ <notification label="不動産を選択" name="EstateBannedAgentRemove">この住人をこの不動産のバンリストからのみ削除しますか?それとも、[ALL_ESTATES]のバンリストから削除しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+ </notification>
+ <notification label="不動産を選択" name="EstateManagerAdd">この不動産限定、または[ALL_ESTATES]の不動産マネージャーを追加しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+ </notification>
+ <notification label="不動産を選択" name="EstateManagerRemove">不動産マネージャーをこの不動産限定、または[ALL_ESTATES]から削除しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+ </notification>
+ <notification label="不動産を選択" name="EstateAllowedExperienceAdd">この不動産の許可リストにのみ追加しますか、それとも[ALL_ESTATES]の許可リストに追加しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+ </notification>
+ <notification label="不動産を選択" name="EstateAllowedExperienceRemove">この不動産の許可リストからのみ削除しますか、それとも[ALL_ESTATES]の許可リストから削除しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+ </notification>
+ <notification label="不動産を選択" name="EstateBlockedExperienceAdd">この不動産のブロックされたリストにのみ追加しますか、それとも[ALL_ESTATES]のブロックされたリストに追加しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+ </notification>
+ <notification label="不動産を選択" name="EstateBlockedExperienceRemove">この不動産のブロックされたリストからのみ削除しますか、それとも[ALL_ESTATES]のブロックされたリストから削除しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+ </notification>
+ <notification label="不動産を選択" name="EstateTrustedExperienceAdd">この不動産のキー リストにのみ追加しますか、それとも[ALL_ESTATES]のキーリストに追加しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+ </notification>
+ <notification label="不動産を選択" name="EstateTrustedExperienceRemove">この不動産のキーリストからのみ削除しますか、それとも[ALL_ESTATES]のキーリストから削除しますか?
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="すべての不動産" yestext="この不動産"/>
+ </notification>
+ <notification label="バンの確認" name="EstateKickUser">この不動産から[EVIL_USER]を追い出しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="EstateChangeCovenant">不動産約款を変更しようとしています。続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="EstateParcelAccessOverride">このオプションのチェックを外すと、グリーティングの防止、プライバシーの維持、成人向けコンテンツから未成年の居住者を保護するために区画所有者が追加した制限が削除される場合があります。必要に応じて土地所有者と相談してください。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="EstateParcelEnvironmentOverride">(不動産全体の変更:[ESTATENAME])このオプションのチェックを外すと、区画所有者が区画に追加したカスタム環境がすべて削除されます。必要に応じて土地所有者と相談してください。
+続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked">訪問しようとしているリージョン(地域)には、現在の初期設定を超えるレーティングのコンテンツが含まれています。「私」>「初期設定」>「一般」を選択して、初期設定を変更できます。
+
+レーティング制限に関する詳細情報は、[https://community.secondlife.com/knowledgebase/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B8%E3%83%99%E3%83%BC%E3%82%B9/%E3%83%AC%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E5%8C%BA%E5%88%86-r323/ こちら]をご覧になってください。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_AdultsOnlyContent">訪問しようとしているリージョン(地域)には、成人のみアクセスできる[REGIONMATURITY]コンテンツが含まれています。
+ <url name="url">
+ https://community.secondlife.com/knowledgebase/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B8%E3%83%99%E3%83%BC%E3%82%B9/%E3%83%AC%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E5%8C%BA%E5%88%86-r323/
+ </url>
+ <tag>
+ fail
+ </tag>
+ <usetemplate ignoretext="リージョン(地域)の横断:成人のみアクセスできるコンテンツが含まれているときの警告" name="okcancelignore" notext="閉じる" yestext="ナレッジベースを開く"/>
+ </notification>
+ <notification name="SLM_UPDATE_FOLDER">
+ [MESSAGE]
+ </notification>
+ <notification name="RegionEntryAccessBlocked_Notify">訪問しようとしているリージョン(地域)には、[REGIONMATURITY]コンテンツが含まれていますが、現在の初期設定は、[REGIONMATURITY]コンテンツ除外するように設定されています。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_NotifyAdultsOnly">訪問しようとしているリージョン(地域)には、成人のみアクセスできる[REGIONMATURITY] コンテンツが含まれています。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_Change">訪問しようとしているリ-ジョン(地域)は、[REGIONMATURITY]コンテンツが含まれていますが、現在の設定では[REGIONMATURITY]コンテンツを除外するように設定されています。ご希望を変更することも、キャンセルすることもできます。この設定を変更すると、そのリージョンに入ることができるようになります。
+ <tag>
+ fail
+ </tag>
+ <tag>
+ confirm
+ </tag>
<form name="form">
- <button name="OK" text="環境設定の変更"/>
- <button default="true" name="Cancel" text="取り消し"/>
- <ignore name="ignore" text="リージョン(地域)の横断:訪問しようとしている地域(リージョン)には現在の環境設定により除外されたコンテンツが含まれています。"/>
+ <button name="OK" text="初期設定の変更"/>
+ <button default="true" name="Cancel" text="キャンセル"/>
+ <ignore name="ignore" text="リージョン(地域)の横断:訪問しようとしているリージョン(地域)には現在の初期設定により除外されたコンテンツが含まれています。"/>
</form>
</notification>
- <notification name="RegionEntryAccessBlocked_PreferencesOutOfSync">
- あなたの環境設定がサーバーと同期していないため、テレポートに技術的な問題が発生しています。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="TeleportEntryAccessBlocked">
- 訪問しようとしている地域(リージョン)には現在の環境設定を超えるコンテンツが含まれています。「ミー」 &gt; 「環境設定」 &gt; 「一般」を選択して、環境設定を変更できます。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="TeleportEntryAccessBlocked_AdultsOnlyContent">
- 訪問しようとしている地域(リージョン)には、成人のみアクセスできる [REGIONMATURITY] コンテンツが含まれています。
- <url name="url">http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview</url>
- <usetemplate ignoretext="テレポート:訪問しようとしている地域(リージョン)には、成人のみアクセスできるコンテンツが含まれています。" name="okcancelignore" notext="閉じる" yestext="ナレッジベースを開く"/>
- </notification>
- <notification name="TeleportEntryAccessBlocked_Notify">訪問しようとしている地域(リージョン)には [REGIONMATURITY] コンテンツが含まれていますが、現在の環境設定は [REGIONMATURITY] コンテンツを除外するように設定されています。</notification>
- <notification name="TeleportEntryAccessBlocked_NotifyAdultsOnly">訪問しようとしている地域(リージョン)には、成人のみアクセスできる [REGIONMATURITY] コンテンツが含まれています。</notification>
- <notification name="TeleportEntryAccessBlocked_ChangeAndReTeleport">
- 訪問しようとしている地域(リージョン)には [REGIONMATURITY] コンテンツが含まれていますが、現在の環境設定は [REGIONMATURITY] コンテンツを除外するように設定されています。環境設定を変更してテレポートを続けるか、このテレポートを取り消すことができます。
+ <notification name="RegionEntryAccessBlocked_PreferencesOutOfSync">あなたの初期設定がサーバーと同期していないため、テレポートに技術的な問題が発生しています。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TeleportEntryAccessBlocked">訪問しようとしているリージョン(地域)には現在の初期設定を超えるコンテンツが含まれています。「私」>「初期設定」>「一般」を選択して、初期設定を変更できます。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TeleportEntryAccessBlocked_AdultsOnlyContent">訪問しようとしているリージョン(地域)には、成人のみアクセスできる[REGIONMATURITY]コンテンツが含まれています。
+ <unique>
+ <context>
+ REGIONMATURITY
+ </context>
+ </unique>
+ <tag>
+ fail
+ </tag>
+ <tag>
+ confirm
+ </tag>
+ <url name="url">
+ https://community.secondlife.com/knowledgebase/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B8%E3%83%99%E3%83%BC%E3%82%B9/%E3%83%AC%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E5%8C%BA%E5%88%86-r323/
+ </url>
+ <usetemplate ignoretext="テレポート:成人のみアクセスできるコンテンツが含まれているときの警告" name="okcancelignore" notext="閉じる" yestext="ナレッジベースを開く"/>
+ </notification>
+ <notification name="TeleportEntryAccessBlocked_Notify">訪問しようとしているリージョン(地域)には、[REGIONMATURITY]コンテンツが含まれていますが、現在の初期設定は[REGIONMATURITY]コンテンツを除外するように設定されています。
+ <unique>
+ <context>
+ REGIONMATURITY
+ </context>
+ </unique>
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="TeleportEntryAccessBlocked_NotifyAdultsOnly">訪問しようとしているリージョン(地域)には、成人のみアクセスできる[REGIONMATURITY]コンテンツが含まれています。
+ <unique>
+ <context>
+ REGIONMATURITY
+ </context>
+ </unique>
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="TeleportEntryAccessBlocked_ChangeAndReTeleport">訪問しようとしているリージョン(地域)には、[REGIONMATURITY]コンテンツが含まれていますが、現在の初期設定は[REGIONMATURITY]コンテンツを除外するように設定されています。
+初期設定を変更してテレポートを続けるか、このテレポートを取り消すことができます。
+ <unique>
+ <context>
+ REGIONMATURITY
+ </context>
+ </unique>
+ <tag>
+ fail
+ </tag>
+ <tag>
+ confirm
+ </tag>
<form name="form">
- <button name="OK" text="変更して続ける"/>
- <button name="Cancel" text="取り消し"/>
- <ignore name="ignore" text="テレポート(再起動可能):訪問しようとしている地域(リージョン)には現在の環境設定により除外されたコンテンツが含まれています。"/>
+ <button name="OK" text="変更して続ける"/>
+ <button name="Cancel" text="キャンセル"/>
+ <ignore name="ignore" text="テレポート(再起動可能):訪問しようとしているリージョン(地域)には、現在の初期設定により除外されたコンテンツが含まれています。"/>
</form>
</notification>
- <notification name="TeleportEntryAccessBlocked_Change">
- 訪問しようとしている地域(リージョン)には [REGIONMATURITY] コンテンツが含まれていますが、現在の環境設定は [REGIONMATURITY] コンテンツを除外するように設定されています。環境設定を変更するか、テレポートを取り消すことができます。環境設定を変更した後、もう一度テレポートを実行する必要があります。
+ <notification name="TeleportEntryAccessBlocked_Change">訪問しようとしているリージョン(地域)には、 [REGIONMATURITY]コンテンツが含まれていますが、現在の初期設定は[REGIONMATURITY]コンテンツを除外するように設定されています。
+初期設定を変更するか、テレポートを取り消すことができます。初期設定を変更した後、もう一度テレポートを実行する必要があります。
+ <unique>
+ <context>
+ REGIONMATURITY
+ </context>
+ </unique>
+ <tag>
+ fail
+ </tag>
+ <tag>
+ confirm
+ </tag>
<form name="form">
- <button name="OK" text="環境設定の変更"/>
- <button name="Cancel" text="取り消し"/>
- <ignore name="ignore" text="テレポート(再起動不可):訪問しようとしている地域(リージョン)には現在の環境設定により除外されたコンテンツが含まれています。"/>
+ <button name="OK" text="初期設定の変更"/>
+ <button name="Cancel" text="キャンセル"/>
+ <ignore name="ignore" text="テレポート(再起動不可):訪問しようとしているリージョン(地域)には、現在の初期設定により除外されたコンテンツが含まれています。"/>
</form>
</notification>
- <notification name="TeleportEntryAccessBlocked_PreferencesOutOfSync">
- あなたの環境設定がサーバーと同期していないため、テレポートに技術的な問題が発生しています。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="RegionTPSpecialUsageBlocked">
- リージョンに入ることができません。'[REGION_NAME]' はスキル ゲーミング リージョンであり、あなたはこのリージョンに入るための特定の基準を満たす必要があります。詳しくは、[http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life スキル ゲーミングのよくある質問] を参照してください。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="PreferredMaturityChanged">
- 今後、[RATING] コンテンツ付きの地域(リージョン)を訪問しようとしているという通知を受け取りません。後でメニューバーの「ミー」 &gt; 「環境設定」 &gt; 「一般」を使用して、コンテンツの環境設定を変更できます。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="MaturityChangeError">
- 現在、[PREFERRED_MATURITY] コンテンツを表示するように環境設定を変更できませんでした。あなたの環境設定は、[ACTUAL_MATURITY] コンテンツを表示するようにリセットされました。メニューバーの「ミー」 &gt; 「環境設定」 &gt; 「一般」を使用して、もう一度環境設定を変更できます。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="LandClaimAccessBlocked">
- 取得しようとしている土地には現在の環境設定を超えるレーティング区分が含まれています。「ミー」 &gt; 「環境設定」 &gt; 「一般」を選択して、環境設定を変更できます。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="LandClaimAccessBlocked_AdultsOnlyContent">
- この土地を購入できるのは、成人だけです。
- <url name="url">http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview</url>
- <usetemplate ignoretext="この土地を購入できるのは、成人だけです。" name="okcancelignore" notext="閉じる" yestext="ナレッジベースを開く"/>
- </notification>
- <notification name="LandClaimAccessBlocked_Notify">取得しようとしている土地には [REGIONMATURITY] コンテンツが含まれていますが、現在の環境設定は [REGIONMATURITY] コンテンツを除外するように設定されています。</notification>
- <notification name="LandClaimAccessBlocked_NotifyAdultsOnly">取得しようとしている土地には、成人のみアクセスできる [REGIONMATURITY] コンテンツが含まれています。</notification>
- <notification name="LandClaimAccessBlocked_Change">
- 取得しようとしている土地には [REGIONMATURITY] コンテンツが含まれていますが、現在の環境設定は [REGIONMATURITY] コンテンツを除外するように設定されています。環境設定を変更して、もう一度土地の取得を試みることができます。
+ <notification name="TeleportEntryAccessBlocked_PreferencesOutOfSync">あなたの初期設定がサーバーと同期していないため、テレポートに技術的な問題が発生しています。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RegionTPSpecialUsageBlocked">リージョン(地域)に入ることができません。「[REGION_NAME]」は、スキルゲーミングリージョンであり、あなたはこのリージョンに入るための特定の基準を満たす必要があります。
+詳しくは、[https://wiki.secondlife.com/wiki/Linden_Lab_Official:Second_Life_Skill_Gaming_FAQ スキルゲーミングのよくある質問]を参照してください。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PreferredMaturityChanged">今後、[RATING]コンテンツ付きのリージョン(地域)を訪問しようとしているという通知を受け取りません。後でメニューバーの「私」>「初期設定」>「一般」を使用して、コンテンツの初期設定を変更できます。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MaturityChangeError">現在、[PREFERRED_MATURITY]コンテンツを表示するように初期設定を変更できませんでした。あなたの初期設定は、[ACTUAL_MATURITY]コンテンツを表示するようにリセットされました。メニューバーの「私」>「初期設定」>「一般」を使用して、もう一度初期設定を変更できます。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked">取得しようとしている土地には現在の初期設定を超えるレーティング区分が含まれています。「私」>「初期設定」>「一般」を選択して、初期設定を変更できます。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked_AdultsOnlyContent">この土地を購入できるのは、成人だけです。
+ <tag>
+ fail
+ </tag>
+ <url name="url">
+ https://community.secondlife.com/knowledgebase/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B8%E3%83%99%E3%83%BC%E3%82%B9/%E3%83%AC%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E5%8C%BA%E5%88%86-r323/
+ </url>
+ <usetemplate ignoretext="土地を購入:成人のみアクセスできるコンテンツが含まれているときの警告" name="okcancelignore" notext="閉じる" yestext="ナレッジベースを開く"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked_Notify">取得しようとしている土地には。[REGIONMATURITY]コンテンツが含まれていますが、現在の初期設定は、[REGIONMATURITY]コンテンツを除外するように設定されています。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="LandClaimAccessBlocked_NotifyAdultsOnly">取得しようとしている土地には、成人のみアクセスできる[REGIONMATURITY]コンテンツが含まれています。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="LandClaimAccessBlocked_Change">取得しようとしている土地には、[REGIONMATURITY]コンテンツが含まれていますが、現在の初期設定は、[REGIONMATURITY]コンテンツを除外するように設定されています。初期設定を変更して、もう一度土地の取得を試みることができます。
+ <tag>
+ fail
+ </tag>
+ <tag>
+ confirm
+ </tag>
<form name="form">
- <button name="OK" text="環境設定の変更"/>
- <button name="Cancel" text="取り消し"/>
- <ignore name="ignore" text="取得しようとしている土地には現在の環境設定により除外されたコンテンツが含まれています。"/>
+ <button name="OK" text="初期設定の変更"/>
+ <button name="Cancel" text="キャンセル"/>
+ <ignore name="ignore" text="取得しようとしている土地には、現在の初期設定により除外されたコンテンツが含まれています。"/>
</form>
</notification>
- <notification name="LandBuyAccessBlocked">
- 購入しようとしている土地には現在の環境設定を超えるレーティング区分が含まれています。「ミー」 &gt; 「環境設定」 &gt; 「一般」を選択して、環境設定を変更できます。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="LandBuyAccessBlocked_AdultsOnlyContent">
- この土地を取得できるのは、成人だけです。
- <url name="url">http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview</url>
- <usetemplate ignoretext="この土地を取得できるのは、成人だけです。" name="okcancelignore" notext="閉じる" yestext="ナレッジベースを開く"/>
- </notification>
- <notification name="LandBuyAccessBlocked_Notify">購入しようとしている土地には [REGIONMATURITY] コンテンツが含まれていますが、現在の環境設定は [REGIONMATURITY] コンテンツを除外するように設定されています。</notification>
- <notification name="LandBuyAccessBlocked_NotifyAdultsOnly">購入しようとしている土地には、成人のみアクセスできる [REGIONMATURITY] コンテンツが含まれています。</notification>
- <notification name="LandBuyAccessBlocked_Change">
- 購入しようとしている土地には [REGIONMATURITY] コンテンツが含まれていますが、現在の環境設定は [REGIONMATURITY] コンテンツを除外するように設定されています。環境設定を変更して、もう一度土地の購入を試みることができます。
+ <notification name="LandBuyAccessBlocked">購入しようとしている土地には、現在の初期設定を超えるレーティング区分が含まれています。「私」>「初期設定」>「一般」から設定を変更できます。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked_AdultsOnlyContent">この土地を取得できるのは、成人だけです。
+ <tag>
+ confirm
+ </tag>
+ <tag>
+ fail
+ </tag>
+ <url name="url">
+ https://community.secondlife.com/knowledgebase/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B8%E3%83%99%E3%83%BC%E3%82%B9/%E3%83%AC%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E5%8C%BA%E5%88%86-r323/
+ </url>
+ <usetemplate ignoretext="土地の取得:成人のみアクセスできるコンテンツが含まれているときの警告" name="okcancelignore" notext="閉じる" yestext="ナレッジベースを開く"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked_Notify">購入しようとしている土地には [REGIONMATURITY]コンテンツが含まれていますが、現在の初期設定は、[REGIONMATURITY]コンテンツを除外するように設定されています。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="LandBuyAccessBlocked_NotifyAdultsOnly">購入しようとしている土地には、成人のみアクセスできる[REGIONMATURITY]コンテンツが含まれています。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="LandBuyAccessBlocked_Change">購入しようとしている土地には [REGIONMATURITY]コンテンツが含まれていますが、現在の初期設定は、[REGIONMATURITY]コンテンツを除外するように設定されています。初期設定を変更して、もう一度土地の購入を試みることができます。
+ <tag>
+ confirm
+ </tag>
+ <tag>
+ fail
+ </tag>
<form name="form">
- <button name="OK" text="環境設定の変更"/>
- <button name="Cancel" text="取り消し"/>
- <ignore name="ignore" text="購入しようとしている土地には現在の環境設定により除外されたコンテンツが含まれています。"/>
+ <button name="OK" text="初期設定の変更"/>
+ <button name="Cancel" text="キャンセル"/>
+ <ignore name="ignore" text="購入しようとしている土地には現在の初期設定により除外されたコンテンツが含まれています。"/>
</form>
</notification>
- <notification name="TooManyPrimsSelected">
- 選択したプリムが多すぎます。 [MAX_PRIM_COUNT] 個選択するか、プリム数を減らしてもう一度お試しください。
- <usetemplate name="okbutton" yestext="OK"/>
+ <notification name="TooManyPrimsSelected">選択したプリムが多すぎます:[MAX_PRIM_COUNT]
+個選択するか、プリム数を減らしてもう一度お試しください。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="TooManyScriptsSelected">
- スクリプト内で選択されたオブジェクトが多すぎます。選択するオブジェクトを減らして、もう一度やり直してください。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ProblemImportingEstateCovenant">
- 不動産約款のインポート時に問題が発生しました。
- <usetemplate name="okbutton" yestext="OK"/>
+スクリプト内で選択されたオブジェクトが多すぎます。選択するオブジェクトを減らして、もう一度やり直してください。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ProblemImportingEstateCovenant">不動産約款のインポート時に問題が発生しました。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="ProblemAddingEstateManager">新しい不動産マネージャーの追加に関する問題:
-いずれかの不動産のマネージャーリストが満杯になっています。</notification>
- <notification name="ProblemAddingEstateBanManager">不動産所有者または管理者を禁止リストに追加できません。</notification>
- <notification name="ProblemAddingEstateGeneric">不動産リストの追加に関する問題:
-いずれかの不動産のリストが満杯になっています。</notification>
- <notification name="UnableToLoadNotecardAsset">
- 現在ノートカードのアセット ID を読み込むことができません。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="NotAllowedToViewNotecard">
- 要求したアセット ID に関するノートカードを閲覧するには、権限が不十分です。
- <usetemplate name="okbutton" yestext="OK"/>
+いずれかの不動産のマネージャーリストが満杯になっています。
+ <tag>
+ fail
+ </tag>
</notification>
- <notification name="MissingNotecardAssetID">
- ノートカード用のアセット ID がデータベースに登録されていません。
- <usetemplate name="okbutton" yestext="OK"/>
+ <notification name="ProblemAddingEstateBanManager">不動産所有者または管理者を禁止リストに追加できません。
+ <tag>
+ fail
+ </tag>
</notification>
- <notification name="PublishClassified">
- 注意:クラシファイド広告の料金は払い戻しされません。
-
-L$ [AMOUNT] で、このクラシファイド広告を今すぐ公開しますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="SetClassifiedMature">
- この広告に「Moderate」コンテンツは含まれていますか?
+ <notification name="ProblemAddingEstateGeneric">不動産リストの追加に関する問題:
+いずれかの不動産のリストが満杯になっています。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="UnableToLoadNotecardAsset">現在ノートカードのアセットIDを読み込むことができません。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="NotAllowedToViewNotecard">要求したアセットIDに関するノートカードを閲覧するには、権限が不十分です。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MissingNotecardAssetID">ノートカード用のアセットIDがデータベースに登録されていません。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PublishClassified">注意:クラシファイド広告の掲載料金の払い戻しはできません。L$ [AMOUNT]で、このクラシファイド広告を今すぐ公開しますか?
+ <tag>
+ confirm
+ </tag>
+ <tag>
+ funds
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="SetClassifiedMature">この広告に「Moderate」コンテンツは含まれていますか?
+ <tag>
+ confirm
+ </tag>
<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="いいえ" yestext="はい"/>
</notification>
- <notification name="SetGroupMature">
- このグループに「Moderate」コンテンツが含まれていますか?
+ <notification name="SetGroupMature">このグループに「Moderate」コンテンツが含まれていますか?
+ <tag>
+ confirm
+ </tag>
<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="いいえ" yestext="はい"/>
</notification>
- <notification label="再起動を確認" name="ConfirmRestart">
- このリージョンを 2 分後に再起動しようとしています。
-続けますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ <notification label="再起動を確認" name="ConfirmRestart">このリージョンを2分後に再起動しようとしています。このまま続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
- <notification label="このリージョンにメッセージを送信" name="MessageRegion">
- このリージョンにいる人全員に送る短いメッセージを入力してください。
+ <notification label="このリージョンにメッセージを送信" name="MessageRegion">このリージョン(地域)にいる人全員に送る、短いメッセージを入力してください。
+ <tag>
+ confirm
+ </tag>
<form name="form">
<input name="message"/>
- <button name="OK" text="OK"/>
- <button name="Cancel" text="取り消し"/>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="キャンセル"/>
</form>
</notification>
- <notification label="地域のレーティング区分指定変更済み" name="RegionMaturityChange">
- このリージョンのレーティング区分が変更されました。
-地図にこの変更が反映するには数分かかることがあります。
- <usetemplate name="okbutton" yestext="OK"/>
+ <notification label="地域のレーティング区分指定変更しました" name="RegionMaturityChange">このリージョン(地域)のレーティング区分が変更されました。
+マップにこの変更が反映するには数分かかることがあります。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification label="ボイスバージョンの不一致" name="VoiceVersionMismatch">[APP_NAME]のこのバージョンは、このリージョン(地域)におけるボイスチャットの互換性がありません。ボイスチャットを正常に行うためには、[APP_NAME]のアップデートが必要です。
+ <tag>
+ fail
+ </tag>
+ <tag>
+ voice
+ </tag>
</notification>
- <notification label="ボイスバージョンの不一致" name="VoiceVersionMismatch">[APP_NAME] のこのバージョンは、このリージョンにおけるボイスチャットの互換性がありません。 ボイスチャットを正常に行うためには、[APP_NAME] のアップデートが必要です。</notification>
<notification label="オブジェクトを購入できません" name="BuyObjectOneOwner">複数の所有者から同時にオブジェクトを購入することはできません。
-単一のオブジェクトを選択し、もう一度試してください。</notification>
+単一のオブジェクトを選択し、もう一度試してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification label="コンテンツを購入できません" name="BuyContentsOneOnly">一度に複数のオブジェクトのコンテンツは購入できません。
-選択するオブジェクトを1つだけにして、もう一度試してください。</notification>
+選択するオブジェクトを一つだけにして、もう一度試してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification label="コンテンツを購入できません" name="BuyContentsOneOwner">複数の所有者から同時にオブジェクトを購入することはできません。
-単一のオブジェクトを選択し、もう一度試してください。</notification>
- <notification name="BuyOriginal">
- オリジナルのオブジェクトを [OWNER] から L$ [PRICE] で購入しますか?
-購入すると、あなたがオブジェクトの所有者となります。
-可能な操作は、
-修正:[MODIFYPERM]、コピー:[COPYPERM]、
-再販・プレゼント:[RESELLPERM] です。
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="BuyOriginalNoOwner">
- L$ [PRICE] でオリジナルのオブジェクトを購入しますか?
-購入すると、あなたがオブジェクトの所有者となります。
-可能な操作は、
-修正:[MODIFYPERM]、コピー:[COPYPERM]、
-再販・プレゼント:[RESELLPERM] です。
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="BuyCopy">
- コピーを [OWNER] から L$ [PRICE] で購入しますか?
-購入したオブジェクトは、あなたのインベントリにコピーされます。
-可能な操作は、
-修正:[MODIFYPERM]、コピー:[COPYPERM]、
-再販・プレゼント:[RESELLPERM] です。
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="BuyCopyNoOwner">
- L$ [PRICE] でコピーを購入しますか?
-購入したオブジェクトは、あなたのインベントリにコピーされます。
-可能な操作は、
-修正:[MODIFYPERM]、コピー:[COPYPERM]、
-再販・プレゼント:[RESELLPERM] です。
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="BuyContents">
- 中身を [OWNER] から L$ [PRICE] で購入しますか?
-購入した中身は、あなたのインベントリにコピーされます。
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="BuyContentsNoOwner">
- L$ [PRICE] で中身を購入しますか?
-購入した中身は、あなたのインベントリにコピーされます。
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="ConfirmPurchase">
- この取引は以下のとおり行われます:
+単一のオブジェクトを選択し、もう一度試してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="BuyOriginal">オリジナルのオブジェクトを[OWNER]からL$ [PRICE]で購入しますか?
+購入すると、あなたがオブジェクトの所有者となり、以下の操作が可能になります。
+修正:[MODIFYPERM]
+コピー:[COPYPERM]
+再販・譲渡:[RESELLPERM]
+ <tag>
+ confirm
+ </tag>
+ <tag>
+ funds
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="BuyOriginalNoOwner">L$ [PRICE]でオリジナルのオブジェクトを購入しますか?
+購入すると、あなたがオブジェクトの所有者となり、以下の操作が可能になります。
+修正:[MODIFYPERM]
+コピー:[COPYPERM]
+再販・譲渡:[RESELLPERM]
+ <tag>
+ confirm
+ </tag>
+ <tag>
+ funds
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="BuyCopy">コピーを[OWNER]からL$ [PRICE]で購入しますか?
+購入したオブジェクトは、あなたのインベントリにコピーされ、以下の操作が可能になります。
+修正:[MODIFYPERM]
+コピー:[COPYPERM]
+再販・譲渡:[RESELLPERM]
+ <tag>
+ confirm
+ </tag>
+ <tag>
+ funds
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="BuyCopyNoOwner">L$ [PRICE]でコピーを購入しますか?
+購入したオブジェクトは、あなたのインベントリにコピーされ、以下の操作が可能になります。
+修正:[MODIFYPERM]
+コピー:[COPYPERM]
+再販・譲渡:[RESELLPERM]
+ <tag>
+ confirm
+ </tag>
+ <tag>
+ funds
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="BuyContents">中身を[OWNER]からL$ [PRICE]で購入しますか?購入した中身は、あなたのインベントリにコピーされます。
+ <tag>
+ confirm
+ </tag>
+ <tag>
+ funds
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="BuyContentsNoOwner">L$ [PRICE]で中身を購入しますか? 購入した中身は、あなたのインベントリにコピーされます。
+ <tag>
+ confirm
+ </tag>
+ <tag>
+ funds
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmPurchase">この取引は以下のとおり行われます:
[ACTION]
-購入を続けますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+このまま購入を続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <tag>
+ funds
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="ConfirmPurchasePassword">
- この取引は以下のとおり行われます:
+ <notification name="ConfirmPurchasePassword">この取引は以下のとおり行われます:
[ACTION]
-購入を続けますか?
-パスワードを再入力し、「 OK 」をクリックしてください。
+このまま購入を続けてもよろしいですか?
+パスワードを再入力し、「OK」をクリックしてください。
+ <tag>
+ confirm
+ </tag>
+ <tag>
+ funds
+ </tag>
<form name="form">
<input name="message"/>
- <button name="ConfirmPurchase" text="OK"/>
- <button name="Cancel" text="取り消し"/>
+ <button name="ConfirmPurchase" text="OK"/>
+ <button name="Cancel" text="キャンセル"/>
</form>
</notification>
- <notification name="SetPickLocation">
- メモ:
-本ピックの位置を更新しましたが、
-他の詳細は元の値のままになります。
- <usetemplate name="okbutton" yestext="OK"/>
+ <notification name="SetPickLocation">メモ:
+本ピックの位置を更新しましたが、 他の詳細は元の値のままになります。
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="MoveInventoryFromObject">
- 「コピー不可」のインベントリアイテムを選択しました。
+ <notification name="MoveInventoryFromObject">「コピー不可」のインベントリアイテムを選択しました。
これらのアイテムはコピーされないまま、あなたのインベントリに移動されます。
-
-アイテムを動かしますか?
- <usetemplate ignoretext="「コピー不可」のアイテムをオブジェクトから動かす前の警告" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+このままインベントリにアイテムを移動しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="「コピー不可」のアイテムをオブジェクトから動かす前の警告" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="MoveInventoryFromScriptedObject">
- 「コピー不可」のインベントリアイテムを選択しました。
-これらのアイテムはコピーされずに、あなたのインベントリに移動されます。
-このオブジェクトはスクリプト付きなので、インベントリに移動させると
-スクリプトに誤動作が起きる可能性があります。
+ <notification name="MoveInventoryFromScriptedObject">「コピー不可」のインベントリアイテムを選択しました。
+これらのアイテムはコピーされずに、あなたのインベントリに移動されます。このオブジェクトはスクリプト付きなので、インベントリに移動させると、スクリプトに誤動作が起きる可能性があります。
-インベントリアイテムを移動しますか?
- <usetemplate ignoretext="スクリプト入りのオブジェクトを壊す恐れのある「コピー不可」のアイテムを動かす前の警告" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+このままインベントリにアイテムを移動しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="スクリプト入りのオブジェクトを壊す恐れのある「コピー不可」のアイテムを動かす前の警告" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="ClickActionNotPayable">
- 警告: クリックで「オブジェクトに支払う」設定をしました。スクリプトに money()イベントが追加されると動作します。
- <form name="form">
+ <notification name="ClickActionNotPayable">警告:クリックで「オブジェクトに支払う」設定をしました。スクリプトにmoney()イベントが追加されると動作します。
+ <form name="form">
<ignore name="ignore" text="オブジェクトを作成中に、money() スクリプトを入れずに「オブジェクトに支払う」アクションを設定したとき"/>
</form>
</notification>
- <notification name="PayConfirmation">
- L$[AMOUNT] を [TARGET] に支払うことを確認してください。
- <usetemplate ignoretext="支払い前に確認 (合計金額が L$200 以上の場合)" name="okcancelignore" notext="取り消し" yestext="支払い"/>
- </notification>
- <notification name="PayObjectFailed">
- 支払いが失敗しました: オブジェクトが見つかりませんでした。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="PaymentBlockedButtonMismatch">
- 支払いが停止されました: 支払われた価格がこのオブジェクトに設定された支払いボタンのどれとも一致しません。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="OpenObjectCannotCopy">このオブジェクトには、あなたがコピーできるアイテムはありません。</notification>
- <notification name="WebLaunchAccountHistory">
- [http://jp.secondlife.com/account/ マイアカウント] ページに移動してアカウント履歴を確認しますか?
- <usetemplate ignoretext="ブラウザを起動してアカウント履歴を見るとき" name="okcancelignore" notext="取り消し" yestext="ページに移動"/>
- </notification>
- <notification name="ConfirmAddingChatParticipants">
- 既存の会話に人を加えると、新しい会話が作成されます。参加者全員に新しい会話についての通知が配信されます。
- <usetemplate ignoretext="チャットの参加者の追加を確認してください" name="okcancelignore" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="ConfirmQuit">
- 終了しようとしています。続けますか?
+ <notification name="PayConfirmation">[TARGET]にL$ [AMOUNT]を支払うことを確認してください。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="支払い前に確認 (合計金額がL$ 200を超える場合)" name="okcancelignore" notext="キャンセル" yestext="支払い"/>
+ </notification>
+ <notification name="PayObjectFailed">支払いが失敗しました:オブジェクトが見つかりませんでした。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PaymentBlockedButtonMismatch">支払いが停止されました:
+支払われた価格が、このオブジェクトに設定された支払いボタンのどれとも一致しません。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="OpenObjectCannotCopy">このオブジェクトには、あなたがコピーできるアイテムはありません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="WebLaunchAccountHistory">[https://secondlife.com/my/account/?lang=ja-JP マイアカウント]
+ページに移動してアカウント履歴を確認しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="ブラウザを起動してアカウント履歴を見るとき" name="okcancelignore" notext="キャンセル" yestext="ページに移動"/>
+ </notification>
+ <notification name="ConfirmAddingChatParticipants">既存の会話に人を加えると、新しい会話が作成されます。参加者全員に新しい会話についての通知が配信されます。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="会話へ参加者を追加する前の確認" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmQuit">終了してもよろしいですか?
+ <tag>
+ confirm
+ </tag>
<usetemplate ignoretext="終了時の確認" name="okcancelignore" notext="終了しない" yestext="終了"/>
</notification>
- <notification name="ConfirmRestoreToybox">
- この操作を実行すると、デフォルト設定のボタンとツールバーが復元されます。
+ <notification name="ConfirmRestoreToybox">この操作を実行すると、デフォルト設定のボタンとツールバーが復元されます。
この操作は元に戻せません。
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="ConfirmClearAllToybox">
- この操作により、全てのボタンはツールボックスに戻り、ツールバーは空になります。
-
+ <notification name="ConfirmClearAllToybox">この操作により、全てのボタンはツールボックスに戻り、ツールバーは空になります。
+
この操作は元に戻せません。
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ <unique/>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="DeleteItems">
- [QUESTION]
+ <notification name="DeleteItems">[QUESTION]
+ <tag>
+ confirm
+ </tag>
<form name="form">
<ignore name="ignore" text="アイテムを削除する前の確認"/>
- <button name="Yes" text="OK"/>
+ <button name="Yes" text="OK"/>
<button name="No" text="キャンセル"/>
</form>
</notification>
- <notification name="DeleteFilteredItems">
- あなたのインベントリには現在フィルターがかけられているため、削除しようとしているアイテムによっては表示されないことがあります。
-
+ <notification name="DeleteFilteredItems">あなたのインベントリには現在フィルタがかけられているため、削除しようとしているアイテムによっては表示されないことがあります。
+
これらのアイテムを削除しますか?
- <usetemplate ignoretext="フィルリングされたアイテムを削除する前の確認" name="okcancelignore" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="ConfirmUnlink">
- これは、リンクセットによる広範囲の選択です。リンクを解除すると、もう一度リンクできなくなる可能性があります。そのような場合に備えて、リンクセットを自分の持ち物にコピーできます。
- <usetemplate ignoretext="リンクセットのリンクを解除するときに確認する" name="okcancelignore" notext="取り消し" yestext="リンクを外す"/>
- </notification>
- <notification name="HelpReportAbuseConfirm">
- この問題のご報告にお時間を割いていただきありがとうございます。
-お知らせいただいた内容について違反がないか確認し、適切に
-対処いたします。
- <usetemplate name="okbutton" yestext="OK"/>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="フィルリングされたアイテムを削除する前の確認" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmUnlink">これは、リンクセットによる広範囲の選択です。リンクを解除すると、もう一度リンクできなくなる可能性があります。
+そのような場合に備えて、リンクセットを自分のインベントリにコピーできます。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="リンクセットのリンクを解除する前の確認" name="okcancelignore" notext="キャンセル" yestext="リンクを外す"/>
+ </notification>
+ <notification name="HelpReportAbuseConfirm">この問題のご報告にお時間を割いていただきありがとうございます。
+お知らせいただいた内容について違反がないか確認し、適切に 対処いたします。
+ <unique/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="HelpReportAbuseSelectCategory">嫌がらせ報告のカテゴリを選択してください。
-カテゴリを選択することにより、嫌がらせ報告の処理や保管に大変役立ちます。</notification>
+カテゴリを選択することにより、嫌がらせ報告の処理や保管に大変役立ちます。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="HelpReportAbuseAbuserNameEmpty">嫌がらせ行為をした人の名前を入力してください。
-正確な情報の入力により、嫌がらせ報告の処理や保管に大変役立ちます。</notification>
+正確な情報の入力により、嫌がらせ報告の処理や保管に大変役立ちます。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="HelpReportAbuseAbuserLocationEmpty">嫌がらせがあった場所を入力してください。
-正確な情報の入力により、嫌がらせ報告の処理や保管に大変役立ちます。</notification>
+正確な情報の入力により、嫌がらせ報告の処理や保管に大変役立ちます。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="HelpReportAbuseSummaryEmpty">嫌がらせの概要を入力してください。
正確な概要の入力により、
-嫌がらせ報告の処理や保管に大変役立ちます。</notification>
+嫌がらせ報告の処理や保管に大変役立ちます。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="HelpReportAbuseDetailsEmpty">嫌がらせの詳細な説明を入力してください。
名前や嫌がらせの詳細を、できるだけ具体的に入力してください。
正確な説明の入力により、
-嫌がらせ報告の処理や保管に大変役立ちます。</notification>
- <notification name="HelpReportAbuseContainsCopyright">こんにちは、
+嫌がらせ報告の処理や保管に大変役立ちます。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="HelpReportAbuseContainsCopyright">
+ 親愛なる居住者様
-知的財産権の侵害を報告しようとしています。 正確に報告するために、以下をご確認ください:
+知的財産権の侵害を報告しているようです。正しく報告していることを確認してください。
-(1) 嫌がらせの報告の手順 住人が [SECOND_LIFE] の権限システムを悪用しているのを見つけたら、嫌がらせの報告をすることができます。例えば、CopyBot や似たようなコピーツールを使用して知的財産権を侵害している場合です。 担当チームは調査を行い、[SECOND_LIFE] [http://secondlife.com/corporate/tos.php 利用規約] や [http://jp.secondlife.com/corporate/cs.php コミュニティスタンダード] に違反する行為に対する適切な処罰を下します。 ただし、担当チームは [SECOND_LIFE] の世界からコンテンツを削除して欲しいというリクエストには応じません。
+⑴嫌がらせの報告の手順。居住者が、[SECOND_LIFE]権限システムを悪用していると思われる場合(たとえば、CopyBotまたは同様のコピーツールを使用して、知的財産権を侵害していると思われる場合)は、不正使用報告を提出することができます。不正行為チームは、[SECOND_LIFE][http://secondlife.com/corporate/tos.php 利用規約]や、[http://jp.secondlife.com/corporate/cs.php コミュニティ・スタンダード]に違反する行為を調査し、に違反する行為に対する適切な処罰を下します。ただし、担当チームは[SECOND_LIFE]の世界からコンテンツを削除して欲しいというリクエストには応じません。
-(2) DMCA またはコンテンツの撤去の手順 コンテンツを [SECOND_LIFE] から削除して欲しいというリクエストをするには、弊社 [http://secondlife.com/corporate/dmca.php DMCA ポリシー] で提示されているとおり、有効な侵害の通知を提出しなければなりません。.
+⑵DMCA またはコンテンツ削除プロセス。[SECOND_LIFE]からコンテンツの削除をリクエストするには、[https://www.lindenlab.com/legal/intellectual-property-infringement-notification-policy DCMAポリシー]に規定されている有効な権利侵害通知を提出する必要があります。
-このまま嫌がらせの報告を続けたい場合は、このウィンドウを閉じて報告を送ってください。 「コピー Bot 及び権限の悪用」のカテゴリを選んだ方が適切の場合があります。
+このまま嫌がらせの報告を続けたい場合は、このウィンドウを閉じて報告の送信を完了してください。特定のカテゴリ「コピー Bot 及び権限の悪用」を選択する必要がある場合があります。
ご協力ありがとうございます。
-Linden Lab</notification>
- <notification name="FailedRequirementsCheck">以下の必要なコンポーネントが、[FLOATER] から抜け落ちています
-[COMPONENTS]</notification>
- <notification label="既存の付属品を置換" name="ReplaceAttachment">
- 体のこの部位には既にオブジェクトが装着されています。
+Linden Lab
+ </notification>
+ <notification name="FailedRequirementsCheck">以下の必要なコンポーネントが、[FLOATER]から抜け落ちています
+[COMPONENTS]
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification label="既存の付属品を置換" name="ReplaceAttachment">体のこの部位には既にオブジェクトが装着されています。
選択されたオブジェクトと置き換えますか?
+ <tag>
+ confirm
+ </tag>
<form name="form">
- <ignore name="ignore" save_option="true" text="装着しているアイテムと選択したアイテムを入れ替えるとき"/>
- <button ignore="自動的に交換" name="Yes" text="OK"/>
+ <ignore name="ignore" save_option="true" text="装着しているアイテムと選択したアイテムを入れ替える"/>
+ <button ignore="自動的に交換" name="Yes" text="OK"/>
<button ignore="交換しない" name="No" text="キャンセル"/>
</form>
</notification>
- <notification name="TooManyWearables">[AMOUNT] 以上のアイテムを含むフォルダを装着できません。「詳細設定」 &gt; 「デバッグ設定を表示」 &gt; 「WearFolderLimit」でこの制限を変更できます。</notification>
- <notification label="「通知を受けない」モードの警告" name="DoNotDisturbModePay">
- 「通知を受けない」をオンにします。この支払との交換で提供されるアイテムが受信されなくなります。
-
-このトランザクションを完了するために、「通知を受けない」をオフにしてもよろしいですか。
+ <notification name="TooManyWearables">[AMOUNT]個以上のアイテムを含むフォルダを装着できません。「詳細設定」>「デバッグ設定を表示」>「WearFolderLimit」でこの制限を変更できます。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification label="「着信拒否」モードの警告" name="DoNotDisturbModePay">「着信拒否」をオンにします。この支払との交換で提供されるアイテムが受信されなくなります。
+このトランザクションを完了するために、「着信拒否」をオフにしてもよろしいですか。
+ <tag>
+ confirm
+ </tag>
<form name="form">
- <ignore name="ignore" text="「通知を受けない」モード時に、人や物を支払う予定です。"/>
- <button ignore="「通知を受けない」モードを維持しない" name="Yes" text="OK"/>
- <button ignore="「通知を受けない」モードを維持する" name="No" text="取り消し"/>
+ <ignore name="ignore" text="「着信拒否」モード時に、人や物を支払う予定です。"/>
+ <button ignore="「着信拒否」モードを解除する" name="Yes" text="OK"/>
+ <button ignore="「着信拒否」モードを維持する" name="No" text="キャンセル"/>
</form>
</notification>
- <notification name="ConfirmDeleteProtectedCategory">
- 「 [FOLDERNAME] 」 は、システムフォルダです。 システムフォルダを削除すると不安定になることがあります。 続けますか?
- <usetemplate ignoretext="システムフォルダを削除する前の確認" name="okcancelignore" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="PurgeSelectedItems">
- [COUNT] アイテムが完全に削除されます。ごみ箱内の選択した項目をすべて削除しますか?
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="ConfirmEmptyTrash">
- [COUNT] 個のアイテムとフォルダーが完全に削除されます。ごみ箱の項目をすべて削除しますか?
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="TrashIsFull">
- ゴミ箱があふれています。これはログイン時に問題を引き起こします。
+ <notification name="ConfirmDeleteProtectedCategory">「[FOLDERNAME]」は、システムフォルダです。
+システムフォルダを削除すると不安定になることがあります。このまま続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="システムフォルダを削除する前の確認" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="PurgeSelectedItems">[COUNT]個のアイテムが完全に削除されます。ごみ箱内の選択した項目を削除してもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmEmptyTrash">[COUNT]個のアイテムとフォルダーが完全に削除されます。ごみ箱の項目をすべて削除してもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="TrashIsFull">ゴミ箱があふれています。これはログイン時に問題を引き起こします。
+ <tag>
+ confirm
+ </tag>
<usetemplate name="okcancelbuttons" notext="後でゴミ箱を空にする" yestext="ごみ箱フォルダーを確認する"/>
</notification>
- <notification name="ConfirmClearBrowserCache">
- トラベル、Web、検索の履歴をすべて削除しますか?
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="ConfirmClearCache">
- ビューワのキャッシュをクリアしますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="ConfirmClearCookies">
- 本当にクッキーをクリアしますか?
+ <notification name="InventoryLimitReachedAIS">インベントリに問題が発生しています。お手数ですが、サポートにお問い合わせください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ConfirmClearBrowserCache">トラベル、Web、検索の履歴をすべて削除しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearCache">ビューアーのキャッシュをクリアしますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearCookies">本当にクッキーをクリアしますか?
+ <tag>
+ confirm
+ </tag>
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="はい"/>
</notification>
- <notification name="ConfirmClearMediaUrlList">
- 保存された URL のリストを消去します。よろしいですか?
+ <notification name="ConfirmClearMediaUrlList">保存されたURLのリストを消去します。このまま、リストを消去してもよろしいですか?
+ <tag>
+ confirm
+ </tag>
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="はい"/>
</notification>
- <notification name="ConfirmEmptyLostAndFound">
- 紛失物の中身をすべて削除しますか?
+ <notification name="ConfirmEmptyLostAndFound">紛失物の中身をすべて削除しますか?
+ <tag>
+ confirm
+ </tag>
<usetemplate ignoretext="紛失物フォルダを空にする前の確認" name="okcancelignore" notext="いいえ" yestext="はい"/>
</notification>
- <notification name="CopySLURL">
- 次の SLurl がクリップボードにコピーされました:
- [SLURL]
-
-Web ページにリンクすると、他人がこの場所に簡単にアクセスできます。Web ブラウザのアドレスバーに貼り付けて試してみてください。
- <form name="form">
- <ignore name="ignore" text="クリップボードに SLurl をコピーするとき"/>
+ <notification name="CopySLURL">次のSLurlがクリップボードにコピーされました:
+[SLURL]
+
+Webページにリンクすると、他人がこの場所に簡単にアクセスできます。Webブラウザのアドレスバーに貼り付けて試してみてください。
+ <form name="form">
+ <ignore name="ignore" text="クリップボードにSLurlをコピーする"/>
</form>
</notification>
- <notification name="WLSavePresetAlert">
- 保存された事前設定を上書きしますか?
+ <notification name="WLSavePresetAlert">保存されたプリセットを上書きしてもよろしいですか?
+ <unique/>
+ <tag>
+ confirm
+ </tag>
<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
</notification>
- <notification name="WLNoEditDefault">デフォルトの設定を編集したり削除したりすることはできません。</notification>
- <notification name="WLMissingSky">このデイサイクルのファイルは次の存在しない「空」ファイルを参照しています: [SKY]。</notification>
- <notification name="WLRegionApplyFail">申し訳ございませんが、設定をリージョンに適用できませんでした。理由: [FAIL_REASON]</notification>
- <notification name="WLLocalTextureDayBlock">ローカルテクスチャは、フィールド [FIELD] 内のトラック [TRACK]、フレーム #[FRAMENO] ([FRAME]%) で使用されています。ローカルテクスチャを使った設定は保存されない可能性があります。</notification>
- <notification name="WLLocalTextureFixedBlock">ローカルテクスチャは、フィールド [FIELD] で使用されています。
-ローカルテクスチャを使った設定は保存されない可能性があります。</notification>
- <notification name="EnvCannotDeleteLastDayCycleKey">
- デイサイクルを空にはできないので、このデイサイクルの最後のキーを削除することはできません。最後のキーを削除して新しいキーを作成するのではなく、最後のキーを変更してください。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="DayCycleTooManyKeyframes">
- このデイサイクルにはこれ以上キーフレームを追加できません。[SCOPE] の範囲のデイサイクルに追加できるキーフレーム数は最高 [MAX] です。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="EnvUpdateRate">
- リージョンの自然環境の設定は [WAIT] 秒ごとにしか更新できません。その間隔を置いてからもう一度お試しください。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="PPSaveEffectAlert">
- ポストプロセス効果が存在します。 上書きしますか?
- <usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+ <notification name="WLNoEditDefault">デフォルトの設定を編集したり削除したりすることはできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="WLMissingSky">このデイサイクルのファイルは、以下の存在しない「空」ファイルを参照しています:[SKY]
+ <tag>
+ fail
+ </tag>
</notification>
- <notification name="ChatterBoxSessionStartError">
- [RECIPIENT] と新しいチャットを開始することができません。
+ <notification name="WLRegionApplyFail">
+ 申し訳ございませんが、設定をリージョンに適用できませんでした。理由:[FAIL_REASON]
+ </notification>
+ <notification name="WLLocalTextureDayBlock">
+ ローカルテクスチャは、フィールド[FIELD]内のトラック[TRACK]、フレーム#[FRAMENO] ([FRAME]%) で使用されています。
+ローカルテクスチャを使った設定は保存されない可能性があります。
+ </notification>
+ <notification name="WLLocalTextureFixedBlock">
+ ローカルテクスチャは、フィールド[FIELD]で使用されています。
+ローカルテクスチャを使った設定は保存されない可能性があります。
+ </notification>
+ <notification name="EnvCannotDeleteLastDayCycleKey">デイサイクルを空にはできないので、このデイサイクルの最後のキーを削除することはできません。
+最後のキーを削除して新しいキーを作成するのではなく、最後のキーを変更してください。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="DayCycleTooManyKeyframes">このデイサイクルにはこれ以上キーフレームを追加できません。[SCOPE]の範囲のデイサイクルに追加できるキーフレーム数は最高 [MAX] です。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="EnvUpdateRate">リージョンの自然環境の設定は、[WAIT]秒ごとにしか更新できません。その間隔を置いてからもう一度お試しください。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PPSaveEffectAlert">ポストプロセス効果が存在します。上書きしますか?
+ <usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+ </notification>
+ <notification name="ChatterBoxSessionStartError">[RECIPIENT]と新しいチャットを開始することができません。
[REASON]
- <usetemplate name="okbutton" yestext="OK"/>
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="ChatterBoxSessionEventError">
- [EVENT]
+ <notification name="ChatterBoxSessionEventError">[EVENT]
[REASON]
- <usetemplate name="okbutton" yestext="OK"/>
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="ForceCloseChatterBoxSession">
- [NAME] とのチャットセッションを閉じます。
+ <notification name="ForceCloseChatterBoxSession">[NAME]とのチャットセッションを閉じます。
[REASON]
- <usetemplate name="okbutton" yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="Cannot_Purchase_an_Attachment">オブジェクトが取り付けられているままでは購入できません。
+ <tag>
+ fail
+ </tag>
</notification>
- <notification name="Cannot_Purchase_an_Attachment">オブジェクトが取り付けられているままでは購入できません。</notification>
- <notification label="引き出し許可のリクエストについて" name="DebitPermissionDetails">
- このリクエストを許可すると、スクリプトであなたのアカウントからリンデンドルを引き出せるようになります。
+ <notification label="引き出し許可のリクエストについて" name="DebitPermissionDetails">このリクエストを許可すると、スクリプトであなたのアカウントからリンデンドルを引き出せるようになります。
この許可を取り消すには、オブジェクトの所有者がオブジェクトを削除するか、オブジェクトのスクリプトをリセットしなければなりません。
- <usetemplate name="okbutton" yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="AutoWearNewClothing">
- 作成する衣類を自動的に装着しますか?
- <usetemplate ignoretext="「容姿」を編集中に、作成する衣類を装着するとき" name="okcancelignore" notext="いいえ" yestext="はい"/>
+ <notification name="AutoWearNewClothing">作成する服装を自動的に装着しますか?
+ <usetemplate ignoretext="「容姿」を編集中に、作成する服装を装着するとき" name="okcancelignore" notext="いいえ" yestext="はい"/>
</notification>
- <notification name="NotAgeVerified">
- 訪問しようとしているロケーションは、18 才以上の住人に制限されています。
- <usetemplate ignoretext="年齢制限付きのエリアを訪問する年齢に達していません。" name="okignore" yestext="OK"/>
+ <notification name="NotAgeVerified">訪問しようとしている場所は、18歳以上の住人に制限されています。
+ <usetemplate ignoretext="年齢制限付きのエリアを訪問する年齢に達していません。" name="okignore" yestext="OK"/>
</notification>
- <notification name="NotAgeVerified_Notify">ロケーションは 18 才以上に制限されています。</notification>
- <notification name="Cannot enter parcel: no payment info on file">
- 支払情報が登録されていないとこのエリアを訪れることができません。 [SECOND_LIFE] サイトで登録を行いますか?
-
+ <notification name="NotAgeVerified_Notify">この場所への入場は、18歳以上に制限されています。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="Cannot enter parcel: no payment info on file">支払情報が登録されていないため、このエリアを訪れることができません。[SECOND_LIFE]サイトで登録を行いますか?
+
[_URL]
- <url name="url" option="0">https://secondlife.com/account/index.php?lang=ja</url>
- <usetemplate ignoretext="支払情報が登録されていないとき" name="okcancelignore" notext="いいえ" yestext="はい"/>
- </notification>
- <notification name="MissingString">文字列 [STRING_NAME] が strings.xml に含まれていません。</notification>
- <notification name="SystemMessageTip">[MESSAGE]</notification>
- <notification name="IMSystemMessageTip">[MESSAGE]</notification>
- <notification name="Cancelled">取り消されました。</notification>
- <notification name="CancelledAttach">添付が取り消されました。</notification>
- <notification name="ReplacedMissingWearable">欠落している衣類や身体部位をデフォルトに置き換えます。</notification>
- <notification name="GroupNotice">件名: [SUBJECT]、メッセージ: [MESSAGE]</notification>
- <notification name="FriendOnlineOffline">&lt;nolink&gt;[NAME]&lt;/nolink&gt; は [STATUS] です</notification>
- <notification name="AddSelfFriend">残念ながら自分自身をフレンド登録することはできません。</notification>
- <notification name="AddSelfRenderExceptions">あなた自身をレンダリングの例外リストに加えることはできません。</notification>
- <notification name="UploadingAuctionSnapshot">インワールドと Web サイトのスナップショットをアップロード中です...
-(所要時間:約 5 分)</notification>
- <notification name="UploadPayment">アップロードに L$ [AMOUNT] 支払いました。</notification>
- <notification name="UploadWebSnapshotDone">Web サイトのスナップショットがアップロードされました。</notification>
- <notification name="UploadSnapshotDone">インワールドでのスナップショットのアップロードが完了しました。</notification>
- <notification name="TerrainDownloaded">raw 地形がダウンロードされました</notification>
- <notification name="GestureMissing">ジェスチャーの [NAME] がデータベースに見つかりません。</notification>
- <notification name="UnableToLoadGesture">[NAME] というジェスチャーを読み込むことができませんでした。</notification>
- <notification name="LandmarkMissing">データベースにランドマークがありません。</notification>
- <notification name="UnableToLoadLandmark">ランドマークを読み込めません。 もう一度お試しください。</notification>
- <notification name="CapsKeyOn">CapsLock キーが有効になっています。
-パスワードに影響するかもしれません。</notification>
- <notification name="NotecardMissing">ノートカードがデータベースにありません。</notification>
- <notification name="NotecardNoPermissions">このノートカードを見る権限がありません。</notification>
- <notification name="RezItemNoPermissions">オブジェクトを Rez するには権限が不足しています。</notification>
- <notification name="IMAcrossParentEstates">親エステート間では IM を送信できません。</notification>
- <notification name="TransferInventoryAcrossParentEstates">親エステート間でインベントリを移動することはできません。</notification>
- <notification name="UnableToLoadNotecard">ノートカードを読み込めません。あとで再度お試しください。</notification>
- <notification name="ScriptMissing">データベースにスクリプトがありません。</notification>
- <notification name="ScriptNoPermissions">スクリプトを閲覧するには権限が不十分です。</notification>
- <notification name="UnableToLoadScript">スクリプトをロードできません。 もう一度試してください。</notification>
+ <tag>
+ confirm
+ </tag>
+ <url name="url" option="0">
+ https://secondlife.com/account/index.php?lang=ja
+ </url>
+ <usetemplate ignoretext="支払情報が登録されていません" name="okcancelignore" notext="いいえ" yestext="はい"/>
+ </notification>
+ <notification name="MissingString">文字列[STRING_NAME]がstrings.xmlに含まれていません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SystemMessageTip">
+ [MESSAGE]
+ </notification>
+ <notification name="IMSystemMessageTip">
+ [MESSAGE]
+ </notification>
+ <notification name="Cancelled">
+ 取り消されました。
+ </notification>
+ <notification name="CancelledAttach">
+ 添付が取り消されました。
+ </notification>
+ <notification name="ReplacedMissingWearable">
+ 欠落している服装や身体部位をデフォルトに置き換えます。
+ </notification>
+ <notification name="GroupNotice">件名:[SUBJECT] メッセージ:[MESSAGE]
+ <tag>
+ group
+ </tag>
+ </notification>
+ <notification name="FriendOnlineOffline">&lt;nolink&gt;[NAME]&lt;/nolink&gt;は、[STATUS]です。
+ <tag>
+ friendship
+ </tag>
+ </notification>
+ <notification name="AddSelfFriend">
+ 残念ながら自分自身をフレンド登録することはできません。
+ </notification>
+ <notification name="AddSelfRenderExceptions">
+ あなた自身をレンダリングの例外リストに加えることはできません。
+ </notification>
+ <notification name="UploadingAuctionSnapshot">
+ インワールドとWebサイトのスナップショットをアップロード中です…
+(所要時間:約5分)
+ </notification>
+ <notification name="UploadPayment">アップロードにL$ [AMOUNT]支払いました。
+ <tag>
+ funds
+ </tag>
+ </notification>
+ <notification name="UploadWebSnapshotDone">
+ Webサイトのスナップショットにアップロードされました。
+ </notification>
+ <notification name="UploadSnapshotDone">
+ インワールドでのスナップショットのアップロードが完了しました。
+ </notification>
+ <notification name="TerrainDownloaded">
+ Terrain.rawがダウンロードされました。
+ </notification>
+ <notification name="GestureMissing">
+ ジェスチャー「[NAME]」がデータベースに見つかりません。
+ </notification>
+ <notification name="UnableToLoadGesture">
+ ジェスチャー「[NAME]」を読み込むことができませんでした。
+ </notification>
+ <notification name="LandmarkMissing">
+ データベースにランドマークがありません。
+ </notification>
+ <notification name="UnableToLoadLandmark">
+ ランドマークを読み込めませんでした。もう一度お試しください。
+ </notification>
+ <notification name="CapsKeyOn">
+ CapsLockキーが有効になっています。
+パスワードに影響するかもしれません。
+ </notification>
+ <notification name="NotecardMissing">ノートカードがデータベースにありません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NotecardNoPermissions">このノートカードを見る権限がありません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="RezItemNoPermissions">オブジェクトをRezするには権限が不足しています。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="IMAcrossParentEstates">
+ 親不動産間では、IMを送信できません。
+ </notification>
+ <notification name="TransferInventoryAcrossParentEstates">
+ 親不動産間でインベントリを移動することはできません。
+ </notification>
+ <notification name="UnableToLoadNotecard">ノートカードを読み込めません。
+あとで再度お試しください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ScriptMissing">データベースにスクリプトがありません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ScriptNoPermissions">スクリプトを閲覧するには権限が不十分です。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="UnableToLoadScript">スクリプトをロードできません。もう一度試してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="IncompleteInventory">あなたの提供するコンテンツは、ローカルではまだ全部揃っていません。
-しばらくしてからもう一度お試しください。</notification>
- <notification name="CannotModifyProtectedCategories">保護されたカテゴリは修正できません。</notification>
- <notification name="CannotRemoveProtectedCategories">保護されたカテゴリは削除できません。</notification>
+しばらくしてからもう一度お試しください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CannotModifyProtectedCategories">保護されたカテゴリは修正できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CannotRemoveProtectedCategories">保護されたカテゴリは削除できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="UnableToBuyWhileDownloading">オブジェクトデータのダウンロード中は購入できません。
-もう一度お試しください。</notification>
+もう一度お試しください。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="UnableToLinkWhileDownloading">オブジェクトデータのウンロード中はリンクできません。
-もう一度お試しください。</notification>
+もう一度お試しください。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CannotBuyObjectsFromDifferentOwners">オブジェクトは一度に一人の所有者から購入できます。
-オブジェクトを 1 つだけ選んでください。</notification>
- <notification name="ObjectNotForSale">このオブジェクトは販売対象ではありません。</notification>
- <notification name="EnteringGodMode">レベル [LEVEL] のゴッドモードに入ります</notification>
- <notification name="LeavingGodMode">レベル [LEVEL] のゴッドモードを解除します</notification>
- <notification name="CopyFailed">これをコピーする権限がありません。</notification>
- <notification name="InventoryAccepted">[NAME] は、あなたが渡したアイテムを受け取りました。</notification>
- <notification name="InventoryDeclined">[NAME] は、インベントリの提供を断りました。</notification>
- <notification name="ObjectMessage">[NAME]: [MESSAGE]</notification>
- <notification name="CallingCardAccepted">コーリングカードが受理されました。</notification>
- <notification name="CallingCardDeclined">コーリングカードが拒否されました。</notification>
- <notification name="TeleportToLandmark">[NAME] などの場所にテレポートするには、「場所」ボタンをクリックしてから、
-表示されたウィンドウで「ランドマーク」タブを選択します。ランドマークを
-いずれか 1 つ選択してから、ウィンドウ下部にある「テレポート」をクリックします。
-(この操作は、ランドマークをダブルクリックするか、右クリックして
-「テレポート」を選択して実行することもできます。)</notification>
- <notification name="TeleportToPerson">誰かとのプライベートな会話を開くには、相手のアバターをクリックして、メニューから「IM」を選択します。</notification>
+オブジェクトを1つだけ選んでください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ObjectNotForSale">
+ このオブジェクトは販売対象ではありません。
+ </notification>
+ <notification name="EnteringGodMode">
+ レベル[LEVEL]のゴッドモードに入ります。
+ </notification>
+ <notification name="LeavingGodMode">
+ レベル[LEVEL]のゴッドモードを解除します。
+ </notification>
+ <notification name="CopyFailed">これをコピーする権限がありません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="InventoryAccepted">
+ [NAME]は、あなたが渡したアイテムを受け取りました。
+ </notification>
+ <notification name="InventoryDeclined">
+ [NAME]は、インベントリの提供を断りました。
+ </notification>
+ <notification name="ObjectMessage">
+ [NAME]:[MESSAGE]
+ </notification>
+ <notification name="CallingCardAccepted">
+ コーリングカードが受理されました。
+ </notification>
+ <notification name="CallingCardDeclined">
+ コーリングカードが拒否されました。
+ </notification>
+ <notification name="TeleportToLandmark">
+ [NAME]などの場所にテレポートするには、「場所」ボタンをクリックしてから、
+表示されたウィンドウで「ランドマーク」タブを選択します。
+ランドマークをいずれか1つ選択してから、ウィンドウ下部にある「テレポート」をクリックします。
+(この操作は、ランドマークをダブルクリックするか、右クリックして「テレポート」を選択して実行することもできます。)
+ </notification>
+ <notification name="TeleportToPerson">
+ 誰かとのプライベートな会話を開くには、相手のアバターをクリックして、メニューから「IM」を選択します。
+ </notification>
<notification name="CantSelectLandFromMultipleRegions">サーバーの境界を越えて土地を選択することできません。
-もっと小さな土地を選択してください。</notification>
- <notification name="SearchWordBanned">コミュニティスタンダードに明記されているコンテンツ制限により、あなたの検索語の一部が除外されました。</notification>
- <notification name="NoContentToSearch">少なくともどれか一つコンテンツの種類を選択して検索を行ってください。(General、Moderate、Adult)</notification>
- <notification name="SystemMessage">[MESSAGE]</notification>
- <notification name="FacebookConnect">[MESSAGE]</notification>
- <notification name="FlickrConnect">[MESSAGE]</notification>
- <notification name="TwitterConnect">[MESSAGE]</notification>
- <notification name="PaymentReceived">[MESSAGE]</notification>
- <notification name="PaymentSent">[MESSAGE]</notification>
- <notification name="PaymentFailure">[MESSAGE]</notification>
- <notification name="EventNotification">
- イベント通知:
+もっと小さな土地を選択してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SearchWordBanned">コミュニティスタンダードに明記されているコンテンツ制限により、あなたの検索語の一部が除外されました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoContentToSearch">少なくともどれか一つコンテンツの種類を選択して検索を行ってください。(General、Moderate、Adult)
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SystemMessage">[MESSAGE]
+ <tag>
+ funds
+ </tag>
+ </notification>
+ <notification name="PaymentReceived">[MESSAGE]
+ <tag>
+ funds
+ </tag>
+ </notification>
+ <notification name="PaymentSent">[MESSAGE]
+ <tag>
+ funds
+ </tag>
+ </notification>
+ <notification name="PaymentFailure">[MESSAGE]
+ <tag>
+ funds
+ </tag>
+ </notification>
+ <notification name="EventNotification">イベント通知:
[NAME]
[DATE]
- <form name="form">
+ <form name="form">
<button name="Details" text="詳細"/>
- <button name="Cancel" text="取り消し"/>
+ <button name="Cancel" text="キャンセル"/>
</form>
</notification>
- <notification name="TransferObjectsHighlighted">
- この区画の購入者に受け渡されるオブジェクトは、すべて区画上で強調表示されています。
-
+ <notification name="TransferObjectsHighlighted">この区画の購入者に受け渡されるオブジェクトは、すべて区画上で強調表示されています。
-*受け渡される樹木や植物は、強調表示されていません。
- <form name="form">
+・受け渡される樹木や植物は、強調表示されていません。
+ <form name="form">
<button name="Done" text="完了"/>
</form>
</notification>
- <notification name="DeactivatedGesturesTrigger">同じトリガーでアクティブにしないジェスチャー:
-[NAMES]</notification>
+ <notification name="DeactivatedGesturesTrigger">
+ 同じトリガーでアクティブにしないジェスチャー:
+[NAMES]
+ </notification>
<notification name="NoQuickTime">Apple の QuickTime ソフトウェアがお使いのシステムにインストールされていないようです。
-ストリーミングメディアをサポートする区画で見たい場合は、[http://www.apple.com/jp/quicktime QuickTime サイト] から QuickTime プレイヤーをインストールしてください。</notification>
- <notification name="NoPlugin">「 [MIME_TYPE] 」の MIME タイプを扱うメディアプラグインが見つかりませんでした。 このタイプのメディアはご利用いただけません。</notification>
- <notification name="MediaPluginFailed">
- 次のメディアプラグインが実行できませんでした:
- [PLUGIN]
-
+ストリーミングメディアをサポートする区画で見たい場合は、[http://www.apple.com/jp/quicktime QuickTimeサイト] から QuickTimeプレイヤーをインストールしてください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoPlugin">「[MIME_TYPE]」のmimeタイプを扱うメディアプラグインが見つかりませんでした。
+このタイプのメディアはご利用いただけません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="MediaPluginFailed">次のメディアプラグインが実行できませんでした:[PLUGIN]
プラグインをインストールしなおすか、問題が解決しない場合はメーカーにお問い合わせください。
+ <tag>
+ fail
+ </tag>
<form name="form">
<ignore name="ignore" text="メディアプラグインの実行に失敗したとき"/>
</form>
</notification>
- <notification name="OwnedObjectsReturned">選択した土地の区画上にあったあなたのオブジェクトは、すべてあなたのインベントリに返却されました。</notification>
- <notification name="OtherObjectsReturned">[NAME] が所有する、選択した区画にあるオブジェクトは、所有者のインベントリに返却されました。</notification>
- <notification name="OtherObjectsReturned2">「 [NAME] 」という名前の住人が所有する、選択した区画上のオブジェクトは、本人に返却されました。</notification>
- <notification name="GroupObjectsReturned">グループ &lt;nolink&gt;[GROUPNAME]&lt;/nolink&gt; と共有する、選択した区画にあるオブジェクトは、オブジェクトのオーナーのインベントリに返却されました。
+ <notification name="OwnedObjectsReturned">
+ 選択した土地の区画上にあったあなたのオブジェクトは、すべてあなたのインベントリに返却されました。
+ </notification>
+ <notification name="OtherObjectsReturned">
+ [NAME]が所有する、選択した区画にあるオブジェクトは、所有者のインベントリに返却されました。
+ </notification>
+ <notification name="OtherObjectsReturned2">
+ 「[NAME]」という名前の住人が所有する、選択した区画上のオブジェクトは、本人に返却されました。
+ </notification>
+ <notification name="GroupObjectsReturned">グループ&lt;nolink&gt;[GROUPNAME]&lt;/nolink&gt;と共有する、選択した区画にあるオブジェクトは、オブジェクトのオーナーのインベントリに返却されました。
譲渡済みの譲渡可能なオブジェクトが前のオーナーに返却されました。
-グループに譲渡された譲渡禁止のオブジェクトは削除されました。</notification>
- <notification name="UnOwnedObjectsReturned">選択した土地の区画上の、あなたの所有物では「なかった」オブジェクトは、本来の所有者に返却されました。</notification>
- <notification name="ServerObjectMessage">[NAME] からのメッセージ:
-&lt;nolink&gt;[MSG]&lt;/nolink&gt;</notification>
- <notification name="NotSafe">この土地ではダメージが有効です。
-ケガをするかもしれません。 死んでしまった場合は「ホーム」にテレポートされます。</notification>
- <notification name="NoFly">このエリアでは飛行が禁止されています。
-ここでは飛べません。</notification>
- <notification name="PushRestricted">このエリアではプッシュが禁止されています。 土地所有者以外は他人をプッシュすることはできません。</notification>
- <notification name="NoVoice">このエリアではボイスチャットが無効です。 誰かが話しているのを聞くことはできません。</notification>
- <notification name="NoBuild">このエリアでは制作が禁止されています。 オブジェクトを制作したり Rez することはできません。</notification>
- <notification name="PathfindingDirty">この値域(リージョン)には、保留中のパスファインディングの変更があります。制作権がある場合は、「地域の再構築」ボタンをクリックして、地域(リージョン)を再構築できます。</notification>
- <notification name="PathfindingDirtyRebake">
- この値域(リージョン)には、保留中のパスファインディングの変更があります。制作権がある場合は、「地域の再構築」ボタンをクリックして、地域(リージョン)を再構築できます。
- <usetemplate name="okbutton" yestext="地域の再構築"/>
- </notification>
- <notification name="DynamicPathfindingDisabled">この地域(リージョン)でダイナミックパスファインディングが有効になっていません。パスファインディング LSL 呼び出しを使用するスクリプト化されたオブジェクトがこの地域(リージョン)では動作できません。</notification>
- <notification name="PathfindingCannotRebakeNavmesh">
- エラーが発生しました。ネットワークまたはサーバーに問題があるか、制作権がない可能性があります。この問題は、一度ログアウトしてから、ログインし直すと解決される場合があります。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="SeeAvatars">この区画にいるアバターやこの区画内で行われる文字チャットは、他の区画から見えません。あなたには、この区画外にいる住人が見えず、外の住人にはあなたの姿が見えません。チャンネル 0 での通常の文字チャットもブロックされます。</notification>
- <notification name="ScriptsStopped">管理者がこのリージョンのスクリプトを一時停止しました。</notification>
- <notification name="ScriptsNotRunning">このリージョンではスクリプトの使用が禁止されています。</notification>
- <notification name="NoOutsideScripts">この土地では、外部のスクリプトが禁止されています。
-
-土地所有者のもの以外はスクリプトが実行されません。</notification>
- <notification name="ClaimPublicLand">そのリージョンにいないと公共の土地を取得することはできません。</notification>
- <notification name="RegionTPAccessBlocked">訪問しようとしている地域(リージョン)には現在の環境設定を超えるコンテンツが含まれています。「ミー」 &gt; 「環境設定」 &gt; 「一般」を選択して、環境設定を変更できます。</notification>
- <notification name="URBannedFromRegion">あなたはリージョンへの立入が禁止されています。</notification>
- <notification name="NoTeenGridAccess">あなたのアカウントではティーングリッドに接続できません。</notification>
- <notification name="ImproperPaymentStatus">このリージョンに入るために適した支払いステータスがありません。</notification>
- <notification name="MustGetAgeRegion">この地域(リージョン)に入るには 18 才以上である必要があります。</notification>
- <notification name="MustGetAgeParcel">この区画に入るには 18 才以上である必要があります。</notification>
- <notification name="NoDestRegion">目的地のリージョンが見つかりませんでした。</notification>
- <notification name="NotAllowedInDest">目的地に入る許可がありません。</notification>
- <notification name="RegionParcelBan">立入禁止された区画を横断することはできません。 別の方法をお試しください。</notification>
- <notification name="TelehubRedirect">テレハブに転送されました。</notification>
- <notification name="CouldntTPCloser">これ以上目的地に近い場所にテレポートができませんでした。</notification>
- <notification name="TPCancelled">テレポートがキャンセルされました。</notification>
+グループに譲渡された譲渡禁止のオブジェクトは削除されました。
+ <tag>
+ group
+ </tag>
+ </notification>
+ <notification name="UnOwnedObjectsReturned">
+ 選択した土地の区画上の、あなたの所有物では「なかった」オブジェクトは、本来の所有者に返却されました。
+ </notification>
+ <notification name="ServerObjectMessage">
+ [NAME]からのメッセージ:
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
+ </notification>
+ <notification name="NotSafe">
+ この土地ではダメージが有効になっています。ケガをするかもしれません。
+死んでしまった場合は「ホーム」にテレポートされます。
+ </notification>
+ <notification name="NoFly">
+ このエリアでの飛行は禁止されています。
+ここでは飛べません。
+ </notification>
+ <notification name="PushRestricted">
+ このエリアでのプッシュは禁止されています。
+土地所有者以外は他人をプッシュすることはできません。
+ </notification>
+ <notification name="NoVoice">このエリアでのボイスチャットは無効になっています。
+音声で誰かと話ことはできません。
+ <tag>
+ voice
+ </tag>
+ </notification>
+ <notification name="NoBuild">
+ このエリアでの制作は禁止されています。オブジェクトを制作したりRezすることはできません。
+ </notification>
+ <notification name="PathfindingDirty">このリージョン(地域)において、保留中の経路探索の変更があります。制作できる権限がある場合は、「リージョンの再構築」ボタンをクリックして、リージョンを再構築できます。
+ <unique/>
+ </notification>
+ <notification name="PathfindingDirtyRebake">このリージョン(地域)において、保留中の経路探索の変更があります。制作できる権限がある場合は、「リージョンの再構築」ボタンをクリックして、リージョンを再構築できます。
+ <unique/>
+ <usetemplate name="okbutton" yestext="リージョンの再構築"/>
+ </notification>
+ <notification name="DynamicPathfindingDisabled">このリージョン(地域)において、動的経路探索が有効になっていません。経路探索LSL呼び出しを使用するスクリプトの入ったオブジェクトは、このリージョンで期待どおりに動作しない可能性があります。
+ <unique/>
+ </notification>
+ <notification name="PathfindingCannotRebakeNavmesh">エラーが発生しました。ネットワークまたはサーバーに問題があるか、制作する権限がない可能性があります。この問題は、一度ログアウトしてから、ログインし直すと解決される場合があります。
+ <unique/>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SeeAvatars">この区画にいるアバターやこの区画内で行われる文字チャットは、他の区画から見えません。あなたには、この区画外にいる住人が見えず、外の住人にはあなたの姿が見えません。チャンネル0での通常の文字チャットもブロックされます。
+ <unique/>
+ </notification>
+ <notification name="ScriptsStopped">
+ 管理者が、このリージョンのスクリプトを一時停止しました。
+ </notification>
+ <notification name="ScriptsNotRunning">
+ このリージョンでは、スクリプトの使用が禁止されています。
+ </notification>
+ <notification name="NoOutsideScripts">この土地では、外部スクリプトの実行が無効になっています。
+
+ここでは、土地所有者に属するスクリプト以外のスクリプトは機能しません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ClaimPublicLand">あなたが所有できるのは、自分がいるリージョン(地域)の公有地のみです。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="RegionTPAccessBlocked">訪問しようとしているリージョン(地域)には現在の初期設定を超えるコンテンツが含まれています。「私」>「初期設定」>「一般」を選択して、初期設定を変更できます。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="URBannedFromRegion">あなたは、このリージョン(地域)への立ち入りが禁止されています。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoTeenGridAccess">お使いのアカウントは、ティーングリッドに接続できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ImproperPaymentStatus">このリージョン(地域)に入るための適切な支払い状況がありません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="MustGetAgeRegion">このリージョン(地域)に入るには、18歳以上である必要があります。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="MustGetAgeParcel">この区画に入るには、18歳以上である必要があります。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoDestRegion">目的地のリージョン(地域)が見つかりませんでした。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NotAllowedInDest">目的地に入る許可がありません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="RegionParcelBan">立入禁止された区画を横断することはできません。別の方法をお試しください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="TelehubRedirect">テレハブに転送されました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CouldntTPCloser">これ以上目的地に近い場所にテレポートができませんでした。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="TPCancelled">
+ テレポートがキャンセルされました。
+ </notification>
<notification name="FullRegionTryAgain">入ろうとしているリージョンは現在満員です。
-しばらくしてから再度お試しください。</notification>
- <notification name="GeneralFailure">よくある失敗</notification>
- <notification name="RoutedWrongRegion">異なるリージョンに迂回されました。 もう一度お試しください。</notification>
- <notification name="NoValidAgentID">エージェント ID が無効です。</notification>
- <notification name="NoValidSession">セッション ID が無効です。</notification>
- <notification name="NoValidCircuit">回路コードが無効です。</notification>
- <notification name="NoPendingConnection">接続を生成できません。</notification>
- <notification name="InternalUsherError">内部エラーが発生しました。</notification>
- <notification name="NoGoodTPDestination">このリージョンでは、適切なテレポート目的地が見つかりませんでした。</notification>
- <notification name="InternalErrorRegionResolver">内部エラーが発生しました。</notification>
- <notification name="NoValidLanding">有効な着地点が見つかりませんでした。</notification>
- <notification name="NoValidParcel">有効な区画が見つかりませんでした。</notification>
- <notification name="ObjectGiveItem">
- [NAME_SLURL] が所有する &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; という名前のオブジェクトが、あなたに [OBJECTTYPE] を渡しました:
+しばらくしてから再度お試しください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="GeneralFailure">よくある失敗
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="RoutedWrongRegion">異なるリージョンに迂回されました。もう一度お試しください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoValidAgentID">無効なエージェントIDです。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoValidSession">無効なセッションIDです。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoValidCircuit">無効な回路コードです。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoPendingConnection">接続を生成できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="InternalUsherError">エージェント案内に接続時に、内部エラーが発生しました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoGoodTPDestination">このリージョン(地域)では、適切なテレポート目的地が見つかりませんでした。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="InternalErrorRegionResolver">リージョンリゾルバーを有効化しようとしたときに内部エラーが発生しました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoValidLanding">有効な着地点が見つかりませんでした。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoValidParcel">有効な区画が見つかりませんでした。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ObjectGiveItem">[NAME_SLURL] が所有する&lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;という名前のオブジェクトが、あなたに[OBJECTTYPE]を渡しました:
&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
- <form name="form">
+ <form name="form">
<button name="Keep" text="受け取る"/>
<button name="Discard" text="破棄"/>
<button name="Mute" text="所有者をブロック"/>
</form>
</notification>
- <notification name="OwnObjectGiveItem">
- &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; という名前のオブジェクトが、あなたに [OBJECTTYPE] を渡しました:
+ <notification name="OwnObjectGiveItem">オブジェクト「&lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt;」が、あなたに[OBJECTTYPE]を渡しました:
+
&lt;nolink&gt;[ITEM_SLURL]&lt;/nolink&gt;
- <form name="form">
+ <form name="form">
<button name="Keep" text="キープ"/>
<button name="Discard" text="処分する"/>
</form>
</notification>
- <notification name="UserGiveItem">
- [NAME_SLURL] があなたに [OBJECTTYPE] を渡しました:
+ <notification name="UserGiveItem">[NAME_SLURL] が、あなたに[OBJECTTYPE]を渡しました:
[ITEM_SLURL]
- <form name="form">
+ <form name="form">
<button name="Show" text="表示"/>
<button name="Discard" text="破棄"/>
<button name="Mute" text="ブロック"/>
</form>
</notification>
- <notification name="GodMessage">[NAME]
+ <notification name="GodMessage">
+ [NAME]
-[MESSAGE]</notification>
- <notification name="JoinGroup">
- [MESSAGE]
+[MESSAGE]
+ </notification>
+ <notification name="JoinGroup">[MESSAGE]
+ <tag>
+ group
+ </tag>
<form name="form">
<button name="Join" text="参加"/>
<button name="Decline" text="辞退"/>
<button name="Info" text="情報"/>
</form>
</notification>
- <notification name="TeleportOffered">
- [NAME_SLURL] はテレポートであなたを呼んでいます。
+ <notification name="TeleportOffered">[NAME_SLURL] は、テレポートであなたを呼んでいます。
+[MESSAGE]
-“[MESSAGE]”
-&lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt; - [MATURITY_STR]
+&lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;-[MATURITY_STR]
+ <tag>
+ confirm
+ </tag>
<form name="form">
<button name="Teleport" text="テレポート"/>
- <button name="Cancel" text="取り消し"/>
+ <button name="Cancel" text="キャンセル"/>
</form>
</notification>
- <notification name="TeleportOffered_MaturityExceeded">
- [NAME_SLURL] はテレポートであなたを呼んでいます。
+ <notification name="TeleportOffered_MaturityExceeded">[NAME_SLURL] は、テレポートであなたを呼んでいます。
+[MESSAGE]
-“[MESSAGE]”
-&lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt; - [MATURITY_STR]
+&lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;-[MATURITY_STR]
-この地域(リージョン)には [REGION_CONTENT_MATURITY] コンテンツが含まれていますが、現在の環境設定は [REGION_CONTENT_MATURITY] コンテンツを除外するように設定されています。環境設定を変更してテレポートを続けるか、このテレポートを取り消すことができます。
+このリージョン(地域)には[REGION_CONTENT_MATURITY]コンテンツが含まれていますが、現在の初期設定は[REGION_CONTENT_MATURITY]コンテンツを除外するように設定されています。初期設定を変更してテレポートを続けるか、このテレポートを取り消すことができます。
+ <tag>
+ confirm
+ </tag>
<form name="form">
<button name="Teleport" text="変更して続ける"/>
- <button name="Cancel" text="取り消し"/>
+ <button name="Cancel" text="キャンセル"/>
</form>
</notification>
- <notification name="TeleportOffered_MaturityBlocked">[NAME_SLURL] はテレポートであなたを呼んでいます。
+ <notification name="TeleportOffered_MaturityBlocked">[NAME_SLURL] は、テレポートであなたを呼んでいます。
+[MESSAGE]
-“[MESSAGE]”
-&lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt; - [MATURITY_STR]
+&lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;-[MATURITY_STR]
-ただし、この地域(リージョン)には成人のみアクセスできるコンテンツが含まれています。</notification>
- <notification name="TeleportOfferSent">[TO_NAME] にテレポートを送りました。</notification>
+ただし、このリージョン(地域)には成人のみアクセスできるコンテンツが含まれています。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="TeleportOfferSent">
+ [TO_NAME]にテレポートのオファーを送りました。
+ </notification>
+ <notification name="TeleportRequest">[NAME_SLURL] は、テレポートであなたを呼んでいます。
+[MESSAGE]
+
+テレポートのオファーを受けますか?
+ <tag>
+ confirm
+ </tag>
+ <form name="form">
+ <button name="Yes" text="はい"/>
+ <button name="No" text="いいえ"/>
+ </form>
+ </notification>
<notification name="GotoURL">
- [MESSAGE]
+[MESSAGE]
[URL]
- <form name="form">
+ <form name="form">
<button name="Later" text="あとで"/>
- <button name="GoNow..." text="今すぐ行く"/>
+ <button name="GoNow..." text="今すぐ行く…"/>
</form>
</notification>
- <notification name="OfferFriendship">
- [NAME_SLURL] はフレンド登録を申し込んでいます。
+ <notification name="OfferFriendship">[NAME_SLURL] は、あなたにフレンド登録を申し込んでいます。
[MESSAGE]
-(デフォルト設定だとお互いのオンライン状態を見ることができます)
+(デフォルトの設定では、お互いのオンライン状態を知ることができます。)
+ <tag>
+ friendship
+ </tag>
+ <tag>
+ confirm
+ </tag>
<form name="form">
<button name="Accept" text="受け入れる"/>
- <button name="Decline" text="辞退"/>
+ <button name="Decline" text="断る"/>
</form>
</notification>
- <notification name="FriendshipOffered">[TO_NAME] にフレンド登録を申し出ました。</notification>
- <notification name="OfferFriendshipNoMessage">
- [NAME_SLURL] はフレンド登録を申し込んでいます。
-
-(デフォルト設定だとお互いのオンライン状態を見ることができます)
+ <notification name="FriendshipOffered">[TO_NAME]にフレンド登録依頼を送りました。
+ <tag>
+ friendship
+ </tag>
+ </notification>
+ <notification name="OfferFriendshipNoMessage">[NAME_SLURL] は、フレンド登録を申し込んでいます。(デフォルト設定だとお互いのオンライン状態を見ることができます)
+ <tag>
+ friendship
+ </tag>
<form name="form">
<button name="Accept" text="受け入れる"/>
- <button name="Decline" text="拒否"/>
+ <button name="Decline" text="断る"/>
</form>
</notification>
- <notification name="FriendshipAccepted">&lt;nolink&gt;[NAME]&lt;/nolink&gt; はあなたからの友人登録リクエストを受諾しました。</notification>
- <notification name="FriendshipDeclined">&lt;nolink&gt;[NAME]&lt;/nolink&gt; はあなたからの友人登録リクエストを拒否しました。</notification>
- <notification name="FriendshipAcceptedByMe">フレンドの登録依頼が承認されました。</notification>
- <notification name="FriendshipDeclinedByMe">フレンドの登録依頼が拒否されました。</notification>
- <notification name="OfferCallingCard">
- [NAME] がコーリングカードを渡そうとしています。
-あなたのインベントリにブックマークが追加され、この住人に素早く IM を送ることができます。
+ <notification name="FriendshipAccepted">&lt;nolink&gt;[NAME]&lt;/nolink&gt;は、あなたからのフレンド登録依頼を受け入れました。
+ <tag>
+ friendship
+ </tag>
+ </notification>
+ <notification name="FriendshipDeclined">&lt;nolink&gt;[NAME]&lt;/nolink&gt;は、あなたからのフレンド登録依頼を断りました。
+ <tag>
+ friendship
+ </tag>
+ </notification>
+ <notification name="FriendshipAcceptedByMe">フレンドの登録依頼を受け入れました。
+ <tag>
+ friendship
+ </tag>
+ </notification>
+ <notification name="FriendshipDeclinedByMe">フレンドの登録依頼を断りました。
+ <tag>
+ friendship
+ </tag>
+ </notification>
+ <notification name="OfferCallingCard">[NAME]が、コーリングカードを渡そうとしています。
+あなたのインベントリにブックマークが追加され、この住人に素早くIMを送ることができます。
+ <tag>
+ friendship
+ </tag>
<form name="form">
<button name="Accept" text="受け入れる"/>
<button name="Decline" text="辞退"/>
</form>
</notification>
- <notification name="RegionRestartMinutes">このリージョンは [SECONDS] 分後に再起動されます。
-このままここにいるとログアウトされます。</notification>
- <notification name="RegionRestartSeconds">このリージョンは [SECONDS] 秒後に再起動されます。.
-このままここにいるとログアウトされます。</notification>
- <notification name="LoadWebPage">
- Web ページ [URL] をロードしますか?
+ <notification name="RegionRestartMinutes">
+ このリージョン「[NAME]」は、[SECONDS]分後に再起動されます。
+このまま、このリージョンに留まっているとログアウトされます。
+ </notification>
+ <notification name="RegionRestartSeconds">
+ このリージョン「[NAME]」は、[SECONDS]秒後に再起動されます。
+このまま、このリージョンに留まっているとログアウトされます。
+ </notification>
+ <notification name="LoadWebPage">のWebページ[URL] を開きますか?
[MESSAGE]
-送信元のオブジェクト:&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;、所有者:[NAME_SLURL]
+送信元のオブジェクト:&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt; 所有者:[NAME_SLURL]
+ <tag>
+ confirm
+ </tag>
<form name="form">
<button name="Gotopage" text="ページに移動"/>
- <button name="Cancel" text="取り消し"/>
+ <button name="Cancel" text="キャンセル"/>
</form>
</notification>
- <notification name="FailedToFindWearableUnnamed">データベースに [TYPE] が見つかりませんでした</notification>
- <notification name="FailedToFindWearable">データベースに [DESC] という名前の [TYPE] が見つかりませんでした。</notification>
- <notification name="InvalidWearable">着用しようとしているアイテムはあなたのビューワでは読み込むことができません。 [APP_NAME] のバージョンをアップグレードしてからこのアイテムを着用してください。</notification>
- <notification name="ScriptQuestion">
- [NAME] が所有する「&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;」 というオブジェクトが、次のことをしようとしています:
+ <notification name="FailedToFindWearableUnnamed">データベースに[TYPE]は見つかりませんでした。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="FailedToFindWearable">データベースに[DESC]という名前の[TYPE]は見つかりませんでした。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="InvalidWearable">着用しようとしているアイテムはあなたのビューアーでは読み込むことができません。[APP_NAME]のバージョンをアップグレードしてからこのアイテムを着用してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ScriptQuestion">[NAME]が所有する「&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;」というオブジェクトが、次のことをしようとしています:
[QUESTIONS]
-よろしいですか?
+よろしいですか?
+ <tag>
+ fail
+ </tag>
<form name="form">
<button name="Yes" text="はい"/>
<button name="No" text="いいえ"/>
<button name="Mute" text="ブロック"/>
</form>
</notification>
- <notification name="ExperienceAcquireFailed">
- 新しい体験を取得できません:
+ <notification name="ExperienceAcquireFailed">新しい体験を取得できません:
[ERROR_MESSAGE]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="NotInGroupExperienceProfileMessage">所有者が選択されたグループのメンバーでないため、体験グループへの変更が無視されました。</notification>
- <notification name="UneditableExperienceProfileMessage">体験プロフィールを更新するときに、編集不可の '[field]' フィールドが無視されました。</notification>
- <notification name="RestrictedToOwnerExperienceProfileMessage">体験の所有者のみが設定できる '[field]'フィールドへの変更を無視しました。</notification>
- <notification name="MaturityRatingExceedsOwnerExperienceProfileMessage">所有者のレーティング区分より高いレーティング区分の体験を設定できません。</notification>
- <notification name="RestrictedTermExperienceProfileMessage">次の条件により、体験プロフィール名および説明の更新ができませんでした: [extra_info]</notification>
- <notification name="TeleportedHomeExperienceRemoved">
- 体験 secondlife:///app/experience/[public_id]/profile を削除するために、[region_name] リージョンからテレポートされ、このリージョンに入ることはできなくなりました。
- <form name="form">
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="NotInGroupExperienceProfileMessage">
+ 所有者が選択されたグループのメンバーでないため、体験グループへの変更が無視されました。
+ </notification>
+ <notification name="UneditableExperienceProfileMessage">
+ 体験プロフィールを更新するときに、編集不可の「[field]」フィールドが無視されました。
+ </notification>
+ <notification name="RestrictedToOwnerExperienceProfileMessage">
+ 体験の所有者のみが設定できる「[field]」フィールドへの変更を無視しました。
+ </notification>
+ <notification name="MaturityRatingExceedsOwnerExperienceProfileMessage">
+ 所有者のレーティング区分より高いレーティング区分の体験を設定できません。
+ </notification>
+ <notification name="RestrictedTermExperienceProfileMessage">
+ 次の条件により、体験プロフィール名および説明の更新ができませんでした:[extra_info]
+ </notification>
+ <notification name="TeleportedHomeExperienceRemoved">体験 secondlife:///app/experience/[public_id]/profile を削除するために、[region_name]リージョンからテレポートされ、このリージョンに入ることはできなくなりました。
+ <form name="form">
<ignore name="ignore" text="体験を削除するために、リージョンから追放されました"/>
</form>
</notification>
- <notification name="TrustedExperienceEntry">
- キー体験 secondlife:///app/experience/[public_id]/profile に参加することにより、[region_name] リージョンに入ることを許可されました。この体験を削除すると、このリージョンから追放される可能性があります。
- <form name="form">
+ <notification name="TrustedExperienceEntry">キー体験 secondlife:///app/experience/[public_id]/profile に参加することにより、[region_name]リージョンに入ることを許可されました。
+この体験を削除すると、このリージョンから追放される可能性があります。
+ <form name="form">
<ignore name="ignore" text="体験によりリージョンに入ることを許可されました"/>
</form>
</notification>
- <notification name="TrustedExperiencesAvailable">この目的地へのアクセス権がありません。下の体験を受け入れることにより、このリージョンに入ることができます:
-
+ <notification name="TrustedExperiencesAvailable">
+ この目的地へのアクセス権がありません。下の体験を受け入れることにより、このリージョンに入ることができます:
[EXPERIENCE_LIST]
-その他のキー体験を利用できます。</notification>
- <notification name="ExperienceEvent">[EventType] by the secondlife:///app/experience/[public_id]/profile experience により、オブジェクトでアクション ([EventType]) を実行することが許可されました。
+その他のキー体験を利用できます。
+ </notification>
+ <notification name="ExperienceEvent">
+ [EventType] by the secondlife:///app/experience/[public_id]/profile experience により、オブジェクトでアクション([EventType])を実行することが許可されました。
所有者:secondlife:///app/agent/[OwnerID]/inspect
オブジェクト名:[ObjectName]
-区画名:[ParcelName]</notification>
- <notification name="ExperienceEventAttachment">[EventType] by the secondlife:///app/experience/[public_id]/profile experience により、添付ファイルでアクション ([EventType]) を実行することが許可されました。
-所有者:secondlife:///app/agent/[OwnerID]/inspect</notification>
- <notification name="ScriptQuestionExperience">
- [NAME] が所有する「&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;」 というオブジェクトが、[GRID_WIDE] 体験への参加を要求しています:
-
-[EXPERIENCE]
-
-権限が許可されると、体験プロフィールから呼び出さない限り、この体験にこのメッセージが再び表示されることはありません。
-
-この体験に関連付けられたスクリプトにより、この体験が有効なリージョンで以下のことを実行できます:
-
-[QUESTIONS] よろしいですか?
+区画名:[ParcelName]
+ </notification>
+ <notification name="ExperienceEventAttachment">
+ [EventType] by the secondlife:///app/experience/[public_id]/profile experience により、添付ファイルでアクション([EventType])を実行することが許可されました。
+所有者:secondlife:///app/agent/[OwnerID]/inspect
+ </notification>
+ <notification name="ScriptQuestionExperience">[NAME]が所有する「&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;」というオブジェクトが、[GRID_WIDE]体験への参加を要求しています:
+[EXPERIENCE]権限が許可されると、体験プロフィールから呼び出さない限り、この体験にこのメッセージが再び表示されることはありません。
+この体験に関連付けられたスクリプトにより、この体験が有効なリージョンで以下のことを実行できます:
+[QUESTIONS]
+よろしいですか?
+ <unique combine="combine_with_new">
+ <context>
+ experience
+ </context>
+ </unique>
+ <tag>
+ confirm
+ </tag>
<form name="form">
<button name="BlockExperience" text="体験をブロック"/>
<button name="Mute" text="オブジェクトをブロックする"/>
@@ -2404,26 +4423,33 @@ Web ページにリンクすると、他人がこの場所に簡単にアクセ
<button name="No" text="いいえ"/>
</form>
</notification>
- <notification name="ScriptQuestionCaution">
- 警告:オブジェクト '&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;' は、あなたのリンデンドルアカウントへのフルアクセスを要求しています。アクセスを許可すると、このオブジェクトは、特に警告を発せずに単発で、随時アカウントから資金を削除するか、アカウントを完全に空にします。
+ <notification name="ScriptQuestionCaution">警告:オブジェクト「&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;」は、あなたのリンデンドルアカウントへの完全なアクセスを求めています。アクセスを許可すると、追加の警告なしで、いつでもアカウントから資金が削除されたり、アカウントが完全に空になったりする可能性があります。
-そのオブジェクトがアカウントへのアクセスを要求する理由がよくわからない場合は、アクセスを許可しないでください。
+アカウントへのアクセスが必要な理由が十分に理解できない場合は、アクセスを許可しないでください。
+
+ <tag>
+ confirm
+ </tag>
<form name="form">
<button name="Grant" text="トータルアクセスを許可"/>
<button name="Deny" text="拒否"/>
</form>
+ <footer>
+ [FOOTERTEXT]
+ </footer>
</notification>
- <notification name="ScriptDialog">
- [NAME] の「&lt;nolink&gt;[TITLE]&lt;/nolink&gt;」
+ <notification name="ScriptDialog">[NAME]の「&lt;nolink&gt;[TITLE]&lt;/nolink&gt;」
[MESSAGE]
- <form name="form">
+ <form name="form">
<button name="Client_Side_Mute" text="ブロック"/>
<button name="Client_Side_Ignore" text="無視"/>
</form>
</notification>
- <notification name="ScriptDialogGroup">
- &lt;nolink&gt;[GROUPNAME]&lt;/nolink&gt; の 「&lt;nolink&gt;[TITLE]&lt;/nolink&gt;」
-[MESSAGE]
+ <notification name="ScriptDialogGroup">&lt;nolink&gt;[GROUPNAME]&lt;/nolink&gt;の「&lt;nolink&gt;[TITLE]&lt;/nolink&gt;」
+[MESSAGE]
+ <tag>
+ group
+ </tag>
<form name="form">
<button name="Client_Side_Mute" text="ブロック"/>
<button name="Client_Side_Ignore" text="無視"/>
@@ -2431,754 +4457,2239 @@ Web ページにリンクすると、他人がこの場所に簡単にアクセ
</notification>
<notification name="BuyLindenDollarSuccess">お支払ありがとうございます。
-あなたの L$ 残高は、処理が完了するとアップデートされます。 処理に 20 分以上かかった場合、お取り引きがキャンセルされることがあります。 その場合は、購入金額はあなたの US$ 残高に追加されます。
-
-[http://secondlife.com/account/ マイアカウント] の取引履歴ページで、支払状況を確認できます。</notification>
- <notification name="FirstOverrideKeys">あなたの移動キーをオブジェクトが操作しています。
-矢印か AWSD のキーで動作を確認してください。
+あなたのL$残高は、処理が完了するとアップデートされます。処理に20分以上かかった場合、お取り引きがキャンセルされることがあります。その場合は、購入金額はあなたの US$残高に追加されます。 [https://secondlife.com/my/account/?lang=ja-JP マイアカウント]の取引履歴ページで、支払状況を確認できます。
+ <tag>
+ funds
+ </tag>
+ </notification>
+ <notification name="FirstOverrideKeys">
+ あなたの移動キーをオブジェクトが操作しています。
+矢印かAWSDのキーで動作を確認してください。
銃などのオブジェクトだと、一人称視点に変更する必要があります。
-M キーを押して変更します。</notification>
- <notification name="FirstSandbox">ここはサンドボックスエリアです。住人が制作を学ぶことができます。
-
-ここで制作されたものは時間が経つと削除されます。制作したアイテムを右クリックして「取る」を選び、インベントリに入れてお持ち帰りするのをお忘れなく。</notification>
- <notification name="MaxListSelectMessage">このリストから [MAX_SELECT] 個までのアイテムを選択できます。</notification>
- <notification name="VoiceInviteP2P">
- [NAME] があなたをボイスチャットコールに招待しています。
-受け入れるをクリックするか、断る場合は拒否をクリックしてください。 ブロックをクリックすると、この発信者をブロックします。
+「M」キーを押して変更します。
+ </notification>
+ <notification name="FirstSandbox">
+ ここはサンドボックスエリアです。住人が制作を学ぶことができます。
+ここで制作されたものは時間が経つと削除されます。制作したアイテムを右クリックして「取る」を選び、インベントリに入れてお持ち帰りするのをお忘れなく。
+ </notification>
+ <notification name="MaxListSelectMessage">
+ このリストから[MAX_SELECT]個までのアイテムを選択できます。
+ </notification>
+ <notification name="VoiceInviteP2P">[NAME]があなたをボイスチャットコールに招待しています。
+受け入れるをクリックするか、断る場合は拒否をクリックしてください。ブロックをクリックすると、この発信者をブロックします。
+ <tag>
+ confirm
+ </tag>
+ <tag>
+ voice
+ </tag>
+ <unique>
+ <context>
+ NAME
+ </context>
+ </unique>
<form name="form">
<button name="Accept" text="受け入れる"/>
<button name="Decline" text="拒否"/>
<button name="Mute" text="ブロック"/>
</form>
</notification>
- <notification name="AutoUnmuteByIM">[NAME] はインスタントメッセージを受け取り、自動的にブロックが解除されました。</notification>
- <notification name="AutoUnmuteByMoney">[NAME] はお金を受け取り、自動的にブロックが解除されました。</notification>
- <notification name="AutoUnmuteByInventory">[NAME] はインベントリを受け取り、自動的にブロックが解除されました。</notification>
- <notification name="VoiceInviteGroup">
- [NAME] は &lt;nolink&gt;[GROUP]&lt;/nolink&gt; のボイスチャットコールに参加しました。
+ <notification name="AutoUnmuteByIM">
+ [NAME]はインスタントメッセージを受け取り、自動的にブロックが解除されました。
+ </notification>
+ <notification name="AutoUnmuteByMoney">
+ [NAME]はお金を受け取り、自動的にブロックが解除されました。
+ </notification>
+ <notification name="AutoUnmuteByInventory">
+ [NAME]はインベントリを受け取り、自動的にブロックが解除されました。
+ </notification>
+ <notification name="VoiceInviteGroup">[NAME]は &lt;nolink&gt;[GROUP]&lt;/nolink&gt;のボイスチャットコールに参加しました。
受け入れるをクリックするか、断る場合は拒否をクリックしてください。ブロックをクリックすると、この発信者をブロックします。
+ <tag>
+ group
+ </tag>
+ <tag>
+ confirm
+ </tag>
+ <tag>
+ voice
+ </tag>
+ <unique>
+ <context>
+ NAME
+ </context>
+ <context>
+ GROUP
+ </context>
+ </unique>
<form name="form">
<button name="Accept" text="受け入れる"/>
<button name="Decline" text="拒否"/>
<button name="Mute" text="ブロック"/>
</form>
</notification>
- <notification name="VoiceInviteAdHoc">
- [NAME] は コンファレンスチャットののボイスチャットコールに参加しました。
-受け入れるをクリックするか、断る場合は拒否をクリックしてください。 ブロックをクリックすると、この発信者をブロックします。
- <form name="form">
+ <notification name="VoiceInviteAdHoc">[NAME]は、会話チャットでボイスチャットコールに参加しました。
+受け入れるをクリックするか、断る場合は拒否をクリックしてください。ブロックをクリックすると、この発信者をブロックします。
+ <form name="form">
<button name="Accept" text="受け入れる"/>
<button name="Decline" text="拒否"/>
<button name="Mute" text="ブロック"/>
</form>
</notification>
- <notification name="InviteAdHoc">
- [NAME] があなたをコンファレンスチャットに招待しています。
-受け入れるをクリックするか、断る場合は拒否をクリックしてください。 ブロックをクリックすると、この発信者をブロックします。
+ <notification name="InviteAdHoc">[NAME]があなたを会話チャットに招待しています。
+受け入れるをクリックするか、断る場合は拒否をクリックしてください。ブロックをクリックすると、この発信者をブロックします。
+ <tag>
+ confirm
+ </tag>
+ <tag>
+ voice
+ </tag>
+ <unique>
+ <context>
+ NAME
+ </context>
+ </unique>
<form name="form">
<button name="Accept" text="受け入れる"/>
<button name="Decline" text="拒否"/>
<button name="Mute" text="ブロック"/>
</form>
</notification>
- <notification name="VoiceChannelFull">あなたが参加しようとしているボイスコール [VOICE_CHANNEL_NAME] は、参加者が最大限に達しました。後でもう一度お試しください。</notification>
- <notification name="ProximalVoiceChannelFull">このエリアのボイスチャットは、混雑のため容量を超えてしまっています。申し訳ありませんが、他のエリアでボイスチャットをお試しください。</notification>
- <notification name="VoiceChannelDisconnected">[VOICE_CHANNEL_NAME] への接続が切れました。 「近くのボイスチャット」に再接続されます。</notification>
- <notification name="VoiceChannelDisconnectedP2P">[VOICE_CHANNEL_NAME] がコールを終了しました。 「近くのボイスチャット」に再接続されます。</notification>
- <notification name="P2PCallDeclined">[VOICE_CHANNEL_NAME] があなたのコールを拒否しました。 「近くのボイスチャット」に再接続されます。</notification>
- <notification name="P2PCallNoAnswer">[VOICE_CHANNEL_NAME] はあなたのコールを受けることができません。 「近くのボイスチャット」に再接続されます。</notification>
- <notification name="VoiceChannelJoinFailed">[VOICE_CHANNEL_NAME] への接続に失敗しました。あとで再度お試しください。 「近くのボイスチャット」に再接続されます。</notification>
- <notification name="VoiceEffectsExpired">ボイスモーフィング効果の1つまたは複数の有効期限が終了しました。
-期限を延長・更新するには [[URL] Click here] をクリックしてください。
-
-プレミアム会員の方は、 [[PREMIUM_URL] click here] をクリックしてボイスモーフィング特典をお受け取りください。</notification>
+ <notification name="VoiceChannelFull">あなたが参加しようとしているボイスコール[VOICE_CHANNEL_NAME]は、参加者が最大限に達しました。後でもう一度お試しください。
+ <tag>
+ fail
+ </tag>
+ <tag>
+ voice
+ </tag>
+ <unique>
+ <context>
+ VOICE_CHANNEL_NAME
+ </context>
+ </unique>
+ </notification>
+ <notification name="ProximalVoiceChannelFull">
+このエリアのボイスチャットは、混雑のため容量を超えてしまっています。申し訳ありませんが、他のエリアでボイスチャットをお試しください。
+ <tag>
+ fail
+ </tag>
+ <tag>
+ voice
+ </tag>
+ </notification>
+ <notification name="VoiceChannelDisconnected">[VOICE_CHANNEL_NAME]への接続が切れました。
+「近隣のボイスチャット」に再接続されます。
+ <tag>
+ voice
+ </tag>
+ <unique>
+ <context>
+ VOICE_CHANNEL_NAME
+ </context>
+ </unique>
+ </notification>
+ <notification name="VoiceChannelDisconnectedP2P">[VOICE_CHANNEL_NAME]がコールを終了しました。
+「近隣のボイスチャット」に再接続されます。
+ <tag>
+ voice
+ </tag>
+ <unique>
+ <context>
+ VOICE_CHANNEL_NAME
+ </context>
+ </unique>
+ </notification>
+ <notification name="P2PCallDeclined">[VOICE_CHANNEL_NAME]があなたのコールを拒否しました。
+「近隣のボイスチャット」に再接続されます。
+ <tag>
+ voice
+ </tag>
+ <tag>
+ fail
+ </tag>
+ <unique>
+ <context>
+ VOICE_CHANNEL_NAME
+ </context>
+ </unique>
+ </notification>
+ <notification name="P2PCallNoAnswer">[VOICE_CHANNEL_NAME]はあなたのコールを受けることができません。
+「近隣のボイスチャット」に再接続されます。
+ <tag>
+ fail
+ </tag>
+ <tag>
+ voice
+ </tag>
+ <unique>
+ <context>
+ VOICE_CHANNEL_NAME
+ </context>
+ </unique>
+ </notification>
+ <notification name="VoiceChannelJoinFailed">[VOICE_CHANNEL_NAME]への接続に失敗しました。あとで再度お試しください。
+「近隣のボイスチャット」に再接続されます。
+ <tag>
+ fail
+ </tag>
+ <tag>
+ voice
+ </tag>
+ <unique>
+ <context>
+ VOICE_CHANNEL_NAME
+ </context>
+ </unique>
+ </notification>
+ <notification name="VoiceEffectsExpired">ボイスモーフィング効果の1つ、または複数の有効期限が終了しました。
+期限を延長・更新するには[[URL] ここ]をクリックしてください。
+
+プレミアム会員の方は、[[PREMIUM_URL] ここ]をクリックしてボイスモーフィング特典をお受け取りください。
+ <tag>
+ fail
+ </tag>
+ <tag>
+ voice
+ </tag>
+ </notification>
<notification name="VoiceEffectsExpiredInUse">ボイスモーフィング効果の有効期限が終了したため、あなたの通常のボイス設定が適用されました。
-期限を延長・更新するには [[URL] Click here] をクリックしてください。
-
-プレミアム会員の方は、 [[PREMIUM_URL] click here] をクリックしてボイスモーフィング特典をお受け取りください。</notification>
- <notification name="VoiceEffectsWillExpire">ボイスモーフィング効果の1つまたは複数の有効期限が [INTERVAL] 日以内に終了します。
-期限を延長・更新するには [[URL] Click here] をクリックしてください。
-
-プレミアム会員の方は、 [[PREMIUM_URL] click here] をクリックしてボイスモーフィング特典をお受け取りください。</notification>
- <notification name="VoiceEffectsNew">新しいボイスモーフィング効果が登場!</notification>
- <notification name="Cannot enter parcel: not a group member">特定のグループメンバーのみこのエリアを訪問することができます。</notification>
- <notification name="Cannot enter parcel: banned">立入禁止されているため、区画に入ることができません。</notification>
- <notification name="Cannot enter parcel: not on access list">アクセスリストに含まれていないため、区画に入ることができません。</notification>
- <notification name="VoiceNotAllowed">あなたには [VOICE_CHANNEL_NAME] のボイスチャットに接続する権限がありません。</notification>
- <notification name="VoiceCallGenericError">[VOICE_CHANNEL_NAME] のボイスチャットに接続中に、エラーが発生しました。後でもう一度お試しください。</notification>
- <notification name="UnsupportedCommandSLURL">クリックした SLurl はサポートされていません。</notification>
- <notification name="BlockedSLURL">信用できないブラウザから SLurl が送られてきたので、セキュリティのためブロックされました。</notification>
- <notification name="ThrottledSLURL">短期間のあいだに、信用できないブラウザから複数の SLurls が送られてきました。
-安全のために数秒間ブロックされます。</notification>
- <notification name="IMToast">
- [MESSAGE]
+期限を延長・更新するには[[URL] ここ]をクリックしてください。
+
+プレミアム会員の方は、[[PREMIUM_URL] ここ]をクリックしてボイスモーフィング特典をお受け取りください。
+ <tag>
+ fail
+ </tag>
+ <tag>
+ voice
+ </tag>
+ </notification>
+ <notification name="VoiceEffectsWillExpire">ボイスモーフィング効果の1つ、または複数の有効期限が[INTERVAL]日以内に終了します。
+期限を延長・更新するには[[URL] ここ]をクリックしてください。
+
+プレミアム会員の方は、[[PREMIUM_URL] ここ]をクリックしてボイスモーフィング特典をお受け取りください。
+ <tag>
+ fail
+ </tag>
+ <tag>
+ voice
+ </tag>
+ </notification>
+ <notification name="VoiceEffectsNew">新しいボイスモーフィング効果が登場!
+ <tag>
+ voice
+ </tag>
+ </notification>
+ <notification name="Cannot enter parcel: not a group member">特定のグループメンバーのみこのエリアを訪問することができます。
+ <tag>
+ fail
+ </tag>
+ <tag>
+ group
+ </tag>
+ </notification>
+ <notification name="Cannot enter parcel: banned">立入禁止されているため、この区画に入ることができません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="Cannot enter parcel: not on access list">アクセスリストに含まれていないため、この区画に入ることができません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="VoiceNotAllowed">あなたには[VOICE_CHANNEL_NAME]のボイスチャットに接続する権限がありません。
+ <tag>
+ fail
+ </tag>
+ <tag>
+ voice
+ </tag>
+ <unique>
+ <context>
+ VOICE_CHANNEL_NAME
+ </context>
+ </unique>
+ </notification>
+ <notification name="VoiceCallGenericError">[VOICE_CHANNEL_NAME]のボイスチャットに接続中に、エラーが発生しました。後でもう一度お試しください。
+ <tag>
+ fail
+ </tag>
+ <tag>
+ voice
+ </tag>
+ <unique>
+ <context>
+ VOICE_CHANNEL_NAME
+ </context>
+ </unique>
+ </notification>
+ <notification name="UnsupportedCommandSLURL">クリックしたSLurlはサポートされていません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="BlockedSLURL">信用できないブラウザからSLurlが送られてきたので、セキュリティのためブロックされました。
+ <tag>
+ security
+ </tag>
+ </notification>
+ <notification name="ThrottledSLURL">
+ 短期間のあいだに、信用できないブラウザから複数のSLurlが送られてきました。
+安全のために数秒間ブロックされます。
+ </notification>
+ <notification name="IMToast">[MESSAGE]
+ <tag>
+ security
+ </tag>
<form name="form">
<button name="respondbutton" text="返答"/>
</form>
</notification>
- <notification name="ConfirmCloseAll">
- すべての IM を閉じますか?
- <usetemplate ignoretext="すべての IM を閉じる前の確認" name="okcancelignore" notext="キャンセル" yestext="OK"/>
- </notification>
- <notification name="AttachmentSaved">アタッチメントが保存されました。</notification>
- <notification name="AppearanceToXMLSaved">外観が XML で [PATH] に保存されました</notification>
- <notification name="AppearanceToXMLFailed">外観を XML に保存できませんでした。</notification>
- <notification name="SnapshotToComputerFailed">スナップショットを [PATH] に保存できませんでした:ディスクの空き容量が不足しています。[NEED_MEMORY]KB が必要ですが、[FREE_MEMORY]KB しかありません。</notification>
- <notification name="SnapshotToLocalDirNotExist">スナップショットを [PATH] に保存できませんでした:ディレクトリは存在しません。</notification>
- <notification name="PresetNotSaved">プリセット [NAME] の保存エラー。</notification>
- <notification name="DefaultPresetNotSaved">デフォルトの事前設定を上書きすることはできません。</notification>
- <notification name="PresetNotDeleted">プリセット [NAME] の削除エラー。</notification>
- <notification name="UnableToFindHelpTopic">ヘルプトピックが見つかりませんでした。</notification>
- <notification name="ObjectMediaFailure">
- サーバーエラー: メディアのアップデートまたは失敗。
-「[ERROR]」
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="TextChatIsMutedByModerator">
- モデレーターがあなたの文字チャットをミュートしました。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="VoiceIsMutedByModerator">
- モデレーターがあなたのボイスをミュートしました。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="FailedToGetBenefits">
- 残念ながら、このセッションで特典情報を得ることができませんでした。これは通常の本番環境で起こるものではありません。恐れ入りますがサポートまでご連絡ください。このセッションが通常通り作動することはありません。再起動することをお勧めします。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="BulkUploadCostConfirmation">
- これは [COUNT] アイテムをアップロードします。総費用は L$[COST] です。アップロードを続けますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="アップロード"/>
- </notification>
- <notification name="BulkUploadNoCompatibleFiles">
- 選択されたファイルは一括アップロードできません。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="BulkUploadIncompatibleFiles">
- 選択されたファイルのいくつかは一括アップロードできません。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="UploadCostConfirmation">
- このアップロードは L$[PRICE] のコストがかかります。アップロードを続けますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="アップロード"/>
- </notification>
- <notification name="ConfirmClearTeleportHistory">
- テレポート履歴を削除しますか?
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ <notification name="ConfirmCloseAll">すべてのIMを閉じますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="すべてのIMを閉じる前の確認" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="AttachmentSaved">
+ 装着物が保存されました。
+ </notification>
+ <notification name="AppearanceToXMLSaved">
+ 外観がXML[PATH]に保存されました
+ </notification>
+ <notification name="AppearanceToXMLFailed">
+ 外観をXMLに保存できませんでした。
+ </notification>
+ <notification name="SnapshotToComputerFailed">
+ スナップショットを[PATH]に保存できませんでした:ディスクの空き容量が不足しています。
+[NEED_MEMORY]㎅が必要ですが、[FREE_MEMORY]㎅しかありません。
+ </notification>
+ <notification name="SnapshotToLocalDirNotExist">
+ スナップショットを[PATH]に保存できませんでした:ディレクトリは存在しません。
+ </notification>
+ <notification name="PresetNotSaved">
+ プリセット[NAME]の保存時にエラーが発生しました。
+ </notification>
+ <notification name="DefaultPresetNotSaved">
+ デフォルトのプリセットを上書きすることはできません。
+ </notification>
+ <notification name="PresetAlreadyExists">「[NAME]」は使用中です。
+このプリセットを置き換えるか、別の名前を選択することができます。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PresetNotDeleted">
+ プリセット[NAME]の削除時にエラーが発生しました。
+ </notification>
+ <notification name="UnableToFindHelpTopic">ヘルプトピックが見つかりませんでした。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ObjectMediaFailure">サーバーエラー:メディアの更新に失敗しました。
+[ERROR]
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TextChatIsMutedByModerator">モデレーターがあなたの文字チャットをミュートしました。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="VoiceIsMutedByModerator">モデレーターがあなたのボイスをミュートしました。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FailedToGetBenefits">残念ながら、このセッションで特典情報を得ることができませんでした。これは通常の本番環境で起こるものではありません。
+恐れ入りますがサポートまでご連絡ください。このセッションが通常通り作動することはありません。再起動することをお勧めします。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="BulkUploadCostConfirmation">[COUNT]個アイテムを一括アップロードします。総費用はL$ [COST]です。アップロードを続けてもよろしいですか?
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="アップロード"/>
+ </notification>
+ <notification name="BulkUploadNoCompatibleFiles">選択されたファイルは一括アップロードできません。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="BulkUploadIncompatibleFiles">選択されたファイルのいくつかは一括アップロードできません。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="UploadCostConfirmation">このアップロードは L$ [PRICE]の費用がかかります。このままアップロードを続けてもよろしいですか?
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="アップロード"/>
+ </notification>
+ <notification name="ConfirmClearTeleportHistory">テレポート履歴を削除しますか?
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="BottomTrayButtonCanNotBeShown">選択したボタンを現在表示することができません。
-じゅうぶんなスペースができればボタンは表示されます。</notification>
- <notification name="ShareNotification">共有する住人を選択します。</notification>
- <notification name="MeshUploadErrorDetails">[LABEL] をアップロードできませんでした: [MESSAGE]
-[DETAILS]詳しくは、SecondLife.log をご覧ください。</notification>
- <notification name="MeshUploadError">[LABEL] をアップロードできませんでした: [MESSAGE]
-
-詳しくは、SecondLife.log をご覧ください</notification>
- <notification name="MeshUploadPermError">メッシュのアップロード許可をリクエスト中にエラーが発生しました。</notification>
- <notification name="RegionCapabilityRequestError">リージョンの '[CAPABILITY]' という機能を取得できませんでした。</notification>
- <notification name="ShareItemsConfirmation">
- 次のアイテムを共有しますか?
+十分なスペースができればボタンは表示されます。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ShareNotification">
+ 共有する住人を選択します。
+ </notification>
+ <notification name="MeshUploadErrorDetails">
+ [LABEL]をアップロードできませんでした:[MESSAGE]
+[DETAILS]
+詳しくは、SecondLife.logをご覧ください。
+ </notification>
+ <notification name="MeshUploadError">
+ [LABEL]をアップロードできませんでした:[MESSAGE]
-&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+詳しくは、SecondLife.logをご覧ください
+ </notification>
+ <notification name="MeshUploadPermError">
+ メッシュのアップロード許可をリクエスト中にエラーが発生しました。
+ </notification>
+ <notification name="RegionCapabilityRequestError">
+ リージョンの「[CAPABILITY]」という機能を取得できませんでした。
+ </notification>
+ <notification name="ShareItemsConfirmation">次のアイテムを共有しますか?
-次の住人と共有:
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
-&lt;nolink&gt;[RESIDENTS]&lt;/nolink&gt;
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+次の住人と共有:&lt;nolink&gt;[RESIDENTS]&lt;/nolink&gt;
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="ShareFolderConfirmation">
- フォルダは一度に 1 つしか共有できません。
-
+ <notification name="ShareFolderConfirmation">フォルダは一度に1つしか共有できません。
+
次のアイテムを共有しますか?
&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
-次の住人と共有:
-
-&lt;nolink&gt;[RESIDENTS]&lt;/nolink&gt;
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="Ok"/>
- </notification>
- <notification name="ItemsShared">アイテムが共有されました。</notification>
- <notification name="DeedToGroupFail">グループへの譲渡に失敗しました。</notification>
- <notification name="ReleaseLandThrottled">区画「[PARCEL_NAME]」は現在放棄できません。</notification>
- <notification name="ReleasedLandWithReclaim">[AREA] m² の区画「[PARCEL_NAME]」が公開されました。
-
-同区画が他の住人に売り出される前の [RECLAIM_PERIOD] 時間内であれば無償で土地を取り戻すことができます。</notification>
- <notification name="ReleasedLandNoReclaim">[AREA] m² の区画「[PARCEL_NAME]」が公開されました。
-
-一般に公開されたので、今なら誰でも購入可能です。</notification>
- <notification name="AvatarRezNotification">(作成後[EXISTENCE]秒経過)
-'[NAME]'というアバターは[TIME]秒後に姿を現わしました。</notification>
- <notification name="AvatarRezSelfBakedDoneNotification">(作成後[EXISTENCE]秒経過)
-アウトフィットのベークは[TIME]秒後に完了しました。</notification>
- <notification name="AvatarRezSelfBakedUpdateNotification">(作成後[EXISTENCE]秒経過)
-容姿の更新は[TIME]秒後に送信されました。
-[STATUS]</notification>
- <notification name="AvatarRezCloudNotification">( [EXISTENCE] 秒)
-アバター「 NAME 」がクラウドになりました。</notification>
- <notification name="AvatarRezArrivedNotification">( [EXISTENCE] 秒)
-アバター「 NAME 」が現れました。</notification>
- <notification name="AvatarRezLeftCloudNotification">( [EXISTENCE] 秒)
-アバター「 [NAME] 」が [TIME] 秒でクラウド状態から出現します。</notification>
- <notification name="AvatarRezEnteredAppearanceNotification">( [EXISTENCE] 秒)
-アバター「 NAME 」が容姿編集モードに入りました。</notification>
- <notification name="AvatarRezLeftAppearanceNotification">( [EXISTENCE] 秒)
-アバター「 NAME 」が容姿編集モードを解除しました。</notification>
- <notification name="NoConnect">
- [PROTOCOL] [HOSTID]を使って接続できません。
+次の住人と共有:&lt;nolink&gt;[RESIDENTS]&lt;/nolink&gt;
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="Ok"/>
+ </notification>
+ <notification name="ItemsShared">
+ アイテムが共有されました。
+ </notification>
+ <notification name="DeedToGroupFail">グループへの譲渡に失敗しました。
+ <tag>
+ group
+ </tag>
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ReleaseLandThrottled">区画「[PARCEL_NAME]」は現在放棄できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ReleasedLandWithReclaim">[AREA]m²の区画「[PARCEL_NAME]」が公開されました。
+
+同区画が他の住人に売り出される前の[RECLAIM_PERIOD]時間内であれば、無償で土地を取り戻すことができます。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ReleasedLandNoReclaim">[AREA]m²の区画「[PARCEL_NAME]」が公開されました。
+一般に公開されたので、今なら誰でも購入可能です。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="AvatarRezNotification">
+ (作成後[EXISTENCE]秒経過)
+「[NAME]」というアバターは、[TIME]秒後に姿を現わします。
+ </notification>
+ <notification name="AvatarRezSelfBakedDoneNotification">
+ (作成後[EXISTENCE]秒経過)
+アウトフィットのベークは、[TIME]秒後に完了します。
+ </notification>
+ <notification name="AvatarRezSelfBakedUpdateNotification">
+ (作成後[EXISTENCE]秒経過)
+容姿の更新は、[TIME]秒後に送信されます。
+[STATUS]
+ </notification>
+ <notification name="AvatarRezCloudNotification">
+ ([EXISTENCE]秒)
+アバター「[NAME]」が、クラウドになります。
+ </notification>
+ <notification name="AvatarRezArrivedNotification">
+ ([EXISTENCE]秒)
+アバター「[NAME]」が、現れます。
+ </notification>
+ <notification name="AvatarRezLeftCloudNotification">
+ ([EXISTENCE]秒)
+アバター「[NAME]」は、[TIME]秒でクラウド状態から出現します。
+ </notification>
+ <notification name="AvatarRezEnteredAppearanceNotification">
+ ([EXISTENCE]秒)
+アバター「[NAME]」が、容姿編集モードに入りました。
+ </notification>
+ <notification name="AvatarRezLeftAppearanceNotification">
+ ([EXISTENCE]秒)
+アバター「[NAME]」が、容姿編集モードを解除しました。
+ </notification>
+ <notification name="NoConnect">[PROTOCOL] [HOSTID]を使って接続できません。
お使いのネットワークやファイアウォールの設定を確認してください。
- <usetemplate name="okbutton" yestext="OK"/>
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="NoVoiceConnect">
- ボイスサーバーに接続できません: 音声に許可される必要のある
+ <notification name="NoVoiceConnect">ボイスサーバーに接続できません:
-[HOSTID]
+[ホストID]
-ポート:
-:TCP:80, 443
-:UDP:3478, 3479, 5060, 5062, 6250, 12000-32000
+音声に対して許可する必要があるポートは次のとおりです。
+TCP: 80, 443
+UDP:3478, 3479, 5060, 5062, 6250, 12000-32000
-お使いのネットワークやファイアウォールの設定を確認してください。
-お使いのルーターの SIP ALG 機能をすべて無効にしてください。
+ネットワークとファイアウォールの設定を確認してください。
+ルーターの SIP ALG 機能を無効にします。
+音声通話は利用できなくなります。
+ <tag>
+ voice
+ </tag>
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="NoVoiceConnect-GIAB">ボイスサーバーに接続できません。
+
ボイスチャットによるコミュニケーションが利用できません。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="NoVoiceConnect-GIAB">
- ボイスサーバーに接続できません。ボイスチャットによるコミュニケーションが利用できません。お使いのネットワークやファイアウォールの設定を確認してください。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AvatarRezLeftNotification">( [EXISTENCE] 秒)
-アバター「 NAME 」が完全に読み込まれました。</notification>
- <notification name="AvatarRezSelfBakedTextureUploadNotification">( 作成後[EXISTENCE]秒経過)
-'[BODYREGION]'の[RESOLUTION]のベークドテクスチャは[TIME]秒後にアップロードされました。</notification>
- <notification name="AvatarRezSelfBakedTextureUpdateNotification">( 作成後[EXISTENCE]秒経過)
-'[BODYREGION]'の[RESOLUTION]のベークドテクスチャは[TIME]秒後にローカルに更新されました。</notification>
- <notification name="CannotUploadTexture">テクスチャをアップロードできません。
-[REASON]</notification>
- <notification name="LivePreviewUnavailable">
- コピー不可および/または転送不可のため、このテクスチャを表示できません。
- <usetemplate ignoretext="コピー不可および/または転送不可テクスチャでライブプレビューモードを使用できないことを警告する" name="okignore" yestext="OK"/>
+お使いのネットワークやファイアウォールの設定を確認してください。
+ <tag>
+ voice
+ </tag>
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AvatarRezLeftNotification">
+ ([EXISTENCE]秒経過)
+アバター「[NAME]」は、完全に読み込まれています。
+ </notification>
+ <notification name="AvatarRezSelfBakedTextureUploadNotification">
+ ([EXISTENCE]秒経過)
+[TIME]秒後に「[BODYREGION]」の[RESOLUTION]のベークドテクスチャは、アップロードされます。
+ </notification>
+ <notification name="AvatarRezSelfBakedTextureUpdateNotification">
+ ([EXISTENCE]秒経過)
+[TIME]秒後に「[BODYREGION]」の[RESOLUTION]のベークドテクスチャは、ローカル反映されます。
</notification>
- <notification name="ConfirmLeaveCall">
- このコールから抜けますか?
+ <notification name="CannotUploadTexture">テクスチャをアップロードできません。
+[REASON]
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="LivePreviewUnavailable">コピー不可/転送不可のため、このテクスチャを表示できません。
+ <usetemplate ignoretext="コピー不可/転送不可テクスチャでライブプレビューモードを使用できないことを警告する" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="FacePasteFailed">ペーストに失敗しました:[REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FacePasteTexturePermissions">アクセス許可が制限されたテクスチャを適用したため、オブジェクトはテクスチャの持つアクセス制限を継承します。
+ <usetemplate ignoretext="ペースト:権限が制限されているテクスチャを適用した。" name="notifyignore"/>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmLeaveCall">このコールから抜けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <tag>
+ voice
+ </tag>
<usetemplate ignoretext="コールから抜ける前の確認" name="okcancelignore" notext="いいえ" yestext="はい"/>
</notification>
- <notification name="ConfirmMuteAll">
- グループコールの参加者全員をミュートしました。
-あとからこのコールに参加する住人も
-ミュートされます。あなたがコールを終了しても他の参加者のミュート状態が続きます。
+ <notification name="ConfirmMuteAll">グループコールの参加者全員をミュートしました。
+あとからこのコールに参加する住人もミュートされます。
+あなたがコールを終了しても他の参加者のミュート状態が続きます。
全員をミュートしますか?
- <usetemplate ignoretext="グループコールの参加者全員をミュートする前の確認" name="okcancelignore" notext="取り消し" yestext="OK"/>
+ <unique/>
+ <tag>
+ group
+ </tag>
+ <tag>
+ confirm
+ </tag>
+ <tag>
+ voice
+ </tag>
+ <usetemplate ignoretext="グループコールの参加者全員をミュートする前の確認" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification label="チャット" name="HintChat">チャットに参加するには、画面下のチャットフィールドにテキストを入力します。
+ <unique/>
+ </notification>
+ <notification label="立ち上がる" name="HintSit">座る姿勢から立ち上がるには、「立ち上がる」ボタンをクリックします。
+ <unique/>
</notification>
- <notification label="チャット" name="HintChat">チャットに参加するには、画面下のチャットフィールドにテキストを入力します。</notification>
- <notification label="立ち上がる" name="HintSit">座る姿勢から立ち上がるには、「立ち上がる」ボタンをクリックします。</notification>
<notification label="話す" name="HintSpeak">「スピーカー」ボタンをクリックすると、マイクのオン・オフが切り替わります。
上矢印をクリックすると、ボイスコントロールパネルが表示されます。
-「スピーカー」ボタンを非表示にすると、ボイス機能も無効になります。</notification>
- <notification label="世界を探検" name="HintDestinationGuide">行き先ガイドには数多くの探索場所が含まれます。どこか行き先を決めたら、テレポートして探索に出かけましょう。</notification>
- <notification label="サイドパネル" name="HintSidePanel">サイドパネルでインベントリ、服、プロフィールなどにすばやくアクセスできます。</notification>
- <notification label="移動" name="HintMove">歩行や走行は、「移動」パネルを開き、矢印コントロールによって操作します。この操作はキーボードの矢印キーで実行することも可能です。</notification>
- <notification label="" name="HintMoveClick">1. クリックして歩行
-地面の一箇所をクリックすると、その場所まで歩きます。
-
-2. クリック・ドラッグで視界を回転
-世界の一箇所をクリックしてドラッグすると、視界の向きが変わります。</notification>
- <notification label="表示名" name="HintDisplayName">表示名(カスタマイズ可能)を設定します。ユーザー名は固有で変更できませんが、ここで追加する表示名は変更可能です。他の住人の名前の表示方法は環境設定で変更してください。</notification>
- <notification label="表示" name="HintView">カメラの視点を変更するには、水平・垂直コントロールを使います。Escape を押すか、または歩行すると、視点がリセットされます。</notification>
- <notification label="インベントリ" name="HintInventory">インベントリにはあなたのアイテムがすべて含まれます。新しく追加されたアイテムは「最新」タブに一覧表示されています。</notification>
- <notification label="あなたのリンデンドル" name="HintLindenDollar">これがあなたの L$ 残高です。リンデンドルを購入するには「L$ の購入」をクリックします。</notification>
- <notification name="LowMemory">メモリプール残量が少なくなっています。クラッシュを避けるため SL の機能の一部は無効になりました。他のアプリケーションを終了し、状況が継続または再発する場合には SL を再起動してください。</notification>
- <notification name="ForceQuitDueToLowMemory">メモリ不足のため 30 秒以内に SL は終了します。</notification>
- <notification name="SOCKS_NOT_PERMITTED">
- ルールセットによって許可されていないため、SOCKS 5 プロキシ &quot;[HOST]:[PORT]&quot; が接続を拒絶しました。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="SOCKS_CONNECT_ERROR">
- SOCKS 5 プロキシ &quot;[HOST]:[PORT]&quot; が接続を拒絶したため、TCP チャンネルを開くことができませんでした。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="SOCKS_NOT_ACCEPTABLE">
- SOCKS 5 プロキシ &quot;[HOST]:[PORT]&quot; は選択された認証システムを拒絶しました。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="SOCKS_AUTH_FAIL">
- SOCKS 5 プロキシ &quot;[HOST]:[PORT]&quot; はあなたの資格が無効だと報告しました。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="SOCKS_UDP_FWD_NOT_GRANTED">
- SOCKS 5 プロキシ &quot;[HOST]:[PORT]&quot; は UDP アソシエートのリクエストを拒絶しました。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="SOCKS_HOST_CONNECT_FAILED">
- SOCKS 5 プロキシサーバー &quot;[HOST]:[PORT]&quot; に接続できませんでした。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="SOCKS_UNKNOWN_STATUS">
- 不明のプロキシエラーがサーバー &quot;[HOST]:[PORT]&quot; で発生しました。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="SOCKS_INVALID_HOST">
- SOCKS プロキシのアドレスまたはポート &quot;[HOST]:[PORT]&quot;が無効です。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="SOCKS_BAD_CREDS">
- SOCKS 5 のユーザー名またはパスワードが正しくありません。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="PROXY_INVALID_HTTP_HOST">
- HTTP プロキシのアドレスまたはポート &quot;[HOST]:[PORT]&quot;が無効です。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="PROXY_INVALID_SOCKS_HOST">
- SOCKS プロキシのアドレスまたはポート &quot;[HOST]:[PORT]&quot;が無効です。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ChangeProxySettings">
- プロキシの設定は [APP_NAME] を再起動後に反映されます。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="AuthRequest">
- 「[REALM]」にある「&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;」のサイトにはユーザー名とパスワードが必要です。
+「スピーカー」ボタンを非表示にすると、ボイス機能も無効になります。
+ <unique/>
+ </notification>
+ <notification label="世界を探検" name="HintDestinationGuide">行き先ガイドには数多くの探索場所が含まれます。どこか行きたい場所をみつけたら、テレポートして探索に出かけましょう。
+ <unique/>
+ </notification>
+ <notification label="サイドパネル" name="HintSidePanel">サイドパネルから、インベントリや服装、プロフィールなどに素早くアクセスできます。
+ <unique/>
+ </notification>
+ <notification label="移動" name="HintMove">歩行や走行は、「移動」パネルを開き、矢印コントロールによって操作します。この操作はキーボードの矢印キーで実行することも可能です。
+ <unique/>
+ </notification>
+ <notification label="" name="HintMoveClick">1,クリックで移動
+地面をクリックすると、その場所まで歩きます。
+
+2,クリック・ドラッグで視界を回転
+任意の場所をクリックしてドラッグすると視界を回転させることができます。
+ <tag>
+ custom_skin
+ </tag>
+ </notification>
+ <notification label="表示名" name="HintDisplayName">表示名(カスタマイズ可能)を設定します。ユーザー名は固有で変更できませんが、ここで追加する表示名は変更可能です。他の住人の名前の表示方法は初期設定で変更してください。
+ <unique/>
+ </notification>
+ <notification label="表示" name="HintView">カメラの視点を変更するには、水平・垂直コントロールを使います。Escキーを押すか、移動キーを押すると、視点がリセットされます。
+ <unique/>
+ <tag>
+ custom_skin
+ </tag>
+ </notification>
+ <notification label="インベントリ" name="HintInventory">インベントリには、あなたのアイテムがすべて含まれます。新しく追加されたアイテムは「最新」タブに一覧表示されています。
+ <unique/>
+ </notification>
+ <notification label="あなたのリンデンドル" name="HintLindenDollar">これがあなたのL$残高です。リンデンドルを購入するには「L$の購入」をクリックします。
+ <unique/>
+ <tag>
+ funds
+ </tag>
+ </notification>
+ <notification name="LowMemory">
+ メモリプール残量が少なくなっています。クラッシュを避けるため[APP_NAME]の機能の一部は無効になりました。他のアプリケーションを終了し、状況が継続または再発する場合にはSecond Lifeを再起動してください。
+ </notification>
+ <notification name="ForceQuitDueToLowMemory">
+ メモリ不足のため30秒以内に[APP_NAME]は終了します。
+ </notification>
+ <notification name="SOCKS_NOT_PERMITTED">ルールセットによって許可されていないため、SOCKS 5プロキシ"[HOST]:[PORT]"が接続を拒絶しました。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_CONNECT_ERROR">SOCKS 5プロキシ"[HOST]:[PORT]" が接続を拒絶したため、TCPチャンネルを開くことができませんでした。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_NOT_ACCEPTABLE">OCKS 5プロキシ"[HOST]:[PORT]"は、選択された認証システムを拒絶しました。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_AUTH_FAIL">SOCKS 5プロキシ"[HOST]:[PORT]"は、あなたの資格が無効だと報告しました。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_UDP_FWD_NOT_GRANTED">SOCKS 5プロキシ"[HOST]:[PORT]"は、UDPアソシエートのリクエストを拒絶しました。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_HOST_CONNECT_FAILED">SOCKS 5プロキシサーバー"[HOST]:[PORT]"に接続できませんでした。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_UNKNOWN_STATUS">不明のプロキシエラーがサーバー"[HOST]:[PORT]"で発生しました。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_INVALID_HOST">SOCKS 5プロキシのアドレスまたはポート"[HOST]:[PORT]"が無効です。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="SOCKS_BAD_CREDS">SOCKS 5 のユーザー名またはパスワードが正しくありません。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PROXY_INVALID_HTTP_HOST">HTTP プロキシのアドレス、またはポート "[HOST]:[PORT]"が無効です。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PROXY_INVALID_SOCKS_HOST">SOCKS プロキシのアドレス、またはポート"[HOST]:[PORT]"が無効です。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ChangeProxySettings">プロキシの設定は[APP_NAME]を再起動後に反映されます。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AuthRequest">「[REALM]」にある「&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;」のサイトには、ユーザー名とパスワードが必要です。
+ <tag>
+ confirm
+ </tag>
<form name="form">
<input name="username" text="ユーザー名"/>
<input name="password" text="パスワード"/>
<button name="ok" text="送信"/>
- <button name="cancel" text="取り消し"/>
+ <button name="cancel" text="キャンセル"/>
</form>
</notification>
- <notification label="" name="NoClassifieds">
- クラシファイド広告の作成と編集はアドバンスモードでのみ利用できます。終了してモードを変更しますか?モードはログイン画面で選択できます。
+ <notification label="" name="NoClassifieds">クラシファイド広告の作成と編集は、拡張モードでのみ利用できます。終了してモードを変更しますか?モードはログイン画面で選択できます。
+ <unique/>
+ <tag>
+ fail
+ </tag>
+ <tag>
+ confirm
+ </tag>
<usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
</notification>
- <notification label="" name="NoGroupInfo">
- グループの作成と編集はアドバンスモードでのみ利用できます。終了してモードを変更しますか?モードはログイン画面で選択できます。
+ <notification label="" name="NoGroupInfo">グループの作成と編集は拡張モードでのみ利用できます。終了してモードを変更しますか?モードはログイン画面で選択できます。
+ <unique/>
+ <tag>
+ fail
+ </tag>
+ <tag>
+ confirm
+ </tag>
<usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
</notification>
- <notification label="" name="NoPlaceInfo">
- 場所のプロフィールの表示はアドバンスモードでのみ利用できます。終了してモードを変更しますか?モードはログイン画面で選択できます。
+ <notification label="" name="NoPlaceInfo">場所のプロフィールの表示は拡張モードでのみ利用できます。終了してモードを変更しますか?モードはログイン画面で選択できます。
+ <unique/>
+ <tag>
+ fail
+ </tag>
+ <tag>
+ confirm
+ </tag>
<usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
</notification>
- <notification label="" name="NoPicks">
- ピックの作成と編集はアドバンスモードでのみ利用できます。終了してモードを変更しますか?モードはログイン画面で選択できます。
+ <notification label="" name="NoPicks">ピックの作成と編集は拡張モードでのみ利用できます。終了してモードを変更しますか?モードはログイン画面で選択できます。
+ <unique/>
+ <tag>
+ fail
+ </tag>
+ <tag>
+ confirm
+ </tag>
<usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
</notification>
- <notification label="" name="NoWorldMap">
- 世界地図の表示はアドバンスモードでのみ利用できます。終了してモードを変更しますか?モードはログイン画面で選択できます。
+ <notification label="" name="NoWorldMap">ワールドマップの表示は拡張モードでのみ利用できます。終了してモードを変更しますか?モードはログイン画面で選択できます。
+ <unique/>
+ <tag>
+ fail
+ </tag>
+ <tag>
+ confirm
+ </tag>
<usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
</notification>
- <notification label="" name="NoVoiceCall">
- ボイスコールはアドバンスモードでのみ利用できます。ログアウトしてモードを変更しますか?
+ <notification label="" name="NoVoiceCall">ボイスコールは拡張モードでのみ利用できます。ログアウトしてモードを変更しますか?
+ <unique/>
+ <tag>
+ fail
+ </tag>
+ <tag>
+ confirm
+ </tag>
<usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
</notification>
- <notification label="" name="NoAvatarShare">
- 共有はアドバンスモードでのみ利用できます。ログアウトしてモードを変更しますか?
+ <notification label="" name="NoAvatarShare">共有は拡張モードでのみ利用できます。ログアウトしてモードを変更しますか?
+ <unique/>
+ <tag>
+ fail
+ </tag>
+ <tag>
+ confirm
+ </tag>
<usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
</notification>
- <notification label="" name="NoAvatarPay">
- 他の住人への支払いはアドバンスモードでのみ利用できます。ログアウトしてモードを変更しますか?
+ <notification label="" name="NoAvatarPay">他の住人への支払いは拡張モードでのみ利用できます。ログアウトしてモードを変更しますか?
+ <unique/>
+ <tag>
+ fail
+ </tag>
+ <tag>
+ confirm
+ </tag>
<usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
</notification>
- <notification label="" name="NoInventory">
- インベントリの表示はアドバンスモードでのみ利用できます。ログアウトしてモードを変更しますか?
+ <notification label="" name="NoInventory">インベントリの表示は拡張モードでのみ利用できます。ログアウトしてモードを変更しますか?
+ <unique/>
+ <tag>
+ fail
+ </tag>
+ <tag>
+ confirm
+ </tag>
<usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
</notification>
- <notification label="" name="NoAppearance">
- 容姿エディターはアドバンスモードでのみ利用できます。ログアウトしてモードを変更しますか?
+ <notification label="" name="NoAppearance">容姿エディターは拡張モードでのみ利用できます。ログアウトしてモードを変更しますか?
+ <unique/>
+ <tag>
+ fail
+ </tag>
+ <tag>
+ confirm
+ </tag>
<usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
</notification>
- <notification label="" name="NoSearch">
- 検索はアドバンスモードでのみ利用できます。ログアウトしてモードを変更しますか?
+ <notification label="" name="NoSearch">検索は拡張モードでのみ利用できます。ログアウトしてモードを変更しますか?
+ <unique/>
+ <tag>
+ fail
+ </tag>
+ <tag>
+ confirm
+ </tag>
<usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
</notification>
- <notification label="" name="ConfirmHideUI">
- この操作により、全てのメニュー項目とボタンが非表示になります。再び表示するには [SHORTCUT] をもう一度クリックしてください。
- <usetemplate ignoretext="UI を非表示にする前に確認" name="okcancelignore" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="PathfindingLinksets_WarnOnPhantom">
- 選択された一部のリンクセットはファントムフラグが切り替えられます。
-
-続けますか?
- <usetemplate ignoretext="選択された一部のリンクセットのファントムフラグが切り替えられます。" name="okcancelignore" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="PathfindingLinksets_MismatchOnRestricted">
- 一部の選択されたリンクセットは、リンクセットへの権限が制限されているため、'[REQUESTED_TYPE]' に設定できません。これらのリンクセットは代わりに '[RESTRICTED_TYPE]' に設定されます。
-
-続けますか?
- <usetemplate ignoretext="一部の選択されたリンクセットは、リンクセットへの権限が制限されているため設定できません。" name="okcancelignore" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="PathfindingLinksets_MismatchOnVolume">
- 選択された一部のリンクセットは、形状が凸状でないため、'[REQUESTED_TYPE]' に設定できません。
-
-続けますか?
- <usetemplate ignoretext="選択された一部のリンクセットは、形状が凸状でないため設定できません。" name="okcancelignore" notext="取り消し" yestext="OK"/>
+ <notification label="" name="ConfirmHideUI">この操作により、全てのメニュー項目とボタンが非表示になります。再び表示するには、[SHORTCUT]をもう一度クリックしてください。
+ <unique/>
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="UIを非表示前の確認" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnRestricted">
- 選択された一部のリンクセットはファントムフラグが切り替えられます。
-
-一部の選択されたリンクセットは、リンクセットへの権限が制限されているため、'[REQUESTED_TYPE]' に設定できません。これらのリンクセットは代わりに '[RESTRICTED_TYPE]' に設定されます。
-
-続けますか?
- <usetemplate ignoretext="選択された一部のリンクセットのファントムフラグが切り替えられ、他のリンクセットはリンクセットへの権限が制限されているため設定できません。" name="okcancelignore" notext="取り消し" yestext="OK"/>
+ <notification name="PathfindingLinksets_WarnOnPhantom">選択された一部のリンクセットはファントムフラグが切り替えられます。
+
+続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="リンクセットのファントムフラグの切替えができなかった時" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnVolume">
- 選択された一部のリンクセットはファントムフラグが切り替えられます。
-
-選択された一部のリンクセットは、形状が凸状でないため、'[REQUESTED_TYPE]' に設定できません。
-
-続けますか?
- <usetemplate ignoretext="選択された一部のリンクセットのファントムフラグが切り替えられ、他のリンクセットは形状が凸状でないため設定できません。" name="okcancelignore" notext="取り消し" yestext="OK"/>
+ <notification name="PathfindingLinksets_MismatchOnRestricted">一部の選択されたリンクセットは、リンクセットへの権限が制限されているため、「[REQUESTED_TYPE]」に設定できません。これらのリンクセットは代わりに「[RESTRICTED_TYPE]」 に設定されます。
+
+続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>?
+ <usetemplate ignoretext="リンクセットの権限制限のため変更ができなかった時" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="PathfindingLinksets_MismatchOnRestricted_MismatchOnVolume">
- 一部の選択されたリンクセットは、リンクセットへの権限が制限されているため、'[REQUESTED_TYPE]' に設定できません。これらのリンクセットは代わりに '[RESTRICTED_TYPE]' に設定されます。
-
-選択された一部のリンクセットは、形状が凸状でないため、'[REQUESTED_TYPE]' に設定できません。これらのリンクセットの用途タイプは変わりません。
-
-続けますか?
- <usetemplate ignoretext="一部の選択されたリンクセットは、リンクセットへの権限が制限されており、また形状が凸状でないため設定できません。" name="okcancelignore" notext="取り消し" yestext="OK"/>
+ <notification name="PathfindingLinksets_MismatchOnVolume">選択された一部のリンクセットは、形状が凸状でないため「[REQUESTED_TYPE]」に設定できません。
+
+続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="リンクセットの形状が凸状でないため変更できなかった時" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
- <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnRestricted_MismatchOnVolume">
- 選択された一部のリンクセットはファントムフラグが切り替えられます。
-
-一部の選択されたリンクセットは、リンクセットへの権限が制限されているため、'[REQUESTED_TYPE]' に設定できません。これらのリンクセットは代わりに '[RESTRICTED_TYPE]' に設定されます。
-
-選択された一部のリンクセットは、形状が凸状でないため、'[REQUESTED_TYPE]' に設定できません。これらのリンクセットの用途タイプは変わりません。
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnRestricted">選択された一部のリンクセットはファントムフラグが切り替えられます。
+
+一部の選択されたリンクセットは、リンクセットへの権限が制限されているため「[REQUESTED_TYPE]」に設定できません。これらのリンクセットは代わりに「[RESTRICTED_TYPE]」に設定されます。
-続けますか?
- <usetemplate ignoretext="選択された一部のリンクセットのファントムフラグが切り替えられ、他のリンクセットはリンクセットへの権限が制限され、また形状が凸状でないため設定できません。" name="okcancelignore" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="PathfindingLinksets_ChangeToFlexiblePath">
- 選択されたオブジェクトはナビメッシュに影響を与えます。オブジェクトをフレキシブルパスに変更すると、ナビメッシュから削除されます。
- <usetemplate ignoretext="選択されたオブジェクトはナビメッシュに影響を与えます。オブジェクトをフレキシブルパスに変更すると、ナビメッシュから削除されます。" name="okcancelignore" notext="取り消し" yestext="OK"/>
+続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="リンクセットの一部のファントムフラグの設定ができたが、権限設定できなかったものがあった時" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
- <global name="UnsupportedGLRequirements">[APP_NAME] に必要なハードウェアがないようです。 [APP_NAME] にはマルチテクスチャをサポートする OpenGL グラフィックカードが必要です。 お使いのグラフィックカードの最新ドライバがインストールされているかどうか、オペレーティングシステムのサービスパックとパッチが入っているかをご確認ください。
-
-この問題が何度も起きる場合は、[SUPPORT_SITE] をご確認ください。</global>
- <global name="UnsupportedCPUAmount">796</global>
- <global name="UnsupportedRAMAmount">510</global>
- <global name="UnsupportedGPU">- あなたのグラフィックカードは必須動作環境の条件を満たしていません。</global>
- <global name="UnsupportedRAM">- あなたのシステムメモリは必須動作環境の条件を満たしていません。</global>
- <global name="You can only set your 'Home Location' on your land or at a mainland Infohub.">自分の土地をお持ちの場合、「ホーム」に設定できます。
-お持ちでない場合は、地図で「インフォハブ」をお探しください。</global>
- <global name="You died and have been teleported to your home location">死んでしまったので、ホームにテレポートされました。</global>
- <notification name="LocalBitmapsUpdateFileNotFound">[FNAME] は、見つからなかったため、更新できませんでした。
-このファイルに対する今後の更新を無効にします。</notification>
- <notification name="LocalBitmapsUpdateFailedFinal">[FNAME] を開くまたはデコードする試行に失敗しました(試行回数 [NRETRIES] 回)。そのため、このファイルは壊れているものとして処理されました。
-このファイルに対する今後の更新を無効にします。</notification>
- <notification name="LocalBitmapsVerifyFail">開くことができない、またはデコードできない無効または読み取り不能な画像ファイル [FNAME] を追加しようとしました。
-この試行はキャンセルされました。</notification>
- <notification name="PathfindingReturnMultipleItems">
- [NUM_ITEMS] 個のアイテムを返却中です。続けますか?
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnVolume">選択された一部のリンクセットはファントムフラグが切り替えられます。
+
+選択された一部のリンクセットは、形状が凸状でないため「[REQUESTED_TYPE]」に設定できません。
+
+続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="リンクセットの一部のファントムフラグは切り替えられたが、他のリンクセットは形状が凸状でなかった時" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="PathfindingLinksets_MismatchOnRestricted_MismatchOnVolume">一部の選択されたリンクセットは、リンクセットへの権限が制限されているため「[REQUESTED_TYPE]」に設定できません。
+
+これらのリンクセットは代わりに「[RESTRICTED_TYPE]」に設定されます。選択された一部のリンクセットは、形状が凸状でないため、「[REQUESTED_TYPE]」に設定できません。
+
+これらのリンクセットの用途タイプは変わりません。
+
+続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="リンクセットの一部の権限が制限されており、また形状が凸状でなかった時" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="PathfindingLinksets_WarnOnPhantom_MismatchOnRestricted_MismatchOnVolume">選択された一部のリンクセットはファントムフラグが切り替えられます。
+
+一部の選択されたリンクセットは、リンクセットへの権限が制限されているため、「[REQUESTED_TYPE]」に設定できません。これらのリンクセットは代わりに「[RESTRICTED_TYPE]」に設定されます。
+
+選択された一部のリンクセットは、形状が凸状でないため、「[REQUESTED_TYPE]」に設定できません。これらのリンクセットの用途タイプは変わりません。
+
+続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="リンクセットの一部のファントムフラグが切り替えられ、他のリンクセットはリンクセットへの権限が制限され、また形状が凸状でないため設定できません。" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="PathfindingLinksets_ChangeToFlexiblePath">選択されたオブジェクトはナビメッシュに影響を与えます。オブジェクトをフレキシブルパスに変更すると、ナビメッシュから削除されます。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="選択されたオブジェクトはナビメッシュに影響を与えます。オブジェクトをフレキシブルパスに変更すると、ナビメッシュから削除されます。" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <global name="UnsupportedGLRequirements">
+ [APP_NAME]の動作に必要なハードウェア要件を満たしていないようです。[APP_NAME]にはマルチテクスチャをサポートするOpenGLグラフィックカードが必要です。
+お使いのグラフィックカードの最新ドライバがインストールされているか、もしくは、オペレーティングシステムに最新のサービスパックやパッチが当たっているかをご確認ください。
+
+この問題が何度も起きる場合は、[SUPPORT_SITE]をご確認ください。
+ </global>
+ <global name="UnsupportedCPUAmount">
+ 796
+ </global>
+ <global name="UnsupportedRAMAmount">
+ 510
+ </global>
+ <global name="UnsupportedGPU">
+ -あなたのグラフィックカードは、必須動作環境の条件を満たしていません。
+ </global>
+ <global name="UnsupportedRAM">
+ -あなたのシステムメモリは、必須動作環境の条件を満たしていません。
+ </global>
+ <global name="You can only set your 'Home Location' on your land or at a mainland Infohub.">
+ 自分の土地を持っている場合、そこを「ホーム」に設定できます。持っていない場合は、マップから「情報ハブ」をお探しください。
+ </global>
+ <global name="You died and have been teleported to your home location">
+ 死んでしまったので、ホームにテレポートされました。
+ </global>
+ <notification name="LocalBitmapsUpdateFileNotFound">
+ [FNAME]が見つからなかったため、更新できませんでした。
+このファイルに対する今後の更新を無効にします。
+ </notification>
+ <notification name="LocalBitmapsUpdateFailedFinal">
+ [FNAME]は、[NRETRIES]回の試行で開くこともデコードすることもできなかったため、壊れているとみなしました。
+このファイルに対する今後の更新を無効にします。
+ </notification>
+ <notification name="LocalBitmapsVerifyFail">
+ 開いたりデコードすることができない、無効である、もしくは読み取り不能な画像ファイル「[FNAME]」を追加しようとしました。
+この試行はキャンセルされました。
+ </notification>
+ <notification name="PathfindingReturnMultipleItems">[NUM_ITEMS]個のアイテムを返却中しようとしています。
+このまま続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
<usetemplate ignoretext="複数のアイテムを返しますか?" name="okcancelignore" notext="いいえ" yestext="はい"/>
</notification>
- <notification name="PathfindingDeleteMultipleItems">
- [NUM_ITEMS] 個のアイテムを削除中です。続けますか?
+ <notification name="PathfindingDeleteMultipleItems">[NUM_ITEMS]個のアイテムを削除しようとしています。
+このまま続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
<usetemplate ignoretext="複数のアイテムを削除しますか?" name="okcancelignore" notext="いいえ" yestext="はい"/>
</notification>
- <notification name="AvatarFrozen">[AV_FREEZER] によってあなたはフリーズされています。世界を動かすことも、世界とインタラクションすることもできません。</notification>
- <notification name="AvatarFrozenDuration">[AV_FREEZER] によって、あなたは [AV_FREEZE_TIME] 秒間フリーズされました。世界を動かすことも、世界とインタラクションすることもできません。</notification>
- <notification name="YouFrozeAvatar">アバターがフリーズされています。</notification>
- <notification name="AvatarHasUnFrozenYou">[AV_FREEZER] によってフリーズが解除されています。</notification>
- <notification name="AvatarUnFrozen">アバターのフリーズが解除されました。</notification>
- <notification name="AvatarFreezeFailure">その区画の管理権限を持っていないため、フリーズに失敗しました。</notification>
- <notification name="AvatarFreezeThaw">フリーズ期間が切れました。仕事に戻ってください。</notification>
- <notification name="AvatarCantFreeze">残念ながら、そのユーザーをフリーズできません。</notification>
- <notification name="NowOwnObject">これで、オブジェクト [OBJECT_NAME] の所有者になりました</notification>
- <notification name="CantRezOnLand">この土地の所有者が許可していないため、[OBJECT_POS] でオブジェクトを Rez することができません。土地ツールを使用して、土地の所有を確認してください。</notification>
- <notification name="RezFailTooManyRequests">リクエストが多すぎて、オブジェクトを Rez することができません。</notification>
- <notification name="SitFailCantMove">今回移動できなかったため、座ることができません。</notification>
- <notification name="SitFailNotAllowedOnLand">その土地に対して許可を受けていないため、座ることができません。</notification>
- <notification name="SitFailNotSameRegion">移動して近づけてみてください。オブジェクトが同じリージョンにないため、オブジェクトを配置できません。</notification>
- <notification name="NoNewObjectRegionFull">新しいオブジェクトを作成できません。リージョンが埋まっています。</notification>
- <notification name="FailedToPlaceObject">指定した場所にオブジェクトを配置できませんでした。もう一度お試しください。</notification>
- <notification name="NoOwnNoGardening">所有していない土地に木や草を植えることはできません。</notification>
- <notification name="NoCopyPermsNoObject">あなたにはオブジェクト &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; をコピーする権限がないため、コピーに失敗しました。</notification>
- <notification name="NoTransPermsNoObject">オブジェクト &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; はあなたに譲渡できないため、コピーに失敗しました。</notification>
- <notification name="AddToNavMeshNoCopy">オブジェクト &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; は navmesh に関連があるため、コピーに失敗しました。</notification>
- <notification name="DupeWithNoRootsSelected">ルートオブジェクトを選択せずに複製します。</notification>
- <notification name="CantDupeCuzRegionIsFull">リージョンが埋まっているため、オブジェクトのコピーを作成することができません。</notification>
- <notification name="CantDupeCuzParcelNotFound">オブジェクトのコピーを作成できません。オブジェクトのある区画が見つかりません。</notification>
- <notification name="CantCreateCuzParcelFull">区画がいっぱいのため、
-オブジェクトを作成できません。</notification>
- <notification name="RezAttemptFailed">オブジェクトへの Rez の試みに失敗しました。</notification>
- <notification name="ToxicInvRezAttemptFailed">このリージョンで問題を引き起こすアイテムは作成できません。</notification>
- <notification name="InvItemIsBlacklisted">その持ち物アイテムはブラックリストに登録されています。</notification>
- <notification name="NoCanRezObjects">現在あなたにはオブジェクトを作成するための許可がありません。</notification>
+ <notification name="AvatarFrozen">[AV_FREEZER]によってあなたはフリーズされています。世界を動かすことも、世界とインタラクションすることもできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="AvatarFrozenDuration">[AV_FREEZER]によって、あなたは[AV_FREEZE_TIME]秒間フリーズされました。世界を動かすことも、世界とインタラクションすることもできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="YouFrozeAvatar">アバターがフリーズされています。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="AvatarHasUnFrozenYou">[AV_FREEZER]によってフリーズが解除されています。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="AvatarUnFrozen">アバターのフリーズが解除されました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="AvatarFreezeFailure">その区画の管理権限を持っていないため、フリーズに失敗しました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="AvatarFreezeThaw">フリーズ期間が切れました。仕事に戻ってください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="AvatarCantFreeze">残念ながら、そのユーザーをフリーズできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NowOwnObject">これで、オブジェクト[OBJECT_NAME]の所有者になりました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantRezOnLand">この土地の所有者が許可していないため、[OBJECT_POS]でオブジェクトをRezすることができません。土地ツールを使用して、土地の所有を確認してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="RezFailTooManyRequests">リクエストが多すぎて、オブジェクトをRezすることができません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SitFailCantMove">今回移動できなかったため、座ることができません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SitFailNotAllowedOnLand">その土地に対して許可を受けていないため、座ることができません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SitFailNotSameRegion">移動して近づけてみてください。オブジェクトが同じリージョンにないため、オブジェクトを配置できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoNewObjectRegionFull">新しいオブジェクトを作成できません。リージョンが埋まっています。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="FailedToPlaceObject">指定した場所にオブジェクトを配置できませんでした。もう一度お試しください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoOwnNoGardening">所有していない土地に木や草を植えることはできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoCopyPermsNoObject">あなたには、オブジェクト&lt;nolink&gt;「[OBJ_NAME]」&lt;/nolink&gt;をコピーする権限がないため、コピーに失敗しました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoTransPermsNoObject">あなたには、オブジェクト&lt;nolink&gt;「[OBJ_NAME]」&lt;/nolink&gt;を譲渡する権限がないため、コピーに失敗しました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="AddToNavMeshNoCopy">オブジェクト&lt;nolink&gt;「[OBJ_NAME]」&lt;/nolink&gt; は、ナビメッシュに関連付けがあるため、コピーに失敗しました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="DupeWithNoRootsSelected">ルートオブジェクトを選択せずに複製します。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantDupeCuzRegionIsFull">リージョン(地域)が埋まっているため、オブジェクトのコピーを作成することができません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantDupeCuzParcelNotFound">オブジェクトのコピーを作成できません。オブジェクトのある区画が見つかりません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantCreateCuzParcelFull">区画がいっぱいのため、オブジェクトを作成できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="RezAttemptFailed">オブジェクトのRezに失敗しました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ToxicInvRezAttemptFailed">このリージョン(地域)で問題を引き起こすアイテムは作成できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="InvItemIsBlacklisted">そのインベントリアイテムは、ブラックリストに登録されています。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoCanRezObjects">現在あなたには、オブジェクトを作成する権限がありません。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="LandSearchBlocked">土地の検索がブロックされました。
短期間に多くの土地を検索したためです。
-しばらくしてから再度お試しください。</notification>
- <notification name="NotEnoughResourcesToAttach">オブジェクトの着用に使用できるスクリプトリソースが足りません。</notification>
- <notification name="YouDiedAndGotTPHome">死んでしまったので、ホームにテレポートされました。</notification>
- <notification name="EjectComingSoon">ここへの入場が許可されていないため、[EJECT_TIME] 秒後に追放されます。</notification>
- <notification name="SaveBackToInvDisabled">「「持ち物」に保存」が無効になっています。</notification>
- <notification name="NoExistNoSaveToContents">「存在しません」から rez されたため、&lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; をオブジェクトの中身に保存できませんでした。</notification>
- <notification name="NoModNoSaveToContents">あなたにはオブジェクト &lt;nolink&gt;'[DEST_NAME]'&lt;/nolink&gt; を修正する権限がないため、&lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt;をオブジェクトの中身に保存できませんでした。</notification>
- <notification name="NoSaveBackToInvDisabled">&lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; をインベントリに保存できません。この操作は無効になりました。</notification>
- <notification name="NoCopyNoSelCopy">あなたにはオブジェクト &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; をコピーする権限がないため、選択内容をコピーできません。</notification>
- <notification name="NoTransNoSelCopy">オブジェクト &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; を譲渡できないため、選択内容をコピーできません。</notification>
- <notification name="NoTransNoCopy">オブジェクト &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; を譲渡できないため、選択内容をコピーできません。</notification>
- <notification name="NoPermsNoRemoval">オブジェクト &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; をシミュレーターから削除することは、権限のシステムにより許可されていません。</notification>
- <notification name="NoModNoSaveSelection">あなたにはオブジェクト &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; を修正する権限がないため、選択内容を保存できません。</notification>
- <notification name="NoCopyNoSaveSelection">オブジェクト &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; はコピー不可なため、選択内容を保存できません。</notification>
- <notification name="NoModNoTaking">あなたにはオブジェクト &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; を修正する権限がないため、選択内容を選ぶことはできません。</notification>
- <notification name="RezDestInternalError">内部エラー: 不明な宛先タイプ。</notification>
- <notification name="DeleteFailObjNotFound">オブジェクトが見つからないため削除できませんでした。</notification>
- <notification name="SorryCantEjectUser">残念ながら、そのユーザーを追放することはできません。</notification>
- <notification name="RegionSezNotAHome">このリージョンでは、ここにホームの位置を設定できません。</notification>
- <notification name="HomeLocationLimits">ホームの場所を設定できるのは、自分の土地か、またはメインランドのインフォハブでのみです。</notification>
- <notification name="HomePositionSet">家の配置の設定。</notification>
- <notification name="AvatarEjected">アバターが追放されました。</notification>
- <notification name="AvatarEjectFailed">その区画の管理権限がないため、追放できませんでした。</notification>
- <notification name="CMOParcelFull">区画がいっぱいなので、オブジェクト '[O]' を地域(リージョン) [R] の [P] に移動できません。</notification>
- <notification name="CMOParcelPerms">ご使用のオブジェクトはこの区画で使用が許可されていないため、オブジェクト '[O]' を地域(リージョン) [R] の [P] に移動できません。</notification>
- <notification name="CMOParcelResources">この区画にこのオブジェクトのリソースが不足しているため、オブジェクト '[O]' を地域(リージョン) [R] の [P] に移動できません。</notification>
- <notification name="NoParcelPermsNoObject">その区画へのアクセス権がないため、コピーが失敗しました。</notification>
- <notification name="CMORegionVersion">他の地域(リージョン)でこのオブジェクトの地域(リージョン)をまたがる受け取りに対応していない旧バージョンを実行しているため、オブジェクト '[O]' を地域(リージョン) [R] の [P] に移動できません。</notification>
- <notification name="CMONavMesh">リージョンの境界にわたってナビメッシュを変更できないため、オブジェクト '[O]' を地域(リージョン) [R] の [P] に移動できません。</notification>
- <notification name="CMOWTF">不明な理由により、オブジェクト '[O]' を地域(リージョン) [R] の [P] に移動できません。 ([F])</notification>
- <notification name="NoPermModifyObject">そのオブジェクトを変更する権限がありません</notification>
- <notification name="TooMuchObjectInventorySelected">
- 大きなインベントリを持つオブジェクトの選択が多すぎます。選択するオブジェクトを減らして、もう一度やり直してください。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="CantEnablePhysObjContributesToNav">ナビメッシュに貢献するオブジェクトに対して物理を有効にできません。</notification>
- <notification name="CantEnablePhysKeyframedObj">キーフレームオブジェクトのために物理を有効にできません。</notification>
- <notification name="CantEnablePhysNotEnoughLandResources">土地のリソースが足りないため、オブジェクトの物理を有効にできません。</notification>
- <notification name="CantEnablePhysCostTooGreat">[MAX_OBJECTS] より大きい物理リソースコストを持つオブジェクトでは、物理を有効にできません。</notification>
- <notification name="PhantomWithConcavePiece">このオブジェクトはファントムで、ナビメッシュに貢献しているため、くぼみを持たせることができません。</notification>
- <notification name="UnableAddItem">アイテムを追加できません!</notification>
- <notification name="UnableEditItem">これは編集できません!</notification>
- <notification name="NoPermToEdit">これを編集する許可がありません。</notification>
- <notification name="NoPermToCopyInventory">そのインベントリをコピーすることは許可されません。</notification>
- <notification name="CantSaveItemDoesntExist">オブジェクトのコンテンツに保存できません。アイテムが存在していません。</notification>
- <notification name="CantSaveItemAlreadyExists">オブジェクトのコンテンツに保存できません。同じ名前を持つアイテムがすでにインベントリに存在します。</notification>
- <notification name="CantSaveModifyAttachment">オブジェクトのコンテンツに保存できません。このため、アタッチメントの権限が変更されます。</notification>
- <notification name="AttachmentHasTooMuchInventory">ご使用のアタッチメントに含まれるインベントリが多すぎるため、インベントリを追加できません。</notification>
- <notification name="IllegalAttachment">添付ファイルはアバターの存在しない点を要求しました。代わりに胸に添付されていました。</notification>
- <notification name="TooManyScripts">スクリプトが多すぎます。</notification>
- <notification name="UnableAddScript">テキストを追加できません!</notification>
- <notification name="AssetServerTimeoutObjReturn">資産サーバーがタイムリーに応答しませんでした。オブジェクトが sim に返されました。</notification>
- <notification name="RegionDisablePhysicsShapes">このリージョンでは、物理的シェイプが有効にされていません。</notification>
- <notification name="NoModNavmeshAcrossRegions">リージョンの境界をまたぐナビメッシュは変更できません。</notification>
- <notification name="NoSetPhysicsPropertiesOnObjectType">そのオブジェクトタイプの物理的プロパティを設定できません。</notification>
- <notification name="NoSetRootPrimWithNoShape">ルートプリムを設定できないため、シェイプがありません。</notification>
- <notification name="NoRegionSupportPhysMats">このリージョンでは、物理的素材が有効にされていません。</notification>
- <notification name="OnlyRootPrimPhysMats">物理的素材を調整できるのは、ルートプリムだけです。</notification>
- <notification name="NoSupportCharacterPhysMats">キャラクターへの物理的素材の設定はまだサポートされていません。</notification>
- <notification name="InvalidPhysMatProperty">指定した物理的素材のプロパティが 1 つ以上無効です。</notification>
- <notification name="NoPermsAlterStitchingMeshObj">メッシュオブジェクトの縫い目のタイプを変更することはできません。</notification>
- <notification name="NoPermsAlterShapeMeshObj">メッシュオブジェクトの形状を変更することはできません</notification>
- <notification name="FullRegionCantEnter">リージョンが埋まっているため、\nこのリージョンに入場できません。</notification>
- <notification name="LinkFailedOwnersDiffer">リンクエラー -- 所有者が違います</notification>
- <notification name="LinkFailedNoModNavmeshAcrossRegions">リンクエラー -- リージョンの境界をまたぐナビメッシュは変更できません。</notification>
- <notification name="LinkFailedNoPermToEdit">リンクエラー -- 編集権限がありません。</notification>
- <notification name="LinkFailedTooManyPrims">リンクエラー -- プリミティブが多すぎます。</notification>
- <notification name="LinkFailedCantLinkNoCopyNoTrans">リンクエラー -- コピーなしと転送なしをリンクできません。</notification>
- <notification name="LinkFailedNothingLinkable">リンクエラー -- リンクできるものがありません。</notification>
- <notification name="LinkFailedTooManyPathfindingChars">リンクエラー -- パスファインディングの文字数が多すぎます</notification>
- <notification name="LinkFailedInsufficientLand">リンクエラー -- 土地のリソースが足りません</notification>
- <notification name="LinkFailedTooMuchPhysics">オブジェクトが使用している物理リソースが多すぎたため、ダイナミックスが無効にされました。</notification>
- <notification name="EstateManagerFailedllTeleportHome">[SLURL] のオブジェクト '[OBJECT_NAME]' で不動産マネージャーのホームをテレポートできません。</notification>
- <notification name="TeleportedHomeByObjectOnParcel">区画 '[PARCEL_NAME]' のオブジェクト '[OBJECT_NAME]' によって、あなたはホームにテレポートされました。</notification>
- <notification name="TeleportedHomeByObject">​オブジェクト ​'[OBJECT_NAME]' によって、あなたはホームへテレポートされています。</notification>
- <notification name="TeleportedByAttachment">
- [ITEM_ID] へのアタッチメントによって、あなたはテレポートされています。
- <usetemplate ignoretext="テレポート:アタッチメントによりテレポートされました" name="notifyignore"/>
- </notification>
- <notification name="TeleportedByObjectOnParcel">
- 区画 '[PARCEL_NAME]' のオブジェクト '[OBJECT_NAME]' によって、あなたはテレポートされています。
+
+お手数ですが、しばらくしてからもう一度やり直してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NotEnoughResourcesToAttach">オブジェクトの着用に使用できるスクリプトのリソースが足りません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="YouDiedAndGotTPHome">死んでしまったので、ホームにテレポートされました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="EjectComingSoon">ここへの入場が許可されていないため、[EJECT_TIME]秒後に追放されます。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoEnterRegionMaybeFull">このリージョン(地域)「[NAME]」へ入場することはできません。
+いっぱいになるか、すぐに再起動される可能性があります。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SaveBackToInvDisabled">「インベントリに保存」が無効になっています。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoExistNoSaveToContents">「存在しません」からrezされたため、&lt;nolink&gt;「[OBJ_NAME]」&lt;/nolink&gt;をオブジェクトの中身に保存できませんでした。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoModNoSaveToContents">あなたには、オブジェクト &lt;nolink&gt;'[DEST_NAME]'&lt;/nolink&gt;を修正する権限がないため、&lt;nolink&gt;「[OBJ_NAME]」&lt;/nolink&gt;をオブジェクトの中身に保存できませんでした。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoSaveBackToInvDisabled">オブジェクト&lt;nolink&gt;「[OBJ_NAME]」&lt;/nolink&gt;をインベントリに保存できません。この操作は無効になりました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoCopyNoSelCopy">あなたには、オブジェクト &lt;nolink&gt;「[OBJ_NAME]」&lt;/nolink&gt;をコピーする権限がないため、選択内容をコピーできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoTransNoSelCopy">オブジェクト&lt;nolink&gt;「[OBJ_NAME]」&lt;/nolink&gt;は譲渡できないため、選択内容をコピーできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoTransNoCopy">オブジェクト&lt;nolink&gt;「[OBJ_NAME]」&lt;/nolink&gt;は譲渡できないため、選択内容をコピーできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoPermsNoRemoval">オブジェクト&lt;nolink&gt;「[OBJ_NAME]」&lt;/nolink&gt;をシミュレーターから削除することは、権限のシステムにより許可されていません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoModNoSaveSelection">あなたには、オブジェクト&lt;nolink&gt;「[OBJ_NAME]」&lt;/nolink&gt;を修正する権限がないため、選択内容を保存できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoCopyNoSaveSelection">オブジェクト&lt;nolink&gt;「[OBJ_NAME]」&lt;/nolink&gt;はコピー不可なため、選択内容を保存できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoModNoTaking">あなたには、オブジェクト&lt;nolink&gt;「[OBJ_NAME]」&lt;/nolink&gt;を修正する権限がないため、選択内容を選ぶことはできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="RezDestInternalError">内部エラー:不明な宛先タイプ。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="DeleteFailObjNotFound">そのオブジェクトは、見つからないため削除できませんでした。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SorryCantEjectUser">残念ながら、そのユーザーを追放することはできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="RegionSezNotAHome">このリージョンでは、ここにホームの位置を設定できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="HomeLocationLimits">ホームの場所を設定できるのは、自分の土地か、またはメインランドの情報ハブでのみです。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="HomePositionSet">家の配置の設定。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="AvatarEjected">アバターが追放されました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="AvatarEjectFailed">その区画の管理権限がないため、追放できませんでした。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CMOParcelFull">区画がいっぱいなので、オブジェクト「[O]」を
+リージョン(地域)[R]の[P]に移動できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CMOParcelPerms">ご使用のオブジェクトは、この区画で使用が許可されていないため、
+オブジェクト「[O]」をリージョン(地域)[R]の[P]に移動できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CMOParcelResources">この区画にこのオブジェクトのリソースが不足しているため、
+オブジェクト「[O]」をリージョン(地域)[R]の[P]に移動できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoParcelPermsNoObject">その区画へのアクセス権がないため、コピーが失敗しました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CMORegionVersion">オブジェクトの受け取りに対応していない、旧バージョンを実行しているため、
+他のリージョン(地域)でリージョンをまたがる
+オブジェクト「[O]」をリージョン(地域)[R]の[P]に移動できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CMONavMesh">リージョンの境界にわたって、ナビメッシュを変更できないため、
+オブジェクト「[O]」をリージョン(地域)[R]の[P]に移動できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CMOWTF">不明な理由により、オブジェクト「[O]」を
+リージョン(地域)[R]の[P]に移動できません。([F])
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoPermModifyObject">そのオブジェクトを変更する権限がありません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="TooMuchObjectInventorySelected">大きなインベントリを持つオブジェクトの選択が多すぎます。選択するオブジェクトを減らして、もう一度やり直してください。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CantEnablePhysObjContributesToNav">ナビメッシュに貢献するオブジェクトに対して物理作用を有効にできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantEnablePhysKeyframedObj">キーフレームオブジェクトのために物理作用を有効にできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantEnablePhysNotEnoughLandResources">土地のリソースが足りないため、オブジェクトの物理作用を有効にできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantEnablePhysCostTooGreat">[MAX_OBJECTS]より大きい物理リソースコストを持つオブジェクトでは、物理作用を有効にできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="PhantomWithConcavePiece">このオブジェクトはファントムで、ナビメッシュに貢献しているため、くぼみを持たせることができません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="UnableAddItem">アイテムを追加できません!
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="UnableEditItem">これは編集できません!
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoPermToEdit">これを編集する許可がありません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoPermToCopyInventory">そのインベントリをコピーすることは許可されません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantSaveItemDoesntExist">オブジェクトのコンテンツに保存できません。アイテムが存在していません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantSaveItemAlreadyExists">オブジェクトのコンテンツに保存できません。同じ名前を持つアイテムがすでにインベントリに存在します。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantSaveModifyAttachment">オブジェクトのコンテンツに保存できません。このため、装着物の権限が変更されます。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="AttachmentHasTooMuchInventory">ご使用の装着物に含まれるインベントリが多すぎるため、インベントリを追加できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="IllegalAttachment">添付ファイルはアバターの存在しない点を要求しました。代わりに胸に添付されていました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="TooManyScripts">スクリプトが多すぎます。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="UnableAddScript">テキストを追加できません!
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="AssetServerTimeoutObjReturn">アセットサーバーが適時に応答しませんでした。オブジェクトが地域に返されました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="RegionDisablePhysicsShapes">このリージョンでは、物理的シェイプが有効にされていません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoModNavmeshAcrossRegions">リージョンの境界をまたぐナビメッシュは変更できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoSetPhysicsPropertiesOnObjectType">そのオブジェクトタイプの物理的プロパティを設定できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoSetRootPrimWithNoShape">ルートプリムを設定できないため、シェイプがありません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoRegionSupportPhysMats">このリージョンでは、物理的素材が有効にされていません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="OnlyRootPrimPhysMats">物理的素材を調整できるのは、ルートプリムだけです。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoSupportCharacterPhysMats">キャラクターへの物理的素材の設定はまだサポートされていません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="InvalidPhysMatProperty">指定した物理的素材のプロパティが1つ以上無効です。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoPermsAlterStitchingMeshObj">メッシュオブジェクトのメッシュ種別を変更することはできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoPermsAlterShapeMeshObj">メッシュオブジェクトの形状を変更することはできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="FullRegionCantEnter">リージョンが埋まっているため、このリージョンに入場できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="LinkFailedOwnersDiffer">リンクエラー-所有者が違います。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="LinkFailedNoModNavmeshAcrossRegions">リンクエラー-リージョンの境界をまたぐナビメッシュは変更できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="LinkFailedNoPermToEdit">リンクエラー-編集権限がありません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="LinkFailedTooManyPrims">リンクエラー-プリミティブが多すぎます。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="LinkFailedCantLinkNoCopyNoTrans">リンクエラー-コピーなしと転送なしをリンクできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="LinkFailedNothingLinkable">リンクエラー-リンクできるものがありません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="LinkFailedTooManyPathfindingChars">リンクエラー-経路探索の文字数が多すぎます。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="LinkFailedInsufficientLand">リンクエラー-土地のリソースが足りません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="LinkFailedTooMuchPhysics">オブジェクトが使用する物理リソースが多すぎます-そのダイナミクスが無効になっています。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="EstateManagerFailedllTeleportHome">[SLURL] のオブジェクト「[OBJECT_NAME]」で不動産マネージャーのホームをテレポートできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="TeleportedHomeByObjectOnParcel">区画「[PARCEL_NAME]」のオブジェクト「[OBJECT_NAME]」によって、あなたはホームにテレポートされました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="TeleportedHomeByObject">​オブジェクト​「[OBJECT_NAME]」によって、あなたはホームへテレポートされています。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="TeleportedByAttachment">[ITEM_ID]への装着物によって、あなたはテレポートされています。
+ <tag>
+ fail
+ </tag>
+ <usetemplate ignoretext="テレポート:装着物によりテレポートされました" name="notifyignore"/>
+ </notification>
+ <notification name="TeleportedByObjectOnParcel">区画「[PARCEL_NAME]」のオブジェクト「[OBJECT_NAME]」によって、あなたはテレポートされています。
+ <tag>
+ fail
+ </tag>
<usetemplate ignoretext="テレポート:区画上のオブジェクトによりテレポートされました" name="notifyignore"/>
</notification>
- <notification name="TeleportedByObjectOwnedBy">[OWNER_ID] が所有しているオブジェクト '[OBJECT_NAME]' によって、あなたはテレポートされています。</notification>
- <notification name="TeleportedByObjectUnknownUser">不明なユーザーが所有しているオブジェクト '[OBJECT_NAME]' によって、あなたはテレポートされています。</notification>
- <notification name="StandDeniedByObject">'[OBJECT_NAME]' はこの時点であなたが立つことを許可しません。</notification>
- <notification name="ResitDeniedByObject">'[OBJECT_NAME]' はこの時点であなたが席を変更することを許可しません。</notification>
- <notification name="CantCreateObjectRegionFull">リクエストされたオブジェクトを作成できません。リージョンが埋まっています。</notification>
- <notification name="CantCreateAnimatedObjectTooLarge">リグ入三角形の限度数を超えるため、リクエストされたアニメーションオブジェクトを作成することができません。</notification>
- <notification name="CantAttackMultipleObjOneSpot">1 つの場所に複数のオブジェクトを着用することはできません。</notification>
- <notification name="CantCreateMultipleObjAtLoc">ここでは、複数のオブジェクトを作成することはできません。</notification>
- <notification name="UnableToCreateObjTimeOut">リクエストされたオブジェクトを作成できません。オブジェクトがデータベースに見つかりません。</notification>
- <notification name="UnableToCreateObjUnknown">リクエストされたオブジェクトを作成できません。リクエストがタイムアウトになりました。もう一度お試しください。</notification>
- <notification name="UnableToCreateObjMissingFromDB">要求されたオブジェクトを作成できません。もう一度お試しください。</notification>
- <notification name="RezFailureTookTooLong">リクエストされたオブジェクトのロードに時間がかかりすぎたため、Rez に失敗しました。</notification>
- <notification name="FailedToPlaceObjAtLoc">指定した場所にオブジェクトを配置できませんでした。もう一度お試しください。</notification>
- <notification name="CantCreatePlantsOnLand">この土地に木を植えることはできません。</notification>
- <notification name="CantRestoreObjectNoWorldPos">オブジェクトをリストアできません。ワールドの位置が見つかりません。</notification>
- <notification name="CantRezObjectInvalidMeshData">メッシュデータが無効なため、オブジェクトを Rez することができません。</notification>
- <notification name="CantRezObjectTooManyScripts">このリージョンに既に多くのスクリプトが存在するため、オブジェクトを Rez することができません。</notification>
- <notification name="CantCreateObjectNoAccess">現在のアクセス権限では、そこにオブジェクトを作成できません。</notification>
- <notification name="CantCreateObject">現在あなたにはオブジェクト作成する許可がありません。</notification>
- <notification name="InvalidObjectParams">無効なオブジェクトパラメーター</notification>
- <notification name="CantDuplicateObjectNoAcess">現在のアクセス権限では、ここにオブジェクトのコピーを作成できません。</notification>
- <notification name="CantChangeShape">あなたにはこのシェイプを変更する許可がありません。</notification>
- <notification name="NoPermsTooManyAttachedAnimatedObjects">この操作を行うと、装着されたアニメーションオブジェクトが限度数を超えます。</notification>
- <notification name="NoPermsLinkAnimatedObjectTooLarge">結果として、アニメーションオブジェクトがリグ入り三角形の限度数を超えるため、これらのオブジェクトを結合できません。</notification>
- <notification name="NoPermsSetFlagAnimatedObjectTooLarge">リグ入り三角形の限度数を超えるため、このオブジェクトをアニメーションオブジェクトにすることはできません。</notification>
- <notification name="CantChangeAnimatedObjectStateInsufficientLand">このオブジェクトをアニメーションオブジェクトの状態に変えると、区画の限度数を超えるため変更できません。</notification>
- <notification name="ErrorNoMeshData">サーバーエラー: メッシュデータが読み込まれていないため、この操作を完了できません。</notification>
- <notification name="NoAccessToClaimObjects">現在のアクセス権限では、ここにオブジェクトを取得できません。</notification>
- <notification name="DeedFailedNoPermToDeedForGroup">あなたのグループにオブジェクトを譲渡する権限がないため、譲渡に失敗しました。</notification>
- <notification name="NoPrivsToBuyObject">現在のアクセス権限では、ここでオブジェクトを購入できません。</notification>
- <notification name="CantAttachObjectAvatarSittingOnIt">アバターがオブジェクトに存在するため、オブジェクトを着用できません。</notification>
- <notification name="WhyAreYouTryingToWearShrubbery">木や草をアタッチメントとして着用できません。</notification>
- <notification name="CantAttachGroupOwnedObjs">グループが所有しているオブジェクトは着用できません。</notification>
- <notification name="CantAttachObjectsNotOwned">所有していないオブジェクトは着用できません。</notification>
- <notification name="CantAttachNavmeshObjects">ナビメッシュに貢献しているオブジェクトは着用できません。</notification>
- <notification name="CantAttachObjectNoMovePermissions">あなたにはオブジェクトを移動する権限がないため、そのオブジェクト添付できません。</notification>
- <notification name="CantAttachNotEnoughScriptResources">オブジェクトの着用に使用できるスクリプトリソースが足りません。</notification>
- <notification name="CantDropItemTrialUser">オブジェクトをここにドロップできません。フリートライアル領域をお試しください。</notification>
- <notification name="CantDropMeshAttachment">メッシュアタッチメントをドロップすることはできません。インベントリから切り離して、ワールドで Rez してください。</notification>
- <notification name="CantDropAttachmentNoPermission">アタッチメントのドロップに失敗しました。そこへドロップする権限がありません。</notification>
- <notification name="CantDropAttachmentInsufficientLandResources">アタッチメントのドロップに失敗しました。利用できる土地リソースの数が足りません。</notification>
- <notification name="CantDropAttachmentInsufficientResources">利用できるリソースが足りないため、アタッチメントのドロップに失敗しました。</notification>
- <notification name="CantDropObjectFullParcel">ここにオブジェクトをドロップできません。区画が埋まっています。</notification>
- <notification name="CantTouchObjectBannedFromParcel">土地区画に入場することを禁止されているため、このオブジェクトを触ったり、つかむことができません。</notification>
- <notification name="PlzNarrowDeleteParams">削除パラメーターを絞ってください。</notification>
- <notification name="UnableToUploadAsset">資産をアップロードできません。</notification>
- <notification name="CantTeleportCouldNotFindUser">ホームをテレポートするユーザーが見つかりませんでした。</notification>
- <notification name="GodlikeRequestFailed">過剰なリクエストが失敗しました</notification>
- <notification name="GenericRequestFailed">一般的なリクエストに失敗しました</notification>
- <notification name="CantUploadPostcard">ポストカードをアップロードできません。後でもう一度お試しください。</notification>
- <notification name="CantFetchInventoryForGroupNotice">グループ通知のインベントリの詳細を取得できません。</notification>
- <notification name="CantSendGroupNoticeNotPermitted">グループ通知の送信が許可されないため、送信できません。</notification>
- <notification name="CantSendGroupNoticeCantConstructInventory">グループ通知を送信できません。持ち物を作成することもできません。</notification>
- <notification name="CantParceInventoryInNotice">通知内の持ち物を検出できません。</notification>
- <notification name="TerrainUploadFailed">地形のアップロードに失敗しました。</notification>
- <notification name="TerrainFileWritten">地形ファイルが書き込まれました。</notification>
- <notification name="TerrainFileWrittenStartingDownload">地形ファイルを書き出し、ダウンロードを開始しています...</notification>
- <notification name="TerrainBaked">地形がベークされました。</notification>
- <notification name="TenObjectsDisabledPlzRefresh">選択された最初の 10 個のオブジェクトのみが無効にされました。必要に応じて、リフレッシュして選択内容を追加してください。</notification>
- <notification name="UpdateViewerBuyParcel">この区画を購入するには、ビューワをアップデートする必要があります。</notification>
- <notification name="CantBuyParcelNotForSale">購入することができません。この区画は販売対象ではありません。</notification>
- <notification name="CantBuySalePriceOrLandAreaChanged">販売価格または土地の面積が変わったため、購入できません。</notification>
- <notification name="CantBuyParcelNotAuthorized">あなたはこの区画の委任された買い手ではありません。</notification>
- <notification name="CantBuyParcelAwaitingPurchaseAuth">すでに購入の認証を待機しているため、この区画を購入できません。</notification>
- <notification name="CantBuildOverflowParcel">区画をオーバーフローするため、ここでオブジェクトを構築することはできません。</notification>
- <notification name="SelectedMultipleOwnedLand">所有者の違う土地を選びました。選択する面積を小さくして、もう一度試してください。</notification>
- <notification name="CantJoinTooFewLeasedParcels">選択範囲のリース区画の数が少ないため、参加できません。</notification>
+ <notification name="TeleportedByObjectOwnedBy">[OWNER_ID]が所有しているオブジェクト「[OBJECT_NAME]」によって、あなたはテレポートされています。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="TeleportedByObjectUnknownUser">不明なユーザーが所有しているオブジェクト「[OBJECT_NAME]」によって、あなたはテレポートされています。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="StandDeniedByObject">「[OBJECT_NAME]」は、この時点であなたが立つことを許可しません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ResitDeniedByObject">「[OBJECT_NAME]」は、この時点であなたが席を変更することを許可しません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantCreateObjectRegionFull">リクエストされたオブジェクトを作成できません。リージョンが埋まっています。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantCreateAnimatedObjectTooLarge">リグ入三角形の限度数を超えるため、リクエストされたアニメーションオブジェクトを作成することができません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantAttackMultipleObjOneSpot">1つの箇所に複数のオブジェクトを着用することはできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantCreateMultipleObjAtLoc">ここでは、複数のオブジェクトを作成することはできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="UnableToCreateObjTimeOut">リクエストされたオブジェクトを作成できません。オブジェクトがデータベースに見つかりません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="UnableToCreateObjUnknown">リクエストされたオブジェクトを作成できません。リクエストがタイムアウトになりました。もう一度お試しください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="UnableToCreateObjMissingFromDB">要求されたオブジェクトを作成できません。もう一度お試しください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="RezFailureTookTooLong">リクエストされたオブジェクトのロードに時間がかかりすぎたため、Rezに失敗しました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="FailedToPlaceObjAtLoc">指定した場所にオブジェクトを配置できませんでした。もう一度お試しください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantCreatePlantsOnLand">この土地に木を植えることはできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantRestoreObjectNoWorldPos">オブジェクトをリストアできません。ワールドの位置が見つかりません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantRezObjectInvalidMeshData">メッシュデータが無効なため、オブジェクトをRezすることができません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantRezObjectTooManyScripts">このリージョンに既に多くのスクリプトが存在するため、オブジェクトをRezすることができません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantCreateObjectNoAccess">現在のアクセス権限では、そこにオブジェクトを作成できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantCreateObject">現在あなたにはオブジェクト作成する権限がありません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="InvalidObjectParams">無効なオブジェクトパラメーター
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantDuplicateObjectNoAcess">現在のアクセス権限では、ここにオブジェクトのコピーを作成できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantChangeShape">あなたにはこのシェイプを変更する権限がありません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoPermsTooManyAttachedAnimatedObjects">この操作を行うと、装着されたアニメーションオブジェクトが限度数を超えます。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoPermsLinkAnimatedObjectTooLarge">結果として、アニメーションオブジェクトがリグ入り三角形の限度数を超えるため、これらのオブジェクトを結合できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoPermsSetFlagAnimatedObjectTooLarge">リグ入り三角形の限度数を超えるため、このオブジェクトをアニメーションオブジェクトにすることはできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantChangeAnimatedObjectStateInsufficientLand">このオブジェクトをアニメーションオブジェクトの状態に変えると、区画の限度数を超えるため変更できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ErrorNoMeshData">サーバーエラー:メッシュデータが読み込まれていないため、この操作を完了できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoAccessToClaimObjects">現在のアクセス権限では、ここにオブジェクトを取得できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="DeedFailedNoPermToDeedForGroup">あなたのグループにオブジェクトを譲渡する権限がないため、譲渡に失敗しました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoPrivsToBuyObject">現在のアクセス権限では、ここでオブジェクトを購入できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantAttachObjectAvatarSittingOnIt">アバターがオブジェクトに存在するため、オブジェクトを着用できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="WhyAreYouTryingToWearShrubbery">木や草を装着物として着用できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantAttachGroupOwnedObjs">グループが所有しているオブジェクトは着用できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantAttachObjectsNotOwned">所有していないオブジェクトは着用できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantAttachNavmeshObjects">ナビメッシュに貢献しているオブジェクトは着用できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantAttachObjectNoMovePermissions">あなたにはオブジェクトを移動する権限がないため、そのオブジェクト添付できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantAttachNotEnoughScriptResources">オブジェクトの着用に使用できるスクリプトリソースが足りません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantDropItemTrialUser">オブジェクトを下に置く事はできません。フリートライアル領域をお試しください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantDropMeshAttachment">メッシュ装着物を下に置く事はできません。インベントリから切り離して、ワールドでRezしてください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantDropAttachmentNoPermission">装着物を下に置く事に失敗しました。そこへ置ける権限がありません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantDropAttachmentInsufficientLandResources">装着物のドロップに失敗しました。利用できる土地リソースの数が足りません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantDropAttachmentInsufficientResources">利用できるリソースが足りないため、装着物のドロップに失敗しました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantDropObjectFullParcel">ここにオブジェクトをドロップできません。区画が埋まっています。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantTouchObjectBannedFromParcel">この土地区画に入場することを禁止されているため、このオブジェクトを触ったり、つかむことができません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="PlzNarrowDeleteParams">削除パラメーターを絞ってください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="UnableToUploadAsset">アセットをアップロードできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantTeleportCouldNotFindUser">ホームをテレポートするユーザーが見つかりませんでした。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="GodlikeRequestFailed">過剰なリクエストで失敗しました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="GenericRequestFailed">一般的なリクエストに失敗しました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantUploadPostcard">ポストカードをアップロードできません。後でもう一度お試しください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantFetchInventoryForGroupNotice">グループ通知のインベントリの詳細を取得できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantSendGroupNoticeNotPermitted">グループ通知の送信が許可されないため、送信できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantSendGroupNoticeCantConstructInventory">グループ通知を送信できません。インベントリを作成することもできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantParceInventoryInNotice">通知内のインベントリを検出できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="TerrainUploadFailed">地形のアップロードに失敗しました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="TerrainFileWritten">地形ファイルが書き込まれました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="TerrainFileWrittenStartingDownload">地形ファイルを書き出し、ダウンロードを開始しています…
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="TerrainBaked">地形がベークされました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="TenObjectsDisabledPlzRefresh">選択された最初の10個のオブジェクトのみが無効にされました。必要に応じて、リフレッシュして選択内容を追加してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="UpdateViewerBuyParcel">この区画を購入するには、ビューアーを更新する必要があります。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantBuyParcelNotForSale">購入することができません。この区画は販売対象ではありません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantBuySalePriceOrLandAreaChanged">販売価格または土地の面積が変わったため、購入できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantBuyParcelNotAuthorized">あなたは、この区画の委任された購入者ではありません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantBuyParcelAwaitingPurchaseAuth">すでに購入の認証を待機しているため、この区画を購入できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantBuildOverflowParcel">区画をオーバーフローするため、ここでオブジェクトを構築することはできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SelectedMultipleOwnedLand">所有者の違う土地を選びました。選択する面積を小さくして、もう一度試してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantJoinTooFewLeasedParcels">選択範囲のリース区画の数が少ないため、参加できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CantDivideLandMultipleParcelsSelected">土地を分割できません。
複数の区画が選択されました。
-小さい区画を選択してください。</notification>
+小さい区画を選択してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CantDivideLandCantFindParcel">土地を分割できません。
区画が見つかりません。
-「ヘルプ」 -&gt; 「バグの報告」で報告してください。</notification>
+「ヘルプ」→「バグの報告」で報告してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="CantDivideLandWholeParcelSelected">土地を分割できません。区画全体が選択されています。
-小さい区画を選択してください。</notification>
- <notification name="LandHasBeenDivided">土地が分割されています。</notification>
- <notification name="PassPurchased">入場許可を購入しました。</notification>
- <notification name="RegionDisallowsClassifieds">リージョンでは、クラシファイド広告を許可しません。</notification>
- <notification name="LandPassExpireSoon">この土地への入場許可はまもなく期限が切れます。</notification>
- <notification name="CantSitNoSuitableSurface">配置に適した表面がありません。別の場所を試してみたください。</notification>
- <notification name="CantSitNoRoom">ここには座る余地がありません。他の場所を試してください。</notification>
- <notification name="ClaimObjectFailedNoPermission">権限がないため、オブジェクトを取得できませんでした。</notification>
- <notification name="ClaimObjectFailedNoMoney">リンデンドルが足りないため、オブジェクトの取得に失敗しました。</notification>
- <notification name="CantDeedGroupLand">グループ所有の土地は、譲渡できません。</notification>
- <notification name="BuyObjectFailedNoMoney">リンデンドルが足りないため、オブジェクトの購入に失敗しました。</notification>
- <notification name="BuyInventoryFailedNoMoney">リンデンドルが不足しているため、インベントリを購入できませんでした。</notification>
- <notification name="BuyPassFailedNoMoney">リンデンドルが足りないため、この土地への入場許可を購入できません。</notification>
- <notification name="CantBuyPassTryAgain">今すぐには入場許可を購入できません。後でもう一度お試しください。</notification>
- <notification name="CantCreateObjectParcelFull">区画が埋まっているため、オブジェクトを\n作成することができません。</notification>
- <notification name="FailedPlacingObject">指定した場所にオブジェクトを配置できませんでした。もう一度お試しください。</notification>
- <notification name="CantCreateLandmarkForEvent">イベントのためのランドマークを作成することができません。</notification>
- <notification name="GodBeatsFreeze">強力な力でフリーズを解除します。</notification>
- <notification name="SpecialPowersRequestFailedLogged">特殊な権限のリクエストに失敗しました。このリクエストはログに記録されています。</notification>
- <notification name="ExpireExplanation">システムは、現在あなたのリクエストを処理できません。リクエストがタイムアウトになりました。</notification>
- <notification name="DieExplanation">システムは、あなたのリクエストを処理できません。</notification>
- <notification name="AddPrimitiveFailure">プリミティブ広告を出すには、資金が足りません。</notification>
- <notification name="RezObjectFailure">資金が足りないため、オブジェクトを作成できません。</notification>
- <notification name="ResetHomePositionNotLegal">ホームが不正なため、ホームの位置をリセットします。</notification>
- <notification name="CantInviteRegionFull">リージョンが埋まっているため、現在の場所に誰かを招待することはできません。後でもう一度お試しください。</notification>
- <notification name="CantSetHomeAtRegion">このリージョンでは、ここにホームの位置を設定できません。</notification>
- <notification name="ListValidHomeLocations">ホームの場所を設定できるのは、自分の土地か、またはメインランドのインフォハブでのみです。</notification>
- <notification name="SetHomePosition">家の配置の設定。</notification>
- <notification name="CantDerezInventoryError">インベントリエラーのため、オブジェクトの Rez 解除ができません。</notification>
- <notification name="CantCreateRequestedInv">リクエストされたインベントリを作成できません。</notification>
- <notification name="CantCreateRequestedInvFolder">リクエストされた持ち物フォルダーを作成できません。</notification>
- <notification name="CantCreateInventory">そのインベントリを作成できません。</notification>
- <notification name="CantCreateLandmark">ランドマークを作成できません。</notification>
- <notification name="CantCreateOutfit">アウトフィットをすぐには作成できません。しばらくしてから再度お試しください。</notification>
- <notification name="InventoryNotForSale">インベントリは販売対象ではありません。</notification>
- <notification name="CantFindInvItem">持ち物アイテムを見つけることができません。</notification>
- <notification name="CantFindObject">オブジェクトが見つかりません。</notification>
- <notification name="CantTransfterMoneyRegionDisabled">オブジェクトへの送金は、このリージョンでは現在無効にされています。</notification>
- <notification name="DroppedMoneyTransferRequest">システムロードにより、支払いを実行できません。</notification>
- <notification name="CantPayNoAgent">支払いの相手を把握できませんでした。</notification>
- <notification name="CantDonateToPublicObjects">パブリックオブジェクトにリンデンドルを与えることはできません。</notification>
- <notification name="InventoryCreationInWorldObjectFailed">インワールドオブジェクトでのインベントリ作成に失敗しました。</notification>
- <notification name="UserBalanceOrLandUsageError">内部エラーが発生したため、ビューワを正しく更新できませんでした。ビューワに表示されるリンデンドルの残高または区画の所有は、サーバー上の実際の残高を反映していない可能性があります。</notification>
- <notification name="LargePrimAgentIntersect">他の住民と交差する大きなプリムを作成することはできません。他の住民が移動した場合は再度お試しください。</notification>
- <notification name="PreferenceChatClearLog">
- これにより、過去の会話のログ、およびそのファイルのすべてのバックアップが削除されます。
- <usetemplate ignoretext="以前の会話のログを削除する前に確認してください。" name="okcancelignore" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="PreferenceChatDeleteTranscripts">
- これにより、以前のすべての会話のテキストが削除されます。過去の会話のリストには影響しません。.txt および txt.backup の拡張子が付いたすべてのファイルが [FOLDER] フォルダーから削除されます。
- <usetemplate ignoretext="テキストを削除するまえに確認してください。" name="okcancelignore" notext="取り消し" yestext="OK"/>
- </notification>
- <notification name="PreferenceChatPathChanged">
- ファイルを移動できません。以前のパスがリストアされました。
- <usetemplate ignoretext="ファイルを移動できません。以前のパスがリストアされました。" name="okignore" yestext="OK"/>
- </notification>
- <notification name="DefaultObjectPermissions">
- デフォルトのオブジェクト権限を保存するときに問題が発生しました: [REASON]。後でデフォルトの権限を設定してください。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="ChatHistoryIsBusyAlert">
- チャット履歴ファイルが前の操作でビジーです。2、3 分経ってからもう一度試すか、別の人とのチャットを選択してください。
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="OutfitPhotoLoadError">
- [REASON]
- <usetemplate name="okbutton" yestext="OK"/>
- </notification>
- <notification name="FailedToFindSettings">データベースから [NAME] の設定の読み込みができませんでした。</notification>
- <notification name="FailedToLoadSettingsApply">環境にこれらの設定を適用することができません。</notification>
- <notification name="FailedToBuildSettingsDay">環境にこれらの設定を適用することができません。</notification>
- <notification name="NoEnvironmentSettings">このリージョンは環境設定をサポートしていません。</notification>
- <notification label="アウトフィットを保存する" name="SaveSettingAs">
- 現在の環境設定を次の内容で保存する:
+小さい区画を選択してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="LandHasBeenDivided">土地が分割されています。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="PassPurchased">入場許可を購入しました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="RegionDisallowsClassifieds">このリージョン(地域)では、クラシファイド広告の掲載が許可されていません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="LandPassExpireSoon">この土地への入場許可は、まもなく期限が切れます。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantSitNoSuitableSurface">配置に適した表面がありません。別の場所を試してみたください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantSitNoRoom">ここには座れる場所がありません。他の場所を試してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ClaimObjectFailedNoPermission">権限がないため、オブジェクトを取得できませんでした。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ClaimObjectFailedNoMoney">リンデンドルが足りないため、オブジェクトの取得に失敗しました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantDeedGroupLand">グループ所有の土地は、譲渡できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="BuyObjectFailedNoMoney">リンデンドルが足りないため、オブジェクトの購入に失敗しました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="BuyInventoryFailedNoMoney">リンデンドルが不足しているため、インベントリを購入できませんでした。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="BuyPassFailedNoMoney">リンデンドルが足りないため、この土地への入場許可を購入できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantBuyPassTryAgain">今すぐには入場許可を購入できません。お手数ですが、しばらく経ってからもう一度やりなおしてください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantCreateObjectParcelFull">区画が埋まっているため、オブジェクトを作成することができません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="FailedPlacingObject">指定した場所にオブジェクトを配置できませんでした。お手数ですが、もう一度やりなおしてください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantCreateLandmarkForEvent">イベントのためのランドマークを作成することができません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="GodBeatsFreeze">強力な力でフリーズを解除します。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SpecialPowersRequestFailedLogged">特殊な権限のリクエストに失敗しました。このリクエストはログに記録されています。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ExpireExplanation">システムは、現在あなたのリクエストを処理できません。リクエストがタイムアウトになりました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="DieExplanation">システムは、あなたのリクエストを処理できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="AddPrimitiveFailure">プリミティブ広告を出すには、資金が足りません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="RezObjectFailure">資金が足りないため、オブジェクトを作成できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ResetHomePositionNotLegal">ホームが不正なため、ホームの位置をリセットします。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantInviteRegionFull">リージョンが埋まっているため、現在の場所に誰かを招待することはできません。お手数ですが、しばらく経ってからもう一度やりなおしてください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantSetHomeAtRegion">このリージョンでは、この位置にホームを設定できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="ListValidHomeLocations">ホームの場所を設定できるのは、自分の土地かメインランドの情報ハブのみです。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SetHomePosition">家の配置の設定。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantDerezInventoryError">インベントリエラーのため、オブジェクトのRezの解除ができません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantCreateRequestedInv">リクエストされたインベントリを作成できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantCreateRequestedInvFolder">リクエストされたインベントリフォルダーを作成できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantCreateInventory">そのインベントリを作成できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantCreateLandmark">ランドマークを作成できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantCreateOutfit">アウトフィットをすぐには作成できません。しばらくしてから再度お試しください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="InventoryNotForSale">インベントリは販売対象ではありません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantFindInvItem">インベントリアイテムを見つけることができません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantFindObject">オブジェクトが見つかりません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantTransfterMoneyRegionDisabled">オブジェクトへの送金は、このリージョンでは現在無効にされています。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="DroppedMoneyTransferRequest">システムロードにより、支払いを実行できません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantPayNoAgent">支払いの相手を把握できませんでした。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CantDonateToPublicObjects">パブリックオブジェクトにリンデンドルを与えることはできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="InventoryCreationInWorldObjectFailed">インワールドオブジェクトでのインベントリ作成に失敗しました。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="UserBalanceOrLandUsageError">内部エラーが発生したため、ビューアーを正しく更新できませんでした。ビューアーに表示されるリンデンドルの残高または区画の所有は、サーバー上の実際の残高を反映していない可能性があります。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="LargePrimAgentIntersect">他の住民と交差する大きなプリムを作成することはできません。他の住民が移動した場合は再度お試しください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="PreferenceChatClearLog">これにより、過去の会話のログ、およびそのファイルのすべてのバックアップが削除されます。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="以前の会話のログを削除する前に確認してください。" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="PreferenceChatDeleteTranscripts">これにより、以前のすべての会話のテキストが削除されます。過去の会話のリストには影響しません。
+.txtおよびtxt.backupの拡張子が付いたすべてのファイルが[FOLDER]フォルダから削除されます。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="テキストを削除するまえに確認してください。" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="PreferenceChatPathChanged">ファイルを移動できません。以前のパスがリストアされました。
+ <usetemplate ignoretext="ファイルを移動できません。以前のパスがリストアされました。" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="DefaultObjectPermissions">デフォルトのオブジェクト権限を保存するときに問題が発生しました:[REASON]
+後でデフォルトの権限を設定してください。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ChatHistoryIsBusyAlert">チャット履歴ファイルが前の操作でビジーです。2、3分経ってからもう一度試すか、別の人とのチャットを選択してください。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="OutfitPhotoLoadError">[REASON]
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FailedToFindSettings">データベースから「[NAME]」の設定の読み込みができませんでした。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="FailedToLoadSettingsApply">環境にこれらの設定を適用することができません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="FailedToBuildSettingsDay">環境にこれらの設定を適用することができません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="NoEnvironmentSettings">このリージョン(地域)は初期設定をサポートしていません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification label="アウトフィットを保存する" name="SaveSettingAs">現在の設定を次の内容で保存する:
+ <unique/>
+ <tag>
+ confirm
+ </tag>
<form name="form">
- <input name="message">[DESC] (新)</input>
- <button name="OK" text="OK"/>
+ <input name="message">
+ [DESC] (New)
+ </input>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="キャンセル"/>
</form>
</notification>
- <notification name="WLImportFail">[FILE] から過去のウインドライトの設定 [NAME] をインポートできません。
+ <notification name="WLImportFail">[FILE]から過去のウインドライトの設定「[NAME]」をインポートできません。
-[REASONS]</notification>
+[REASONS]
+ <tag>
+ fail
+ </tag>
+ </notification>
<notification name="WLParcelApplyFail">この区画で環境を設定することはできません。
-変更する権限のある区画を入力または選択してください。</notification>
- <notification name="SettingsUnsuported">このリージョンでは設定をサポートしていません。
-設定に対応しているリージョンに移動し、アクションを再試行してください。</notification>
- <notification name="SettingsConfirmLoss">
- &quot;[NAME]&quot;と名付けられたこの [TYPE] に加えられた変更が失われます。
-続けますか?
+変更する権限のある区画を入力または選択してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SettingsUnsuported">このリージョン(地域)では設定をサポートしていません。
+設定に対応しているリージョンに移動し、アクションを再試行してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="SettingsConfirmLoss">「[NAME]」と名付けられたこの[TYPE]に加えられた変更が失われます。
+続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
<usetemplate ignoretext="変更を失いますがよろしいですか?" name="okcancelignore" notext="いいえ" yestext="はい"/>
</notification>
- <notification name="SettingsConfirmReset">
- 適用されたすべての設定を削除しようとしています。
-続けますか?
+ <notification name="SettingsConfirmReset">適用されたすべての設定を削除しようとしています。
+続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
</notification>
- <notification name="PersonalSettingsConfirmReset">
- 適用されたすべての個人的な照明の設定を削除しようとしています。
-続けますか?
+ <notification name="PersonalSettingsConfirmReset">適用されたすべての個人的な照明の設定を削除しようとしています。
+続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
</notification>
- <notification name="SettingsMakeNoTrans">
- このデイサイクルに移行不可の設定をインポートしようとしています。このまま続けると、編集中の設定も移行不可になります。
+ <notification name="SettingsMakeNoTrans">このデイサイクルに移行不可の設定をインポートしようとしています。このまま続けると、編集中の設定も移行不可になります。
この変更は元に戻すことができません。
-続けますか?
+続けてもよろしいですか?
+ <tag>
+ confirm
+ </tag>
<usetemplate ignoretext="設定を移行不可にしますか?" name="okcancelignore" notext="いいえ" yestext="はい"/>
</notification>
- <notification name="NoEditFromLibrary">ライブラリから直接設定を変更することはできません。
-自分の持ち物からコピーしてやり直してください。</notification>
- <notification name="EnvironmentApplyFailed">この設定で問題が発生しました。この設定は現在保存または適用ができません。</notification>
- <notification name="TrackLoadFailed">トラックを [TRACK] にロードできません。</notification>
- <notification name="TrackLoadMismatch">トラックを [TRACK1] から [TRACK2] にロードできません。</notification>
+ <notification name="NoEditFromLibrary">ライブラリから直接設定を変更することはできません。自分のインベントリからコピーしてやり直してください。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="EnvironmentApplyFailed">この設定で問題が発生しました。この設定は現在保存または適用ができません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="TrackLoadFailed">トラックを[TRACK]にロードできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="TrackLoadMismatch">トラックを[TRACK1]から[TRACK2]にロードできません。
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification name="CompressionTestResults">サイズ[SIZE]㎅のファイル[FILE]をgzipのレベル6で圧縮したテスト結果:
+圧縮:[PACK_TIME]秒 [PSIZE]㎅
+解凍:[UNPACK_TIME]秒 [USIZE]㎅
+ <tag>
+ fail
+ </tag>
+ </notification>
+ <notification label="二段階認証トークンプロンプト" name="PromptMFAToken">[MESSAGE]
+ <tag>
+ confirm
+ </tag>
+ <form name="form">
+ <input name="token"/>
+ <button name="continue" text="確認"/>
+ <button name="cancel" text="キャンセル"/>
+ </form>
+ </notification>
+ <notification label="サブフォルダの作成" name="CreateSubfolder">新しいフォルダーに名前を付けます:
+ <unique/>
+ <tag>
+ confirm
+ </tag>
+ <form name="form">
+ <input name="message">
+ [DESC]
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="キャンセル"/>
+ </form>
+ </notification>
+ <notification name="SameFolderRequired">選択したアイテムは、同じフォルダー内に存在する必要があります。
+ <tag>
+ fail
+ </tag>
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RiggedMeshAttachedToHUD">HUDポイント「[POINT]」にアタッチされたオブジェクト「[NAME]」にはリグメッシュが含まれています。
+
+リグメッシュオブジェクトは、アバターに取り付けるように設計されています。あなたにはこのオブジェクトが表示されますが、他の人には表示されません。
+
+他の人にこのオブジェクトを見てもらいたい場合は、オブジェクトを削除して、アバターのアタッチメントポイントに再度アタッチします。
+ <tag>
+ confirm
+ </tag>
+ <usetemplate ignoretext="リグメッシュがHUDポイントにアタッチされている場合に警告します。" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="EnableAutoFPSWarning" type="alertmodal">自動FPSを有効にしようとしています。保存されていないグラフィック設定はすべて失われます。
+
+まずそれらを保存しますか?
+ <tag>
+ confirm
+ </tag>
+ <usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+ </notification>
</notifications>
diff --git a/indra/newview/skins/default/xui/ja/outfit_accordion_tab.xml b/indra/newview/skins/default/xui/ja/outfit_accordion_tab.xml
index bac885e5d8..a89eca6d9a 100644
--- a/indra/newview/skins/default/xui/ja/outfit_accordion_tab.xml
+++ b/indra/newview/skins/default/xui/ja/outfit_accordion_tab.xml
@@ -1,4 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- *NOTE: mantipov: this xml is intended to be used inside panel_outfits_list.xml for each outfit folder-->
-<!-- All accordion tabs in the My Appearance/My Outfits panel will be created from this one at runtume-->
-<accordion_tab name="Mockup Tab" title="Mockup Tab"/>
+<accordion_tab name="Mockup Tab" title="モックアップタブ"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/panel_active_object_row.xml b/indra/newview/skins/default/xui/ja/panel_active_object_row.xml
index 90491e84c5..97a74a0a9d 100644
--- a/indra/newview/skins/default/xui/ja/panel_active_object_row.xml
+++ b/indra/newview/skins/default/xui/ja/panel_active_object_row.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_activeim_row">
- <string name="unknown_obj">
- 不明のオブジェクト
- </string>
+ <chiclet_script name="object_chiclet"/>
+ <chiclet_offer name="inv_offer_chiclet"/>
<text name="object_name">
- 名前のないオブジェクト
+ 無名のオブジェクト
</text>
+ <button name="hide_btn" label=""/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/ja/panel_adhoc_control_panel.xml
deleted file mode 100644
index 17e1283d24..0000000000
--- a/indra/newview/skins/default/xui/ja/panel_adhoc_control_panel.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?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="コール" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="コール終了" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="ボイスコントロール" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml
index 3ef8eba19f..b920a0a8f7 100644
--- a/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml
@@ -1,32 +1,35 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="avatar_list_item">
<string name="FormatSeconds">
- [COUNT] 秒
+ [COUNT]秒
</string>
<string name="FormatMinutes">
- [COUNT] 分
+ [COUNT]分
</string>
<string name="FormatHours">
- [COUNT] 時間
+ [COUNT]時間
</string>
<string name="FormatDays">
- [COUNT] 日
+ [COUNT]日
</string>
<string name="FormatWeeks">
- [COUNT] 週間
+ [COUNT]週間
</string>
<string name="FormatMonths">
- [COUNT] ヶ月
+ [COUNT]ヶ月
</string>
<string name="FormatYears">
- [COUNT] 年
+ [COUNT]年
</string>
- <text name="avatar_name" value="(ローディング)"/>
- <text name="last_interaction" value="0 秒"/>
- <icon name="permission_edit_theirs_icon" tool_tip="このフレンドのオブジェクトを編集することができます"/>
- <icon name="permission_edit_mine_icon" tool_tip="このフレンドは、あなたのオブジェクトを編集・削除・取得することができます"/>
- <icon name="permission_map_icon" tool_tip="このフレンドは地図上であなたの位置を表示できます"/>
- <icon name="permission_online_icon" tool_tip="このフレンドはあなたがオンラインにいることを確認できます"/>
+ <icon name="hovered_icon"/>
+ <icon name="selected_icon"/>
+ <text name="avatar_name" value="(読み込んでいます)"/>
+ <text name="last_interaction" value="0秒"/>
+ <icon name="permission_edit_theirs_icon" tool_tip="このフレンドのオブジェクトを編集することができます。"/>
+ <icon name="permission_edit_mine_icon" tool_tip="このフレンドは、あなたのオブジェクトを編集・削除・取得することができます。"/>
+ <icon tool_tip="このフレンドはマップ上であなたの位置を表示できます。" name="permission_map_icon"/>
+ <icon name="permission_online_icon" tool_tip="このフレンドは、あなたのオンライン状況を確認できます。"/>
<button name="info_btn" tool_tip="詳細"/>
- <button name="profile_btn" tool_tip="プロフィールの表示"/>
+ <button name="profile_btn" tool_tip="プロフィールの閲覧"/>
+ <output_monitor name="speaking_indicator" tool_tip="ボイスのボリューム"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_avatar_tag.xml b/indra/newview/skins/default/xui/ja/panel_avatar_tag.xml
index fd91ea97d1..30f0068d3d 100644
--- a/indra/newview/skins/default/xui/ja/panel_avatar_tag.xml
+++ b/indra/newview/skins/default/xui/ja/panel_avatar_tag.xml
@@ -4,9 +4,9 @@
<text name="sender_tag_name">
Angela Tester
</text>
- <text name="tag_time" value="23:30"/>
+ <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/ja/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/ja/panel_block_list_sidetray.xml
index 2fb3206c7d..e32a54cec5 100644
--- a/indra/newview/skins/default/xui/ja/panel_block_list_sidetray.xml
+++ b/indra/newview/skins/default/xui/ja/panel_block_list_sidetray.xml
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="block_list_panel">
<panel label="bottom_panel" name="blocked_buttons_panel">
- <filter_editor label="フィルター" name="blocked_filter_input"/>
+ <filter_editor label="フィルタ" name="blocked_filter_input"/>
<menu_button name="blocked_gear_btn" tool_tip="選択した住人・オブジェクトに対するアクション"/>
<menu_button name="view_btn" tool_tip="オプションを並べ替える"/>
<menu_button name="plus_btn" tool_tip="ブロックする住人・オブジェクトを選択"/>
<button name="unblock_btn" tool_tip="ブロックリストから住人・オブジェクトを削除"/>
</panel>
<text name="block_limit">
- [COUNT] 件のエントリーがブロック リストにあり、制限は [LIMIT] です。
+ [COUNT]件のエントリーが、ブロックリストにあり、制限は[LIMIT]です。
</text>
<block_list name="blocked" tool_tip="現在ブロックされている住人一覧"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/ja/panel_body_parts_list_item.xml
index 95a5a26d4e..e4faad9384 100644
--- a/indra/newview/skins/default/xui/ja/panel_body_parts_list_item.xml
+++ b/indra/newview/skins/default/xui/ja/panel_body_parts_list_item.xml
@@ -1,8 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="wearable_item">
- <text name="item_name" value="..."/>
- <panel name="btn_lock" tool_tip="これを編集する権限がありません"/>
+ <icon name="hovered_icon"/>
+ <icon name="selected_icon"/>
+ <icon name="item_icon"/>
+ <text name="item_name" value="…"/>
+ <panel name="btn_lock" tool_tip="これを編集する権限がありません。">
+ <icon name="btn_lock1"/>
+ </panel>
<panel name="btn_edit_panel">
<button name="btn_edit" tool_tip="このシェイプを編集"/>
</panel>
+ <icon name="wearable_type_separator_icon"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_bodyparts_list_button_bar.xml b/indra/newview/skins/default/xui/ja/panel_bodyparts_list_button_bar.xml
index 42d8a21660..ace9dedad7 100644
--- a/indra/newview/skins/default/xui/ja/panel_bodyparts_list_button_bar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_bodyparts_list_button_bar.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="clothing_list_button_bar_panel">
- <button label="交換" name="switch_btn"/>
- <button label="買い物 &gt;" name="bodyparts_shop_btn"/>
+ <button label="切り替え" name="switch_btn"/>
+ <button name="bodyparts_shop_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/ja/panel_bottomtray_lite.xml
index 6eca8adfe5..57876299fe 100644
--- a/indra/newview/skins/default/xui/ja/panel_bottomtray_lite.xml
+++ b/indra/newview/skins/default/xui/ja/panel_bottomtray_lite.xml
@@ -1,8 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="bottom_tray_lite">
<layout_stack name="toolbar_stack_lite">
+ <layout_panel/>
+ <layout_panel>
+ <panel name="nearby_chat"/>
+ </layout_panel>
<layout_panel name="gesture_panel">
- <gesture_combo_list label="ジェスチャー" name="Gesture" tool_tip="ジェスチャーの表示・非表示"/>
+ <gesture_combo_list label="ジェスチャー" name="Gesture" tool_tip="ジェスチャーの表示/非表示"/>
</layout_panel>
+ <layout_panel name="after_gesture_panel"/>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_camera_preset_item.xml b/indra/newview/skins/default/xui/ja/panel_camera_preset_item.xml
new file mode 100644
index 0000000000..5990c83943
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_camera_preset_item.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="camera_preset_item">
+ <icon name="hovered_icon"/>
+ <icon name="selected_icon"/>
+ <text name="preset_name" value="デフォルト"/>
+ <button name="delete_btn" tool_tip="プリセットを削除"/>
+ <button name="reset_btn" tool_tip="デフォルトのプリセットにリセットします。"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_chat_header.xml b/indra/newview/skins/default/xui/ja/panel_chat_header.xml
index 7916bf5155..98a4e60b9b 100644
--- a/indra/newview/skins/default/xui/ja/panel_chat_header.xml
+++ b/indra/newview/skins/default/xui/ja/panel_chat_header.xml
@@ -1,4 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="im_header" name="im_header">
- <text name="time_box" value="23:30"/>
+ <avatar_icon name="avatar_icon"/>
+ <text name="user_name" value="テスト文字列 無視してください"/>
+ <text name="time_box" value="23:30"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_classified_info.xml b/indra/newview/skins/default/xui/ja/panel_classified_info.xml
index 57a255afde..73d7830697 100644
--- a/indra/newview/skins/default/xui/ja/panel_classified_info.xml
+++ b/indra/newview/skins/default/xui/ja/panel_classified_info.xml
@@ -10,10 +10,10 @@
L$ [PRICE]
</panel.string>
<panel.string name="click_through_text_fmt">
- [TELEPORT] テレポート、 [MAP] 地図、 [PROFILE] プロフィール
+ [TELEPORT]テレポート、[MAP]マップ、[PROFILE]プロフィール
</panel.string>
<panel.string name="date_fmt">
- [year,datetime,slt]/[mthnum,datetime,slt]/[day,datetime,slt]
+ [year,datetime,slt]年[mthnum,datetime,slt]月[day,datetime,slt]日
</panel.string>
<panel.string name="auto_renew_on">
有効
@@ -38,7 +38,7 @@
<layout_stack name="descr_stack">
<layout_panel name="clickthrough_layout_panel">
<text name="click_through_label" value="クリック数:"/>
- <text_editor name="click_through_text" tool_tip="Click through data" value="[clicks]"/>
+ <text_editor name="click_through_text" tool_tip="クリックされた回数" value="[clicks]"/>
</layout_panel>
<layout_panel name="price_layout_panel">
<text name="auto_renew_label" value="自動更新:"/>
@@ -57,7 +57,7 @@
<button label="テレポート" name="teleport_btn"/>
</layout_panel>
<layout_panel name="show_on_map_btn_lp">
- <button label="地図" name="show_on_map_btn"/>
+ <button label="マップ" name="show_on_map_btn"/>
</layout_panel>
<layout_panel name="edit_btn_lp">
<button label="編集" name="edit_btn"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/ja/panel_clothing_list_button_bar.xml
index 2159f17fec..156f475fc6 100644
--- a/indra/newview/skins/default/xui/ja/panel_clothing_list_button_bar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_clothing_list_button_bar.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="clothing_list_button_bar_panel">
- <button label="追加 +" name="add_btn"/>
- <button label="買い物 &gt;" name="clothing_shop_btn"/>
+ <button label="追加+" name="add_btn"/>
+ <button name="clothing_shop_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/ja/panel_clothing_list_item.xml
index 158b2fa6ac..8694637020 100644
--- a/indra/newview/skins/default/xui/ja/panel_clothing_list_item.xml
+++ b/indra/newview/skins/default/xui/ja/panel_clothing_list_item.xml
@@ -1,9 +1,17 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="wearable_item">
- <button name="btn_delete" tool_tip="アウトフィットから取り除く"/>
- <text name="item_name" value="..."/>
- <panel name="btn_lock" tool_tip="これを編集する権限がありません"/>
+ <icon name="hovered_icon"/>
+ <icon name="selected_icon"/>
+ <button name="btn_delete" tool_tip="アウトフィットから削除"/>
+ <icon name="item_icon"/>
+ <text name="item_name" value="…"/>
+ <button name="btn_move_up"/>
+ <button name="btn_move_down"/>
+ <panel name="btn_lock" tool_tip="これを編集する権限がありません">
+ <icon name="btn_lock1"/>
+ </panel>
<panel name="btn_edit_panel">
<button name="btn_edit" tool_tip="この着用物を編集"/>
</panel>
+ <icon name="wearable_type_separator_icon"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_cof_wearables.xml b/indra/newview/skins/default/xui/ja/panel_cof_wearables.xml
index b9bc10c220..dfa9ed058a 100644
--- a/indra/newview/skins/default/xui/ja/panel_cof_wearables.xml
+++ b/indra/newview/skins/default/xui/ja/panel_cof_wearables.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="cof_wearables">
<accordion name="cof_wearables_accordion">
- <accordion_tab name="tab_attachments" title="アタッチメント"/>
- <accordion_tab name="tab_clothing" title="衣類"/>
+ <accordion_tab name="tab_clothing" title="服装"/>
+ <accordion_tab name="tab_attachments" title="装着物"/>
<accordion_tab name="tab_body_parts" title="身体部位"/>
</accordion>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_conversation_list_item.xml b/indra/newview/skins/default/xui/ja/panel_conversation_list_item.xml
index 09ffb92d36..89e7150aa2 100644
--- a/indra/newview/skins/default/xui/ja/panel_conversation_list_item.xml
+++ b/indra/newview/skins/default/xui/ja/panel_conversation_list_item.xml
@@ -1,8 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="conversation_list_item">
+ <icon name="nearby_chat_icon"/>
<layout_stack name="conversation_item_stack">
+ <layout_panel name="call_icon_panel">
+ <icon name="selected_icon"/>
+ </layout_panel>
<layout_panel name="conversation_title_panel">
- <text name="conversation_title" value="(ローディング)"/>
+ <text name="conversation_title" value="(読み込み中)"/>
+ <output_monitor name="speaking_indicator"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_conversation_log_list_item.xml b/indra/newview/skins/default/xui/ja/panel_conversation_log_list_item.xml
index e05a67e31d..070040dc6d 100644
--- a/indra/newview/skins/default/xui/ja/panel_conversation_log_list_item.xml
+++ b/indra/newview/skins/default/xui/ja/panel_conversation_log_list_item.xml
@@ -1,6 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="conversation_log_list_item">
+ <icon name="selected_icon"/>
+ <icon name="hovered_icon"/>
<icon name="voice_session_icon" tool_tip="ボイスチャット"/>
<icon name="unread_ims_icon" tool_tip="ログアウト時に表示されるメッセージ"/>
+ <text name="conversation_name"/>
+ <text name="date_time"/>
<button name="delete_btn" tool_tip="このエントリーを削除"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/ja/panel_deletable_wearable_list_item.xml
index a1e30283ee..7d98a130fc 100644
--- a/indra/newview/skins/default/xui/ja/panel_deletable_wearable_list_item.xml
+++ b/indra/newview/skins/default/xui/ja/panel_deletable_wearable_list_item.xml
@@ -1,5 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="deletable_wearable_item">
- <button name="btn_delete" tool_tip="アウトフィットから取り除く"/>
- <text name="item_name" value="..."/>
+ <icon name="hovered_icon"/>
+ <icon name="selected_icon"/>
+ <button name="btn_delete" tool_tip="アウトフィットから削除"/>
+ <icon name="item_icon"/>
+ <text name="item_name" value="…"/>
+ <icon name="wearable_type_separator_icon"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/ja/panel_dummy_clothing_list_item.xml
index 0395d4edd8..f38f1f5b5c 100644
--- a/indra/newview/skins/default/xui/ja/panel_dummy_clothing_list_item.xml
+++ b/indra/newview/skins/default/xui/ja/panel_dummy_clothing_list_item.xml
@@ -1,7 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="dummy_clothing_item">
- <text name="item_name" value="..."/>
+ <icon name="hovered_icon"/>
+ <icon name="selected_icon"/>
+ <icon name="item_icon"/>
+ <text name="item_name" value="…"/>
<panel name="btn_add_panel">
- <button name="btn_add" tool_tip="この種類のアイテムを追加する"/>
+ <button name="btn_add" tool_tip="この種類のアイテムを追加する。"/>
</panel>
+ <icon name="wearable_type_separator_icon"/>
+ <text name="item_name"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml b/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml
index 7250da69a4..57b32172ac 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml
@@ -2,11 +2,16 @@
<panel name="edit_alpha_panel">
<scroll_container name="avatar_alpha_color_panel_scroll">
<panel name="avatar_alpha_color_panel">
- <texture_picker label="アルファ(下)" name="Lower Alpha" tool_tip="クリックして写真を選択します"/>
- <texture_picker label="アルファ(上)" name="Upper Alpha" tool_tip="クリックして写真を選択します"/>
- <texture_picker label="頭部のアルファ" name="Head Alpha" tool_tip="クリックして写真を選択します"/>
- <texture_picker label="目のアルファ" name="Eye Alpha" tool_tip="クリックして写真を選択します"/>
- <texture_picker label="髪のアルファ" name="Hair Alpha" tool_tip="クリックして写真を選択します"/>
+ <check_box name="lower alpha texture invisible"/>
+ <texture_picker label="アルファ(下半身)" name="Lower Alpha" tool_tip="クリックで画像を選択できます。"/>
+ <check_box name="upper alpha texture invisible"/>
+ <texture_picker label="アルファ(上半身)" name="Upper Alpha" tool_tip="クリックで画像を選択できます。"/>
+ <check_box name="head alpha texture invisible"/>
+ <texture_picker label="頭部のアルファ" name="Head Alpha" tool_tip="クリックで画像を選択できます。"/>
+ <check_box name="eye alpha texture invisible"/>
+ <texture_picker label="瞳のアルファ" name="Eye Alpha" tool_tip="クリックで画像を選択できます。"/>
+ <check_box name="hair alpha texture invisible"/>
+ <texture_picker label="髪のアルファ" name="Hair Alpha" tool_tip="クリックで画像を選択できます。"/>
</panel>
</scroll_container>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_eyes.xml b/indra/newview/skins/default/xui/ja/panel_edit_eyes.xml
index 94967999a1..773e9ed5c5 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_eyes.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_eyes.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_eyes_panel">
<panel name="avatar_eye_color_panel">
- <texture_picker label="瞳" name="Iris" tool_tip="クリックして写真を選択します"/>
+ <texture_picker label="瞳" name="Iris" tool_tip="クリックして画像を選択します"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_gloves.xml b/indra/newview/skins/default/xui/ja/panel_edit_gloves.xml
index 72eb120c3d..41e28d9095 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_gloves.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_gloves.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_gloves_panel">
<panel name="avatar_gloves_color_panel">
- <texture_picker label="テクスチャ" name="Fabric" tool_tip="クリックして写真を選択します"/>
- <color_swatch label="色・色彩配合" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
+ <texture_picker label="テクスチャ" name="Fabric" tool_tip="クリックして画像を選択します"/>
+ <color_swatch label="色/明暗" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_hair.xml b/indra/newview/skins/default/xui/ja/panel_edit_hair.xml
index f73f760192..4254ea9ca5 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_hair.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_hair.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_hair_panel">
<panel name="avatar_hair_color_panel">
- <texture_picker label="テクスチャ" name="Texture" tool_tip="クリックして写真を選択"/>
+ <texture_picker label="テクスチャ" name="Texture" tool_tip="クリックして画像を選択"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_jacket.xml b/indra/newview/skins/default/xui/ja/panel_edit_jacket.xml
index ee39e9435c..8ba5ae1cb6 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_jacket.xml
@@ -1,13 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_jacket_panel">
<panel name="avatar_jacket_color_panel">
- <texture_picker label="上半身のテクスチャ" name="Upper Fabric" tool_tip="クリックして写真を選択します"/>
- <texture_picker label="下半身のテクスチャ" name="Lower Fabric" tool_tip="クリックして写真を選択します"/>
- <color_swatch label="色・色彩配合" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
+ <texture_picker label="上部テクスチャ" name="Upper Fabric" tool_tip="クリックして画像を選択します。"/>
+ <texture_picker label="下部テクスチャ" name="Lower Fabric" tool_tip="クリックして画像を選択します。"/>
+ <color_swatch label="色/明暗" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます。"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
- <accordion_tab name="jacket_main_tab" title="ジャケット"/>
+ <accordion_tab name="jacket_main_tab" title="ジャケット">
+ <scrolling_panel_list name="jacket_main_param_list"/>
+ </accordion_tab>
</accordion>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_pants.xml b/indra/newview/skins/default/xui/ja/panel_edit_pants.xml
index 6a1789c9f4..cdefed7865 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_pants.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_pants.xml
@@ -1,12 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_pants_panel">
<panel name="avatar_pants_color_panel">
- <texture_picker label="テクスチャ" name="Fabric" tool_tip="クリックして写真を選択します"/>
- <color_swatch label="色・色彩配合" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
+ <texture_picker label="テクスチャ" name="Fabric" tool_tip="クリックして画像を選択します"/>
+ <color_swatch label="色/明暗" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
- <accordion_tab name="pants_main_tab" title="パンツ"/>
+ <accordion_tab name="pants_main_tab" title="ズボン">
+ <scrolling_panel_list name="pants_main_param_list"/>
+ </accordion_tab>
</accordion>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_physics.xml b/indra/newview/skins/default/xui/ja/panel_edit_physics.xml
index 6ebf0062dc..54ad79568f 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_physics.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_physics.xml
@@ -2,13 +2,27 @@
<panel name="edit_physics_panel">
<panel label="" name="accordion_panel">
<accordion name="physics_accordion">
- <accordion_tab name="physics_breasts_updown_tab" title="胸の弾み"/>
- <accordion_tab name="physics_breasts_inout_tab" title="胸の谷間"/>
- <accordion_tab name="physics_breasts_leftright_tab" title="胸の揺れ"/>
- <accordion_tab name="physics_belly_tab" title="お腹の弾み"/>
- <accordion_tab name="physics_butt_tab" title="お尻の弾み"/>
- <accordion_tab name="physics_butt_leftright_tab" title="お尻の揺れ"/>
- <accordion_tab name="physics_advanced_tab" title="高度なパラメーター"/>
+ <accordion_tab name="physics_breasts_updown_tab" title="胸の弾み">
+ <scrolling_panel_list name="physics_breasts_updown_param_list"/>
+ </accordion_tab>
+ <accordion_tab name="physics_breasts_inout_tab" title="胸の谷間">
+ <scrolling_panel_list name="physics_breasts_inout_param_list"/>
+ </accordion_tab>
+ <accordion_tab name="physics_breasts_leftright_tab" title="胸の揺れ">
+ <scrolling_panel_list name="physics_breasts_leftright_param_list"/>
+ </accordion_tab>
+ <accordion_tab name="physics_belly_tab" title="お腹の弾み">
+ <scrolling_panel_list name="physics_belly_updown_param_list"/>
+ </accordion_tab>
+ <accordion_tab name="physics_butt_tab" title="お尻の弾み">
+ <scrolling_panel_list name="physics_butt_updown_param_list"/>
+ </accordion_tab>
+ <accordion_tab name="physics_butt_leftright_tab" title="お尻の揺れ">
+ <scrolling_panel_list name="physics_butt_leftright_param_list"/>
+ </accordion_tab>
+ <accordion_tab name="physics_advanced_tab" title="高度なパラメーター">
+ <scrolling_panel_list name="physics_advanced_param_list"/>
+ </accordion_tab>
</accordion>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_shape.xml b/indra/newview/skins/default/xui/ja/panel_edit_shape.xml
index 5a3a949150..a711cd78c6 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_shape.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_shape.xml
@@ -12,15 +12,33 @@
<text name="avatar_height"/>
<panel label="シャツ" name="accordion_panel">
<accordion name="wearable_accordion">
- <accordion_tab name="shape_body_tab" title="身体"/>
- <accordion_tab name="shape_head_tab" title="頭"/>
- <accordion_tab name="shape_eyes_tab" title="目"/>
- <accordion_tab name="shape_ears_tab" title="耳"/>
- <accordion_tab name="shape_nose_tab" title="鼻"/>
- <accordion_tab name="shape_mouth_tab" title="口"/>
- <accordion_tab name="shape_chin_tab" title="あご"/>
- <accordion_tab name="shape_torso_tab" title="上半身"/>
- <accordion_tab name="shape_legs_tab" title="脚"/>
+ <accordion_tab name="shape_body_tab" title="身体">
+ <scrolling_panel_list name="shape_body_param_list"/>
+ </accordion_tab>
+ <accordion_tab name="shape_head_tab" title="頭">
+ <scrolling_panel_list name="shape_head_param_list"/>
+ </accordion_tab>
+ <accordion_tab name="shape_eyes_tab" title="目">
+ <scrolling_panel_list name="shape_eyes_param_list"/>
+ </accordion_tab>
+ <accordion_tab name="shape_ears_tab" title="耳">
+ <scrolling_panel_list name="shape_ears_param_list"/>
+ </accordion_tab>
+ <accordion_tab name="shape_nose_tab" title="鼻">
+ <scrolling_panel_list name="shape_nose_param_list"/>
+ </accordion_tab>
+ <accordion_tab name="shape_mouth_tab" title="口">
+ <scrolling_panel_list name="shape_mouth_param_list"/>
+ </accordion_tab>
+ <accordion_tab name="shape_chin_tab" title="あご">
+ <scrolling_panel_list name="shape_chin_param_list"/>
+ </accordion_tab>
+ <accordion_tab name="shape_torso_tab" title="上半身">
+ <scrolling_panel_list name="shape_torso_param_list"/>
+ </accordion_tab>
+ <accordion_tab name="shape_legs_tab" title="脚">
+ <scrolling_panel_list name="shape_legs_param_list"/>
+ </accordion_tab>
</accordion>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_shirt.xml b/indra/newview/skins/default/xui/ja/panel_edit_shirt.xml
index f33daa4eba..b75def6a64 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_shirt.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_shirt.xml
@@ -1,12 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shirt_panel">
<panel name="avatar_shirt_color_panel">
- <texture_picker label="テクスチャ" name="Fabric" tool_tip="クリックして写真を選択"/>
- <color_swatch label="色・色彩配合" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
+ <texture_picker label="テクスチャ" name="Fabric" tool_tip="クリックして画像を選択"/>
+ <color_swatch label="色/明暗" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きで色を選択"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
- <accordion_tab name="shirt_main_tab" title="シャツ"/>
+ <accordion_tab name="shirt_main_tab" title="シャツ">
+ <scrolling_panel_list name="shirt_main_param_list"/>
+ </accordion_tab>
</accordion>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_shoes.xml b/indra/newview/skins/default/xui/ja/panel_edit_shoes.xml
index c7626189af..bac634ba20 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_shoes.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_shoes.xml
@@ -1,12 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shoes_panel">
<panel name="avatar_shoes_color_panel">
- <texture_picker label="テクスチャ" name="Fabric" tool_tip="クリックして写真を選択します"/>
- <color_swatch label="色・色彩配合" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
+ <texture_picker label="テクスチャ" name="Fabric" tool_tip="クリックして画像を選択します"/>
+ <color_swatch label="色/明暗" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
- <accordion_tab name="shoes_main_tab" title="靴"/>
+ <accordion_tab name="shoes_main_tab" title="靴">
+ <scrolling_panel_list name="shoes_main_param_list"/>
+ </accordion_tab>
</accordion>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_skin.xml b/indra/newview/skins/default/xui/ja/panel_edit_skin.xml
index 7573132576..db0cb1e97a 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_skin.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skin_panel">
<panel name="avatar_skin_color_panel">
- <texture_picker label="頭" name="Head" tool_tip="クリックして写真を選択します"/>
- <texture_picker label="上半身" name="Upper Body" tool_tip="クリックして写真を選択します"/>
- <texture_picker label="下半身" name="Lower Body" tool_tip="クリックして写真を選択します"/>
+ <texture_picker label="頭" name="Head" tool_tip="クリックして画像を選択します"/>
+ <texture_picker label="上半身" name="Upper Body" tool_tip="クリックして画像を選択します"/>
+ <texture_picker label="下半身" name="Lower Body" tool_tip="クリックして画像を選択します"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_skirt.xml b/indra/newview/skins/default/xui/ja/panel_edit_skirt.xml
index 6efc4ce99a..01658bf0fd 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_skirt.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_skirt.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skirt_panel">
<panel name="avatar_skirt_color_panel">
- <texture_picker label="テクスチャ" name="Fabric" tool_tip="クリックして写真を選択"/>
- <color_swatch label="色・色彩配合" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
+ <texture_picker label="テクスチャ" name="Fabric" tool_tip="クリックして画像を選択"/>
+ <color_swatch label="色/明暗" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_socks.xml b/indra/newview/skins/default/xui/ja/panel_edit_socks.xml
index 71fc7c5682..bfb04cbe49 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_socks.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_socks.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_socks_panel">
<panel name="avatar_socks_color_panel">
- <texture_picker label="テクスチャ" name="Fabric" tool_tip="クリックして写真を選択します"/>
- <color_swatch label="色・色彩配合" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
+ <texture_picker label="テクスチャ" name="Fabric" tool_tip="クリックして画像を選択します"/>
+ <color_swatch label="色/明暗" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/ja/panel_edit_tattoo.xml
index 5729cb7552..f5e3dd348d 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_tattoo.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_tattoo.xml
@@ -2,9 +2,9 @@
<panel name="edit_tattoo_panel">
<scroll_container name="avatar_tattoo_scroll">
<panel name="avatar_tattoo_color_panel">
- <texture_picker label="頭部のタトゥー" name="Head Tattoo" tool_tip="クリックして写真を選択する"/>
- <texture_picker label="上部のタトゥー" name="Upper Tattoo" tool_tip="クリックして写真を選択する"/>
- <texture_picker label="下部のタトゥー" name="Lower Tattoo" tool_tip="クリックして写真を選択する"/>
+ <texture_picker label="頭部のタトゥ" name="Head Tattoo" tool_tip="クリックして画像を選択する"/>
+ <texture_picker label="上半身のタトゥ" name="Upper Tattoo" tool_tip="クリックして画像を選択する"/>
+ <texture_picker label="下半身のタトゥ" name="Lower Tattoo" tool_tip="クリックして画像を選択する"/>
<color_swatch label="色/明暗" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
</panel>
</scroll_container>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_underpants.xml b/indra/newview/skins/default/xui/ja/panel_edit_underpants.xml
index f345a81922..a269fec582 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_underpants.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_underpants.xml
@@ -1,12 +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="テクスチャ" name="Fabric" tool_tip="クリックして写真を選択します"/>
- <color_swatch label="色・色彩配合" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
+ <texture_picker label="テクスチャ" name="Fabric" tool_tip="クリックして画像を選択します"/>
+ <color_swatch label="色/明暗" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
- <accordion_tab name="underpants_main_tab" title="下着パンツ"/>
+ <accordion_tab name="underpants_main_tab" title="下着(下半身)"/>
</accordion>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml
index 66b2ffa8ba..e11bc45541 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml
@@ -1,12 +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="テクスチャ" name="Fabric" tool_tip="クリックして写真を選択します"/>
- <color_swatch label="色・色彩配合" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
+ <texture_picker label="テクスチャ" name="Fabric" tool_tip="クリックして画像を選択します"/>
+ <color_swatch label="色/明暗" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
</panel>
<panel name="accordion_panel">
<accordion name="wearable_accordion">
- <accordion_tab name="undershirt_main_tab" title="下着シャツ"/>
+ <accordion_tab name="undershirt_main_tab" title="下着(上半身)"/>
</accordion>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_universal.xml b/indra/newview/skins/default/xui/ja/panel_edit_universal.xml
index 614fd1059f..fd5fe80848 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_universal.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_universal.xml
@@ -2,17 +2,17 @@
<panel name="edit_universal_panel">
<scroll_container name="avatar_universal_scroll">
<panel name="avatar_universal_color_panel">
- <texture_picker label="頭部のタトゥー" name="Head Universal Tattoo" tool_tip="クリックして写真を選択する"/>
- <texture_picker label="上部のタトゥー" name="Upper Universal Tattoo" tool_tip="クリックして写真を選択する"/>
- <texture_picker label="下部のタトゥー" name="Lower Universal Tattoo" tool_tip="クリックして写真を選択する"/>
- <texture_picker label="スカートのタトゥー" name="Skirt Tattoo" tool_tip="クリックして写真を選択する"/>
- <texture_picker label="髪の毛のタトゥー" name="Hair Tattoo" tool_tip="クリックして写真を選択する"/>
- <texture_picker label="目のタトゥー" name="Eyes Tattoo" tool_tip="クリックして写真を選択する"/>
- <texture_picker label="左腕のタトゥー" name="Left Arm Tattoo" tool_tip="クリックして写真を選択する"/>
- <texture_picker label="左脚のタトゥー" name="Left Leg Tattoo" tool_tip="クリックして写真を選択する"/>
- <texture_picker label="Aux1 のタトゥー" name="Aux1 Tattoo" tool_tip="クリックして写真を選択する"/>
- <texture_picker label="Aux2 のタトゥー" name="Aux2 Tattoo" tool_tip="クリックして写真を選択する"/>
- <texture_picker label="Aux3 のタトゥー" name="Aux3 Tattoo" tool_tip="クリックして写真を選択する"/>
+ <texture_picker label="頭部のタトゥ" name="Head Universal Tattoo" tool_tip="クリックして画像を選択する"/>
+ <texture_picker label="上部のタトゥ" name="Upper Universal Tattoo" tool_tip="クリックして画像を選択する"/>
+ <texture_picker label="下部のタトゥ" name="Lower Universal Tattoo" tool_tip="クリックして画像を選択する"/>
+ <texture_picker label="スカートのタトゥ" name="Skirt Tattoo" tool_tip="クリックして画像を選択する"/>
+ <texture_picker label="髪の毛のタトゥ" name="Hair Tattoo" tool_tip="クリックして画像を選択する"/>
+ <texture_picker label="目のタトゥ" name="Eyes Tattoo" tool_tip="クリックして画像を選択する"/>
+ <texture_picker label="左腕のタトゥ" name="Left Arm Tattoo" tool_tip="クリックして画像を選択する"/>
+ <texture_picker label="左脚のタトゥ" name="Left Leg Tattoo" tool_tip="クリックして画像を選択する"/>
+ <texture_picker label="予備1のタトゥ" name="Aux1 Tattoo" tool_tip="クリックして画像を選択する"/>
+ <texture_picker label="予備2のタトゥ" name="Aux2 Tattoo" tool_tip="クリックして画像を選択する"/>
+ <texture_picker label="予備3のタトゥ" name="Aux3 Tattoo" tool_tip="クリックして画像を選択する"/>
<color_swatch label="色/明暗" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
</panel>
</scroll_container>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml b/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml
index 9101920f1b..2533c976da 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml
@@ -34,19 +34,19 @@
手袋を編集中
</string>
<string name="edit_undershirt_title">
- 下着(上)を編集中
+ 下着(上半身)を編集中
</string>
<string name="edit_underpants_title">
- 下着(下)を編集中
+ 下着(下半身)を編集中
</string>
<string name="edit_alpha_title">
アルファマスクを編集中
</string>
<string name="edit_tattoo_title">
- タトゥーを編集中
+ タトゥを編集中
</string>
<string name="edit_universal_title">
- ユニバーサルを編集中
+ 全般を編集中
</string>
<string name="edit_physics_title">
物理作用の編集中
@@ -67,7 +67,7 @@
シャツ:
</string>
<string name="pants_desc_text">
- パンツ:
+ ズボン:
</string>
<string name="shoes_desc_text">
靴:
@@ -85,10 +85,10 @@
手袋:
</string>
<string name="undershirt_desc_text">
- 下着シャツ:
+ 下着(上半身):
</string>
<string name="underpants_desc_text">
- 下着パンツ:
+ 下着(下半身):
</string>
<string name="alpha_desc_text">
アルファマスク:
@@ -97,7 +97,7 @@
タトゥ:
</string>
<string name="universal_desc_text">
- ユニバーサル:
+ 全般:
</string>
<string name="physics_desc_text">
物理作用:
@@ -116,7 +116,7 @@
<panel name="button_panel">
<layout_stack name="button_panel_ls">
<layout_panel name="save_as_btn_lp">
- <button label="別名で保存" name="save_as_button"/>
+ <button label="名前をつけて保存" name="save_as_button"/>
</layout_panel>
<layout_panel name="revert_btn_lp">
<button label="変更を元に戻す" name="revert_button"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_experience_info.xml b/indra/newview/skins/default/xui/ja/panel_experience_info.xml
index b3a17fcb56..ee37bf971e 100644
--- a/indra/newview/skins/default/xui/ja/panel_experience_info.xml
+++ b/indra/newview/skins/default/xui/ja/panel_experience_info.xml
@@ -1,11 +1,17 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_experience_info">
- <text name="title" value="体験プロフィール"/>
+ <text name="title" value="体験のプロフィール"/>
<scroll_container name="xp_scroll">
<panel name="scrolling_panel">
- <layout_stack>
- <layout_panel>
- <text name="experience_title" value="Kyle&apos;s Superhero RPG"/>
+ <layout_stack name="ls1">
+ <layout_panel name="image_panel">
+ <texture_picker name="logo"/>
+ </layout_panel>
+ <layout_panel name="title panel">
+ <text name="experience_title" value="カイルのスーパーヒーローRPG"/>
+ </layout_panel>
+ <layout_panel name="description panel">
+ <expandable_text name="experience_description"/>
</layout_panel>
<layout_panel name="location panel">
<text name="Location">
@@ -15,7 +21,7 @@
どこか
</text>
<button label="テレポート" name="teleport_btn"/>
- <button label="地図" name="map_btn"/>
+ <button label="マップ" name="map_btn"/>
</layout_panel>
<layout_panel name="marketplace panel">
<text name="Location">
@@ -25,9 +31,9 @@
どこか
</text>
</layout_panel>
- <layout_panel>
+ <layout_panel name="details panel">
<text name="ContentRating">
- 評価:
+ レーティング:
</text>
<text name="ContentRatingText">
Adult
@@ -36,7 +42,7 @@
所有者:
</text>
<text name="OwnerText">
- Kyle
+ カイル
</text>
<button label="編集" name="edit_btn"/>
</layout_panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_experience_list_editor.xml b/indra/newview/skins/default/xui/ja/panel_experience_list_editor.xml
index 84e60aea56..2419849800 100644
--- a/indra/newview/skins/default/xui/ja/panel_experience_list_editor.xml
+++ b/indra/newview/skins/default/xui/ja/panel_experience_list_editor.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="experince_list_editor">
<panel.string name="loading">
- ローディング...
+ 読み込んでいます…
</panel.string>
<panel.string name="panel_allowed">
許可された体験:
@@ -13,7 +13,7 @@
キー体験:
</panel.string>
<panel.string name="no_results">
- (空)
+ (空)
</panel.string>
<text name="text_name">
体験リスト
@@ -21,7 +21,7 @@
<scroll_list name="experience_list">
<columns label="名前" name="experience_name"/>
</scroll_list>
- <button label="追加..." name="btn_add"/>
+ <button label="追加…" name="btn_add"/>
<button label="削除" name="btn_remove"/>
- <button label="プロフィール..." name="btn_profile"/>
+ <button label="プロフィール…" name="btn_profile"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_experience_list_item.xml b/indra/newview/skins/default/xui/ja/panel_experience_list_item.xml
index d72d2bebf6..922404dab4 100644
--- a/indra/newview/skins/default/xui/ja/panel_experience_list_item.xml
+++ b/indra/newview/skins/default/xui/ja/panel_experience_list_item.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Experiences">
+<panel name="panel_experience_list_item" label="体験一覧">
<text name="experience_name">
ダミー名
</text>
diff --git a/indra/newview/skins/default/xui/ja/panel_experience_log.xml b/indra/newview/skins/default/xui/ja/panel_experience_log.xml
index 16976df035..541a1e34cf 100644
--- a/indra/newview/skins/default/xui/ja/panel_experience_log.xml
+++ b/indra/newview/skins/default/xui/ja/panel_experience_log.xml
@@ -1,24 +1,25 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="EVENTS">
- <string name="no_events" value="イベントなし。"/>
- <string name="loading" value="ローディング..."/>
- <layout_stack>
- <layout_panel>
+<panel name="panel_experience_log" label="イベント">
+ <string name="no_events" value="イベントはありません。"/>
+ <string name="loading" value="読み込んでいます…。"/>
+ <layout_stack name="ls1">
+ <layout_panel name="list panel">
<scroll_list name="experience_log_list">
- <columns label="時間" name="time"/>
- <columns label="イベント" name="event"/>
- <columns label="体験" name="experience_name"/>
- <columns label="オブジェクト" name="object_name"/>
+ <columns name="time" label="時間"/>
+ <columns name="event" label="イベント"/>
+ <columns name="experience_name" label="体験"/>
+ <columns name="object_name" label="オブジェクト"/>
</scroll_list>
- <button label="知らせる" name="btn_notify"/>
- <button label="プロフィール" name="btn_profile_xp"/>
- <button label="報告" name="btn_report_xp"/>
+ <button name="btn_notify" label="通知"/>
+ <button name="btn_profile_xp" label="プロフィール"/>
+ <button name="btn_report_xp" label="報告"/>
</layout_panel>
<layout_panel name="button_panel">
- <check_box label="すべてのイベント 日数を通知" name="notify_all"/>
- <button label="クリア" name="btn_clear"/>
- <button label="&lt;" name="btn_prev"/>
- <button label="&gt;" name="btn_next"/>
+ <check_box label="すべてのイベント日数を通知" name="notify_all"/>
+ <spinner name="logsizespinner"/>
+ <button name="btn_clear" label="クリア"/>
+ <button name="btn_prev" label="⇦"/>
+ <button name="btn_next" label="⇨"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_experience_search.xml b/indra/newview/skins/default/xui/ja/panel_experience_search.xml
index 9ab84e7d18..da8d09f1ae 100644
--- a/indra/newview/skins/default/xui/ja/panel_experience_search.xml
+++ b/indra/newview/skins/default/xui/ja/panel_experience_search.xml
@@ -1,41 +1,50 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="SEARCH">
+<panel name="panel_experience_search" label="検索">
<string name="not_found">
- 「[TEXT]」は見つかりませんでした
+ 「[TEXT]」は見つかりませんでした。
</string>
<string name="no_results">
- 検索結果:ゼロ
+ 検索結果:なし
</string>
<string name="searching">
- 検索中...
+ 検索しています…。
</string>
<string name="loading">
- ロード中...
+ 読み込みんでいます…。
</string>
<string name="maturity_icon_general">
- &quot;Parcel_PG_Light&quot;
+ "Parcel_PG_Light"
</string>
<string name="maturity_icon_moderate">
- &quot;Parcel_M_Light&quot;
+ "Parcel_M_Light"
</string>
<string name="maturity_icon_adult">
- &quot;Parcel_R_Light&quot;
+ "Parcel_R_Light"
</string>
<panel name="search_panel">
+ <text name="lbl name part">
+ 名前の一部を入力してください:
+ </text>
+ <line_editor name="edit"/>
<button label="進む" name="find"/>
+ <text name="lbl max content rating">
+ コンテンツの最大レーティング:
+ </text>
<icons_combo_box label="Moderate" name="maturity">
+ <icons_combo_box.drop_down_button/>
<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.item label="General" name="PG" value="13"/>
</icons_combo_box>
<scroll_list name="search_results">
- <columns label="名前" name="experience_name"/>
- <columns label="所有者" name="owner"/>
+ <columns name="maturity" label=""/>
+ <columns name="experience_name" label="名前"/>
+ <columns name="owner" label="所有者"/>
</scroll_list>
- <button label="OK" label_selected="OK" name="ok_btn"/>
- <button label="取り消し" name="cancel_btn"/>
- <button label="プロフィールを表示" name="profile_btn"/>
- <button label="&lt;" name="left_btn"/>
- <button label="&gt;" name="right_btn"/>
+ <button label="OK" label_selected="OK" name="ok_btn"/>
+ <button label="キャンセル" name="cancel_btn"/>
+ <button label="プロフィール表示" name="profile_btn"/>
+ <button label="⇦" name="left_btn"/>
+ <button label="⇨" name="right_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_experiences.xml b/indra/newview/skins/default/xui/ja/panel_experiences.xml
index ab0d2a97a4..11bbf784b3 100644
--- a/indra/newview/skins/default/xui/ja/panel_experiences.xml
+++ b/indra/newview/skins/default/xui/ja/panel_experiences.xml
@@ -1,6 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Experiences">
- <string name="loading_experiences" value="体験をロード中..."/>
- <string name="no_experiences" value="体験がありません。"/>
- <string name="acquire" value="体験を取得"/>
+<panel name="panel_experiences" label="体験">
+ <string name="loading_experiences" value="体験を読み込んでいます…"/>
+ <string name="no_experiences" value="体験はありません。"/>
+ <string name="acquire" value="体験する"/>
+ <layout_stack>
+ <layout_panel>
+ <flat_list_view name="experiences_list"/>
+ </layout_panel>
+ <layout_panel name="button_panel">
+ <button name="btn_action"/>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_facebook_account.xml b/indra/newview/skins/default/xui/ja/panel_facebook_account.xml
deleted file mode 100644
index 5269e5a2da..0000000000
--- a/indra/newview/skins/default/xui/ja/panel_facebook_account.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<panel name="panel_facebook_account">
- <string name="facebook_connected" value="次のユーザーとして Facebook に接続:"/>
- <string name="facebook_disconnected" value="Facebook に接続していません"/>
- <text name="account_caption_label">
- Facebook に接続していません。
- </text>
- <panel name="panel_buttons">
- <button label="接続..." name="connect_btn"/>
- <button label="切断" name="disconnect_btn"/>
- <text name="account_learn_more_label">
- [http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Share-Facebook/ta-p/2149711 Facebook への投稿について]
- </text>
- </panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_bulk_ban.xml b/indra/newview/skins/default/xui/ja/panel_group_bulk_ban.xml
index 343db03030..962d69c67c 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_bulk_ban.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_bulk_ban.xml
@@ -1,41 +1,41 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="住人を立入禁止" name="bulk_ban_panel">
+<panel label="住人をバン" name="bulk_ban_panel">
<panel.string name="loading">
- (ロード中...)
+ (読み込んでいます…)
</panel.string>
<panel.string name="ban_selection_too_large">
- グループへの立入禁止が送信されていません: 選択した住人が多すぎます。グループへの立入禁止の数は 1 リクエスト当たり 100 人に制限されています。
+ グループのバンが送信されていません:選択した住人が多すぎます。グループへの立入禁止の数は1リクエスト当たり100人に制限されています。
</panel.string>
<panel.string name="ban_not_permitted">
- グループへの立入禁止が送信されていません: 「立入禁止リストの管理」の能力がありません。
+ グループのバンが送信されていません:「立入禁止リストの管理」の能力がありません。
</panel.string>
<panel.string name="ban_limit_fail">
- グループへの立入禁止が送信されていません: グループへの立入禁止の登録許容数に達しました。
+ グループのバンが送信されていません:グループへの立入禁止の登録許容数に達しました。
</panel.string>
<panel.string name="partial_ban">
- グループへの立入禁止の一部が送信されませんでした: [REASONS]
+ グループのバンが送信されていません:[REASONS]
</panel.string>
<panel.string name="ban_failed">
- グループへの立入禁止が送信されませんでした: [REASONS]
+ グループのバンが送信されていません:[REASONS]
</panel.string>
<panel.string name="residents_already_banned">
- - 次の住民は既に立入禁止にされています: [RESIDENTS]。
+ ・次の住民は既にバンされています:[RESIDENTS]
</panel.string>
<panel.string name="ban_limit_reached">
- - 立入禁止の許容値に達しました。次のエージェントは立入禁止にされません: [RESIDENTS]。
+ ・バンの上限人数に達しました。次のエージェントは立入禁止にされません:[RESIDENTS]
</panel.string>
<panel.string name="cant_ban_yourself">
- - グループから自分自身を立入禁止にすることはできません。
+ ・グループから自分自身をバンにすることはできません。
</panel.string>
<text name="help_text">
- グループから一度に複数の住人を立入禁止にすることができます。「リストから住人を選択」をクリックしてください。
+ グループから複数の住人を一括でバンすることができます。「リストから住人を選択」をクリックしてください。
</text>
<button label="リストから住人を選択" name="add_button"/>
- <name_list name="banned_agent_list" tool_tip="Ctrl キーを押しながら複数の住人をクリックできます"/>
- <button label="選択した住人をリストから削除" name="remove_button" tool_tip="立入禁止リストから上で選択した住人を削除します"/>
- <button label="住人を立入禁止" name="ban_button"/>
- <button label="取り消し" name="cancel_button"/>
+ <name_list name="banned_agent_list" tool_tip="Ctrlキーを押しながらクリックすることで複数の住人を選択できます。"/>
+ <button label="選択した住人をリストから削除" name="remove_button" tool_tip="バンリストから、選択した住人を削除します。"/>
+ <button label="住人をバン" name="ban_button"/>
+ <button label="キャンセル" name="cancel_button"/>
<string name="GroupBulkBan">
- グループへの立入禁止
+ グループから一括バン
</string>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_control_panel.xml b/indra/newview/skins/default/xui/ja/panel_group_control_panel.xml
deleted file mode 100644
index 49749732c9..0000000000
--- a/indra/newview/skins/default/xui/ja/panel_group_control_panel.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?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="グループプロフィール" name="group_info_btn"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="グループコール" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="コール終了" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="ボイスコントロールを開く" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_creation_sidetray.xml b/indra/newview/skins/default/xui/ja/panel_group_creation_sidetray.xml
index d771751293..42e3b0050e 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_creation_sidetray.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_creation_sidetray.xml
@@ -1,30 +1,60 @@
-<?xml version="1.0" ?>
-<panel name="GroupCreation" label="グループ作成">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="グループ作成" name="GroupCreation">
+ <panel.string name="current_membership">
+ (あなたのメンバーシップ)
+ </panel.string>
<panel name="group_info_top">
- <line_editor name="group_name_editor" label="ここにグループ名を入力する"/>
+ <line_editor label="グループ名をここに入力してください。" name="group_name_editor"/>
</panel>
- <layout_panel name="group_info"/>
<layout_stack name="layout">
- <texture_picker name="insignia" tool_tip="クリックして写真を選択すする"/>
- <text_editor name="charter">グループ チャーター</text_editor>
- <button name="back" tool_tip="グループのリストに戻る"/>
- <text name="info_deletion">ご注意:7 日後、メンバーのいないグループ(作成者以外)は削除されます。</text>
- <check_box name="check_enrollment_fee" label="参加費用" tool_tip="グループへの参加費用の有無を設定する"/>
- <combo_box.item name="pg" label="一般的なコンテンツ"/>
- <scroll_list.rows name="basic" value="ベーシック(プレースホルダー)"/>
- <button name="btn_create" label="L$ [COST] でグループを作成する" tool_tip="新しいグループを作成する"/>
- <text name="fee_information">グループ作成費用は会員レベルにより異なります。[https://secondlife.com/my/account/membership.php 詳細]</text>
- <scroll_list.rows name="premium" value="プレミアム(プレースホルダー)"/>
- <check_box name="open_enrollement" label="どなたでも参加できます" tool_tip="招待されていない新メンバーがこのグループに参加できるように設定する。"/>
- <combo_item name="select_mature">- 成熟度評価を選択する -</combo_item>
- <spinner name="spin_enrollment_fee" label="L$" tool_tip="新メンバーは参加費用が確認された際、グループ参加費用を支払う必要があります。"/>
- <combo_box.item name="mature" label="控えめなコンテンツ"/>
+ <layout_panel name="group_info">
+ <panel name="group_info_top">
+ <texture_picker name="insignia" tool_tip="クリックして写真を選択"/>
+ <text_editor name="charter">
+ グループ憲章
+ </text_editor>
+ </panel>
+ <panel name="preferences_container">
+ <check_box label="誰でも加入可能" name="open_enrollement" tool_tip="このグループが招待なしで、新しいメンバーに参加できるようにするかどうかを設定します。"/>
+ <check_box label="入会費" name="check_enrollment_fee" tool_tip="グループへへの加入に入会費が必要かどうかを設定します。"/>
+ <spinner name="spin_enrollment_fee" tool_tip="登録料がチェックされている場合、新しいメンバーはグループに参加するためにこの料金を支払う必要があります。"/>
+ <combo_box name="group_mature_check" tool_tip="レーティングは、グループで許可されるコンテンツと行動のタイプを指定します。">
+ <combo_item name="select_mature" value="Select">
+ -レーティングの選択-
+ </combo_item>
+ <combo_box.item label="Moderateコンテンツ" name="mature" value="Mature"/>
+ <combo_box.item label="Generalコンテンツ" name="pg" value="Not Mature"/>
+ </combo_box>
+ </panel>
+ </layout_panel>
+ <layout_panel name="create_info">
+ <text name="fee_information">
+ グループを作成するための料金は、メンバーシップレベルに基づいています。[https://secondlife.com/my/account/membership.php 詳細]
+ </text>
+ <scroll_list name="membership_list">
+ <scroll_list.columns name="clmn_name"/>
+ <scroll_list.columns name="clmn_price"/>
+ <scroll_list.rows name="basic" value="基本(プレースホルダ)"/>
+ <scroll_list.rows name="plc2" value=""/>
+ <scroll_list.rows name="premium" value="プレミアム(プレースホルダ)"/>
+ </scroll_list>
+ </layout_panel>
+ <layout_panel name="create_actions">
+ <layout_stack name="button_row_ls">
+ <layout_panel name="layout_crt">
+
+ </layout_panel>
+ <layout_panel name="layout_crt">
+ <button label="グループ作成:L$[COST]" name="btn_create" tool_tip="新しいグループを作成"/>
+ <button name="back" label="キャンセル" tool_tip="グループ一覧に戻ります。"/>
+ </layout_panel>
+ <layout_panel name="layout_crt">
+
+ </layout_panel>
+ </layout_stack>
+ <text name="info_deletion">
+ 注:48時間メンバーが2人未満のグループは、自動的に解散されます。
+ </text>
+ </layout_panel>
</layout_stack>
- <layout_panel name="layout_crt"/>
- <layout_stack name="button_row_ls"/>
- <layout_panel name="create_actions"/>
- <panel name="preferences_container"/>
- <combo_box name="group_mature_check" tool_tip="レーティング区分は、グループ内でどのようなコンテンツや行動が許されるかを指定するものです"/>
- <scroll_list name="membership_list"/>
- <layout_panel name="create_info"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_general.xml b/indra/newview/skins/default/xui/ja/panel_group_general.xml
index aab536f653..2d3d59ed85 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_general.xml
@@ -12,7 +12,7 @@
メンバーのデータを検索
</panel.string>
<panel name="group_info_top">
- <texture_picker label="" name="insignia" tool_tip="クリックして写真を選択します"/>
+ <texture_picker label="" name="insignia" tool_tip="クリックして画像を選択します"/>
<text name="prepend_founded_by">
創設者:
</text>
@@ -23,7 +23,7 @@
<button label="参加します!" name="btn_join"/>
</panel>
<text_editor name="charter">
- グループの理念、指針を記入してください
+ グループの理念、指針を記入してください。
</text_editor>
<name_list name="visible_members">
<name_list.columns label="メンバー" name="name"/>
@@ -31,13 +31,13 @@
<name_list.columns label="ログイン" name="status"/>
</name_list>
<text name="my_group_settngs_label">
- 個人の設定
+ 自分の設定
</text>
<text name="active_title_label">
- 私のタイトル:
+ タイトル:
</text>
<combo_box name="active_title" tool_tip="このグループをアクティブにしたときに、アバター名の上に表示されるタイトルを設定します。"/>
- <check_box label="グループ通知を受信" name="receive_notices" tool_tip="このグループからの通知を受信するかどうかの設定を行います。 グループからスパムが送られてくる場合はこのボックスのチェックを外してください。"/>
+ <check_box label="グループ通知を受信" name="receive_notices" tool_tip="このグループからの通知を受信するかどうかの設定を行います。グループからスパムが送られてくる場合は、このボックスのチェックを外してください。"/>
<check_box label="プロフィールに表示" name="list_groups_in_profile" tool_tip="あなたのプロフィールにこのグループを表示するかどうかの設定を行います。"/>
<panel name="preferences_container">
<text name="group_settngs_label">
@@ -46,13 +46,13 @@
<check_box label="誰でも入会できます" name="open_enrollement" tool_tip="招待されなくても新規メンバーが加入できるかどうかを設定します。"/>
<check_box label="入会費がかかります" name="check_enrollment_fee" tool_tip="入会費が必要かどうかを設定します。"/>
<spinner label="L$" name="spin_enrollment_fee" tool_tip="「入会費」にチェックが入っている場合、新規メンバーは指定された入会費を支払わなければグループに入れません。"/>
- <combo_box name="group_mature_check" tool_tip="レーティング区分は、グループ内でどのようなコンテンツや行動が許されるかを指定するものです">
+ <combo_box name="group_mature_check" tool_tip="レーティング区分は、グループ内でどのようなコンテンツや行動が許されるかを指定するものです。">
<combo_item name="select_mature">
- - レーティング区分を指定 -
+ ─レーティング区分を指定─
</combo_item>
<combo_box.item label="「Moderate」コンテンツ" name="mature"/>
<combo_box.item label="「General」コンテンツ" name="pg"/>
</combo_box>
- <check_box initial_value="true" label="検索に表示" name="show_in_group_list" tool_tip="このグループを検索結果に表示させます"/>
+ <check_box initial_value="true" label="検索に表示" name="show_in_group_list" tool_tip="このグループを検索結果に表示させます。"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml
index bd1013d6ca..70670d3cac 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml
@@ -1,26 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="グループインベントリ" name="GroupInfo">
<panel.string name="default_needs_apply_text">
- 保存していない変更があります
+ 保存していない変更があります。
</panel.string>
<panel.string name="want_apply_text">
変更を保存しますか?
</panel.string>
<panel.string name="group_join_btn">
- 参加 (L$[AMOUNT])
+ 入会費(L$ [AMOUNT])
</panel.string>
<panel.string name="group_join_free">
無料
</panel.string>
<panel name="group_info_top">
- <text_editor name="group_name" value="(ローディング...)"/>
+ <text_editor name="group_name" value="(読み込んでいます…)"/>
<line_editor label="新しいグループの名前を入力してください" 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="役割 &amp; メンバー"/>
+ <accordion_tab name="group_roles_tab" title="役割とメンバー"/>
<accordion_tab name="group_notices_tab" title="通知"/>
<accordion_tab name="group_land_tab" title="土地・資産"/>
<accordion_tab name="group_experiences_tab" title="体験"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_invite.xml b/indra/newview/skins/default/xui/ja/panel_group_invite.xml
index 2639454a01..85f0cba760 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_invite.xml
@@ -4,26 +4,27 @@
本当に新しい所有者を招待しますか?この操作は取り消しできません。
</panel.string>
<panel.string name="loading">
- (ローディング...)
+ (読み込んでいます…)
</panel.string>
<panel.string name="already_in_group">
選択した住人のなかに、既にグループに所属している人がいるため、招待を送ることができませんでした。
</panel.string>
<panel.string name="invite_selection_too_large">
- グループへの招待が送信されていません: 選択された住人が多すぎます。グループへの招待は1回のリクエストあたり100人に制限されています。
+ グループへの招待が送信されていません:選択された住人が多すぎます。
+グループへの招待は1回のリクエストあたり100人に制限されています。
</panel.string>
- <text bottom_delta="-96" font="SansSerifSmall" height="72" name="help_text">
- グループには一度に複数の住人を招待することができます。 「リストから住人を選択」をクリックしてください。
+ <text name="help_text">
+ グループには一度に複数の住人を招待することができます。「リストから住人を選択」をクリックしてください。
</text>
- <button bottom_delta="-10" label="リストから住人を選択" name="add_button" tool_tip=""/>
- <name_list bottom_delta="-160" height="156" name="invitee_list" tool_tip="Ctrl キーを押しながら複数の住人をクリックできます"/>
+ <button label="リストから住人を選択" name="add_button" tool_tip=""/>
+ <name_list name="invitee_list" tool_tip="Ctrl キーを押しながら複数の住人をクリックできます"/>
<button label="リストから選択したものを削除" name="remove_button" tool_tip="招待リストから上で選択した住人を削除します"/>
<text name="role_text">
割り当て先の役割を選択:
</text>
<combo_box name="role_name" tool_tip="メンバーに割り当てたい役割をリストから選んください"/>
<button label="招待状を送信" name="invite_button"/>
- <button label="取り消し" name="cancel_button"/>
+ <button label="キャンセル" name="cancel_button"/>
<string name="GroupInvitation">
グループへの招待
</string>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_land_money.xml b/indra/newview/skins/default/xui/ja/panel_group_land_money.xml
index 82be58a0fb..d4777081f8 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_land_money.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="土地とL$" name="land_money_tab">
<panel.string name="help_text">
- 「土地利用の合計」が「寄付総額」以下、または同じになるまで警告が表示されます。
+ 「土地の総利用量」が「総貢献額」以下、または同じになるまで警告が表示されます。
</panel.string>
<panel.string name="cant_view_group_land_text">
グループ所有地を確認する権限がありません。
@@ -13,70 +13,68 @@
グループの会計情報を確認する権限がありません。
</panel.string>
<panel.string name="loading_txt">
- ロード中...
+ 読み込んでいます…
</panel.string>
<panel.string name="land_contrib_error">
- 土地の貢献を設定することができません
+ 土地の貢献を設定することができません。
</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="種類" name="type"/>
- <scroll_list.columns label="面積" name="area"/>
+ <scroll_list.columns label="リージョン(地域)" name="location"/>
+ <scroll_list.columns label="種別" name="type"/>
+ <scroll_list.columns label="エリア" name="area"/>
<scroll_list.columns label="非表示" name="hidden"/>
</scroll_list>
<text name="total_contributed_land_label">
- 寄付合計:
+ 総貢献額:
</text>
<text name="total_contributed_land_value">
- [AREA] 平方メートル
+ [AREA]㎡
</text>
- <button label="地図" label_selected="地図" name="map_button"/>
+ <button label="マップ" name="map_button"/>
<text name="total_land_in_use_label">
- 土地利用の合計:
- </text>
- <text name="total_land_in_use_value">
- [AREA] 平方メートル
+ 土地の総利用量:
</text>
<text name="land_available_label">
- 利用可能の土地:
+ 利用可能な土地:
</text>
<text name="land_available_value">
- [AREA] 平方メートル
+ [AREA]㎡
</text>
<text name="your_contribution_label">
あなたの貢献:
</text>
+ <line_editor name="your_contribution_line_editor"/>
<text name="your_contribution_units">
- 平方メートル
+ ㎡
</text>
<text name="your_contribution_max_value">
- (最大 [AMOUNT])
+ (最大[AMOUNT])
</text>
<text name="group_over_limit_text">
- 土地利用をサポートするための土地クレジットが足りません
+ 使用中の土地をサポートするには、より多くの土地クレジットが必要です。
</text>
<text name="group_money_heading">
- グループの L$
+ グループのL$
</text>
</panel>
<tab_container name="group_money_tab_container">
- <panel label="計画" name="group_money_planning_tab">
+ <panel label="計画中" name="group_money_planning_tab">
<text_editor name="group_money_planning_text">
- ローディング...
+ 読み込んでいます…
</text_editor>
</panel>
- <panel label="詳細" name="group_money_details_tab">
+ <panel label="詳細情報" name="group_money_details_tab">
<text_editor name="group_money_details_text">
- ローディング...
+ 読み込んでいます…
</text_editor>
<button label="前の週" label_selected="前の週" name="earlier_details_button" tool_tip="前の週"/>
<button label="次の週" label_selected="次の週" name="later_details_button" tool_tip="次の週"/>
</panel>
- <panel label="販売取引" name="group_money_sales_tab">
+ <panel label="販売中" name="group_money_sales_tab">
<text_editor name="group_money_sales_text">
- ローディング...
+ 読み込んでいます…
</text_editor>
<button label="前の週" label_selected="前の週" name="earlier_sales_button" tool_tip="前の週"/>
<button label="次の週" label_selected="次の週" name="later_sales_button" tool_tip="次の週"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_list_item.xml b/indra/newview/skins/default/xui/ja/panel_group_list_item.xml
index 77d3d8f391..c0da7a9dfc 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_list_item.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_list_item.xml
@@ -1,6 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="group_list_item">
+ <icon name="hovered_icon"/>
+ <icon name="selected_icon"/>
+ <group_icon name="group_icon"/>
<text name="group_name" value="不明"/>
- <button name="info_btn" tool_tip="詳細"/>
+ <button name="info_btn" tool_tip="詳細詳細"/>
<button name="profile_btn" tool_tip="プロフィールの表示"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_list_item_short.xml b/indra/newview/skins/default/xui/ja/panel_group_list_item_short.xml
index 77d3d8f391..cca8816f6e 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_list_item_short.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_list_item_short.xml
@@ -1,6 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="group_list_item">
+ <icon name="hovered_icon"/>
+ <icon name="selected_icon"/>
+ <group_icon name="group_icon"/>
<text name="group_name" value="不明"/>
- <button name="info_btn" tool_tip="詳細"/>
+ <button name="visibility_hide_btn" tool_tip="プロフィールでグループを非表示にする"/>
+ <button name="visibility_show_btn" tool_tip="プロフィールでグループを表示する"/>
+ <button name="info_btn" tool_tip="詳細情報"/>
<button name="profile_btn" tool_tip="プロフィールの表示"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_notices.xml b/indra/newview/skins/default/xui/ja/panel_group_notices.xml
index ddad6c1f9b..ebde7f9944 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_notices.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="通知" name="notices_tab">
<panel.string name="help_text">
- 通知でメッセージを送ることができ、通知にアイテムを添付することができます。
+ 通知でメッセージを送ることができ、アイテムを添付することができます。
通知を受け取ることができる「役割」にあるメンバーだけに送信されます。
「一般」タブで通知の受信をオフにすることができます。
</panel.string>
@@ -9,8 +9,8 @@
過去の通知はありません
</panel.string>
<text name="lbl2">
- 通知は 14 日間保存されます。
-1 日の制限数は 200 通です。
+ 通知は14日間保存されます。
+1日の制限数は200通です。
</text>
<scroll_list name="notice_list">
<scroll_list.columns label="" name="icon"/>
@@ -42,14 +42,14 @@
<button label="インベントリ" name="open_inventory" tool_tip="インベントリを開きます"/>
<button label="取り外す" label_selected="添付物を削除" name="remove_attachment" tool_tip="あなたの通知から添付されたアイテムを削除します"/>
<button label="送信" label_selected="送信" name="send_notice"/>
- <group_drop_target name="drop_target" tool_tip="インベントリのアイテムをこのボックスにドラッグして、通知と一緒に送ります。 添付するには、そのアイテムのコピーと再販・プレゼントの権限があなたにある必要があります。"/>
+ <group_drop_target name="drop_target" tool_tip="インベントリのアイテムをこのボックスにドラッグして、通知と一緒に送ります。添付するには、そのアイテムのコピーと再販・譲渡の権限があなたにある必要があります。"/>
</panel>
<panel label="過去の通知を表示" name="panel_view_past_notice">
<text name="lbl">
アーカイブ通知
</text>
<text name="lbl2">
- 新しい通知を送信するには、+ ボタンを押してください
+ 新しい通知を送信するには、+ボタンを押してください
</text>
<text name="lbl3">
件名:
diff --git a/indra/newview/skins/default/xui/ja/panel_group_notify.xml b/indra/newview/skins/default/xui/ja/panel_group_notify.xml
index 7135ae780d..2d8416f74c 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_notify.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_notify.xml
@@ -1,12 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="instant_message" name="panel_group_notify">
+<panel label="インスタントメッセージ" 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"/>
+ <string name="subject_font" value="サンセリフ大"/>
+ <string name="date_font" value="サンセリフ"/>
<panel label="header" name="header">
- <text name="title" value="送信者の名前 / グループ名"/>
+ <group_icon name="group_icon"/>
+ <text name="title" value="送信者の名前/グループ名"/>
</panel>
- <text_editor name="message" value="message"/>
+ <text_editor name="message" value="メッセージ"/>
+ <icon name="attachment_icon"/>
<text name="attachment" value="添付アイテム"/>
- <button label="OK" name="btn_ok"/>
+ <button label="OK" name="btn_ok"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_roles.xml b/indra/newview/skins/default/xui/ja/panel_group_roles.xml
index ef8f55b60e..bd16e3e986 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_roles.xml
@@ -1,98 +1,162 @@
-<?xml version="1.0" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="メンバーと役割" name="roles_tab">
- <panel.string name="default_needs_apply_text">保存していない変更があります</panel.string>
- <panel.string name="want_apply_text">変更を保存しますか?</panel.string>
+ <panel.string name="default_needs_apply_text">
+ 保存していない変更があります。
+ </panel.string>
+ <panel.string name="want_apply_text">
+ 変更を保存しますか?
+ </panel.string>
<tab_container name="roles_tab_container">
<panel label="メンバー" name="members_sub_tab" tool_tip="メンバー">
- <panel.string name="help_text">あなたはメンバーに割り当てられた役割を付加、削除できます。
-Ctrl キーを押しながらメンバー名をクリックすると
-複数の人を選択できます。</panel.string>
- <panel.string name="donation_area">[AREA] 平方メートル</panel.string>
- <filter_editor label="メンバーを選別" name="filter_input"/>
+ <panel.string name="help_text">
+ ここからメンバーに役割を付与したり、削除することができます。
+Ctrlキーを押しながら、メンバー名をクリックすることで複数の人を選択できます。
+ </panel.string>
+ <panel.string name="donation_area">
+ [AREA]㎡
+ </panel.string>
+ <filter_editor label="メンバーをフィルタ" name="filter_input"/>
<name_list name="member_list">
<name_list.columns label="メンバー" name="name"/>
<name_list.columns label="寄付" name="donated"/>
<name_list.columns label="ステータス" name="online"/>
- <name_list.columns label="職名" name="title"/>
+ <name_list.columns label="タイトル" name="title"/>
</name_list>
<button label="招待" name="member_invite"/>
<button label="追放" name="member_eject"/>
<button label="メンバーの立入禁止" name="member_ban"/>
</panel>
<panel label="役割" name="roles_sub_tab">
- <panel.string name="help_text">役割には、タイトルと許可された能力が
-割り当てられています。メンバーは
-1つ以上の役割を持つことができます。グループで使える役割は10つまでで、
-「全員(Everyone)」と「オーナー(Owner)」がそれに含まれています。</panel.string>
- <panel.string name="cant_delete_role">「全員(Everyone)」と「オーナー(Owner)」の役割は削除することができません。</panel.string>
- <panel.string name="power_folder_icon">Inv_FolderClosed</panel.string>
- <panel.string name="power_all_have_icon">Checkbox_On</panel.string>
- <panel.string name="power_partial_icon">Checkbox_Off</panel.string>
- <filter_editor label="役割を選別" name="filter_input"/>
+ <panel.string name="help_text">
+ 役割には、タイトルと許可された能力が割り当てられています。
+メンバーは1つ以上の役割を持つことができます。
+グループで使える役割は10個までで、「全員(Everyone)」と「所有者(Owner)」がそれに含まれています。
+ </panel.string>
+ <panel.string name="cant_delete_role">
+ 「全員(Everyone)」と「所有者(Owner)」の役割は削除することができません。
+ </panel.string>
+ <panel.string name="power_folder_icon">
+ Inv_FolderClosed
+ </panel.string>
+ <panel.string name="power_all_have_icon">
+ Checkbox_On
+ </panel.string>
+ <panel.string name="power_partial_icon">
+ Checkbox_Off
+ </panel.string>
+ <filter_editor label="役割をフィルタ" name="filter_input"/>
<scroll_list name="role_list">
<scroll_list.columns label="役割" name="name"/>
- <scroll_list.columns label="肩書き" name="title"/>
- <scroll_list.columns label="#" name="members"/>
+ <scroll_list.columns label="タイトル" name="title"/>
+ <scroll_list.columns label="#" name="members"/>
</scroll_list>
<button label="新しい役割" name="role_create"/>
+ <button label="役割をコピー" name="role_copy"/>
<button label="役割を削除" name="role_delete"/>
</panel>
- <panel label="能力" name="actions_sub_tab" tool_tip="能力の説明文には、どの役割・メンバーがその能力を持つかが書かれています。">
- <panel.string name="help_text">役割に含まれたメンバーに、このグループで特定の
-活動を行うことを許可する能力。さまざまな能力が提供されます。</panel.string>
- <filter_editor label="能力を選別" name="filter_input"/>
+ <panel label="能力" name="actions_sub_tab" tool_tip="能力の説明と、その能力を実行できるロールとメンバーを表示できます。">
+ <panel.string name="help_text">
+ 能力は、ロール内のメンバーはこのグループ内で特定のことを行うことができます。
+多種多様な能力が指定可能です。
+ </panel.string>
+ <panel.string name="power_folder_icon">
+ Inv_FolderClosed
+ </panel.string>
+ <panel.string name="power_all_have_icon">
+ Checkbox_On
+ </panel.string>
+ <panel.string name="power_partial_icon">
+ Checkbox_Off
+ </panel.string>
+ <filter_editor label="能力でフィルタ" name="filter_input"/>
<scroll_list name="action_list" tool_tip="詳細を見るには、能力を選んでください。">
+ <scroll_list.columns label="" name="icon"/>
+ <scroll_list.columns label="" name="checkbox"/>
<scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
- <panel label="立入禁止にされた住人" name="banlist_sub_tab" tool_tip="このグループから立ち入り禁止にされた住人を表示します。">
- <panel.string name="help_text">立入禁止リストに登録された住人はグループに参加できません。</panel.string>
- <panel.string name="ban_count_template">立入禁止の人数: [COUNT]/[LIMIT]</panel.string>
+ <panel label="バンされた住民" name="banlist_sub_tab" tool_tip="このグループからバンされた住人を表示します。">
+ <panel.string name="help_text">
+ バンリストに登録された住人は、グループに参加できません。
+ </panel.string>
+ <panel.string name="ban_count_template">
+ バンされた人数:[LIMIT]人中[COUNT]人
+ </panel.string>
<name_list name="ban_list">
<name_list.columns label="住人" name="name"/>
- <name_list.columns label="立入禁止にされた日付" name="ban_date"/>
+ <name_list.columns label="バンした日付" name="ban_date"/>
</name_list>
- <button label="住人の立入禁止" name="ban_create" tool_tip="グループから住人を立入禁止にする"/>
- <button label="立入禁止の解除" name="ban_delete" tool_tip="選択した住人のグループへの立ち入り禁止を解除"/>
- <button name="ban_refresh" tool_tip="立入禁止リストの更新"/>
+ <button label="住人をバンする" name="ban_create" tool_tip="グループから住人をバンします。"/>
+ <button label="バンの解除" name="ban_delete" tool_tip="選択した住人のバンを解除します。"/>
+ <button label="リフレッシュ" name="ban_refresh" tool_tip="バンリストをリフレッシュします。"/>
+ <text name="ban_count" width="100"/>
</panel>
- <button name="role_copy" label="コピーロール"/>
</tab_container>
<panel name="members_footer">
- <text name="static">割当られた役割</text>
+ <text name="static">
+ 割当られた役割
+ </text>
<scroll_list name="member_assigned_roles">
<scroll_list.columns label="" name="checkbox"/>
<scroll_list.columns label="" name="role"/>
</scroll_list>
- <text name="static2">許可された能力</text>
+ <text name="static2">
+ 許可されたアクション
+ </text>
<scroll_list name="member_allowed_actions" tool_tip="各能力の詳細は、能力のタブをご覧ください。">
+ <scroll_list.columns label="" name="icon"/>
+ <scroll_list.columns label="" name="checkbox"/>
<scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
<panel name="members_header">
- <text_editor name="member_action_description">これは「このグループからメンバーを追放」する能力です。「オーナー」のみが他の「オーナー」を追放できます。</text_editor>
+ <text_editor name="member_action_description">
+ これは「このグループからメンバーを追放」する能力です。「所有者」のみが他の「所有者」を追放できます。
+ </text_editor>
</panel>
<panel name="roles_footer">
- <text name="static">役割名</text>
+ <text name="static">
+ 役割名
+ </text>
<line_editor name="role_name"/>
- <text name="static3">役割タイトル</text>
+ <text name="static3">
+ 役割タイトル
+ </text>
<line_editor name="role_title"/>
- <text name="static2">説明</text>
+ <text name="static2">
+ 説明
+ </text>
<text_editor name="role_description"/>
- <text name="static4">割当られたメンバー</text>
+ <text name="static4">
+ 割当られたメンバー
+ </text>
<check_box label="Reveal members" name="role_visible_in_list" tool_tip="グループ外の人が一般タブを見たときに、この役割のメンバーが表示されるかどうかを設定します。"/>
- <text name="static5" tool_tip="現在選択されている役割で実行できる能力のリスト">許可された能力</text>
+ <text name="static5" tool_tip="現在選択されている役割で実行できる能力のリスト">
+ 許可された能力
+ </text>
<scroll_list name="role_allowed_actions" tool_tip="各能力の詳細は、能力のタブをご覧ください。">
+ <scroll_list.columns label="" name="icon"/>
<scroll_list.columns label="" name="checkbox"/>
<scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
<panel name="roles_header">
- <text_editor name="role_action_description">これは「このグループからメンバーを追放」する能力です。「オーナー」のみが他の「オーナー」を追放できます。</text_editor>
+ <text_editor name="role_action_description">
+ これは「このグループからメンバーを追放」する能力です。
+「所有者」のみが他の「所有者」を追放できます。
+ </text_editor>
</panel>
<panel name="actions_footer">
- <text_editor name="action_description">これは「グループからメンバーを追放する」能力です。 オーナーを追放できるのは、別のオーナーだけです。</text_editor>
- <text name="static2">この能力を持つ役割</text>
- <text name="static3">この能力を持つメンバー</text>
+ <text_editor name="action_description">
+ これは「グループからメンバーを追放する」能力です。
+「所有者」を追放できるのは、別の「所有者」だけです。
+ </text_editor>
+ <text name="static2">
+ この能力を持つ役割
+ </text>
+ <text name="static3">
+ この能力を持つメンバー
+ </text>
+ <name_list name="action_members"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_hide_beacon.xml b/indra/newview/skins/default/xui/ja/panel_hide_beacon.xml
new file mode 100644
index 0000000000..45faf331d7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_hide_beacon.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_hide_beacon">
+ <button label="ビーコンを隠す" name="hide_beacon_btn" tool_tip="トラッキングを停止してビーコンを隠す。"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_im_control_panel.xml b/indra/newview/skins/default/xui/ja/panel_im_control_panel.xml
deleted file mode 100644
index f2429ac12a..0000000000
--- a/indra/newview/skins/default/xui/ja/panel_im_control_panel.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_im_control_panel">
- <text name="avatar_name" value="不明"/>
- <layout_stack name="button_stack">
- <layout_panel name="view_profile_btn_panel">
- <button label="プロフィール" 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="テレポート" name="teleport_btn" tool_tip="この人にテレポートを送ります"/>
- </layout_panel>
- <layout_panel name="share_btn_panel">
- <button label="共有" name="share_btn"/>
- </layout_panel>
- <layout_panel name="pay_btn_panel">
- <button label="支払う" name="pay_btn"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="コール" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="コール終了" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="ボイスコントロール" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_instant_message.xml b/indra/newview/skins/default/xui/ja/panel_instant_message.xml
index bf4cbcdc46..c11266eae9 100644
--- a/indra/newview/skins/default/xui/ja/panel_instant_message.xml
+++ b/indra/newview/skins/default/xui/ja/panel_instant_message.xml
@@ -3,8 +3,12 @@
<string name="message_max_lines_count">
6
</string>
- <panel label="im_header" name="im_header">
- <text name="time_box" value="23:30"/>
+ <panel label="IMのヘッダ" name="im_header">
+ <avatar_icon name="avatar_icon"/>
+ <group_icon name="group_icon"/>
+ <avatar_icon name="adhoc_icon"/>
+ <text name="user_name" value="テスト文字列 無視してください"/>
+ <text name="time_box" value="23:30"/>
</panel>
- <button label="返信" name="reply"/>
+ <text name="message"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_inventory_item.xml b/indra/newview/skins/default/xui/ja/panel_inventory_item.xml
index d18047fbcf..70b741b0f8 100644
--- a/indra/newview/skins/default/xui/ja/panel_inventory_item.xml
+++ b/indra/newview/skins/default/xui/ja/panel_inventory_item.xml
@@ -1,4 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="inventory_item">
- <text name="item_name" value="..."/>
+ <icon name="hovered_icon"/>
+ <icon name="selected_icon"/>
+ <icon name="item_icon"/>
+ <text name="item_name" value="…"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_landmark_info.xml b/indra/newview/skins/default/xui/ja/panel_landmark_info.xml
index 7fca66f90f..c95320e53a 100644
--- a/indra/newview/skins/default/xui/ja/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/ja/panel_landmark_info.xml
@@ -13,28 +13,49 @@
この位置の情報は現在ご利用いただけません。あとでもう一度お試しください。
</string>
<string name="server_forbidden_text">
- この位置の情報は、アクセス制限のためご利用いただけません。 許可については区画所有者にお問い合わせください。
+ この位置の情報は、アクセス制限のためご利用いただけません。許可については区画所有者にお問い合わせください。
</string>
<string name="acquired_date">
- [year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ [year,datetime,local]年[mth,datetime,local]月[day,datetime,local]日([wkday,datetime,local]) [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
</string>
+ <string name="icon_PG" value="Parcel_PG_Dark"/>
+ <string name="icon_M" value="Parcel_M_Dark"/>
+ <string name="icon_R" value="Parcel_R_Dark"/>
<button name="back_btn" tool_tip="戻る"/>
<text name="title" value="場所のプロフィール"/>
<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)"/>
+ <texture_picker name="logo"/>
+ <text name="parcel_title" value="SampleParcel, Name Long"/>
+ <text name="region_title">
+ リージョン(地域):[REGIONAMEPOS]
+ </text>
+ <text name="parcel_owner_label" value="所有者:"/>
+ <text name="parcel_owner" value="一時的な所有者"/>
<expandable_text name="description" value="Du waltz die spritz"/>
+ <icon name="maturity_icon"/>
<text name="maturity_value" value="不明"/>
<panel name="landmark_info_panel">
+ <view_border name="lod_tab_border"/>
+ <text name="this_landmark">
+ ランドマーク:
+ </text>
<text name="owner_label" value="所有者:"/>
- <text name="creator_label" value="制作者:"/>
- <text name="created_label" value="制作日:"/>
+ <text name="owner"/>
+ <text name="creator_label" value="作成者:"/>
+ <text name="creator"/>
+ <text name="created_label" value="作成日:"/>
+ <text name="created"/>
</panel>
<panel name="landmark_edit_panel">
- <text name="title_label" value="タイトル:"/>
- <text name="notes_label" value="メモ:"/>
- <text name="folder_label" value="ランドマークの位置:"/>
+ <text value="タイトル:"/>
+ <line_editor name="title_value"/>
+ <button name="edit_btn" tool_tip="ランドマーク情報を編集"/>
+ <line_editor name="title_editor"/>
+ <text name="notes_label" value="ノート:"/>
+ <text_editor name="notes_editor"/>
+ <text name="folder_label" value="ランドマークの場所:"/>
+ <combo_box name="folder_combo"/>
</panel>
</panel>
</scroll_container>
diff --git a/indra/newview/skins/default/xui/ja/panel_landmarks.xml b/indra/newview/skins/default/xui/ja/panel_landmarks.xml
index 24d6ff23ae..3e359e4e4c 100644
--- a/indra/newview/skins/default/xui/ja/panel_landmarks.xml
+++ b/indra/newview/skins/default/xui/ja/panel_landmarks.xml
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Landmarks">
<accordion name="landmarks_accordion">
<accordion_tab name="tab_favorites" title="お気に入りバー"/>
- <accordion_tab name="tab_landmarks" title="マイ ランドマーク"/>
+ <accordion_tab name="tab_landmarks" title="ランドマーク"/>
<accordion_tab name="tab_inventory" title="インベントリ"/>
<accordion_tab name="tab_library" title="ライブラリ"/>
</accordion>
diff --git a/indra/newview/skins/default/xui/ja/panel_login.xml b/indra/newview/skins/default/xui/ja/panel_login.xml
index db4b0aea23..ebb79dd835 100644
--- a/indra/newview/skins/default/xui/ja/panel_login.xml
+++ b/indra/newview/skins/default/xui/ja/panel_login.xml
@@ -1,22 +1,36 @@
-<?xml version="1.0" ?>
-<panel name="panel_login">
- <panel.string name="forgot_password_url">http://secondlife.com/account/request.php?lang=ja</panel.string>
- <panel.string name="sign_up_url">https://join.secondlife.com/</panel.string>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_login" focus_root="true">
+ <panel.string name="forgot_password_url">
+ https://secondlife.com/my/account/request.php?lang=ja-JP
+ </panel.string>
+ <panel.string name="sign_up_url">
+ https://join.secondlife.com/?lang=ja
+ </panel.string>
<layout_stack name="ui_stack">
+ <layout_panel name="ui_elastic_pad_left"/>
<layout_panel name="ui_container">
- <combo_box label="ユーザー名" name="username_combo" tool_tip="登録時に自分で選んだユーザー名(例:bobsmith12、Steller Sunshineなど)"/>
- <line_editor label="パスワード" name="password_edit"/>
+ <icon name="sl_logo_small"/>
+ <combo_box label="Username" tool_tip="登録時に自分で選んだユーザー名(例:bobsmith12、Steller Sunshineなど)" name="username_combo">
+ <combo_box.combo_editor/>
+ </combo_box>
+ <line_editor name="password_edit" label="パスワード"/>
<combo_box label="お気に入りの場所" name="start_location_combo">
- <combo_box.item label="最後にログアウトした場所" name="MyLastLocation"/>
- <combo_box.item label="ホーム" name="MyHome"/>
+ <combo_box.combo_editor/>
+ <combo_box.item label="最後にいた場所" name="MyLastLocation" value="last"/>
+ <combo_box.item label="ホーム" name="MyHome" value="home"/>
</combo_box>
<button label="ログイン" name="connect_btn"/>
- <check_box label="記憶する" name="remember_check"/>
- <text name="forgot_password_text">パスワードを忘れた場合</text>
- <combo_box label="グリッドを選択" name="server_combo"/>
- <text name="sign_up_text">登録</text>
+ <text name="sign_up_text">
+ サインアップ
+ </text>
+ <check_box label="名前を記録" name="remember_name" tool_tip="すでに記憶されているユーザーは、「私」>「初期設定」>「詳細設定」>「記憶されたユーザー名」から削除できます。"/>
+ <check_box label="パスワードを記録" name="remember_password"/>
+ <combo_box label="Select grid" name="server_combo"/>
+ <text name="forgot_password_text">
+ パスワードに関するヘルプ
+ </text>
</layout_panel>
- <check_box name="remember_name" label="記憶する" tool_tip="記憶されたユーザーを削除することができます。私 &gt; プリファレンス&gt; アドバンス &gt; 記憶されたユーザー名"/>
- <check_box name="remember_password" label="パスワードを記憶する"/>
+ <layout_panel name="ui_elastic_pad_right"/>
</layout_stack>
+ <web_browser name="login_html"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_login_first.xml b/indra/newview/skins/default/xui/ja/panel_login_first.xml
index 644cee25f2..0f987fc816 100644
--- a/indra/newview/skins/default/xui/ja/panel_login_first.xml
+++ b/indra/newview/skins/default/xui/ja/panel_login_first.xml
@@ -1,39 +1,54 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_login">
<panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php?lang=ja
+ https://secondlife.com/my/account/request.php?lang=ja-JP
</panel.string>
<panel.string name="sign_up_url">
- https://join.secondlife.com/
+ https://join.secondlife.com/?lang=ja
</panel.string>
<layout_stack name="logo_stack">
+ <layout_panel name="page_top"/>
+ <layout_panel name="parent_panel">
+ <layout_stack name="logo_stack">
+ <layout_panel name="logo_left"/>
+ <layout_panel name="logo_container">
+ <icon name="sl_logo"/>
+ </layout_panel>
+ <layout_panel auto_resize="true"/>
+ </layout_stack>
+ </layout_panel>
<layout_panel name="parent_panel2">
<layout_stack name="widget_stack">
+ <layout_panel name="widget_left"/>
<layout_panel name="widget_container">
- <combo_box label="ユーザー名" name="username_combo" tool_tip="登録時に自分で選んだユーザー名(例:bobsmith12、Steller Sunshineなど)"/>
- <line_editor label="パスワード" name="password_edit"/>
+ <combo_box label="ユーザ名" tool_tip="登録時に自分で選んだユーザー名(例:bobsmith12、Steller Sunshineなど)" name="username_combo">
+ <combo_box.combo_editor/>
+ <combo_box.combo_button/>
+ <combo_box.drop_down_button/>
+ </combo_box>
+ <line_editor name="password_edit" label="パスワード"/>
<button label="ログイン" name="connect_btn"/>
- <check_box label="記憶する" name="remember_check"/>
- <text name="forgot_password_text">
- パスワードを忘れた場合
+ <text name="sign_up_text" valign="center">
+ サインアップ
</text>
- <text name="sign_up_text">
- 登録
+ <check_box label="ユーザ名を記憶" name="remember_name" tool_tip="すでに記憶されているユーザーは、「私」>「初期設定」>「詳細設定」>「記憶されたユーザー名」から削除できます。"/>
+ <check_box label="パスワード記憶" name="remember_password"/>
+ <text name="forgot_password_text">
+ パスワードを忘れましたか?
</text>
</layout_panel>
+ <layout_panel name="widget_right"/>
</layout_stack>
</layout_panel>
<layout_panel name="parent_panel3">
<layout_stack name="images_stack">
+ <layout_panel name="images_left"/>
<layout_panel name="images_container">
- <text name="image_caption_left">
- 最初のステップは、アイランドについて学ぶことです。さあ、アイランド探検の入口を見つけてください!
- </text>
- <text name="image_caption_right">
- ソーシャル アイランドを探検して、他の新しい住人を探してください!
- </text>
+ <icon name="image_left"/>
</layout_panel>
+ <layout_panel name="images_right"/>
</layout_stack>
</layout_panel>
+ <layout_panel name="page_bottom"/>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_main_inventory.xml b/indra/newview/skins/default/xui/ja/panel_main_inventory.xml
index 5751154163..a38492c6d1 100644
--- a/indra/newview/skins/default/xui/ja/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/panel_main_inventory.xml
@@ -1,14 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="もの" name="main inventory panel">
<panel.string name="ItemcountFetching">
- [ITEM_COUNT] 個のアイテムと [CATEGORY_COUNT] 個のフォルダーを取得中です... [FILTER]
+ [ITEM_COUNT]個のアイテムと[CATEGORY_COUNT]個のフォルダーを取得中です…。[FILTER]
</panel.string>
<panel.string name="ItemcountCompleted">
- [ITEM_COUNT] 個のアイテムと [CATEGORY_COUNT] 個のフォルダー [FILTER]
+ [ITEM_COUNT]個のアイテムと[CATEGORY_COUNT]個のフォルダーの取得が完了しました。[FILTER]
</panel.string>
<panel.string name="ItemcountUnknown">
- [ITEM_COUNT] 個のアイテムと [CATEGORY_COUNT] 個のフォルダーを取得しました [FILTER]
+ [ITEM_COUNT]個のアイテムと[CATEGORY_COUNT]個のフォルダーを取得しました。[FILTER]
</panel.string>
+ <panel.string name="inventory_title">インベントリ</panel.string>
<text name="ItemcountText">
アイテム:
</text>
@@ -17,8 +18,10 @@
<item label="名前" name="Name" value="search_by_name"/>
<item label="制作者" name="Creator" value="search_by_creator"/>
<item label="説明" name="Description" value="search_by_description"/>
- <item label="UUID" name="UUID" value="search_by_UUID"/>
+ <item label="UUID" name="UUID" value="search_by_UUID"/>
</combo_box>
+ <menu_button tool_tip="検索表示オプションを表示" name="options_visibility_btn"/>
+ <filter_editor label="検索語句を入力" name="inventory search editor"/>
<tab_container name="inventory filter tabs">
<inventory_panel label="インベントリ" name="All Items"/>
<recent_inventory_panel label="最新" name="Recent Items"/>
@@ -26,13 +29,13 @@
</tab_container>
<layout_stack name="bottom_panel">
<layout_panel name="options_gear_btn_panel">
- <menu_button name="options_gear_btn" tool_tip="オプションを表示します"/>
+ <menu_button name="options_gear_btn" tool_tip="オプションを表示します。"/>
</layout_panel>
<layout_panel name="add_btn_panel">
- <button name="add_btn" tool_tip="新しいアイテムを追加します"/>
+ <button name="add_btn" tool_tip="新しいアイテムを追加します。"/>
</layout_panel>
<layout_panel name="trash_btn_panel">
- <dnd_button name="trash_btn" tool_tip="選択したアイテムを削除します"/>
+ <dnd_button name="trash_btn" tool_tip="選択したアイテムを削除します。"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_marketplace_listings.xml b/indra/newview/skins/default/xui/ja/panel_marketplace_listings.xml
index a9218bebff..ef191a9079 100644
--- a/indra/newview/skins/default/xui/ja/panel_marketplace_listings.xml
+++ b/indra/newview/skins/default/xui/ja/panel_marketplace_listings.xml
@@ -1,11 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="マーケットプレイス" name="Marketplace Panel">
<panel name="tool_panel">
- <menu_button name="sort_btn" tool_tip="表示/並べ替えオプション"/>
+ <menu_button name="sort_btn" tool_tip="表示/並べ替えオプション"/>
<button name="add_btn" tool_tip="新規リストフォルダの作成"/>
<button label="エラーを確認" name="audit_btn" tool_tip="マーケットプレイスのリストを確認"/>
</panel>
<panel name="tab_container_panel">
<filter_editor label="マーケットプレイスのリストをフィルタ" name="filter_editor"/>
</panel>
+ <panel name="marketplace_drop_zone">
+ <text>
+ ここにフォルダをドロップして新しいリストを作成
+ </text>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_marketplace_listings_inventory.xml b/indra/newview/skins/default/xui/ja/panel_marketplace_listings_inventory.xml
index 43cb64d6ba..13718060bf 100644
--- a/indra/newview/skins/default/xui/ja/panel_marketplace_listings_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/panel_marketplace_listings_inventory.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<inventory_panel label="すべて" name="All Items" tool_tip="ここにアイテムをドラッグ&ドロップしてリストに表示します"/>
+<inventory_panel label="すべて" name="All Items" tool_tip="ここにアイテムをドラッグ&ドロップしてリストに表示します。"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/panel_marketplace_listings_listed.xml b/indra/newview/skins/default/xui/ja/panel_marketplace_listings_listed.xml
index 7f27231cbd..e01d9faa5a 100644
--- a/indra/newview/skins/default/xui/ja/panel_marketplace_listings_listed.xml
+++ b/indra/newview/skins/default/xui/ja/panel_marketplace_listings_listed.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<inventory_panel label="リストに掲載" name="Active Items"/>
+<inventory_panel label="リストに掲載" name="Active Items"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/panel_marketplace_listings_unassociated.xml b/indra/newview/skins/default/xui/ja/panel_marketplace_listings_unassociated.xml
index 215be9ae6d..341715d2d7 100644
--- a/indra/newview/skins/default/xui/ja/panel_marketplace_listings_unassociated.xml
+++ b/indra/newview/skins/default/xui/ja/panel_marketplace_listings_unassociated.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<inventory_panel label="関連付けされていない" name="Unassociated Items"/>
+<inventory_panel label="関連付けされていない" name="Unassociated Items"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/panel_marketplace_listings_unlisted.xml b/indra/newview/skins/default/xui/ja/panel_marketplace_listings_unlisted.xml
index 04530477f6..9fc0eec184 100644
--- a/indra/newview/skins/default/xui/ja/panel_marketplace_listings_unlisted.xml
+++ b/indra/newview/skins/default/xui/ja/panel_marketplace_listings_unlisted.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<inventory_panel label="リストから削除済み" name="Inactive Items"/>
+<inventory_panel label="リストから削除済み" name="Inactive Items"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml b/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml
index 6321dbb048..5d984cb58c 100644
--- a/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml
@@ -7,6 +7,7 @@
(このページは指定したホワイトリストをパスしません)
</text>
<line_editor name="home_url" tool_tip="このメディアソースのホームページ"/>
+ <web_browser name="preview_media"/>
<text name="preview_label">
プレビュー
</text>
@@ -15,18 +16,19 @@
</text>
<text name="current_url" tool_tip="メディアソースの現在のページ" value=""/>
<button label="リセット" name="current_url_reset_btn"/>
- <check_box initial_value="false" label="ループ再生" name="auto_loop"/>
- <check_box initial_value="false" label="最初にクリックしたときの動作" name="first_click_interact"/>
- <check_box initial_value="false" label="自動ズーム" name="auto_zoom"/>
- <check_box initial_value="false" label="自動メディア再生" name="auto_play"/>
+ <check_box label="ループ再生" name="auto_loop"/>
+ <check_box label="最初にクリックしたときの動作" name="first_click_interact"/>
+ <check_box label="自動ズーム" name="auto_zoom"/>
+ <check_box label="自動メディア再生" name="auto_play"/>
<text name="media_setting_note">
注意: 住人はこの設定を無視できます
</text>
- <check_box initial_value="false" label="オブジェクトの表面サイズに合わせて自動調整" name="auto_scale"/>
+ <check_box label="オブジェクトの表面サイズに合わせて自動調整" name="auto_scale"/>
<text name="size_label">
サイズ:
</text>
<text name="X_label">
- X
+ X
</text>
+ <spinner label="" name="height_pixels"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/ja/panel_media_settings_permissions.xml
index 11d9ed4c16..e86f46b027 100644
--- a/indra/newview/skins/default/xui/ja/panel_media_settings_permissions.xml
+++ b/indra/newview/skins/default/xui/ja/panel_media_settings_permissions.xml
@@ -14,16 +14,16 @@
<text name="owner_label">
所有者
</text>
- <check_box initial_value="false" label="ナビゲーションと相互作用力を有効にする" name="perms_owner_interact"/>
- <check_box initial_value="false" label="コントロールバーを表示する" name="perms_owner_control"/>
+ <check_box label="ナビゲーションと相互作用力を有効にする" name="perms_owner_interact"/>
+ <check_box label="コントロールバーを表示する" name="perms_owner_control"/>
<text name="group_label">
グループ:
</text>
- <check_box initial_value="false" label="ナビゲーションと相互作用力を有効にする" name="perms_group_interact"/>
- <check_box initial_value="false" label="コントロールバーを表示する" name="perms_group_control"/>
+ <check_box label="ナビゲーションと相互作用力を有効にする" name="perms_group_interact"/>
+ <check_box label="コントロールバーを表示する" name="perms_group_control"/>
<text name="anyone_label">
全員
</text>
- <check_box initial_value="false" label="ナビゲーションと相互作用力を有効にする" name="perms_anyone_interact"/>
- <check_box initial_value="false" label="コントロールバーを表示する" name="perms_anyone_control"/>
+ <check_box label="ナビゲーションと相互作用力を有効にする" name="perms_anyone_interact"/>
+ <check_box label="コントロールバーを表示する" name="perms_anyone_control"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_media_settings_security.xml b/indra/newview/skins/default/xui/ja/panel_media_settings_security.xml
index ea4fdb9ce5..a6224302d1 100644
--- a/indra/newview/skins/default/xui/ja/panel_media_settings_security.xml
+++ b/indra/newview/skins/default/xui/ja/panel_media_settings_security.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="セキュリティ" name="Media Settings Security">
- <check_box initial_value="false" label="指定した URL パターンから始まる接続を許可する" name="whitelist_enable"/>
+ <check_box label="指定したURLパターンから始まる接続を許可する。" name="whitelist_enable"/>
<text name="home_url_fails_some_items_in_whitelist">
ホームページに失敗したエントリーがありました:
</text>
<button label="追加" name="whitelist_add"/>
<button label="削除" name="whitelist_del"/>
<text name="home_url_fails_whitelist">
- 警告: 「一般」タブで指定されたホームページは、ホワイトリストに掲載されていません。 正しい機能が設定されるまで、この機能は一時停止します。
+ 警告:「一般」タブで指定されたホームページは、ホワイトリストに掲載されていません。正しい機能が設定されるまで、この機能は一時停止します。
</text>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml
index 201fb0a376..08edb447cb 100644
--- a/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="nearby_chat">
- <line_editor label="ここをクリックしてチャットを開始します。" name="chat_box" tool_tip="Enter キーを押して発言し、Ctrl + Enter キーで叫びます。"/>
- <button name="show_nearby_chat" tool_tip="近くのチャットログを表示・非表示"/>
+ <line_editor label="ここをクリックしてチャットを開始します。" name="chat_box" tool_tip="Enterキーで発言し、Ctrl+Enterキーでシャウトします。"/>
+ <button name="show_nearby_chat" tool_tip="近隣チャットログを表示/非表示"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_nearby_media.xml b/indra/newview/skins/default/xui/ja/panel_nearby_media.xml
index c29ec64304..1093624cda 100644
--- a/indra/newview/skins/default/xui/ja/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/ja/panel_nearby_media.xml
@@ -16,15 +16,15 @@
(再生中)
</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 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="メディアの設定を開きます"/>
- <button label="詳細 &gt;&gt;" label_selected="&lt;&lt; 簡易" name="more_btn" tool_tip="アドバンスコントロール"/>
- <button label="詳細 &gt;&gt;" label_selected="簡易 &lt;&lt;" name="less_btn" tool_tip="アドバンスコントロール"/>
+ <button label="詳細 ≫" label_selected="≪ 簡易" name="more_btn" tool_tip="拡張コントロール"/>
+ <button label="詳細 ≫" label_selected="≪ 簡易" name="less_btn" tool_tip="拡張コントロール"/>
</panel>
<panel name="nearby_media_panel">
<text name="nearby_media_title">
- 近くのメディア
+ 近隣のメディア
</text>
<text name="show_text">
表示:
@@ -54,7 +54,7 @@
<button name="pause_btn" tool_tip="選択したメディアを一時停止"/>
</layout_panel>
<layout_panel name="volume_slider_ctrl">
- <slider_bar initial_value="0.5" name="volume_slider" tool_tip="選択したメディアの音量"/>
+ <slider_bar name="volume_slider" tool_tip="選択したメディアの音量"/>
</layout_panel>
<layout_panel name="mute">
<button name="mute_btn" tool_tip="選択したメディアの音をミュート"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_notification.xml b/indra/newview/skins/default/xui/ja/panel_notification.xml
new file mode 100644
index 0000000000..351edf6d50
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_notification.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="通知パネル" name="notification_panel">
+ <panel label="情報パネル" name="info_panel">
+ <text name="text_box"/>
+ <text name="caution_text_box"/>
+ <text_editor name="text_editor_box"/>
+ </panel>
+ <panel label="コントロールパネル" name="control_panel">
+
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_notification_list_item.xml b/indra/newview/skins/default/xui/ja/panel_notification_list_item.xml
index 698aefdb3d..00733bf79d 100644
--- a/indra/newview/skins/default/xui/ja/panel_notification_list_item.xml
+++ b/indra/newview/skins/default/xui/ja/panel_notification_list_item.xml
@@ -1,39 +1,109 @@
-<?xml version="1.0" ?>
-<panel name="main_panel">
- <panel name="sender_time_panel_exp"/>
- <panel name="main_info_panel_expanded"/>
- <layout_panel name="layout_panel_middle_exp"/>
- <layout_stack name="horizontal_stack"/>
- <panel name="panel_expanded_view"/>
- <layout_panel name="layout_panel_expanded_view"/>
- <layout_stack name="item_vertical_stack"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="main_panel" title="panel_notification_list_item">
+ <panel.string name="sender_resident_text">
+ 送信者:"[SENDER_RESIDENT]"
+ </panel.string>
+ <panel.string name="group_name_text">
+ グループ:"[GROUP_NAME]"
+ </panel.string>
+ <panel.string name="group_fee_text">
+ 費用:[GROUP_FEE]
+ </panel.string>
+ <panel.string name="item_condensed_height">
+ 50
+ </panel.string>
+ <panel.string name="item_expanded_height">
+ 87
+ </panel.string>
+ <panel.string name="expanded_height_resize_for_attachment">
+ 27
+ </panel.string>
<panel name="panel_total_view">
- <text name="notification_time_exp" value="2014/12/24 23:30"/>
- <text name="sender_or_fee_box_exp">送信者:「住人 住人 住人」</text>
- <text name="notification_title_exp">通知件名 通知件名 通知件名 通知件名</text>
- <avatar_icon name="avatar_icon" tool_tip="アバター"/>
- <button name="join_btn" label="参加"/>
- <chat_editor name="notification_text_exp">通知件名がここに入る。あーだこーだ.</chat_editor>
- <button name="decline_btn" label="拒否"/>
- <group_icon name="group_icon_exp" tool_tip="グループ"/>
- <text name="sender_or_fee_box">送信者:「住人 住人 住人」</text>
- <icon name="attachment_icon_exp" tool_tip="アタッチメント"/>
- <icon name="system_notification_icon_exp" tool_tip="アイコン"/>
- <text name="notification_title">グループ名:通知件名 通知件名 通知件名 通知件名 通知件名</text>
- <button name="info_btn" label="情報"/>
- <text name="group_name_exp">グループ名 グループ名 グループ名</text>
- <text name="attachment_text">アタッチメントがここに入る。あーだこーだ.</text>
+ <layout_stack name="item_vertical_stack">
+ <layout_panel name="layout_panel_condensed_view">
+ <panel name="panel_condensed_view">
+ <layout_stack name="horizontal_stack">
+ <layout_panel name="layout_panel_right">
+ <group_icon name="group_icon" tool_tip="グループ"/>
+ <avatar_icon name="avatar_icon" tool_tip="アバター"/>
+ <icon name="system_notification_icon" tool_tip="アイコン"/>
+ </layout_panel>
+ <layout_panel name="layout_panel_middle">
+ <panel name="main_info_panel">
+ <panel name="notification_title_panel">
+ <text name="notification_title">
+ グループ名:通知件名 通知件名 通知件名 通知件名 通知件名
+ </text>
+ <icon name="attachment_icon" tool_tip="装着物"/>
+ </panel>
+ <panel name="sender_time_panel">
+ <text name="sender_or_fee_box">
+ 送信者:住民 じゅうみん
+ </text>
+ <text name="notification_time" value="2014年12月24日 23:30"/>
+ </panel>
+ </panel>
+ </layout_panel>
+ <layout_panel name="layout_panel_right">
+ <panel name="close_expand_panel">
+ <button name="close_btn"/>
+ <button name="expand_btn"/>
+ </panel>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </layout_panel>
+ <layout_panel name="layout_panel_expanded_view">
+ <panel name="panel_expanded_view">
+ <layout_stack name="horizontal_stack">
+ <layout_panel name="layout_panel_right_exp">
+ <group_icon name="group_icon_exp" tool_tip="グループ"/>
+ <avatar_icon name="avatar_icon_exp" tool_tip="アバター"/>
+ <icon name="system_notification_icon_exp" tool_tip="アイコン"/>
+ <icon name="attachment_icon_exp" tool_tip="添付"/>
+ </layout_panel>
+ <layout_panel name="layout_panel_middle_exp">
+ <panel name="main_info_panel_expanded">
+ <panel name="notification_title_panel_exp">
+ <text name="notification_title_exp">
+ 通知件名 通知件名 通知件名 通知件名
+ </text>
+ <text name="group_name_exp">
+ グループ名 グループ名 グループ名
+ </text>
+ </panel>
+ <panel name="sender_time_panel_exp">
+ <text name="sender_or_fee_box_exp">
+ 送信者:住民 じゅうみん
+ </text>
+ <text name="notification_time_exp" value="2014年12月24日 23:30"/>
+ </panel>
+ <panel name="notification_text_panel_exp">
+ <chat_editor name="notification_text_exp">
+ 通知件名がここに入る。あーだこーだ
+ </chat_editor>
+ </panel>
+ <panel name="attachment_panel">
+ <text name="attachment_text">
+ 装着物がここに入る。あーだこーだ
+ </text>
+ </panel>
+ <panel name="button_panel">
+ <button name="join_btn" label="参加"/>
+ <button name="decline_btn" label="却下"/>
+ <button name="info_btn" label="情報"/>
+ </panel>
+ </panel>
+ </layout_panel>
+ <layout_panel name="layout_panel_left_exp">
+ <panel name="close_expand_panel_exp">
+ <button name="close_expanded_btn"/>
+ <button name="condense_btn"/>
+ </panel>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </layout_panel>
+ </layout_stack>
</panel>
- <panel name="notification_title_panel_exp"/>
- <layout_panel name="layout_panel_right"/>
- <panel name="panel_condensed_view"/>
- <layout_panel name="layout_panel_condensed_view"/>
- <panel name="button_panel"/>
- <panel name="notification_text_panel_exp"/>
- <layout_panel name="layout_panel_right_exp"/>
- <panel name="sender_time_panel"/>
- <panel name="main_info_panel"/>
- <layout_panel name="layout_panel_middle"/>
- <panel name="notification_title_panel"/>
- <panel name="attachment_panel"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_online_status_toast.xml b/indra/newview/skins/default/xui/ja/panel_online_status_toast.xml
index fdc489f375..3a7eeb29c8 100644
--- a/indra/newview/skins/default/xui/ja/panel_online_status_toast.xml
+++ b/indra/newview/skins/default/xui/ja/panel_online_status_toast.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="friend_online_status" name="friend_online_status"/>
+<panel label="フレンドのオンライン状況" name="friend_online_status"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/panel_outfit_edit.xml b/indra/newview/skins/default/xui/ja/panel_outfit_edit.xml
index e89ce0c479..fbc64335aa 100644
--- a/indra/newview/skins/default/xui/ja/panel_outfit_edit.xml
+++ b/indra/newview/skins/default/xui/ja/panel_outfit_edit.xml
@@ -1,56 +1,80 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- Side tray Outfit Edit panel -->
-<panel label="アウトフットの編集" name="outfit_edit">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="outfit_edit">
<string name="No Outfit" value="アウトフィットなし"/>
<string name="unsaved_changes" value="保存されていない変更"/>
- <string name="now_editing" value="編集しています..."/>
+ <string name="now_editing" value="編集中"/>
+ <string name="folder_view_off" value="Hierarchy_View_Disabled" translate="false"/>
+ <string name="folder_view_on" value="Hierarchy_View_On" translate="false"/>
+ <string name="list_view_off" value="List_View_Disabled" translate="false"/>
+ <string name="list_view_on" value="List_View_On" translate="false"/>
<panel.string name="not_available">
- (該当なし)
+ (無し)
</panel.string>
<panel.string name="unknown">
(不明)
</panel.string>
- <string name="Filter.All" value="すべて"/>
- <string name="Filter.Clothes/Body" value="衣類/身体"/>
+ <string name="Filter.All" value="全て"/>
+ <string name="Filter.Clothes/Body" value="服装/身体"/>
<string name="Filter.Objects" value="オブジェクト"/>
- <string name="Filter.Clothing" value="衣類"/>
+ <string name="Filter.Clothing" value="服装"/>
<string name="Filter.Bodyparts" value="身体部位"/>
<string name="replace_body_part" value="クリックして既存のシェイプと置き換える"/>
- <text name="title" value="アウトフットの編集"/>
- <panel label="bottom_panel" name="header_panel">
- <panel label="bottom_panel" name="outfit_name_and_status">
- <text name="status" value="編集しています..."/>
- <text name="curr_outfit_name" value="[Current Outfit]"/>
+ <button name="back_btn"/>
+ <text name="title" value="アウトフィットのパーツを編集"/>
+ <panel name="header_panel">
+ <icon name="outfit_icon" top="2"/>
+ <panel name="outfit_name_and_status">
+ <text name="status" value="編集中…"/>
+ <text name="curr_outfit_name" value="[現在のアウトフィット]"/>
+ <loading_indicator name="edit_outfit_loading_indicator"/>
</panel>
</panel>
<layout_stack name="im_panels">
- <layout_panel label="IM コントロールパネル" name="outfit_wearables_panel">
+ <layout_panel lname="outfit_wearables_panel">
<layout_stack name="filter_panels">
<layout_panel name="add_button_and_combobox">
- <button label="さらに追加..." name="show_add_wearables_btn" tool_tip="開く/閉じる"/>
+ <panel name="cof_wearables_list"/>
+ <button name="show_add_wearables_btn" label="更に追加…" tool_tip="開く/閉じる"/>
+ <combo_box name="list_view_filter_combobox"/>
+ <combo_box name="folder_view_filter_combobox"/>
+ <button name="filter_button"/>
</layout_panel>
<layout_panel name="filter_panel">
- <filter_editor label="インベントリの着用物をフィルター" name="look_item_filter"/>
+ <filter_editor label="インベントリを着用可能物でフィルタ" name="look_item_filter"/>
</layout_panel>
</layout_stack>
</layout_panel>
<layout_panel name="add_wearables_panel">
- <button label="アイテムを装着" name="plus_btn"/>
+ <icon follows="left|top|right" height="10" image_name="Dragbar" left="0" top_pad="-9" width="313"/>
+ <inventory_panel name="folder_view"/>
+ <panel name="filtered_wearables_panel">
+ <wearable_items_list name="list_view"/>
+ </panel>
+ <button label="アイテムを着用" name="plus_btn"/>
</layout_panel>
</layout_stack>
<panel name="no_add_wearables_button_bar">
- <button name="shop_btn_1" tool_tip="「SL マーケットプレイス」ページをご覧ください。また、いま着用しているアイテムを選択してここをクリックすると、それに似たアイテムが表示されます。"/>
+ <menu_button name="gear_menu_btn"/>
+ <icon name="dummy_right_icon"/>
+ <button name="shop_btn_1" tool_tip="SLマーケットプレイスをご覧ください。また、いま着用しているアイテムを選択してここをクリックすると、それに似たアイテムが表示されます。"/>
</panel>
<panel name="add_wearables_button_bar">
- <button name="shop_btn_2" tool_tip="「SL マーケットプレイス」ページをご覧ください。また、いま着用しているアイテムを選択してここをクリックすると、それに似たアイテムが表示されます。"/>
+ <menu_button name="wearables_gear_menu_btn"/>
+ <button name="folder_view_btn"/>
+ <button name="list_view_btn"/>
+ <icon name="dummy_right_icon"/>
+ <button name="shop_btn_2" tool_tip="SLマーケットプレイスをご覧ください。また、いま着用しているアイテムを選択してここをクリックすると、それに似たアイテムが表示されます。"/>
</panel>
<panel name="save_revert_button_bar">
<layout_stack name="button_bar_ls">
<layout_panel name="save_btn_lp">
- <button label="保存" name="save_btn"/>
+ <button label="変更を保存" name="save_btn"/>
+ </layout_panel>
+ <layout_panel name="save_as_btn_lp">
+ <button label="別名で保存…" name="save_as_btn"/>
</layout_panel>
<layout_panel name="revert_btn_lp">
- <button label="変更を元に戻す" name="revert_btn" tool_tip="前回保存された状態に戻す"/>
+ <button label="変更を元に戻す" name="revert_btn" tool_tip="最後に保存されたバージョンに復元します。"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_outfit_gallery.xml b/indra/newview/skins/default/xui/ja/panel_outfit_gallery.xml
index 74c3bdac47..b469fa6869 100644
--- a/indra/newview/skins/default/xui/ja/panel_outfit_gallery.xml
+++ b/indra/newview/skins/default/xui/ja/panel_outfit_gallery.xml
@@ -1,7 +1,31 @@
-<?xml version="1.0" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Outfit Gallery">
+ <string name="outfit_photo_string">
+ "[OUTFIT_NAME]"のアウトフィットの画像
+ </string>
+ <string name="no_outfits_msg">
+ あなたは、まだアウトフィットを持っていません。[secondlife:///app/search/all/ 検索]してみてください。
+ </string>
+ <string name="no_matched_outfits_msg">
+ お探しのものが見つかりませんでしたか?[secondlife:///app/search/all/[SEARCH_TERM] 検索]してみてください。
+ </string>
+ <text name="no_outfits_txt">
+ 検索中…
+ </text>
+ <scroll_container name="gallery_scroll_panel">
+
+
+
+ </scroll_container>
<panel name="bottom_panel">
- <menu_button name="options_gear_btn" tool_tip="追加オプションを表示する"/>
- <button name="trash_btn" tool_tip="選択したアウトフィットを削除する"/>
+ <menu_button tool_tip="追加オプションを表示" name="options_gear_btn"/>
+ <icon name="dummy_icon"/>
+ <text name="OutfitcountText">
+ [COUNT]個
+ </text>
+ <text name="avatar_complexity_label">
+ 複雑度:[WEIGHT]
+ </text>
+ <button name="trash_btn" tool_tip="選択されたアウトフィットを削除"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_outfit_gallery_item.xml b/indra/newview/skins/default/xui/ja/panel_outfit_gallery_item.xml
index 8069321dac..7bcb99fea2 100644
--- a/indra/newview/skins/default/xui/ja/panel_outfit_gallery_item.xml
+++ b/indra/newview/skins/default/xui/ja/panel_outfit_gallery_item.xml
@@ -1,7 +1,15 @@
-<?xml version="1.0" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="gallery_item_panel">
+ <string name="worn_string">
+ (着用中)
+ </string>
+ <icon name="preview_outfit"/>
<panel name="text_bg_panel">
- <text name="outfit_name">サマーヒップスター、ピアス ピアス ピアス ピアス ピアス</text>
- <text name="outfit_worn_text">(装着)</text>
+ <text name="outfit_name">
+ 夏のヒップスター、ピアス、ピアス、ピアス、ピアス
+ </text>
+ <text name="outfit_worn_text">
+ (着用中)
+ </text>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_outfit_snapshot_inventory.xml b/indra/newview/skins/default/xui/ja/panel_outfit_snapshot_inventory.xml
new file mode 100644
index 0000000000..64ee963ad8
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_outfit_snapshot_inventory.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_outfit_snapshot_inventory">
+ <icon name="title_icon"/>
+ <text name="title">
+ インベントリ
+ </text>
+ <view_border name="hr"/>
+ <text name="hint_lbl">
+ インベントリ画像をアップロードするには、L$[UPLOAD_COST]かかります。
+金額はサブスクリプションレベルによって異なります。高いレベルでは減額されます。
+ </text>
+ <button label="キャンセル" name="cancel_btn"/>
+ <button label="アップロード(L$ [UPLOAD_COST])" name="save_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml
index 8633bfb2ad..3097482da6 100644
--- a/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml
@@ -1,23 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="もの" name="Outfits">
+<panel name="Outfits" label="モノ">
<panel.string name="wear_outfit_tooltip">
- 選択したアウトフィットを着用する
+ 選択したアウトフィットに着替える
</panel.string>
<panel.string name="wear_items_tooltip">
選択したアイテムを着用
</panel.string>
<tab_container name="appearance_tabs">
- <panel label="アウトフィットギャラリー" name="outfit_gallery_tab"/>
- <panel label="マイ アウトフィット" name="outfitslist_tab"/>
- <panel label="着用中" name="cof_tab"/>
+ <panel name="outfit_gallery_tab" label="アウトフィットギャラリー"/>
+ <panel name="outfitslist_tab" label="自分のアウトフィット"/>
+ <panel name="cof_tab" label="着用中"/>
</tab_container>
<panel name="bottom_panel">
<layout_stack name="bottom_panel_ls">
<layout_panel name="save_btn_lp">
- <button label="別名で保存" name="save_btn"/>
+ <button label="変更を保存" name="save_btn"/>
+ </layout_panel>
+ <layout_panel name="save_as_btn_lp">
+ <button label="名前をつけて保存…" name="save_as_btn"/>
</layout_panel>
<layout_panel name="wear_btn_lp">
- <button label="装着" name="wear_btn"/>
+ <button label="着用" name="wear_btn"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/ja/panel_outfits_inventory_gear_default.xml
index e8caab0696..9b8695bd4f 100644
--- a/indra/newview/skins/default/xui/ja/panel_outfits_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/ja/panel_outfits_inventory_gear_default.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_gear_default">
- <menu_item_call label="着用中のアウトフィットを入れ替える" name="wear"/>
- <menu_item_call label="着用中のアウトフィットから取り除く" name="remove"/>
- <menu_item_call label="名前の変更" name="rename"/>
+ <menu_item_call label="このアウトフィットに着替える" name="wear"/>
+ <menu_item_call label="このアウトフィットから取り除く" name="remove"/>
+ <menu_item_separator name="Outfits Gear Separator"/>
+ <menu_item_call label="名前変更" name="rename"/>
<menu_item_call label="リンクを外す" name="remove_link"/>
<menu_item_call label="アウトフィットを削除する" name="delete"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/panel_outfits_list.xml b/indra/newview/skins/default/xui/ja/panel_outfits_list.xml
index df9ef40113..94766ee8fa 100644
--- a/indra/newview/skins/default/xui/ja/panel_outfits_list.xml
+++ b/indra/newview/skins/default/xui/ja/panel_outfits_list.xml
@@ -1,11 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Outfits">
<accordion name="outfits_accordion">
- <no_matched_tabs_text name="no_matched_outfits_msg" value="お探しのものは見つかりましたか?[secondlife:///app/search/all/[SEARCH_TERM] 検索] をお試しください。"/>
- <no_visible_tabs_text name="no_outfits_msg" value="アウトフィットがまだありません。[secondlife:///app/search/all 検索] をお試しください。"/>
+ <no_matched_tabs_text name="no_matched_outfits_msg" value="お探しのものは見つかりましたか?[secondlife:///app/search/all/[SEARCH_TERM] 検索]をお試しください。"/>
+ <no_visible_tabs_text name="no_outfits_msg" value="アウトフィットがまだありません。[secondlife:///app/search/all 検索]をお試しください。"/>
</accordion>
<panel name="bottom_panel">
- <menu_button name="options_gear_btn" tool_tip="オプションを表示します"/>
- <button name="trash_btn" tool_tip="選択したアウトフィットを削除する"/>
+ <menu_button tool_tip="追加オプションを表示" name="options_gear_btn"/>
+ <icon name="dummy_icon"/>
+ <button name="trash_btn" tool_tip="選択されたアウトフィットを削除する。"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_outfits_wearing.xml b/indra/newview/skins/default/xui/ja/panel_outfits_wearing.xml
index a6fbaae58d..65bcdf8d5d 100644
--- a/indra/newview/skins/default/xui/ja/panel_outfits_wearing.xml
+++ b/indra/newview/skins/default/xui/ja/panel_outfits_wearing.xml
@@ -1,13 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Wearing">
<panel.string name="no_attachments">
- 着用しているアタッチメントはありません。
+ 着用している装着物はありません。
</panel.string>
<accordion name="wearables_accordion">
<accordion_tab name="tab_wearables" title="着用物"/>
- <accordion_tab name="tab_temp_attachments" title="一時的なアタッチメント"/>
+ <accordion_tab name="cof_items_list" title="一時的な装着物">
+ <scroll_list name="temp_attachments_list">
+ <scroll_list.columns name="icon"/>
+ <scroll_list.columns name="text"/>
+ </scroll_list>
+ </accordion_tab>
</accordion>
<panel name="bottom_panel">
- <menu_button name="options_gear_btn" tool_tip="オプションを表示します"/>
+ <menu_button name="options_gear_btn" tool_tip="オプションを表示します。"/>
+ <icon name="dummy_icon"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_people.xml b/indra/newview/skins/default/xui/ja/panel_people.xml
index be00a3c122..516ee3c7d2 100644
--- a/indra/newview/skins/default/xui/ja/panel_people.xml
+++ b/indra/newview/skins/default/xui/ja/panel_people.xml
@@ -1,71 +1,70 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- Side tray panel -->
-<panel label="人" name="people_panel">
- <string name="no_recent_people" value="最近交流した人はいません。 一緒に何かする仲間をお探しですか? [secondlife:///app/search/people 検索] か [secondlife:///app/worldmap 世界地図] をお試しください。"/>
- <string name="no_filtered_recent_people" value="お探しのものは見つかりましたか? [secondlife:///app/search/people/[SEARCH_TERM] 検索] をお試しください。"/>
- <string name="no_one_near" value="近くに誰もいません。 一緒に何かする仲間をお探しですか? [secondlife:///app/search/people 検索] か [secondlife:///app/worldmap 世界地図] をお試しください。"/>
- <string name="no_one_filtered_near" value="お探しのものは見つかりましたか? [secondlife:///app/search/people/[SEARCH_TERM] 検索] をお試しください。"/>
+<panel label="人物" name="people_panel">
+ <string name="no_recent_people" value="最近交流があった人物はいません。一緒に何かする仲間をお探しですか?[secondlife:///app/search/people 検索]か[secondlife:///app/worldmap ワールドマップ]をお試しください。"/>
+ <string name="no_filtered_recent_people" value="お探しの人物は見つかりましたか?[secondlife:///app/search/people/[SEARCH_TERM] 検索]をお試しください。"/>
+ <string name="no_one_near" value="近くに誰もいません。一緒に何かする仲間をお探しですか?[secondlife:///app/search/people 検索]か[secondlife:///app/worldmap ワールドマップ]をお試しください。"/>
+ <string name="no_one_filtered_near" value="お探しの人物は見つかりましたか?[secondlife:///app/search/people/[SEARCH_TERM] 検索]をお試しください。"/>
<string name="no_friends_online" value="オンラインのフレンドはいません"/>
<string name="no_friends" value="フレンドはいません"/>
<string name="no_friends_msg">
- 友達を見つけるには、[secondlife:///app/search/people 検索] をするか、住人を右クリックしてフレンド登録してください。
-一緒に何かする仲間をお探しですか? [secondlife:///app/worldmap 世界地図] をお試しください。
+ フレンドを見つけるには、[secondlife:///app/search/people 検索]をするか、人物を右クリックしてフレンド登録してください。
+一緒に何かするフレンドをお探しですか?[secondlife:///app/worldmap ワールドマップ]をお試しください。
</string>
<string name="no_filtered_friends_msg">
- お探しのものは見つかりましたか? [secondlife:///app/search/people/[SEARCH_TERM] 検索] をお試しください。
+ お探しのフレンドは見つかりましたか?[secondlife:///app/search/people/[SEARCH_TERM] 検索]をお試しください。
</string>
- <string name="no_filtered_groups_msg" value="お探しのものは見つかりましたか? [secondlife:///app/search/groups/[SEARCH_TERM] 検索] をお試しください。"/>
- <string name="no_groups_msg" value="グループをお探しですか? [secondlife:///app/search/groups 検索] をお試しください。"/>
- <string name="MiniMapToolTipMsg" value="[地域](ダブルクリックで地図を開く。Shift‐ドラッグで水平・垂直移動)"/>
+ <string name="no_filtered_groups_msg" value="お探しのフレンドは見つかりましたか?[secondlife:///app/search/groups/[SEARCH_TERM] 検索]をお試しください。"/>
+ <string name="no_groups_msg" value="グループをお探しですか?[secondlife:///app/search/groups 検索]をお試しください。"/>
+ <string name="MiniMapToolTipMsg" value="[地域](ダブルクリックでマップを開く。Shift‐ドラッグで水平・垂直移動)"/>
<string name="AltMiniMapToolTipMsg" value="[地域](ダブルクリックでテレポート。Shift‐ドラッグで水平・垂直移動)"/>
- <string name="GroupCountWithInfo" value="あなたは現在、[COUNT] グループに属しています。あと [REMAINING] グループに参加することができます。[secondlife:/// 上限を増やす]"/>
+ <string name="GroupCountWithInfo" value="あなたは現在、[COUNT]グループに属しています。あと[REMAINING]グループに参加することができます。[secondlife:/// 上限を増やす]"/>
<tab_container name="tabs">
- <panel label="近く" name="nearby_panel">
+ <panel label="近隣" name="nearby_panel">
<panel label="bottom_panel" name="nearby_buttons_panel">
- <filter_editor label="人をフィルター" name="nearby_filter_input"/>
- <button name="gear_btn" tool_tip="選択した人に対するアクション"/>
- <menu_button name="nearby_view_btn" tool_tip="表示 / 並べ替えのオプション"/>
- <button name="add_friend_btn" tool_tip="フレンド登録を申し出ます"/>
- <dnd_button name="nearby_del_btn" tool_tip="フレンドとして選択されている人を削除"/>
+ <filter_editor label="人物をフィルタ" name="nearby_filter_input"/>
+ <button name="gear_btn" tool_tip="選択した人物に対するアクション"/>
+ <menu_button name="nearby_view_btn" tool_tip="表示/並べ替えのオプション"/>
+ <button name="add_friend_btn" tool_tip="フレンド登録を申し込みます"/>
+ <dnd_button name="nearby_del_btn" tool_tip="フレンドとして選択されている人物を削除"/>
</panel>
</panel>
<panel label="フレンド" name="friends_panel">
<panel label="bottom_panel" name="friends_buttons_panel">
- <filter_editor label="人をフィルター" name="friends_filter_input"/>
- <button name="gear_btn" tool_tip="選択した人に対するアクション"/>
- <menu_button name="friends_view_btn" tool_tip="表示 / 並べ替えのオプション"/>
- <button name="friends_add_btn" tool_tip="フレンド登録を申し出ます"/>
- <dnd_button name="friends_del_btn" tool_tip="フレンドとして選択されている人を削除"/>
+ <filter_editor label="人物をフィルタ" name="friends_filter_input"/>
+ <button name="gear_btn" tool_tip="選択した人物に対するアクション"/>
+ <menu_button name="friends_view_btn" tool_tip="表示/並べ替えのオプション"/>
+ <button name="friends_add_btn" tool_tip="フレンド登録を申し込みます"/>
+ <dnd_button name="friends_del_btn" tool_tip="フレンドとして選択されている人物を削除"/>
</panel>
<accordion name="friends_accordion">
<accordion_tab name="tab_online" title="オンライン"/>
<accordion_tab name="tab_all" title="全員"/>
- <accordion_tab name="tab_suggested_friends" title="友だちになりたくない人"/>
+ <accordion_tab name="tab_suggested_friends" title="友だちになりたくない人物"/>
</accordion>
</panel>
<panel label="グループ" name="groups_panel">
<panel label="bottom_panel" name="groups_buttons_panel">
- <filter_editor label="フィルターグループ" name="groups_filter_input"/>
+ <filter_editor label="グループをフィルタ" name="groups_filter_input"/>
<menu_button name="groups_gear_btn" tool_tip="選択したグループに対するアクション"/>
- <menu_button name="groups_view_btn" tool_tip="表示 / 並べ替えのオプション"/>
- <menu_button name="plus_btn" tool_tip="グループに参加 / 新規グループを作成します"/>
+ <menu_button name="groups_view_btn" tool_tip="表示/並べ替えのオプション"/>
+ <menu_button name="plus_btn" tool_tip="グループに参加/新規グループを作成します"/>
<dnd_button name="minus_btn" tool_tip="選択したグループから脱退"/>
</panel>
<text name="groupcount">
- あなたは現在、[COUNT] グループに属しています。あと [REMAINING] グループに参加することができます。
+ あなたは現在、[COUNT]グループに属しています。あと[REMAINING]グループに参加することができます。
</text>
</panel>
<panel label="最新" name="recent_panel">
<panel label="bottom_panel" name="recent_buttons_panel">
- <filter_editor label="人をフィルター" name="recent_filter_input"/>
- <button name="gear_btn" tool_tip="選択した人に対するアクション"/>
- <menu_button name="recent_view_btn" tool_tip="表示 / 並べ替えのオプション"/>
- <button name="add_friend_btn" tool_tip="フレンド登録を申し出ます"/>
- <dnd_button name="recent_del_btn" tool_tip="フレンドとして選択されている人を削除"/>
+ <filter_editor label="人物をフィルタ" name="recent_filter_input"/>
+ <button name="gear_btn" tool_tip="選択した人物に対するアクション"/>
+ <menu_button name="recent_view_btn" tool_tip="表示/並べ替えのオプション"/>
+ <button name="add_friend_btn" tool_tip="フレンド登録を申し込みます。"/>
+ <dnd_button name="recent_del_btn" tool_tip="選択されているフレンドを削除"/>
</panel>
</panel>
- <panel label="停止" name="blocked_panel">
- <panel label="ブロックされた住人とオブジェクト" name="panel_block_list_sidetray"/>
+ <panel label="ブロック" name="blocked_panel">
+ <panel label="ブロックされた人物とオブジェクト" name="panel_block_list_sidetray"/>
</panel>
</tab_container>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_performance_autoadjustments.xml b/indra/newview/skins/default/xui/ja/panel_performance_autoadjustments.xml
new file mode 100644
index 0000000000..3a0eeae6d5
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_performance_autoadjustments.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_performance_autoadjustments">
+ <button name="back_btn"/>
+ <text name="back_lbl">
+ 戻る
+ </text>
+ <text name="settings_title">
+ 設定を自動調整
+ </text>
+ <button label="推奨設定にリセット" name="defaults_btn"/>
+ <view_border name="border0"/>
+ <text name="targetfps_desc">
+ 目標フレームレート
+ </text>
+ <spinner name="target_fps" tool_tip="ビューアーは、グラフィック設定を調整することでこれを実現しようとします。"/>
+ <text name="display_desc">
+ お使いのディスプレイは、最大[FPS_LIMIT]fpsをサポートしています。
+ </text>
+ <text name="settings_desc">
+ 影響する設定
+ </text>
+ <combo_box name="TuningFPSStrategy">
+ <combo_box.item label="アバターのみ" name="av_only" value="0"/>
+ <combo_box.item label="アバターとワールド" name="av_and_scene" value="1"/>
+ <combo_box.item label="ワールドのみ" name="scene_only" value="2"/>
+ </combo_box>
+ <button label="今すぐ自動調整" name="start_autotune" tool_tip="ビューアーは、目標FPSを満たすように設定が調整されるまで停止します。"/>
+ <button label="キャンセル" name="stop_autotune" tool_tip="自動調整を中断します。"/>
+ <text name="wip_desc">
+ 調整中です…
+ </text>
+ <check_box label="継続的に調整する" name="AutoTuneContinuous" tool_tip="ビューアーは、このフローターが閉じていても停止するまで、目標FPSを満たすように設定を継続的に調整します。">
+ </check_box>
+ <radio_group name="autotune_lock_type">
+ <radio_item label="このログインセッションのみ" name="one_session_lock" value="0"/>
+ <radio_item label="今後のログインセッションから" name="next_session_lock" value="1"/>
+ </radio_group>
+ <view_border name="border_vsync"/>
+ <check_box label="VSyncを有効化" tool_tip="垂直同期を有効にして、画面のティアリングや途切れを軽減します。"/>
+ <text name="vsync_desc">
+ モニターのリフレッシュレートをフレームレートと同期させます。
+ </text>
+ <text name="vsync_desc_limit">
+ 注意:VSyncをオンにすると、フレームレートが[FPS_LIMIT]fpsに制限されます。
+ </text>
+ <view_border name="border1"/>
+ <text name="simplify_dist_desc">
+ 遠くにあるアバターの表示の詳細度を減らすと、グラフィックスの速度が向上します。
+ </text>
+ <check_box label="アバターをさらに簡素化" name="AutoTuneImpostorByDistEnabled" tool_tip="有効にするとビューアは、MaxNonImpostorsの設定を調整して、完全にレンダリングされるアバターを指定された半径内のアバターに限定します。"/>
+ <spinner name="ffa_autotune"/>
+ <text name="dist_meters">
+ メートル
+ </text>
+ <view_border name="border2"/>
+ <text name="dist_limits_desc">
+ 自動設定が影響を及ぼす距離範囲を選択します。
+ </text>
+ <text name="min_dist_lbl">
+ 最小距離
+ </text>
+ <spinner name="min_dd_autotune"/>
+ <text name="pref_dist_lbl">
+ 最大距離
+ </text>
+ <spinner name="pref_dd_autotune"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_performance_complexity.xml b/indra/newview/skins/default/xui/ja/panel_performance_complexity.xml
new file mode 100644
index 0000000000..65438ab45d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_performance_complexity.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_performance_complexity">
+ <button name="back_btn"/>
+ <text name="back_lbl">
+ 戻る
+ </text>
+ <text name="attachments_title">
+ 現在のアバターの複雑度
+ </text>
+ <text name="attachments_desc1">
+ 装着物を付けるとアバターがより複雑になります。アバターの複雑度が高い場合、
+ </text>
+ <text name="attachments_desc2">
+ 他の人からあなたの詳細が見えず、グラフィック速度が低下する可能性があります。
+ </text>
+ <text name="attachments_desc3">
+ 不要な重い装着物を削除すると解決することがあります。
+ </text>
+ <name_list name="obj_list">
+ <name_list.columns label="" name="complex_visual"/>
+ <name_list.columns label="" name="complex_value"/>
+ <name_list.columns label="" name="name"/>
+ </name_list>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_performance_huds.xml b/indra/newview/skins/default/xui/ja/panel_performance_huds.xml
new file mode 100644
index 0000000000..51d9e73540
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_performance_huds.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_performance_huds">
+ <button name="back_btn"/>
+ <text name="back_lbl">
+ 戻る
+ </text>
+ <text name="huds_title">
+ アクティブなHUD
+ </text>
+ <text name="huds_desc1">
+ 使用していないHUDを取り外すとメモリが節約され、Second Lifeの処理が高速化されます。
+ </text>
+ <text name="huds_desc2">
+ 注意:HUDの最小化ボタンを使用しても、HUDを取り外したことにはなりません。
+ </text>
+ <name_list name="hud_list">
+ <name_list.columns label="" name="complex_visual"/>
+ <name_list.columns label="" name="complex_value"/>
+ <name_list.columns label="" name="name"/>
+ </name_list>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_performance_nearby.xml b/indra/newview/skins/default/xui/ja/panel_performance_nearby.xml
new file mode 100644
index 0000000000..1695c6e556
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_performance_nearby.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_performance_nearby">
+ <button name="back_btn"/>
+ <text name="back_lbl">
+ 戻る
+ </text>
+ <text name="av_nearby_title">
+ 近くのアバター
+ </text>
+ <text name="av_nearby_desc">
+ 複雑度の高いアバターの表示を省略して速度を上げることができます。
+ </text>
+ <slider tool_tip="複雑度が高いアバターをレンダリングする際に時間がかかるとみなすタイミングを制御します。(単位:マイクロ秒)" name="RenderAvatarMaxART">
+ </slider>
+ <text name="RenderAvatarMaxARTText">
+ 制限なし
+ </text>
+ <name_list name="nearby_list">
+ <name_list.columns label="" name="complex_visual"/>
+ <name_list.columns label="" name="complex_value"/>
+ <name_list.columns label="" name="name"/>
+ </name_list>
+ <text name="av_nearby_desc2">
+ インワールド内のアバターを右クリックして表示を制御することもできます。
+ </text>
+ <button label="例外…" name="exceptions_btn">
+ </button>
+ <check_box label="フレンドは常に詳細表示する" name="display_friends"/>
+ <view_border name="border"/>
+ <check_box label="アバターを完全に非表示にする(風景写真に適しています)" name="hide_avatars"/>
+ <text name="name_tags_textbox">
+ 名前タグ:
+ </text>
+ <radio_group name="name_tag_mode">
+ <radio_item label="オフ" name="radio"/>
+ <radio_item label="オン" name="radio2"/>
+ <radio_item label="簡略表示" name="radio3"/>
+ </radio_group>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_performance_preferences.xml b/indra/newview/skins/default/xui/ja/panel_performance_preferences.xml
new file mode 100644
index 0000000000..a031cd7176
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_performance_preferences.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_performance_preferences">
+ <button name="back_btn"/>
+ <text name="back_lbl">
+ 戻る
+ </text>
+ <text name="settings_title">
+ グラフィック設定
+ </text>
+ <button label="拡張設定を開く" name="advanced_btn"/>
+ <button label="推奨設定にリセット" name="defaults_btn"/>
+ <view_border name="border0"/>
+ <text name="quality_lbl">
+ 品質と速度
+ </text>
+ <text name="fastest_lbl">
+ 距離と速度
+ </text>
+ <radio_group name="graphics_quality">
+ <radio_item name="0"/>
+ <radio_item name="1"/>
+ <radio_item name="2"/>
+ <radio_item name="3"/>
+ <radio_item name="4"/>
+ <radio_item name="5"/>
+ <radio_item name="6"/>
+ </radio_group>
+ <text name="quality_lbl">
+ 最高品位
+ </text>
+ <text name="quality_desc">
+ ショートカットを選択すると、手動で行った変更がすべてリセットされます。
+ </text>
+ <view_border name="border2"/>
+ <text name="distance_lbl">
+ 距離
+ </text>
+ <text name="faster_lbl">
+ 速度
+ </text>
+ <slider name="draw_distance"/>
+ <text name="draw_distance_m">
+ m
+ </text>
+ <text name="farther_lbl">
+ 遠景
+ </text>
+ <text name="distance_desc1">
+ ズームアウト時に遠くまで見たい場合は、距離を長く設定してください。
+ </text>
+ <view_border name="border3"/>
+ <text name="environment_lbl">
+ 環境
+ </text>
+ <text name="enhancements_desc">
+ この設定によりリアリズムは向上しますが、速度が低下する可能性があります。
+ </text>
+ <check_box label="大気(周辺)シェーダー" name="atmospheric_shaders"/>
+ <check_box label="高度な光源モデル" name="advanced_lighting_model"/>
+ <text name="RenderShadowDetailText">
+ 影:
+ </text>
+ <combo_box name="ShadowDetail">
+ <combo_box.item label="なし" name="0" value="0"/>
+ <combo_box.item label="太陽/月" name="1" value="1"/>
+ <combo_box.item label="太陽/月+プロジェクター" name="2" value="2"/>
+ </combo_box>
+ <view_border name="border3"/>
+ <text name="water_lbl">
+ 水面
+ </text>
+ <text name="water_desc">
+ 水面の効果を簡素化するかオフにすると、フレームレートが大幅に向上します。
+ </text>
+ <check_box label="透明な水" name="TransparentWater"/>
+ <text name="ReflectionsText">
+ 水面の反射:
+ </text>
+ <combo_box name="Reflections">
+ <combo_box.item label="なし;不透明" name="0" value="-2"/>
+ <combo_box.item label="なし;透明" name="0" value="-1"/>
+ <combo_box.item label="最小限" name="0" value="0"/>
+ <combo_box.item label="地形と樹木" name="1" value="1"/>
+ <combo_box.item label="全ての静的なオブジェクト" name="2" value="2"/>
+ <combo_box.item label="全てのアバターとオブジェクト" name="3" value="3"/>
+ <combo_box.item label="全て" name="4" value="4"/>
+ </combo_box>
+ <view_border name="border4"/>
+ <text name="photo_lbl">
+ 写真
+ </text>
+ <text name="photo_desc">
+ 詳細度を最大にすると撮影に適した画像になりますが、フレームレートが下がります。
+ </text>
+ <spinner label="距離の詳細:" name="render_volume_lod"/>
+ <text name="photo_desc">
+ (0.0~4.0の値を入れてください)
+ </text>
+ <text name="1_lbl">
+ 1
+ </text>
+ <text name="2_lbl">
+ 2
+ </text>
+ <text name="3_lbl">
+ 3
+ </text>
+ <text name="4_lbl">
+ 4
+ </text>
+ <text name="5_lbl">
+ 5
+ </text>
+ <text name="6_lbl">
+ 6
+ </text>
+ <text name="7_lbl">
+ 7
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_place_profile.xml b/indra/newview/skins/default/xui/ja/panel_place_profile.xml
index 7235bc0f18..21843e4420 100644
--- a/indra/newview/skins/default/xui/ja/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_place_profile.xml
@@ -14,7 +14,7 @@
<string name="sale_pending_text" value="(販売処理中)"/>
<string name="group_owned_text" value="(グループ所有)"/>
<string name="price_text" value="L$"/>
- <string name="area_text" value="平方メートル"/>
+ <string name="area_text" value="㎡"/>
<string name="all_residents_text" value="すべての住人"/>
<string name="group_text" value="グループ"/>
<string name="can_resell">
@@ -36,10 +36,10 @@
この場所の情報は現在ご利用いただけません。あとでもう一度お試しください。
</string>
<string name="server_forbidden_text">
- この場所の情報は、アクセス制限のためご利用いただけません。 許可については区画所有者にお問い合わせください。
+ この場所の情報は、アクセス制限のためご利用いただけません。許可については区画所有者にお問い合わせください。
</string>
<string name="acquired_date">
- [year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ [year,datetime,local]年[mth,datetime,local]月[day,datetime,local]日[wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
</string>
<button name="back_btn" tool_tip="戻る"/>
<text name="title" value="場所のプロフィール"/>
@@ -73,7 +73,7 @@
<button label="土地情報" name="about_land_btn"/>
</panel>
</accordion_tab>
- <accordion_tab name="region_information_tab" title="リージョン(地域) ">
+ <accordion_tab name="region_information_tab" title="リージョン(地域)">
<panel name="region_information_panel">
<text name="region_name_label" value="リージョン:"/>
<text name="region_name" value="Mooseland"/>
@@ -87,12 +87,12 @@
<text name="region_group">
The Mighty Moose of mooseville soundvillemoose
</text>
- <button label="地域 / 不動産" name="region_info_btn"/>
+ <button label="リージョン(地域)/不動産" name="region_info_btn"/>
</panel>
</accordion_tab>
- <accordion_tab name="estate_information_tab" title="エステート(不動産)">
+ <accordion_tab name="estate_information_tab" title="不動産(不動産)">
<panel name="estate_information_panel">
- <text name="estate_name_label" value="エステート:"/>
+ <text name="estate_name_label" value="不動産:"/>
<text name="estate_rating_label" value="レーティング:"/>
<text name="estate_owner_label" value="所有者:"/>
<text name="estate_owner" value="長い所有者の名前をテスト"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_places.xml b/indra/newview/skins/default/xui/ja/panel_places.xml
index 9d3925afdc..33699fe37f 100644
--- a/indra/newview/skins/default/xui/ja/panel_places.xml
+++ b/indra/newview/skins/default/xui/ja/panel_places.xml
@@ -1,48 +1,66 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="場所" name="places panel">
- <string name="landmarks_tab_title" value="マイ ランドマーク"/>
- <string name="teleport_history_tab_title" value="テレポートの履歴"/>
- <filter_editor label="場所をフィルター" 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="テレポート" name="teleport_btn" tool_tip="該当するエリアにテレポートする"/>
+ <string name="landmarks_tab_title" value="ランドマーク"/>
+ <string name="teleport_history_tab_title" value="訪問した場所"/>
+ <string name="favorites_tab_title" value="お気に入り"/>
+ <string name="tooltip_trash_items" value="選択されたランドマークかフォルダを削除"/>
+ <string name="tooltip_trash_history" value="訪問した場所一覧を削除"/>
+ <layout_stack name="places_layout_panel">
+ <layout_panel name="main_panel">
+ <layout_stack name="top_menu_panel">
+ <layout_panel name="filter_panel">
+ <filter_editor label="場所をフィルタ" name="Filter"/>
+ </layout_panel>
+ <layout_panel name="options_gear_btn_panel">
+ <menu_button tool_tip="オプションを表示" name="options_gear_btn"/>
+ </layout_panel>
+ <layout_panel name="options_sort_btn_panel">
+ <menu_button tool_tip="ソートオプションを表示" name="sorting_menu_btn"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <menu_button name="add_menu_btn" tool_tip="新しいランドマークかフォルダを追加"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="trash_btn"/>
+ </layout_panel>
+ </layout_stack>
+ <tab_container name="Places Tabs"/>
+ <panel name="panel_place_profile"/>
+ <panel name="panel_landmark_info"/>
+ </layout_panel>
+ <layout_panel auto_resize="false" layout="topleft" height="25" name="button_layout_panel">
+ <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="テレポート" name="teleport_btn" tool_tip="該当するエリアにテレポートする"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="マップ" name="map_btn" tool_tip="ワールドマップに該当するエリアを表示"/>
+ </layout_panel>
+ </layout_stack>
</layout_panel>
- <layout_panel name="chat_btn_lp">
- <button label="地図" name="map_btn" tool_tip="世界地図に該当するエリアを表示"/>
+ <layout_panel name="lp_options">
+ <menu_button name="overflow_btn" tool_tip="追加オプションを表示"/>
</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="ランドマークの情報を編集します"/>
- </layout_panel>
- <layout_panel name="overflow_btn_lp">
- <menu_button label="▼" name="overflow_btn" tool_tip="オプションを表示します"/>
+ <layout_panel name="lp2">
+ <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_profile_ls">
- <layout_panel name="profile_btn_lp">
- <button label="プロフィール" name="profile_btn" tool_tip="場所のプロフィールを表示"/>
+ <layout_stack name="bottom_bar_ls2">
+ <layout_panel name="save_btn_lp">
+ <button label="保存" name="save_btn"/>
</layout_panel>
- </layout_stack>
- <layout_stack name="bottom_bar_close_ls3">
- <layout_panel name="close_btn_lp">
- <button label="閉じる" name="close_btn"/>
+ <layout_panel name="cancel_btn_lp">
+ <button label="キャンセル" name="cancel_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>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_postcard_message.xml b/indra/newview/skins/default/xui/ja/panel_postcard_message.xml
index b7c3f48557..65f6046003 100644
--- a/indra/newview/skins/default/xui/ja/panel_postcard_message.xml
+++ b/indra/newview/skins/default/xui/ja/panel_postcard_message.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_postcard_message">
<text name="to_label">
- 終:
+ 宛先:
</text>
<text name="name_label">
- 始:
+ 名前:
</text>
<text name="subject_label">
件名:
@@ -16,6 +16,6 @@
<text_editor name="msg_form">
メッセージをここに入力してください。
</text_editor>
- <button label="取り消し" name="cancel_btn"/>
+ <button label="キャンセル" name="cancel_btn"/>
<button label="送信" name="send_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_postcard_settings.xml b/indra/newview/skins/default/xui/ja/panel_postcard_settings.xml
index f34fdc6b67..6373eadabc 100644
--- a/indra/newview/skins/default/xui/ja/panel_postcard_settings.xml
+++ b/indra/newview/skins/default/xui/ja/panel_postcard_settings.xml
@@ -2,12 +2,12 @@
<panel name="panel_postcard_settings">
<combo_box label="解像度" name="postcard_size_combo">
<combo_box.item label="現在のウィンドウ" 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="640✕480" name="640x480"/>
+ <combo_box.item label="800✕600" name="800x600"/>
+ <combo_box.item label="1024✕768" name="1024x768"/>
<combo_box.item label="カスタム" name="Custom"/>
</combo_box>
- <spinner label="横幅 x 高さ" name="postcard_snapshot_width"/>
+ <spinner label="横幅✕高さ" name="postcard_snapshot_width"/>
<check_box label="縦横比の固定" name="postcard_keep_aspect_check"/>
<slider label="品質:" name="image_quality_slider"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
index 64bd382575..40998f8035 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
@@ -1,32 +1,36 @@
-<?xml version="1.0" encoding="utf-8"?>
-<panel label="アドバンス" name="advanced">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="拡張" name="advanced">
<panel.string name="aspect_ratio_text">
- [NUM]:[DEN]
+ [NUM]:[DEN]
</panel.string>
<text name="Cache:">
キャッシュ:
</text>
- <spinner label="キャッシュサイズ (256 - 9984MB)" name="cachesizespinner"/>
+ <spinner label="キャッシュ容量(256~9984㎆)" name="cachesizespinner"/>
<text name="text_box5">
- MB
+ ㎆
</text>
<button label="キャッシュをクリア" label_selected="キャッシュをクリア" name="clear_cache"/>
<text name="Cache location">
- キャッシュの保存場所:
+ キャッシュ保存先:
</text>
<button label="参照" label_selected="参照" name="set_cache"/>
<button label="デフォルトの場所" label_selected="デフォルトの場所" name="default_cache_location"/>
<text name="UI Size:">
- UI サイズ:
+ UIのサイズ:
+ </text>
+ <text name="HUD Size:">
+ HUDのスケール:
</text>
<check_box label="スクリプトのエラーを表示:" name="show_script_errors"/>
<radio_group name="show_location">
- <radio_item label="近くのチャット" name="0"/>
+ <radio_item label="近隣チャット" name="0"/>
<radio_item label="別々のウィンドウ" name="1"/>
</radio_group>
- <check_box label="複数のビューワを許可" name="allow_multiple_viewer_check"/>
+ <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_advanced_menu_check"/>
<check_box label="開発メニューを表示" name="show_develop_menu_check"/>
- <button label="デフォルト作成許可" name="default_creation_permissions"/>
+ <button label="記録済みのユーザ名" name="remembered_usernames"/>
+ <button label="デフォルトの作成権限" name="default_creation_permissions"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml
index 4c2906cc18..1137907fec 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml
@@ -3,10 +3,10 @@
<text name="tell_me_label">
知らせる:
</text>
- <check_box label="L$ を使用する場合" name="notify_money_spend_checkbox"/>
- <check_box label="フレンドがログイン・ログアウトするとき" name="friends_online_notify_checkbox"/>
- <check_box label="L$ を手に入れる場合" name="notify_money_received_checkbox"/>
- <text name="show_label" width="300">
+ <check_box label="L$の使用時" name="notify_money_spend_checkbox"/>
+ <check_box label="フレンドのログイン状態変化時" name="friends_online_notify_checkbox"/>
+ <check_box label="L$の入手時" name="notify_money_received_checkbox"/>
+ <text name="show_label">
常に表示するメッセージ:
</text>
<text name="dont_show_label">
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
index 5046c11194..dd11296729 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
@@ -1,23 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="チャット" name="chat">
- <check_box initial_value="true" label="近くのチャットでジェスチャーを自動コンプリートする" name="auto_complete_gestures"/>
+ <check_box initial_value="true" label="近隣チャットでジェスチャーを自動補完する" name="auto_complete_gestures"/>
<panel name="general_chat_settings">
<check_box initial_value="true" label="チャット中にタイピング動作のアニメーションを再生" name="play_typing_animation"/>
- <check_box label="オフライン時に受け取った IM をメールで受信" name="send_im_to_email"/>
- <check_box label="フレンドとグループ以外からはコールと IM を受信しない" name="voice_call_friends_only_check"/>
+ <check_box label="オフライン時に受け取ったIMはメールで受信する" name="send_im_to_email"/>
+ <check_box label="フレンドとグループ以外からのコールとIMは受信しない" name="voice_call_friends_only_check"/>
+ <text name="email_settings">
+ [https://accounts.secondlife.com/change_email?lang=ja オフライン時のIMのメール送信先の設定]
+ </text>
<text name="font_size">
文字の大きさ:
</text>
<combo_box name="chat_font_size">
- <item label="小規模" name="Small" value="0"/>
+ <item label="小" name="Small" value="0"/>
<item label="中" name="Medium" value="1"/>
- <item label="大規模" name="Large" value="2"/>
+ <item label="大" name="Large" value="2"/>
</combo_box>
<check_box label="吹き出しチャット" name="bubble_text_chat"/>
</panel>
<panel name="im_notification_settings">
<text name="friend_ims">
- フレンド IM:
+ フレンドIM:
</text>
<combo_box name="FriendIMOptions">
<item label="開いている会話ウィンドウ" name="OpenConversationsWindow" value="openconversations"/>
@@ -27,7 +30,7 @@
</combo_box>
<check_box label="サウンドを再生" name="play_sound_friend_im"/>
<text name="non_friend_ims">
- フレンドのいない IM:
+ フレンドのいないIM:
</text>
<combo_box name="NonFriendIMOptions">
<item label="開いている会話ウィンドウ" name="OpenConversationsWindow" value="openconversations"/>
@@ -37,7 +40,7 @@
</combo_box>
<check_box label="サウンドを再生" name="play_sound_non_friend_im"/>
<text name="conference_ims">
- 会議 IM:
+ 会話IM:
</text>
<combo_box name="ConferenceIMOptions">
<item label="開いている会話ウィンドウ" name="OpenConversationsWindow" value="openconversations"/>
@@ -47,7 +50,7 @@
</combo_box>
<check_box label="サウンドを再生" name="play_sound_conference_im"/>
<text name="group_chat">
- グループチャット:
+ グループチャット:
</text>
<combo_box name="GroupChatOptions">
<item label="開いている会話ウィンドウ" name="OpenConversationsWindow" value="openconversations"/>
@@ -57,7 +60,7 @@
</combo_box>
<check_box label="サウンドを再生" name="play_sound_group_chat_im"/>
<text name="nearby_chat">
- 近くのチャット:
+ 近隣チャット:
</text>
<combo_box name="NearbyChatOptions">
<item label="開いている会話ウィンドウ" name="OpenConversationsWindow" value="openconversations"/>
@@ -67,7 +70,7 @@
</combo_box>
<check_box label="サウンドを再生" name="play_sound_nearby_chat_im"/>
<text name="object_ims">
- オブジェクト IM:
+ オブジェクトによるIM:
</text>
<combo_box name="ObjectIMOptions">
<item label="開いている会話ウィンドウ" name="OpenConversationsWindow" value="openconversations"/>
@@ -77,12 +80,12 @@
</combo_box>
<check_box label="サウンドを再生" name="play_sound_object_im"/>
<text name="notifications_alert">
- 一時的にすべての通知を停止するには、「コミュニケーション」 &gt; 「着信拒否]を使用します。
+ 一時的にすべての通知を停止するには、「コミュニケーション」>「着信拒否」を使用します。
</text>
</panel>
<panel name="play_sound_settings">
<text name="play_sound">
- サウンドを再生:
+ サウンドを再生:
</text>
<check_box label="新しい会話" name="new_conversation"/>
<check_box label="受信音声コール" name="incoming_voice_call"/>
@@ -94,18 +97,18 @@
保存:
</text>
<combo_box name="conversation_log_combo">
- <item label="ログおよびテキストチャット" name="log_and_transcripts" value="2"/>
+ <item label="ログとテキストチャット" name="log_and_transcripts" value="2"/>
<item label="ログのみ" name="log_only" value="1"/>
- <item label="ログまたはテキストチャットなし" name="no_log_or_transcript" value="0"/>
+ <item label="ログかテキストチャットなし" name="no_log_or_transcript" value="0"/>
</combo_box>
- <button label="ログを消去..." name="clear_log"/>
- <button label="テキストチャットを削除..." name="delete_transcripts"/>
+ <button label="ログを消去…" name="clear_log"/>
+ <button label="テキストチャットを削除…" name="delete_transcripts"/>
<text name="log_location_label">
場所:
</text>
- <button label="参照..." label_selected="参照" name="log_path_button"/>
+ <button label="参照…" label_selected="参照" name="log_path_button"/>
</panel>
- <button label="他の言語..." name="ok_btn"/>
- <button label="自動置換..." name="autoreplace_showgui"/>
- <button label="スペルチェック中..." name="spellcheck_showgui"/>
+ <button label="他の言語…" name="ok_btn"/>
+ <button label="自動置換…" name="autoreplace_showgui"/>
+ <button label="スペルチェック…" name="spellcheck_showgui"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_colors.xml b/indra/newview/skins/default/xui/ja/panel_preferences_colors.xml
index 9f6abf8fcb..b740f85806 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_colors.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_colors.xml
@@ -1,7 +1,7 @@
<?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">
@@ -11,7 +11,7 @@
自分
</text>
<text name="text_box2">
- 他の住人
+ 他人
</text>
<text name="text_box3">
オブジェクト
@@ -29,7 +29,7 @@
所有者
</text>
<text name="text_box9">
- URL
+ URL
</text>
<text name="bubble_chat">
名前の表示の背景色(吹き出しチャットにも適用):
@@ -37,8 +37,8 @@
<color_swatch name="background" tool_tip="名前の表示色を選択"/>
<slider label="不透明度:" name="bubble_chat_opacity" tool_tip="名前の表示の不透明度を選択"/>
<text name="floater_opacity">
- フローターの不透明度:
+ フローターの透過度:
</text>
- <slider label="有効:" name="active"/>
- <slider label="無効:" name="inactive"/>
+ <slider label="アクティブなフローター:" name="active"/>
+ <slider label="非アクティブなフローター:" name="inactive"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_controls.xml b/indra/newview/skins/default/xui/ja/panel_preferences_controls.xml
new file mode 100644
index 0000000000..03c9b83fce
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_controls.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="操作設定" name="controls">
+ <combo_box name="key_mode">
+ <combo_box.item label="三人称視点のとき" name="third_person" value="1"/>
+ <combo_box.item label="一人称視点のとき(マウスルック)" name="first_person" value="0"/>
+ <combo_box.item label="アバター編集時" name="edit_avatar" value="2"/>
+ <combo_box.item label="着席時" name="sitting" value="3"/>
+ </combo_box>
+ <button label="デフォルトに戻す" tool_tip="すべての操作設定をデフォルト値に戻します。" name="restore_defaults"/>
+ <scroll_list name="controls_list"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
index 378cf8652e..9309dda5af 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
@@ -5,17 +5,17 @@
</text>
<combo_box name="language_combobox">
<combo_box.item label="English (英語)" name="English"/>
- <combo_box.item label="Dansk (デンマーク語) - ベータ" name="Danish"/>
- <combo_box.item label="Deutsch (ドイツ語) – ベータ" name="Deutsch(German)"/>
- <combo_box.item label="Español (スペイン語) – ベータ" name="Spanish"/>
- <combo_box.item label="Français (フランス語) – ベータ" name="French"/>
- <combo_box.item label="Italiano (イタリア語) - ベータ" name="Italian"/>
- <combo_box.item label="Polski (ポーランド語) - ベータ" name="Polish"/>
- <combo_box.item label="Português(ポルトガル語) - ベータ" name="Portugese"/>
- <combo_box.item label="Русский (ロシア語) - ベータ" name="Russian"/>
- <combo_box.item label="Türkçe (トルコ語) - ベータ" name="Turkish"/>
- <combo_box.item label="日本語 – ベータ" name="(Japanese)"/>
- <combo_box.item label="正體中文(簡体字中国語)- ベータ版" name="Traditional Chinese"/>
+ <combo_box.item label="Dansk(デンマーク語)-ベータ" name="Danish"/>
+ <combo_box.item label="Deutsch(ドイツ語)-ベータ" name="Deutsch(German)"/>
+ <combo_box.item label="Español(スペイン語)-ベータ" name="Spanish"/>
+ <combo_box.item label="Français(フランス語)-ベータ" name="French"/>
+ <combo_box.item label="Italiano(イタリア語)-ベータ" name="Italian"/>
+ <combo_box.item label="Polski(ポーランド語)-ベータ" name="Polish"/>
+ <combo_box.item label="Português(ポルトガル語)-ベータ" name="Portugese"/>
+ <combo_box.item label="Русский(ロシア語)-ベータ" name="Russian"/>
+ <combo_box.item label="Türkçe(トルコ語)-ベータ" name="Turkish"/>
+ <combo_box.item label="日本語-ベータ" name="(Japanese)"/>
+ <combo_box.item label="正體中文(簡体字中国語)-ベータ版" name="Traditional Chinese"/>
</combo_box>
<text name="language_textbox2">
(再起動後に反映)
@@ -26,12 +26,12 @@
<text name="maturity_desired_textbox"/>
<combo_box name="maturity_desired_combobox">
<combo_box.item label="General、Moderate、Adult" name="Desired_Adult"/>
- <combo_box.item label="General と Moderate" name="Desired_Mature"/>
+ <combo_box.item label="GeneralとModerate" name="Desired_Mature"/>
<combo_box.item label="General" name="Desired_PG"/>
</combo_box>
<check_box label="ログイン画面にお気に入りの場所を表示" name="favorites_on_login_check"/>
<text name="favorites_check_extra_text">
- (このコンピュータを使用する他の人にも表示されます)
+ (このコンピュータを使用する他の人にも表示されます)
</text>
<text name="name_tags_textbox">
名前の表示:
@@ -45,26 +45,26 @@
<check_box label="ユーザー名" name="show_slids" tool_tip="bobsmith123 などユーザー名を表示"/>
<check_box label="グループタイトル" name="show_all_title_checkbox1" tool_tip="オフィサーまたはメンバーなど、グループタイトルを表示"/>
<check_box label="フレンドをハイライト表示" name="show_friends" tool_tip="フレンドの名前をハイライト表示"/>
- <check_box label="表示名を表示" name="display_names_check" tool_tip="これを選択すると、チャット、IM などで表示名が表示されます。"/>
+ <check_box label="表示名を表示" name="display_names_check" tool_tip="これを選択すると、チャット、IMなどで表示名が表示されます。"/>
<text name="inworld_typing_rg_label">
- 文字キーを押して次の操作:
+ 特定キーを押したときの動作:
</text>
<radio_group name="inworld_typing_preference">
- <radio_item label="ローカル・チャットを始める" name="radio_start_chat" value="1"/>
- <radio_item label="ムーブメントに影響(WASD など)" name="radio_move" value="0"/>
+ <radio_item label="チャットを始める" name="radio_start_chat" value="1"/>
+ <radio_item label="移動する(WSADなど)" name="radio_move" value="0"/>
</radio_group>
<text name="title_afk_text">
- 一時退席までの時間:
+ 「離席」とするまでの時間:
</text>
- <combo_box label="一時退席までの時間:" name="afk">
- <combo_box.item label="2 分" name="item0"/>
- <combo_box.item label="5 分" name="item1"/>
- <combo_box.item label="10 分" name="item2"/>
- <combo_box.item label="30 分" name="item3"/>
- <combo_box.item label="一時退席設定なし" name="item4"/>
+ <combo_box label="「離席」とするまでの時間:" name="afk">
+ <combo_box.item label="2分" name="item0"/>
+ <combo_box.item label="5分" name="item1"/>
+ <combo_box.item label="10分" name="item2"/>
+ <combo_box.item label="30分" name="item3"/>
+ <combo_box.item label="離席設定なし" name="item4"/>
</combo_box>
<text name="text_box3">
- 「通知を受けない」応答:
+ 「着信拒否」時の応答:
</text>
<text_editor name="do_not_disturb_response">
log_in_to_change
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml
index fc966dc08a..79a4689526 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml
@@ -1,10 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="表示" name="Display panel">
+<panel label="グラフィック" name="Display panel">
+ <text follows="top|left|right" height="16" layout="topleft" left="5" top="5" width="100">
+ 使用中のプリセット:
+ </text>
<text name="preset_text">
- (なし)
+ (なし)
</text>
<text name="QualitySpeed">
- クオリティとスピード:
+ 品質と速度:
</text>
<text name="ShadersPrefText">
@@ -16,26 +19,42 @@
</text>
<text name="ShadersPrefText4">
- 超高
+ 最高
</text>
<text name="FasterText">
- 速い
+ 速度優先
</text>
<text name="BetterText">
- 遅い
- </text>
- <check_box initial_value="true" label="周囲 (大気) シェーダー" name="WindLightUseAtmosShaders"/>
- <check_box initial_value="true" label="高度なライティングモデル" name="UseLightShaders"/>
- <slider label="アバターの最大複雑度:" name="IndirectMaxComplexity" tool_tip="どの点で視覚的に複雑なアバターを JellyDoll として描くかを制御します"/>
+ 品質優先
+ </text>
+ <icon name="LowGraphicsDivet"/>
+ <icon name="LowMidGraphicsDivet"/>
+ <icon name="MidGraphicsDivet"/>
+ <icon name="MidHighGraphicsDivet"/>
+ <icon name="HighGraphicsDivet"/>
+ <icon name="HighUltraGraphicsDivet"/>
+ <icon name="UltraGraphicsDivet"/>
+ <slider name="QualityPerformanceSelection"/>
+ <slider control_name="RenderFarClip" label="描画距離:" name="DrawDistance"/>
+ <text name="DrawDistanceMeterText2">
+ m
+ </text>
+ <check_box initial_value="true" label="大気(周辺)シェーダー" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="true" label="高度な光源モデル" name="UseLightShaders"/>
+ <button label="自動調整" name="AutoAdjustmentsButton"/>
+ <slider label="アバターの最大複雑度:" name="IndirectMaxComplexity" tool_tip="どの程度の複雑度で他のアバターをJellyDollとして描画するを設定します。"/>
<text name="IndirectMaxComplexityText">
0
</text>
- <check_box initial_value="true" label="常に友人を描画" name="AlwaysRenderFriends"/>
- <button label="例外..." name="RenderExceptionsButton"/>
- <button label="設定をプリセットとして保存..." name="PrefSaveButton"/>
- <button label="プリセットをロード..." name="PrefLoadButton"/>
- min_val=&quot;0.125&quot;
- <button label="事前設定を削除..." name="PrefDeleteButton"/>
+ <text name="IndirectMaxComplexityLink">
+ [https://community.secondlife.com/t5/Featured-News/Why-are-all-these-people-made-of-colored-jelly/ba-p/3031255 これはなんですか?]
+ </text>
+ <check_box label="フレンドは常に描画" name="AlwaysRenderFriends"/>
+ <button label="例外…" name="RenderExceptionsButton"/>
+ <button label="設定をプリセットとして保存…" name="PrefSaveButton"/>
+ <button label="プリセットを読み込む…" name="PrefLoadButton"/>
+ <button label="プリセットを削除…" name="PrefDeleteButton"/>
+ <button label="プリセットを削除…" name="PrefDeleteButton"/>
<button label="推奨設定にリセット" name="Defaults"/>
- <button label="詳細設定..." name="AdvancedSettings"/>
+ <button label="拡張設定…" name="AdvancedSettings"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_grids.xml b/indra/newview/skins/default/xui/ja/panel_preferences_grids.xml
new file mode 100644
index 0000000000..18aca0dafc
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_grids.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="グリッド" name="grids">
+ <text name="add_grid_text">
+ 新しいグリッドを追加:
+ </text>
+ <line_editor name="add_grid" label="ログインURIを入力"/>
+ <button label="追加" name="add_grid_commit"/>
+ <text name="manage_grid_text">
+ グリッド管理:
+ </text>
+ <scroll_list name="grid_list">
+ <scroll_list.columns label="グリッド名" name="grid_label"/>
+ <scroll_list.columns label="ログインURI" name="login_uri"/>
+ <scroll_list.commit_callback function="Pref.SelectGrid"/>
+ </scroll_list>
+ <button label="有効化" name="activate_grid"/>
+ <button label="リフレッシュ" name="refresh_grid"/>
+ <button label="削除" name="remove_grid"/>
+ <button label="デバッグ" name="debug_grid"/>
+ <check_box label="ログイン時にグリッド選択を表示" name="show_grid_selection_check" tool_tip="ログイン画面にグリッド選択を表示して、他のワールドにログインします。"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_move.xml b/indra/newview/skins/default/xui/ja/panel_preferences_move.xml
index 121bebfd52..57bcce66a5 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_move.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_move.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="移動" name="move_panel">
+ <icon name="camera_icon"/>
<slider label="視界角" name="camera_fov"/>
<slider label="距離" name="camera_offset_scale"/>
<text name="heading2">
@@ -7,33 +8,36 @@
</text>
<check_box label="制作・編集" name="edit_camera_movement" tool_tip="編集モードのオン・オフの切り替えに、自動カメラポジションを使います"/>
<check_box label="容姿" name="appearance_camera_movement" tool_tip="編集モードに入ったときに、自動カメラポジションを使います"/>
+ <icon name="avatar_icon"/>
<text name="keyboard_lbl">
キーボード:
</text>
- <check_box label="常にキー操作で動くようにする" name="arrow_keys_move_avatar_check"/>
- <check_box label="上矢印キー2度押し+長押しで走る" name="tap_tap_hold_to_run"/>
+ <check_box label="方向キー押下時は、常に移動するようにする" name="arrow_keys_move_avatar_check"/>
+ <check_box label="移動キー2度押し+長押しで走る" name="tap_tap_hold_to_run"/>
+ <check_box label="ジャンプまたはしゃがみキーを押し続けると、飛行を開始または停止します。" name="automatic_fly"/>
<text name="mouse_lbl">
マウス:
</text>
<check_box label="一人称視点で表示する" name="first_person_avatar_visible"/>
<text name=" Mouse Sensitivity">
- 一人称視点のマウスの感度:
+ 一人称視点時のマウスの感度:
</text>
<check_box label="切り替え" name="invert_mouse"/>
<text name="single_click_action_lbl">
土地をシングルクリック:
</text>
<combo_box name="single_click_action_combo">
- <combo_box.item label="動作なし" name="0"/>
- <combo_box.item label="クリックされた地点に移動" name="1"/>
+ <combo_box.item label="動作なし" name="0" value="0"/>
+ <combo_box.item label="クリックされた地点に移動" name="1" value="1"/>
</combo_box>
<text name="double_click_action_lbl">
土地をダブルクリック:
</text>
<combo_box name="double_click_action_combo">
- <combo_box.item label="動作なし" name="0"/>
- <combo_box.item label="クリックされた地点に移動" name="1"/>
- <combo_box.item label="クリックされた地点にテレポート" name="2"/>
+ <combo_box.item label="動作なし" name="0" value="0"/>
+ <combo_box.item label="クリックされた地点に移動" name="1" value="1"/>
+ <combo_box.item label="クリックされた地点にテレポート" name="2" value="2"/>
</combo_box>
- <button label="その他のディバイス" name="joystick_setup_button"/>
+ <check_box control_name="EnableCollisionSounds" label="ぶつかったときにサウンドを鳴らす" name="sound_on_collisions"/>
+ <button label="その他のデバイス" name="joystick_setup_button"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml
index 2db6a688f3..7a857a2254 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml
@@ -5,7 +5,7 @@
</panel.string>
<button label="履歴を消去" name="clear_cache" tool_tip="ログイン画像、最後にいた場所、テレポート履歴、Web、テクスチャキャッシュを削除します"/>
<text name="cache_size_label_l">
- (位置、画像、web、検索履歴)
+ (位置、画像、Web、検索履歴)
</text>
<check_box label="プロフィールを検索結果に表示する" name="online_searchresults"/>
<check_box label="私のオンライン状態を確認できるのは、フレンドとグループだけ" name="online_visibility"/>
@@ -15,8 +15,8 @@
<text name="Logs:">
チャットログ:
</text>
- <check_box label="近くのチャットログをコンピューターに保存する" name="log_nearby_chat"/>
- <check_box label="IM ログをコンピューターに保存する" name="log_instant_messages"/>
+ <check_box label="近隣チャットログをコンピューターに保存する" name="log_nearby_chat"/>
+ <check_box label="IMログをコンピューターに保存する" name="log_instant_messages"/>
<check_box label="チャットログでラインごとに時間を入れる" name="show_timestamps_check_im"/>
<check_box label="ログファイル名に日付を入れる。" name="logfile_name_datestamp"/>
<text name="log_path_desc">
@@ -25,6 +25,6 @@
<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/ja/panel_preferences_setup.xml b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
index 2ceecf9df6..f487bc32a9 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
@@ -17,13 +17,13 @@
<radio_group name="preferred_browser_behavior">
<radio_item label="すべてのリンクにデフォルトシステムのブラウザを使用します" name="internal" tool_tip="デフォルトのシステム Web ブラウザでヘルプや Web リンク先などを見ます。全画面で起動中にはおすすめしません。" value="0"/>
<radio_item label="Second Life リンクにのみ内蔵ブラウザを使用します" name="external" tool_tip="ヘルプ、Web リンクなどにはデフォルトシステムのブラウザを使用します内蔵ブラウザは LindenLab/Second Life リンクにのみ使用されます。" value="1"/>
- <radio_item label="すべてのリンクに内蔵ブラウザを使用します" name="external_all" tool_tip="内蔵ブラウザでヘルプや Web リンクなどを見ます。[APP_NAME] 内に新しいウィンドウでこのブラウザが開きます。" value="2"/>
+ <radio_item label="すべてのリンクに内蔵ブラウザを使用します" name="external_all" tool_tip="内蔵ブラウザでヘルプや Web リンクなどを見ます。[APP_NAME]内に新しいウィンドウでこのブラウザが開きます。" value="2"/>
</radio_group>
<check_box initial_value="true" label="プラグインを有効にする" name="browser_plugins_enabled"/>
<check_box initial_value="true" label="Cookie を受け入れる" name="cookies_enabled"/>
<check_box initial_value="true" label="Javascript を有効にする" name="browser_javascript_enabled"/>
<text name="Software updates:">
- ソフトウェアアップデート:
+ ソフトウェアの更新:
</text>
<combo_box name="updater_service_combobox">
<combo_box.item label="各アップデートを自動的にインストールする" name="Install_automatically"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
index 899b7c1b84..3956e07bf8 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
@@ -1,37 +1,61 @@
-<?xml version="1.0" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="サウンド" name="Preference Media panel">
- <panel.string name="middle_mouse">マウスの中央</panel.string>
- <slider label="全体の音量" name="System Volume"/>
- <check_box initial_value="true" label="Mute when minimized" name="mute_when_minimized"/>
- <text name="mute_chb_label">最小化でミュート</text>
+ <panel.string name="middle_mouse">
+ 中央のボタン
+ </panel.string>
+ <panel.string name="button4_mouse">
+ 4ボタン
+ </panel.string>
+ <panel.string name="button5_mouse">
+ 5ボタン
+ </panel.string>
+ <slider label="全体のボリューム" name="System Volume"/>
+ <button name="mute_audio"/>
+ <check_box name="mute_when_minimized"/>
+ <text name="mute_chb_label">
+ 最小化時にミュート
+ </text>
<slider label="ボタン" name="UI Volume"/>
- <slider label="風" name="Wind Volume"/>
+ <button name="mute_audio"/>
+ <slider label="環境音" name="Wind Volume"/>
+ <button name="mute_audio"/>
<slider label="効果音" name="SFX Volume"/>
+ <button name="mute_audio"/>
<slider label="ストリーミング音楽" name="Music Volume"/>
+ <button name="mute_audio"/>
<check_box label="有効" name="enable_music"/>
<slider label="メディア" name="Media Volume"/>
+ <button name="mute_audio"/>
<check_box label="有効" name="enable_media"/>
<slider label="ボイスチャット" name="Voice Volume"/>
+ <button name="mute_audio"/>
<check_box label="有効" name="enable_voice_check"/>
- <check_box label="メディアを自動再生する" name="media_auto_play_btn" tool_tip="ここにチェックを入れてメディアの自動再生を許可します" value="true"/>
- <check_box label="他のアバターに取り付けられたメディアを再生する" name="media_show_on_others_btn" tool_tip="このチェックを外すと、近くにいる他のアバターに取り付けられたメディアを非表示にします" value="true"/>
- <check_box label="ジェスチャーの音を再生" name="gesture_audio_play_btn" tool_tip="ジェスチャーの音を聞くにはこれを選択" value="true"/>
- <text name="voice_chat_settings">ボイスチャットの設定</text>
- <text name="Listen from">方向:</text>
- <radio_group name="ear_location">
- <radio_item label="カメラの位置から聞く" name="0"/>
- <radio_item label="アバターの位置から聞く" name="1"/>
+ <text name="Listen media from">
+ メディアとサウンドの聞き取り位置:
+ </text>
+ <radio_group name="media_ear_location">
+ <radio_item label="カメラの位置" name="0"/>
+ <radio_item label="アバターの位置" name="1"/>
</radio_group>
- <check_box label="話すときにアバターの口を動かす" name="enable_lip_sync"/>
- <check_box label="ボイスのオン・オフ切り替えに使用するトリガーキー:" name="push_to_talk_toggle_check" tool_tip="トグルモードの時にトリガーキーを1度押して放すと、マイクのオン・オフ設定を切り替えます。トグルモードではないときは、トリガーキーを押した状態の時のみあなたの声が相手に聞こえます。"/>
- <line_editor label="プッシュ・トゥ・スピークのトリガー" name="modifier_combo"/>
- <button label="キー設定" name="set_voice_hotkey_button"/>
- <button name="set_voice_middlemouse_button" tool_tip="マウスの中央ボタンにリセット"/>
- <button label="入力・出力機器" name="device_settings_btn"/>
- <panel label="機器の設定" name="device_settings_panel"/>
+ <check_box name="media_show_on_others_btn" tool_tip="このチェックを外すと、近くにいる他のアバターに取り付けられたメディアを非表示にします。" label="他のアバターに取り付けられたメディアを再生する"/>
+ <text name="media_autoplay_label">
+ メディアの自動再生
+ </text>
<combo_box name="media_auto_play_combo">
- <item name="autoplay_enabled" label="はい"/>
- <item name="autoplay_ask" label="求める"/>
- <item name="autoplay_disabled" label="いいえ"/>
+ <item label="再生しない" name="autoplay_disabled" value="0"/>
+ <item label="常に再生" name="autoplay_enabled" value="1"/>
+ <item label="その都度確認" name="autoplay_ask" value="2"/>
</combo_box>
+ <text name="Listen from">
+ ボイスの聞き取り位置:
+ </text>
+ <radio_group name="ear_location">
+ <radio_item label="カメラの位置" name="0"/>
+ <radio_item label="アバターの位置" name="1"/>
+ </radio_group>
+ <check_box label="喋るときにアバターの口を動かす" name="enable_lip_sync"/>
+ <check_box label="ボイスチャットをトグルモードにする" name="push_to_talk_toggle_check" tool_tip="トグルモードでは、トリガーキーを押すことでマイクのオン/オフを切り替えます。そうでない場合は、トリガーキーを押している間だけマイクがオンになります。"/>
+ <check_box name="gesture_audio_play_btn" tool_tip="ジェスチャーからのサウンドを聞くにはこれを選択" label="ゼスチャーのサウンドを再生"/>
+ <button label="入出力機器の設定" name="device_settings_btn"/>
+ <panel name="device_settings_panel"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_uploads.xml b/indra/newview/skins/default/xui/ja/panel_preferences_uploads.xml
index 50d0e311a0..198b836610 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_uploads.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_uploads.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="アップロード" name="uploads">
<text name="title">
- アップロード用の最新の宛先フォルダ
+ アップロード先のフォルダ
</text>
<text name="title_models">
画像
@@ -16,6 +16,7 @@
モデル
</text>
<text name="upload_help">
- 宛先フォルダを変更するには、持ち物でそのフォルダを右クリックして、&quot;デフォルトとして使用&quot; を選択します
+ 宛先フォルダを変更するには、インベントリでそのフォルダを右クリックして、
+「デフォルトとして使用」を選択します。
</text>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_presets_camera_pulldown.xml b/indra/newview/skins/default/xui/ja/panel_presets_camera_pulldown.xml
new file mode 100644
index 0000000000..8ef0da18a0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_presets_camera_pulldown.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="presets_camera_pulldown">
+ <text name="Camera Presets">
+ カメラのプリセット
+ </text>
+ <scroll_list name="preset_camera_list"/>
+ <view_border name="horiz_separator"/>
+ <button name="open_prefs_btn" label="カメラのフローターを表示" tool_tip="カメラのフローターを起動する"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_presets_pulldown.xml b/indra/newview/skins/default/xui/ja/panel_presets_pulldown.xml
index 422ed01cbb..b4504dd39a 100644
--- a/indra/newview/skins/default/xui/ja/panel_presets_pulldown.xml
+++ b/indra/newview/skins/default/xui/ja/panel_presets_pulldown.xml
@@ -1,7 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="presets_pulldown">
<text name="Graphic Presets">
- グラフィックプリセット
+ グラフィックのプリセット
</text>
- <button label="グラフィックス設定を開く" name="open_prefs_btn" tool_tip="グラフィックス設定を開きます"/>
+ <scroll_list name="preset_list"/>
+ <view_border name="horiz_separator"/>
+ <button name="open_prefs_btn" label="グラフィック初期設定" tool_tip="グラフィック設定を呼び出します。"/>
+ <button name="open_autofps_btn" label="自動FPS設定" tool_tip="自動調整設定を呼び出します。"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml
index 9eb384830b..6c33bda5cd 100644
--- a/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml
+++ b/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml
@@ -1,10 +1,14 @@
-<?xml version="1.0" ?>
+<?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="control_background_image_name">
+ Inspector_Background
+ </string>
+ <string name="skip_step">
+ 0.2
+ </string>
<layout_stack name="progress_indicator_area">
<layout_panel name="media_progress_indicator">
- <progress_bar name="media_progress_bar" tool_tip="ローディング"/>
+ <progress_bar name="media_progress_bar" tool_tip="読み込んでいます…"/>
</layout_panel>
</layout_stack>
<layout_stack name="media_controls">
@@ -41,7 +45,7 @@
</layout_stack>
</layout_panel>
<layout_panel name="media_play_position">
- <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="ムービー再生進行"/>
+ <slider_bar name="media_play_slider" tool_tip="ムービー再生進行"/>
</layout_panel>
<layout_panel name="skip_back">
<button name="skip_back_btn" tool_tip="前にステップ"/>
@@ -60,8 +64,8 @@
<button name="close_btn" tool_tip="ズームバック"/>
</layout_panel>
<layout_panel name="new_window">
- <button name="new_window_btn" tool_tip="URL をブラウザで開く"/>
+ <button name="new_window_btn" tool_tip="URLをブラウザで開く"/>
</layout_panel>
- <icon name="media_secure_lock_flag" tool_tip="安全なブラウジング"/>
</layout_stack>
+ <icon name="media_secure_lock_flag" tool_tip="安全なブラウジング"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_profile_classified.xml b/indra/newview/skins/default/xui/ja/panel_profile_classified.xml
index 2d1bc07e2c..6213c5deea 100644
--- a/indra/newview/skins/default/xui/ja/panel_profile_classified.xml
+++ b/indra/newview/skins/default/xui/ja/panel_profile_classified.xml
@@ -10,10 +10,10 @@
L$[PRICE]
</panel.string>
<panel.string name="click_through_text_fmt">
- [TELEPORT] テレポート、 [MAP] 地図、 [PROFILE] プロフィール
+ [TELEPORT]テレポート、[MAP]マップ、[PROFILE]プロフィール
</panel.string>
<panel.string name="date_fmt">
- [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
+ [year,datetime,slt]年[mthnum,datetime,slt]月[day,datetime,slt]日
</panel.string>
<panel.string name="auto_renew_on">
有効
@@ -47,7 +47,7 @@
<text name="creation_date_label" value="制作日:"/>
<text_editor name="creation_date" tool_tip="制作日" value="[date]"/>
<text name="price_for_listing_label" value="掲載価格:"/>
- <text_editor name="price_for_listing" tool_tip="掲載価格。">
+ <text_editor name="price_for_listing" tool_tip="掲載価格">
[PRICE]
</text_editor>
</layout_panel>
@@ -75,7 +75,7 @@
場所:
</text>
<text name="classified_location_edit">
- ロード中...
+ 読み込んでいます…
</text>
<button label="現在地に設定" name="set_to_curr_location_btn"/>
<text name="category_label" value="カテゴリ:"/>
@@ -95,7 +95,7 @@
<button label="テレポート" name="teleport_btn"/>
</layout_panel>
<layout_panel name="map_btn_lp">
- <button label="地図" name="show_on_map_btn"/>
+ <button label="マップ" name="show_on_map_btn"/>
</layout_panel>
<layout_panel name="edit_btn_lp">
<button label="編集" name="edit_btn"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_profile_classifieds.xml b/indra/newview/skins/default/xui/ja/panel_profile_classifieds.xml
index 1980c0fa62..b6609a5b69 100644
--- a/indra/newview/skins/default/xui/ja/panel_profile_classifieds.xml
+++ b/indra/newview/skins/default/xui/ja/panel_profile_classifieds.xml
@@ -4,6 +4,6 @@
<button label="新規…" name="new_btn"/>
<button label="削除…" name="delete_btn"/>
<text name="classifieds_panel_text">
- ロード中...
+ 読み込んでいます…
</text>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_profile_firstlife.xml b/indra/newview/skins/default/xui/ja/panel_profile_firstlife.xml
index a4ee262cb3..4fc2c976e6 100644
--- a/indra/newview/skins/default/xui/ja/panel_profile_firstlife.xml
+++ b/indra/newview/skins/default/xui/ja/panel_profile_firstlife.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="プロフィール" name="panel_profile_firstlife"/>
+<panel label="プロフィール" name="panel_profile_firstlife"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/panel_profile_interests.xml b/indra/newview/skins/default/xui/ja/panel_profile_interests.xml
deleted file mode 100644
index 93cde6ffec..0000000000
--- a/indra/newview/skins/default/xui/ja/panel_profile_interests.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="趣味" name="panel_profile_interests">
- <text name="I Want To:">
- 次の内容を実行:
- </text>
- <check_box label="作る" name="chk0"/>
- <check_box label="探検" name="chk1"/>
- <check_box label="出会う" name="chk2"/>
- <check_box label="雇ってもらう" name="chk6"/>
- <check_box label="グループ" name="chk3"/>
- <check_box label="買う" name="chk4"/>
- <check_box label="販売する" name="chk5"/>
- <check_box label="雇う" name="chk7"/>
- <line_editor name="want_to_edit">
- (ロード中...)
- </line_editor>
- <text name="Skills:">
- スキル:
- </text>
- <check_box label="テクスチャ" name="schk0"/>
- <check_box label="建築" name="schk1"/>
- <check_box label="モデリング" name="schk3"/>
- <check_box label="イベント計画" name="schk2"/>
- <check_box label="スクリプト" name="schk4"/>
- <check_box label="キャラクターのカスタマイズ" name="schk5"/>
- <line_editor name="skills_edit">
- (ロード中...)
- </line_editor>
- <text name="Languages:">
- 言語:
- </text>
- <line_editor name="languages_edit">
- (ロード中...)
- </line_editor>
-</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_profile_notes.xml b/indra/newview/skins/default/xui/ja/panel_profile_notes.xml
index 4b4e0d5e4e..7099555e37 100644
--- a/indra/newview/skins/default/xui/ja/panel_profile_notes.xml
+++ b/indra/newview/skins/default/xui/ja/panel_profile_notes.xml
@@ -3,6 +3,6 @@
<text name="status_message" value="このアバターのプライベートメモ:"/>
<text name="status_message2" value="このアバターに次の許可を与える:"/>
<check_box label="自分のオンラインステータスを表示する" name="status_check"/>
- <check_box label="世界地図で自分を探せるようにする" name="map_check"/>
+ <check_box label="ワールドマップで自分を探せるようにする" name="map_check"/>
<check_box label="自分のオブジェクトを編集・削除・取得できるようにする" name="objects_check"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_profile_pick.xml b/indra/newview/skins/default/xui/ja/panel_profile_pick.xml
index 0a20c04ad6..3b952458d3 100644
--- a/indra/newview/skins/default/xui/ja/panel_profile_pick.xml
+++ b/indra/newview/skins/default/xui/ja/panel_profile_pick.xml
@@ -4,10 +4,10 @@
(掲載後更新)
</panel.string>
<line_editor name="pick_location">
- ロード中...
+ (読み込んでいます…)
</line_editor>
<button label="テレポート" name="teleport_btn"/>
- <button label="地図に表示" name="show_on_map_btn"/>
+ <button label="マップに表示" name="show_on_map_btn"/>
<button label="場所を設定" name="set_to_curr_location_btn" tool_tip="現在地に設定"/>
<button label="ピックを保存" name="save_changes_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_profile_picks.xml b/indra/newview/skins/default/xui/ja/panel_profile_picks.xml
index 4cbfadd09d..05d5225581 100644
--- a/indra/newview/skins/default/xui/ja/panel_profile_picks.xml
+++ b/indra/newview/skins/default/xui/ja/panel_profile_picks.xml
@@ -2,11 +2,11 @@
<panel label="ピック" name="panel_picks">
<string name="no_picks" value="ピックなし"/>
<text name="Tell everyone about your favorite places in Second Life.">
- Second Life のお気に入りの場所を紹介しましょう。
+ Second Lifeのお気に入りの場所を紹介しましょう。
</text>
<button label="新規…" name="new_btn"/>
<button label="削除…" name="delete_btn"/>
<text name="picks_panel_text">
- ロード中...
+ 読み込んでいます…
</text>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_profile_secondlife.xml b/indra/newview/skins/default/xui/ja/panel_profile_secondlife.xml
index 5470dc6c82..71e223b90b 100644
--- a/indra/newview/skins/default/xui/ja/panel_profile_secondlife.xml
+++ b/indra/newview/skins/default/xui/ja/panel_profile_secondlife.xml
@@ -1,77 +1,85 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="プロフィール" name="panel_profile">
- <string name="status_online">
- オンライン中
- </string>
- <string name="status_offline">
- オフライン中
- </string>
+<panel name="panel_profile" label="プロフィール">
+ <string name="date_format" value="SLでの誕生日:[year,datetime,utc]年[mth,datetime,utc]月[day,datetime,utc]日"/>
+ <string name="age_format" value="[AGE]経過"/>
+ <string name="partner_text" value="パートナー:[LINK]"/>
<string name="CaptionTextAcctInfo">
- [ACCTTYPE]
+ アカウント:[ACCTTYPE]
[PAYMENTINFO]
</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]
- </string>
- <string name="name_text_args">
- [NAME]
- </string>
- <string name="display_name_text_args">
- [DISPLAY_NAME]
- </string>
- <string name="FSDev" value="開発者"/>
- <string name="FSSupp" value="サポート"/>
- <string name="FSQualityAssurance" value="バグハンター"/>
- <string name="FSGW" value="ゲートウェイ"/>
- <text name="name_label" value="名前:"/>
- <button label="名前:" name="set_name" tool_tip="表示名を設定"/>
- <panel name="name_holder">
- <text_editor name="complete_name" value="(ロード中...)"/>
- </panel>
- <layout_stack name="imagepositioner">
- <layout_panel name="label_stack">
- <text name="status" value="ステータス不明"/>
- <text name="label" value="Second Life 生年月日:"/>
- <text name="label2" value="アカウント:"/>
- <text name="partner_label" value="パートナー:"/>
+ <string name="BadgeBeta" value="オリジナルβテスター"/>
+ <string name="BadgeBetaLifetime" value="β会員"/>
+ <string name="BadgeLifetime" value="会員"/>
+ <string name="BadgeLinden" value="Linden Lab社員"/>
+ <string name="BadgePremiumLifetime" value="プレミアム会員"/>
+ <string name="BadgePremiumPlusLifetime" value="プレミアム・プラス会員"/>
+ <layout_stack name="image_stack">
+ <layout_panel name="image_panel">
+ <icon name="2nd_life_pic"/>
+ <loading_indicator name="image_upload_indicator"/>
</layout_panel>
- </layout_stack>
- <text name="Groups:" value="グループ:"/>
- <button label="+" label_selected="+" name="group_invite" tool_tip="グループに招待"/>
- <layout_stack name="aboutpositioner">
- <layout_panel name="about_stack">
- <text name="About:" value="詳細:"/>
+ <layout_panel name="basics_panel">
+ <line_editor name="user_name" value="(読み込んでいます…)"/>
+ <line_editor name="sl_birth_date" value="(読み込んでいます…)"/>
+ <line_editor name="user_age" value="(読み込んでいます…)"/>
+ </layout_panel>
+ <layout_panel name="partner_layout">
+ <text name="partner_link" value="パートナー:(読み込んでいます…)"/>
</layout_panel>
- <layout_panel name="give_stack">
- <text name="Give item:" value="アイテムを渡す:"/>
- <text name="Give inventory" tool_tip="インベントリのアイテムをここにドロップしてこの人に渡します。">
- インベントリのアイテムをここにドロップしてください。
- </text>
+ <layout_panel name="partner_spacer_layout"/>
+ <layout_panel name="badge_layout">
+ <icon name="badge_icon"/>
+ <text name="badge_text" value="バッチのテスト"/>
+ </layout_panel>
+ <layout_panel name="friend_layout">
+ <text name="friend_text" value="あなたはフレンドです。"/>
+ </layout_panel>
+ <layout_panel name="online_layout">
+ <icon name="online_icon"/>
+ <text name="online_text" value="オンライン"/>
+ </layout_panel>
+ <layout_panel name="offline_layout">
+ <icon name="offline_icon"/>
+ <text name="offline_text" value="オフライン"/>
+ </layout_panel>
+ <layout_panel name="account_layout">
+ <text name="account_info" value="アカウント:(読み込んでいます…)"/>
+ </layout_panel>
+ <layout_panel name="indicator_stack">
+ <loading_indicator name="progress_indicator"/>
+ </layout_panel>
+ <layout_panel name="settings_panel">
+ <text name="search_label" value="自分のプロフィールを検索結果に反映:"/>
+ <combo_box name="show_in_search" tool_tip="検索結果から、あなたを見つけてもらいましょう。">
+ <combo_box.item name="Hide" label="表示しない" value="0"/>
+ <combo_box.item name="Show" label="表示する" value="1"/>
+ </combo_box>
+ </layout_panel>
+ <layout_panel name="menu_panel">
+ <menu_button label="アクション" name="agent_actions_menu"/>
</layout_panel>
</layout_stack>
- <layout_stack name="buttonstack">
- <layout_panel name="left_buttonstack">
- <button label="地図上で見つける" label_selected="地図上で見つける" name="show_on_map_btn" tool_tip="住人を地図上で探す"/>
- <button label="お金を払う" label_selected="お金を払う" name="pay" tool_tip="住人にお金を支払う"/>
+ <layout_stack name="main_stack">
+ <layout_panel name="display_name_panel">
+ <line_editor name="display_name" value="(読み込んでいます…)"/>
+ <icon tool_tip="フレンドは、自分のオンライン状況を見ることができます。" name="can_see_online"/>
+ <icon tool_tip="フレンドは、自分のオンライン状況を見ることができません。" name="cant_see_online"/>
+ <icon tool_tip="フレンドは、自分がマップのどこにいるかを知ることができます。" name="can_see_on_map"/>
+ <icon tool_tip="フレンドは、自分がマップのどこにいるかを知ることができません。" name="cant_see_on_map"/>
+ <icon tool_tip="フレンドは、自分のオブジェクトを編集できます。" name="can_edit_objects"/>
+ <icon tool_tip="フレンドは、自分のオブジェクトを編集できません。" name="cant_edit_objects"/>
+ </layout_panel>
+ <layout_panel name="about_panel">
+ <text_editor name="sl_description_edit"/>
</layout_panel>
- <layout_panel name="middle_buttonstack">
- <button label="テレポートを送る" label_selected="テレポートを送る" name="teleport" tool_tip="住人にテレポートを送る"/>
- <button label="インスタントメッセージ" label_selected="インスタントメッセージ" name="im" tool_tip="インスタントメッセージを開きます"/>
+ <layout_panel name="about_buttons_panel">
+ <button name="save_description_changes" label="保存"/>
+ <button name="discard_description_changes" label="破棄"/>
+ <view_border name="cost_text_border"/>
</layout_panel>
- <layout_panel name="right_buttonstack">
- <button label="フレンド登録" label_selected="フレンド登録" name="add_friend" tool_tip="フレンド登録を申し出ます"/>
- <button label="ブロック" name="block" tool_tip="この住人をブロックする"/>
- <button label="ブロック解除" name="unblock" tool_tip="この住人のブロックを解除する"/>
+ <layout_panel name="groups_panel">
+ <text name="group_label" value="グループのメンバーシップ"/>
+ <group_list name="group_list"/>
</layout_panel>
</layout_stack>
- <check_box label="検索に表示" name="show_in_search_checkbox"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_profile_web.xml b/indra/newview/skins/default/xui/ja/panel_profile_web.xml
index 4f56a7e98d..4091d4826c 100644
--- a/indra/newview/skins/default/xui/ja/panel_profile_web.xml
+++ b/indra/newview/skins/default/xui/ja/panel_profile_web.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Web" name="panel_profile_web">
- <panel.string name="LoadTime" value="ロード時間:[TIME] 秒"/>
+ <panel.string name="LoadTime" value="ロード時間:[TIME]秒"/>
<line_editor name="url_edit">
- (ロード中...)
+ (読み込んでいます…)
</line_editor>
<flyout_button label="ロード" name="load" tool_tip="このプロフィールページを、組み込み Web ブラウザでロードします。">
- <flyout_button.item label="ビューワ内のブラウザを開く" name="open_item"/>
+ <flyout_button.item label="ビューア内のブラウザを開く" name="open_item"/>
<flyout_button.item label="外部ブラウザを開く" name="home_item"/>
</flyout_button>
<button name="web_profile_popout_btn" tool_tip="Web プロフィールのポップアウト"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_progress.xml b/indra/newview/skins/default/xui/ja/panel_progress.xml
index 4a47412521..7fd7d5ab5c 100644
--- a/indra/newview/skins/default/xui/ja/panel_progress.xml
+++ b/indra/newview/skins/default/xui/ja/panel_progress.xml
@@ -1,10 +1,12 @@
-<?xml version="1.0" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="login_progress_panel">
<layout_panel name="panel_icons"/>
<layout_stack name="vertical_centering"/>
<layout_panel name="panel4"/>
<layout_panel name="center"/>
<layout_stack name="horizontal_centering">
- <text name="logos_lbl">セカンドライフ使用</text>
+ <text name="logos_lbl">
+ セカンドライフ使用
+ </text>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_access.xml b/indra/newview/skins/default/xui/ja/panel_region_access.xml
index 34809688d0..a8ff9cfe4e 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_access.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_access.xml
@@ -3,12 +3,12 @@
<tab_container name="tabs">
<panel label="不動産マネージャー" name="estate_managers_panel">
<text name="estate_manager_label">
- 不動産マネージャー:
+ 不動産マネージャー:
</text>
<name_list name="estate_manager_name_list">
<columns label="名前" name="name"/>
</name_list>
- <button label="追加..." name="add_estate_manager_btn"/>
+ <button label="追加…" name="add_estate_manager_btn"/>
<button label="削除…" name="remove_estate_manager_btn"/>
</panel>
<panel label="許可" name="allowed_panel">
@@ -22,7 +22,7 @@
<name_list name="allowed_avatar_name_list">
<columns label="名前" name="name"/>
</name_list>
- <button label="追加..." name="add_allowed_avatar_btn"/>
+ <button label="追加…" name="add_allowed_avatar_btn"/>
<button label="削除…" name="remove_allowed_avatar_btn"/>
</panel>
<panel label="許可されたグループ" name="allowed_groups_panel">
@@ -36,7 +36,7 @@
<name_list name="allowed_group_name_list">
<columns label="名前" name="name"/>
</name_list>
- <button label="追加..." name="add_allowed_group_btn"/>
+ <button label="追加…" name="add_allowed_group_btn"/>
<button label="削除…" name="remove_allowed_group_btn"/>
</panel>
<panel label="禁止" name="banned_panel">
@@ -45,15 +45,15 @@
<button label="コピー" name="copy_banned_list_btn"/>
</panel>
<text name="ban_resident_label">
- 常に禁止:
+ 常にバン:
</text>
<name_list name="banned_avatar_name_list">
<columns label="名前" name="name"/>
<columns label="最後にログインした日" name="last_login_date"/>
- <columns label="禁止された日付" name="ban_date"/>
- <columns label="禁止した人:" name="bannedby"/>
+ <columns label="バンされた日付" name="ban_date"/>
+ <columns label="バンした人:" name="bannedby"/>
</name_list>
- <button label="追加..." name="add_banned_avatar_btn"/>
+ <button label="追加…" name="add_banned_avatar_btn"/>
<button label="削除…" name="remove_banned_avatar_btn"/>
</panel>
</tab_container>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_covenant.xml b/indra/newview/skins/default/xui/ja/panel_region_covenant.xml
index 5214f79141..9b2239e0bb 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_covenant.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="約款" name="Covenant">
- <text font="SansSerifLarge" name="estate_section_lbl" width="200">
+ <text font="SansSerifLarge" name="estate_section_lbl">
不動産
</text>
<text name="estate_name_lbl">
@@ -10,7 +10,7 @@
メインランド
</text>
<text name="estate_owner_lbl">
- オーナー:
+ 所有者:
</text>
<text name="estate_owner_text">
(無)
@@ -26,55 +26,55 @@
この不動産には約款がありません。
</text_editor>
<button label="リセット" name="reset_covenant"/>
- <text name="covenant_help_text" left="100">
+ <text name="covenant_help_text">
約款の変更は不動産全区画に適用となります。
</text>
- <text name="covenant_instructions" width="390">
+ <text name="covenant_instructions">
この不動産約款を変更する際は、ノートカードをドラッグ&ドロップしてください。
</text>
- <text bottom_delta="-34" font="SansSerifLarge" name="region_section_lbl" width="200">
- 地域
+ <text bottom_delta="-34" font="SansSerifLarge" 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">
- メインランド/ホームステッド
+ メインランド/入植地
</text>
<text name="region_maturity_lbl">
区分:
</text>
<text name="region_maturity_text">
- Adult
+ アダルト
</text>
<text name="resellable_lbl">
再販:
</text>
<text name="resellable_clause">
- この地域(リージョン)にある土地は再販できません。
+ このリージョン(地域)にある土地は再販できません。
</text>
<text name="changeable_lbl">
再分割:
</text>
<text name="changeable_clause">
- この地域(リージョン)にある土地は統合または分割ができません。
+ このリージョン(地域)にある土地は統合または分割ができません。
</text>
<string name="can_resell">
- この地域で購入した土地は、再販できます。
+ このリージョン(地域)で購入した土地は、再販できます。
</string>
<string name="can_not_resell">
- この地域の購入地は再販できないことがあります。
+ このリージョン(地域)の購入地は再販できないことがあります。
</string>
<string name="can_change">
- この地域の購入地は統合または再分割できます。
+ このリージョン(地域)の購入地は統合または再分割できます。
</string>
<string name="can_not_change">
- この地域の購入地は統合/再分割できないことがあります。
+ このリージョン(地域)の購入地は統合/再分割できないことがあります。
</string>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_debug.xml b/indra/newview/skins/default/xui/ja/panel_region_debug.xml
index 908af3d66a..d2cf3739bf 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_debug.xml
@@ -1,35 +1,35 @@
<?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="スクリプト無効化" name="disable_scripts_check" tool_tip="この地域のスクリプトをすべて無効にします"/>
- <check_box label="衝突を無効化" name="disable_collisions_check" tool_tip="この地域の非アバター衝突を無効にします"/>
- <check_box label="物理作用を無効化" name="disable_physics_check" tool_tip="この地域の物理作用をすべて無効にします"/>
+ <check_box label="スクリプト無効化" name="disable_scripts_check" tool_tip="このリージョン(地域)のスクリプトをすべて無効にします"/>
+ <check_box label="衝突を無効化" name="disable_collisions_check" tool_tip="このリージョン(地域)の非アバター衝突を無効にします"/>
+ <check_box label="物理作用を無効化" name="disable_physics_check" tool_tip="このリージョン(地域)の物理作用をすべて無効にします"/>
<button label="適用" name="apply_btn"/>
- <text name="objret_text_lbl" width="120">
+ <text name="objret_text_lbl">
オブジェクトの返却
</text>
<text name="resident_text_lbl">
- 住人:
+ 住人:
</text>
<line_editor name="target_avatar_name">
- (なし)
+ (なし)
</line_editor>
<button label="選択" name="choose_avatar_btn"/>
<text name="options_text_lbl">
- オプション:
+ オプション:
</text>
<check_box label="スクリプト付きのもの" name="return_scripts" tool_tip="スクリプトのオブジェクトだけ返却します"/>
<check_box label="他人の土地にあるもの" name="return_other_land" tool_tip="他人に属する土地にあるオブジェクトのみを返却します"/>
- <check_box label="この不動産に属するすべてのリージョンのもの" name="return_estate_wide" tool_tip="この不動産に含まれているすべての地域のオブジェクトを返却します"/>
+ <check_box label="この不動産に属するすべてのリージョンのもの" name="return_estate_wide" tool_tip="この不動産に含まれているすべてのリージョン(地域)のオブジェクトを返却します"/>
<button label="返却" name="return_btn"/>
<button label="上部コライダー取得" name="top_colliders_btn" tool_tip="衝突する可能性が最も高いオブジェクトのリスト"/>
- <button label="地域再起動" name="restart_btn" tool_tip="2分間のカウントダウン後、地域を再起動します"/>
+ <button label="リージョン(地域)再起動" name="restart_btn" tool_tip="2分間のカウントダウン後、リージョン(地域)を再起動します"/>
<button label="上部スクリプト取得" name="top_scripts_btn" tool_tip="スクリプトの実行に最も時間を費やしているオブジェクトのリスト"/>
<button label="再起動をキャンセル" name="cancel_restart_btn" tool_tip="リージョンの再起動をキャンセル"/>
- <button label="地域デバッグコンソール" name="region_debug_console_btn" tool_tip="地域デバッグコンソールを開く"/>
+ <button label="リージョン(地域)デバッグコンソール" name="region_debug_console_btn" tool_tip="リージョン(地域)デバッグコンソールを開く"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_environment.xml b/indra/newview/skins/default/xui/ja/panel_region_environment.xml
index 02c08e4999..48aa2a0adb 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_environment.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_environment.xml
@@ -1,18 +1,40 @@
-<?xml version="1.0" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="環境" name="panel_env_info">
- <string name="str_label_use_default">既定の設定を使用</string>
- <string name="str_label_use_region">リージョンの設定を使用</string>
- <string name="str_altitude_desription">空 [INDEX]([ALTITUDE]m)</string>
- <string name="str_no_parcel">区画が選択されていません。環境設定が無効になっています。</string>
- <string name="str_cross_region">リージョンの境界では環境設定ができません。</string>
- <string name="str_legacy">このリージョンで環境設定はできません。</string>
- <string name="str_disallowed">不動産マネージャーが、このリージョンで区画の環境を変更することを許可していません。</string>
- <string name="str_too_small">環境をサポートするには、最低でも 128 平方メートルの区画が必要です。</string>
- <string name="str_empty">(空)</string>
- <string name="str_region_env">(リージョンの環境)</string>
+ <string name="str_label_use_default">
+ 既定の設定を使用
+ </string>
+ <string name="str_label_use_region">
+ リージョン(地域)の設定を使用
+ </string>
+ <string name="str_altitude_desription">
+ 空 [INDEX]([ALTITUDE]m)
+ </string>
+ <string name="str_no_parcel">
+ 区画が選択されていません。環境の設定は無効になっています。
+ </string>
+ <string name="str_cross_region">
+ リージョン(地域)の境界では環境の設定ができません。
+ </string>
+ <string name="str_legacy">
+ このリージョン(地域)で環境の設定ができません。
+ </string>
+ <string name="str_disallowed">
+ このリージョン(地域)の不動産マネージャーは、区画ごとの環境の変更を許可していません。
+ </string>
+ <string name="str_too_small">
+ 環境を変更するには、最低でも128㎡の区画が必要です。
+ </string>
+ <string name="str_empty">
+ (空)
+ </string>
+ <string name="str_region_env">
+ (リージョンの環境)
+ </string>
<layout_stack>
<layout_panel name="pnl_environment_disabled">
- <text name="txt_environment_disabled">...</text>
+ <text name="txt_environment_disabled">
+ …
+ </text>
</layout_panel>
<layout_panel name="pnl_environment_config">
<layout_stack>
@@ -20,34 +42,45 @@
<layout_stack>
<layout_panel name="pnl_environment_current">
<button label="[USEDEFAULT]" name="btn_usedefault"/>
- <button label="持ち物を使う" name="btn_select_inventory"/>
+ <button label="インベントリを使う" name="btn_select_inventory"/>
<button label="カスタマイズ" name="btn_edit"/>
- <check_box label="区画所有者が環境を上書きすることがあります" name="chk_allow_override"/>
+ <check_box label="区画所有者による環境を上書きを許可" name="chk_allow_override"/>
</layout_panel>
<layout_panel name="pnl_environment_length">
- <text name="lbl_apparent_time">[HH]:[MM][AP] ([PRC]%)</text>
+ <text name="lbl_apparent_time">
+ [AP] [HH]:[MM]([PRC]%)
+ </text>
</layout_panel>
<layout_panel name="pnl_environment_buttons"/>
</layout_stack>
</layout_panel>
<layout_panel name="pnl_environment_altitudes">
<panel name="pnl_alt1">
- <text name="txt_alt1">空 [INDEX]
- [ALTITUDE]m</text>
- <line_editor name="edt_invname_alt1">不明</line_editor>
- <settings_drop_target name="sdt_alt1" tool_tip="持ち物から設定をこのターゲットボックスにドラッグし、現在の空として選択する"/>
+ <text name="txt_alt1">
+ 空[INDEX] [ALTITUDE]m
+ </text>
+ <line_editor name="edt_invname_alt1">
+ 不明
+ </line_editor>
+ <settings_drop_target name="sdt_alt1" tool_tip="インベントリからターゲットボックスに設定をドラッグし、現在の空として選択します。"/>
</panel>
<panel name="pnl_alt2">
- <text name="txt_alt2">空 [INDEX]
- [ALTITUDE]m</text>
- <line_editor name="edt_invname_alt2">不明</line_editor>
- <settings_drop_target name="sdt_alt2" tool_tip="持ち物から設定をこのターゲットボックスにドラッグし、現在の空として選択する"/>
+ <text name="txt_alt2">
+ 空[INDEX] [ALTITUDE]m
+ </text>
+ <line_editor name="edt_invname_alt2">
+ 不明
+ </line_editor>
+ <settings_drop_target name="sdt_alt2" tool_tip="インベントリからターゲットボックスに設定をドラッグし、現在の空として選択します。"/>
</panel>
<panel name="pnl_alt3">
- <text name="txt_alt3">空 [INDEX]
- [ALTITUDE]m</text>
- <line_editor name="edt_invname_alt3">不明</line_editor>
- <settings_drop_target name="sdt_alt3" tool_tip="持ち物から設定をこのターゲットボックスにドラッグし、現在の空として選択する"/>
+ <text name="txt_alt3">
+ 空[INDEX] [ALTITUDE]m
+ </text>
+ <line_editor name="edt_invname_alt3">
+ 不明
+ </line_editor>
+ <settings_drop_target name="sdt_alt3" tool_tip="インベントリからターゲットボックスに設定をドラッグし、現在の空として選択します。"/>
</panel>
<multi_slider initial_value="0" name="sld_altitudes">
<slider name="sld1" value="1000"/>
@@ -55,14 +88,22 @@
<slider name="sld3" value="3000"/>
</multi_slider>
<panel name="pnl_ground">
- <text name="txt_ground">地面</text>
- <line_editor name="edt_invname_ground">不明</line_editor>
- <settings_drop_target name="sdt_ground" tool_tip="持ち物から設定をこのターゲットボックスにドラッグし、地表レベルの空として選択します。"/>
+ <text name="txt_ground">
+ 地面
+ </text>
+ <line_editor name="edt_invname_ground">
+ 不明
+ </line_editor>
+ <settings_drop_target name="sdt_ground" tool_tip="インベントリからターゲットボックスに設定をドラッグし、地面レベルの空として選択します。"/>
</panel>
<panel name="pnl_water">
- <text name="txt_water">水</text>
- <line_editor name="edt_invname_water">不明</line_editor>
- <settings_drop_target name="sdt_water" tool_tip="持ち物から設定をこのターゲットボックスにドラッグし、現在の水として選択する"/>
+ <text name="txt_water">
+ 水面
+ </text>
+ <line_editor name="edt_invname_water">
+ 不明
+ </line_editor>
+ <settings_drop_target name="sdt_water" tool_tip="インベントリからターゲットボックスに設定をドラッグし、現在の水面として選択する"/>
</panel>
<button label="リセット" name="btn_rst_altitudes" tool_tip="デフォルトの高度にリセット"/>
</layout_panel>
@@ -70,7 +111,11 @@
</layout_panel>
</layout_stack>
<layout_panel name="pnl_environment_region_msg">
- <text name="region_text_lbl">地域:</text>
- <text name="region_text">不明</text>
+ <text name="region_text_lbl">
+ リージョン(地域):
+ </text>
+ <text name="region_text">
+ 不明
+ </text>
</layout_panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_estate.xml b/indra/newview/skins/default/xui/ja/panel_region_estate.xml
index 6464a65feb..df790376ec 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_estate.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="不動産" name="Estate">
<text name="estate_help_text">
- このタブ内の設定変更は、不動産内のすべての地域に影響します。
+ このタブ内の設定変更は、不動産内のすべてのリージョン(地域)に影響します。
</text>
<text name="estate_text">
不動産:
@@ -19,8 +19,8 @@
<radio_item label="アクセスタブに記載された住人とグループのみ許可する" name="estate_restricted_access"/>
<radio_item label="誰でも訪問可" name="estate_public_access"/>
</radio_group>
- <check_box label="18 歳以上である必要があります" name="limit_age_verified" tool_tip="この不動産(エステート)にアクセスするには、18 才以上でなければなりません。詳細については、[SUPPORT_SITE] をご覧ください。"/>
- <check_box label="支払情報が登録されている必要があります" name="limit_payment" tool_tip="支払情報が登録されていないと、この不動産にアクセスすることはできません。詳細については、[SUPPORT_SITE] をご覧ください。"/>
+ <check_box label="18歳以上である必要があります" name="limit_age_verified" tool_tip="この不動産(不動産)にアクセスするには、18 才以上でなければなりません。詳細については、[SUPPORT_SITE]をご覧ください。"/>
+ <check_box label="支払情報が登録されている必要があります" name="limit_payment" tool_tip="支払情報が登録されていないと、この不動産にアクセスすることはできません。詳細については、[SUPPORT_SITE]をご覧ください。"/>
<check_box label="区画所有者" name="parcel_access_override"/>
<check_box label="ボイスチャットを許可" name="voice_chat_check"/>
<check_box label="直接テレポートを許可" name="allow_direct_teleport"/>
@@ -31,20 +31,20 @@
<text name="allow_resident_label">
常に許可:
</text>
- <button label="追加..." name="add_estate_manager_btn"/>
- <button label="削除..." name="remove_estate_manager_btn"/>
- <button label="追加..." name="add_allowed_avatar_btn"/>
- <button label="削除..." name="remove_allowed_avatar_btn"/>
+ <button label="追加…" name="add_estate_manager_btn"/>
+ <button label="削除…" name="remove_estate_manager_btn"/>
+ <button label="追加…" name="add_allowed_avatar_btn"/>
+ <button label="削除…" name="remove_allowed_avatar_btn"/>
<text name="allow_group_label">
グループを常に許可:
</text>
<text name="ban_resident_label">
常に禁止:
</text>
- <button label="追加..." name="add_allowed_group_btn"/>
- <button label="削除..." name="remove_allowed_group_btn"/>
- <button label="追加..." name="add_banned_avatar_btn"/>
- <button label="削除..." name="remove_banned_avatar_btn"/>
- <button label="メッセージを不動産に送信..." name="message_estate_btn"/>
- <button label="不動産から住人を追い出す..." name="kick_user_from_estate_btn"/>
+ <button label="追加…" name="add_allowed_group_btn"/>
+ <button label="削除…" name="remove_allowed_group_btn"/>
+ <button label="追加…" name="add_banned_avatar_btn"/>
+ <button label="削除…" name="remove_banned_avatar_btn"/>
+ <button label="メッセージを不動産に送信…" name="message_estate_btn"/>
+ <button label="不動産から住人を追い出す…" name="kick_user_from_estate_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_experiences.xml b/indra/newview/skins/default/xui/ja/panel_region_experiences.xml
index 711b8e7291..eca22cfa31 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_experiences.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_experiences.xml
@@ -14,7 +14,7 @@
</panel.string>
<panel.string name="blocked_estate_text">
グリッドスコープ体験のみブロックできます。
-
+
ブロックされた体験は、この不動産では実行できません。
</panel.string>
<panel.string name="estate_caption">
@@ -22,12 +22,12 @@
</panel.string>
<panel.string name="allowed_parcel_text">
ランドスコープとなる体験のみ許可されます。
-
+
許可された体験には、この不動産でブロックされていない場合、この区画で実行する権限があります。
</panel.string>
<panel.string name="blocked_parcel_text">
住人の体験をブロックできます。
-
+
ブロックされた体験は、この区画では実行できません。
</panel.string>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_general.xml b/indra/newview/skins/default/xui/ja/panel_region_general.xml
index d23007dc6b..2e4ee72b28 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_general.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="地域" name="General">
+<panel label="リージョン(地域)" name="General">
<text name="region_text_lbl">
- 地域:
+ リージョン(地域):
</text>
<text left_delta="70" name="region_text">
未知
</text>
- <text name="version_channel_text_lbl" width="100">
+ <text name="version_channel_text_lbl">
バージョン:
</text>
<text left_delta="70" name="version_channel_text">
@@ -37,8 +37,8 @@
<icons_combo_box.item label="General" name="PG" value="13"/>
</icons_combo_box>
<button label="適用" name="apply_btn"/>
- <button label="住人 1 名をホームにテレポート..." name="kick_btn"/>
- <button label="住人全員をホームにテレポート..." name="kick_all_btn"/>
- <button label="メッセージを地域に送信..." name="im_btn"/>
- <button label="テレハブの管理..." name="manage_telehub_btn"/>
+ <button label="住人 1 名をホームにテレポート…" name="kick_btn"/>
+ <button label="住人全員をホームにテレポート…" name="kick_all_btn"/>
+ <button label="メッセージを地域に送信…" name="im_btn"/>
+ <button label="テレハブの管理…" name="manage_telehub_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_terrain.xml b/indra/newview/skins/default/xui/ja/panel_region_terrain.xml
index c1080a7d7b..5470bd6e3b 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_terrain.xml
@@ -10,19 +10,19 @@
<spinner label="地形の上昇限度" name="terrain_raise_spin"/>
<spinner label="地形の下降限度" name="terrain_lower_spin"/>
<text name="detail_texture_text">
- 地形テクスチャ(1024x1024 の 24 bit .tga ファイル)
- </text>
+ 地形テクスチャ(1024✕1024 の 24 bit .tga ファイル)
+ </text>
<text name="height_text_lbl">
- 1(低)
+ 1(低)
</text>
<text name="height_text_lbl2">
- 2
+ 2
</text>
<text name="height_text_lbl3">
- 3
+ 3
</text>
<text name="height_text_lbl4">
- 4(高)
+ 4(高)
</text>
<text name="height_text_lbl5">
地形の隆起範囲
@@ -31,7 +31,7 @@
数値は上のテクスチャのブレンド範囲を示します。
</text>
<text name="height_text_lbl11">
- 計測単位はメートルで、「低」の値は、1番のテクスチャの高さの「最大値」です。「高」の値は、4番のテクスチャの高さの「最低値」です。
+ 計測単位はメートルで、「低」の値は、1番のテクスチャの高さの「最大値」です。「高」の値は、4番のテクスチャの高さの「最低値」です。
</text>
<text name="height_text_lbl6">
北西
@@ -53,8 +53,8 @@
<spinner label="低" name="height_start_spin_2"/>
<spinner label="高" name="height_range_spin_0"/>
<spinner label="高" name="height_range_spin_2"/>
- <button label="RAW 地形ダウンロード..." name="download_raw_btn" tool_tip="不動産オーナーのみ利用可能、管理者は利用不可です"/>
- <button label="RAW 地形アップロード..." name="upload_raw_btn" tool_tip="不動産オーナーのみ利用可能、管理者は利用不可です"/>
+ <button label="RAW 地形ダウンロード…" name="download_raw_btn" tool_tip="不動産オーナーのみ利用可能、管理者は利用不可です"/>
+ <button label="RAW 地形アップロード…" name="upload_raw_btn" tool_tip="不動産オーナーのみ利用可能、管理者は利用不可です"/>
<button label="地形の構築" name="bake_terrain_btn" tool_tip="現在の地形を上昇・下降範囲の中間点として設定します"/>
<button label="適用" name="apply_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_script_ed.xml b/indra/newview/skins/default/xui/ja/panel_script_ed.xml
index 3aa20d0a3c..0861b5caf1 100644
--- a/indra/newview/skins/default/xui/ja/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/ja/panel_script_ed.xml
@@ -1,51 +1,51 @@
<?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">
- このスクリプトは「コピー不可」のため、表示・編集することができません。 オブジェクト内のスクリプトの表示・編集には、全権限が必要です。
+ このスクリプトは「コピー不可」のため、表示・編集することができません。オブジェクト内のスクリプトの表示・編集には、全権限が必要です。
</panel.string>
<panel.string name="public_objects_can_not_run">
- 公共のオブジェクトではスクリプトを実行できません
+ 公共オブジェクトで、スクリプトを実行することはできません。
</panel.string>
<panel.string name="script_running">
実行中
</panel.string>
<panel.string name="Title">
- スクリプト: [NAME]
+ スクリプト:[NAME]
</panel.string>
<panel.string name="external_editor_not_set">
- 環境変数 LL_SCRIPT_EDITOR または ExternalEditor を設定してエディターを選択します。
+ 環境変数 LL_SCRIPT_EDITOR か、外部のエディタを指定して、編集に使うアプリケーションを選択します。
</panel.string>
<menu_bar name="script_menu">
<menu label="ファイル" name="File">
<menu_item_call label="保存" name="Save"/>
- <menu_item_call label="変更を元に戻す" name="Revert All Changes"/>
- <menu_item_call label="ファイルからロード..." name="LoadFromFile"/>
- <menu_item_call label="ファイルに保存..." name="SaveToFile"/>
- <menu_item_call label="色..." name="Colors"/>
+ <menu_item_call label="復帰" name="Revert All Changes"/>
+ <menu_item_call label="ファイルを開く…" name="LoadFromFile"/>
+ <menu_item_call label="ファイルへ保存…" name="SaveToFile"/>
+ <menu_item_call label="色…" name="Colors"/>
</menu>
<menu label="編集" name="Edit">
- <menu_item_call label="元に戻す" name="Undo"/>
+ <menu_item_call label="取り消し" name="Undo"/>
<menu_item_call label="やり直し" name="Redo"/>
- <menu_item_call label="切り取り" name="Cut"/>
+ <menu_item_call label="カット" name="Cut"/>
<menu_item_call label="コピー" name="Copy"/>
- <menu_item_call label="貼り付け" name="Paste"/>
+ <menu_item_call label="ペースト" name="Paste"/>
<menu_item_call label="すべて選択" name="Select All"/>
<menu_item_call label="選択解除" name="Deselect"/>
- <menu_item_call label="検索 / 再配置..." name="Search / Replace..."/>
- <menu_item_call label="行に移動..." name="Go to line..."/>
+ <menu_item_call label="検索/再配置…" name="Search / Replace..."/>
+ <menu_item_call label="行に移動…" name="Go to line..."/>
</menu>
<menu label="ヘルプ" name="Help">
- <menu_item_call label="ヘルプ..." name="Help..."/>
- <menu_item_call label="キーワードヘルプ..." name="Keyword Help..."/>
+ <menu_item_call label="ヘルプ…" name="Help..."/>
+ <menu_item_call label="キーワードヘルプ…" name="Keyword Help..."/>
</menu>
</menu_bar>
<script_editor name="Script Editor">
- ローディング...
+ 読み込んでいます…
</script_editor>
- <combo_box label="挿入..." name="Insert..."/>
+ <combo_box label="挿入…" name="Insert..."/>
<button label="保存" label_selected="保存" name="Save_btn"/>
- <button label="編集..." name="Edit_btn"/>
+ <button label="編集…" name="Edit_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_script_experience.xml b/indra/newview/skins/default/xui/ja/panel_script_experience.xml
index eb8a510b20..f062aba572 100644
--- a/indra/newview/skins/default/xui/ja/panel_script_experience.xml
+++ b/indra/newview/skins/default/xui/ja/panel_script_experience.xml
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="script_experience" title="体験">
<button label="体験" name="Expand Experience"/>
<check_box label="体験を使用" name="enable_xp"/>
<layout_stack name="xp_details">
<layout_panel>
- <combo_box label="体験を選択..." name="Experiences..."/>
+ <combo_box label="体験を選択…" name="Experiences..."/>
</layout_panel>
</layout_stack>
<text name="No Experiences">
diff --git a/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml
index 494884c187..c717b71194 100644
--- a/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="マイ アバター" name="script_limits_my_avatar_panel">
+<panel label="自分のアバター" name="script_limits_my_avatar_panel">
<text name="script_memory">
アバターのスクリプト使用
</text>
<text name="loading_text">
- ローディング...
+ 読み込んでいます…
</text>
<scroll_list name="scripts_list">
- <scroll_list.columns label="サイズ (kb)" name="size" width="90"/>
- <scroll_list.columns label="URL" name="urls"/>
+ <scroll_list.columns label="サイズ (㎅)" name="size"/>
+ <scroll_list.columns label="URL" name="urls"/>
<scroll_list.columns label="オブジェクト名" name="name"/>
<scroll_list.columns label="場所" name="location"/>
</scroll_list>
diff --git a/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml
index d91eba9699..71dedb55a6 100644
--- a/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml
+++ b/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml
@@ -6,13 +6,13 @@
<text name="parcels_listed"/>
<text name="memory_used"/>
<text name="loading_text">
- ローディング...
+ 読み込んでいます…
</text>
<scroll_list name="scripts_list">
- <scroll_list.columns label="サイズ (kb)" name="size" width="90"/>
- <scroll_list.columns label="URL" name="urls"/>
+ <scroll_list.columns label="サイズ (㎅)" name="size"/>
+ <scroll_list.columns label="URL" name="urls"/>
<scroll_list.columns label="オブジェクト名" name="name"/>
- <scroll_list.columns label="オブジェクトの所有者" name="owner" width="120"/>
+ <scroll_list.columns label="オブジェクトの所有者" name="owner"/>
<scroll_list.columns label="区画" name="parcel"/>
<scroll_list.columns label="場所" name="location"/>
</scroll_list>
diff --git a/indra/newview/skins/default/xui/ja/panel_script_question_toast.xml b/indra/newview/skins/default/xui/ja/panel_script_question_toast.xml
index a2d0237da0..b38b4bdbfb 100644
--- a/indra/newview/skins/default/xui/ja/panel_script_question_toast.xml
+++ b/indra/newview/skins/default/xui/ja/panel_script_question_toast.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="script_question_panel" name="panel_script_question_toast">
<panel label="buttons_panel" name="buttons_panel"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_scrolling_param.xml b/indra/newview/skins/default/xui/ja/panel_scrolling_param.xml
index b698fa762d..d67b168cc1 100644
--- a/indra/newview/skins/default/xui/ja/panel_scrolling_param.xml
+++ b/indra/newview/skins/default/xui/ja/panel_scrolling_param.xml
@@ -1,12 +1,12 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="LLScrollingPanelParam">
<text name="Loading...">
- ロード中...
+ 読み込んでいます…
</text>
<text name="Loading...2">
- ロード中...
+ 読み込んでいます…
</text>
- <button label="" label_selected="" name="less" />
- <button label="" label_selected="" name="more" />
- <slider label="[DESC]" name="param slider" />
+ <button label="" label_selected="" name="less"/>
+ <button label="" label_selected="" name="more"/>
+ <slider label="[DESC]" name="param slider"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_settings_sky_atmos.xml b/indra/newview/skins/default/xui/ja/panel_settings_sky_atmos.xml
index 56fab14f7c..1fa87eb5f7 100644
--- a/indra/newview/skins/default/xui/ja/panel_settings_sky_atmos.xml
+++ b/indra/newview/skins/default/xui/ja/panel_settings_sky_atmos.xml
@@ -1,2 +1,63 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="大気&光" name="panel_settings_sky_atmos"/>
+<panel label="大気と雷" name="panel_settings_sky_atmos">
+ <layout_stack follows="all" layout="topleft" left="5" top="5" right="-5" bottom="-5" orientation="vertical">
+ <layout_panel border="true" bevel_style="in" auto_resize="false" user_resize="false" visible="true" height="75">
+ <text follows="left|top" height="10" layout="topleft" left_delta="15" top_pad="15" width="80">
+ アンビエントカラー:
+ </text>
+ <color_swatch can_apply_immediately="true" follows="left|top" height="37" label_height="0" layout="topleft" left_delta="0" name="ambient_light" top_pad="5" width="60"/>
+ <text follows="left" height="10" layout="topleft" left_delta="90" top_delta="-15" width="80">
+ 青のホライズン:
+ </text>
+ <color_swatch can_apply_immediately="true" follows="left|top" height="37" label_height="0" layout="topleft" left_delta="0" name="blue_horizon" top_pad="5" width="60"/>
+ <text follows="left" height="10" layout="topleft" left_delta="90" top_delta="-15" width="80">
+ 青の濃度:
+ </text>
+ <color_swatch can_apply_immediately="true" follows="left|top" height="37" label_height="0" layout="topleft" left_delta="0" name="blue_density" top_pad="5" width="60"/>
+ </layout_panel>
+ <layout_panel border="true" bevel_style="in" auto_resize="true" user_resize="false" visible="true">
+ <layout_stack name="atmosphere1" left="5" top="5" right="-5" bottom="-5" follows="left|top|right|bottom" orientation="hoizontal">
+ <layout_panel border="false" bevel_style="in" auto_resize="true" user_resize="false" visible="true" min_width="225">
+ <text follows="left|top" height="10" layout="topleft" left_delta="15" top_pad="15" width="80">
+ 霞の地平線:
+ </text>
+ <slider decimal_digits="2" follows="left|top" height="16" increment="0.01" initial_value="0" layout="topleft" left_delta="5" min_val="0" max_val="5" name="haze_horizon" top_delta="20" width="207" can_edit_text="true"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="-5" top_delta="25" width="80">
+ 霞の密度:
+ </text>
+ <slider decimal_digits="2" follows="left|top" height="16" increment="0.01" initial_value="0" layout="topleft" left_delta="5" min_val="0" max_val="5" name="haze_density" top_delta="20" width="207" can_edit_text="true"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="-5" top_delta="25" width="80">
+ 水分レベル:
+ </text>
+ <slider decimal_digits="3" follows="left|top" height="14" increment="0.001" initial_value="0" left_delta="5" top_delta="20" layout="topleft" min_val="0" max_val="1" name="moisture_level" width="207" can_edit_text="true"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="-5" top_delta="25" width="80">
+ 液滴半径:
+ </text>
+ <slider decimal_digits="2" follows="left|top" height="14" increment="0.01" initial_value="0" left_delta="5" top_delta="20" layout="topleft" min_val="5.0" max_val="1000.0" name="droplet_radius" width="207" can_edit_text="true"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="-5" top_delta="25" width="80">
+ 氷のレベル:
+ </text>
+ <slider decimal_digits="3" follows="left|top" height="14" increment="0.001" initial_value="0" left_delta="5" top_delta="20" layout="topleft" min_val="0" max_val="1" name="ice_level" width="207" can_edit_text="true"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="-5" top_delta="25" width="80">
+ シーンのガンマ値:
+ </text>
+ <slider decimal_digits="2" follows="left|top" height="16" increment="0.01" initial_value="0" layout="topleft" left_delta="5" max_val="20" name="scene_gamma" top_delta="20" width="207" can_edit_text="true"/>
+ </layout_panel>
+ <layout_panel border="false" bevel_style="in" auto_resize="true" user_resize="false" visible="true" min_width="225">
+ <text follows="left|top" height="10" layout="topleft" left_delta="15" top_pad="15" width="200">
+ 密度乗数:
+ </text>
+ <slider decimal_digits="4" follows="left|top" height="16" increment="0.0001" initial_value="0" layout="topleft" left_delta="5" min_val="0.0001" max_val="2" name="density_multip" top_delta="20" width="219" can_edit_text="true"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="-5" top_delta="25" width="200">
+ 距離乗数:
+ </text>
+ <slider decimal_digits="2" follows="left|top" height="16" increment="0.01" initial_value="0.8" layout="topleft" left_delta="5" min_val="0.05" max_val="1000" name="distance_multip" top_delta="20" width="219" can_edit_text="true"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="-5" top_delta="25" width="200">
+ 最大高度:
+ </text>
+ <slider decimal_digits="1" follows="left|top" height="16" increment="0.01" initial_value="0" layout="topleft" left_delta="5" min_val="0" max_val="10000" name="max_alt" top_delta="20" width="219" can_edit_text="true"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_settings_sky_clouds.xml b/indra/newview/skins/default/xui/ja/panel_settings_sky_clouds.xml
index 232530c5f8..6de6796c5f 100644
--- a/indra/newview/skins/default/xui/ja/panel_settings_sky_clouds.xml
+++ b/indra/newview/skins/default/xui/ja/panel_settings_sky_clouds.xml
@@ -2,12 +2,44 @@
<panel label="雲" name="panel_settings_sky_clouds">
<layout_stack>
<layout_panel>
- <slider label="X" name="cloud_density_x"/>
- <slider label="Y" name="cloud_density_y"/>
- <slider label="D" name="cloud_density_d"/>
- <slider label="X" name="cloud_detail_x"/>
- <slider label="Y" name="cloud_detail_y"/>
- <slider label="D" name="cloud_detail_d"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="15" top_pad="15" width="80">
+ 雲の色:
+ </text>
+ <color_swatch name="cloud_color"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="0" top_delta="47" width="200">
+ 雲の量:
+ </text>
+ <slider name="cloud_coverage"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="-5" top_delta="25" width="200">
+ 雲のスケール:
+ </text>
+ <slider name="cloud_scale"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="-5" top_delta="25" width="200">
+ 雲の分散:
+ </text>
+ <slider name="cloud_variance"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="-5" top_delta="25" width="200">
+ 雲の移動:
+ </text>
+ <xy_vector name="cloud_scroll_xy"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="160" top_delta="-20" width="200">
+ 雲の画像:
+ </text>
+ <texture_picker name="cloud_map"/>
+ </layout_panel>
+ <layout_panel>
+ <text follows="left|top" height="10" layout="topleft" left_delta="15" top_pad="15" width="200">
+ 雲の密度:
+ </text>
+ <slider label="X" name="cloud_density_x"/>
+ <slider label="Y" name="cloud_density_y"/>
+ <slider label="密度" name="cloud_density_d"/>
+ <text follows="left|top" height="10" layout="topleft" left_delta="-5" top_delta="35" width="200">
+ 雲の詳細:
+ </text>
+ <slider label="X" name="cloud_detail_x"/>
+ <slider label="Y" name="cloud_detail_y"/>
+ <slider label="密度" name="cloud_detail_d"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_settings_sky_density.xml b/indra/newview/skins/default/xui/ja/panel_settings_sky_density.xml
index cb746d8792..a17d27757b 100644
--- a/indra/newview/skins/default/xui/ja/panel_settings_sky_density.xml
+++ b/indra/newview/skins/default/xui/ja/panel_settings_sky_density.xml
@@ -1,27 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="密度" name="panel_settings_sky_density">
+<panel label="空中の光の散乱密度" name="panel_settings_sky_density">
<layout_stack>
<layout_panel>
- <slider label="レイリー指数項:" name="rayleigh_exponential"/>
- <slider label="レイリー指数スケール:" name="rayleigh_exponential_scale"/>
- <slider label="レイリー線形項:" name="rayleigh_linear"/>
- <slider label="レイリー定数項:" name="rayleigh_constant"/>
- <slider label="レイリー最大高度:" name="rayleigh_max_altitude"/>
+ <slider name="rayleigh_exponential" label="レイリー散乱の指数:"/>
+ <slider name="rayleigh_exponential_scale" label="レイリー散乱の指数係数:"/>
+ <slider name="rayleigh_linear" label="レイリー散乱の線形項:"/>
+ <slider name="rayleigh_constant" label="レイリー散乱の定数:"/>
+ <slider name="rayleigh_max_altitude" label="レイリー散乱の最大高度:"/>
</layout_panel>
<layout_panel>
- <slider label="レイリー指数項:" name="mie_exponential"/>
- <slider label="Mie 指数スケール:" name="mie_exponential_scale"/>
- <slider label="Mie 線形項:" name="mie_linear"/>
- <slider label="Mie 定数項:" name="mie_constant"/>
- <slider label="Mie 不等要素:" name="mie_aniso_factor"/>
- <slider label="Mie 最大高度:" name="mie_max_altitude"/>
+ <slider name="mie_exponential" label="ミー散乱の指数:"/>
+ <slider name="mie_exponential_scale" label="ミー散乱の指数係数:"/>
+ <slider name="mie_linear" label="ミー散乱の線形項:"/>
+ <slider name="mie_constant" label="ミー散乱の定数"/>
+ <slider name="mie_aniso_factor" label="ミー散乱の異方性因子:"/>
+ <slider name="mie_max_altitude" label="ミー散乱の最高高度:"/>
</layout_panel>
<layout_panel>
- <slider label="吸収指数項:" name="absorption_exponential"/>
- <slider label="吸収指数スケール:" name="absorption_exponential_scale"/>
- <slider label="吸収線形項:" name="absorption_linear"/>
- <slider label="吸収定数項:" name="absorption_constant"/>
- <slider label="吸収最大高度:" name="absorption_max_altitude"/>
+ <slider name="absorption_exponential" label="光の吸収の指数:"/>
+ <slider name="absorption_exponential_scale" label="光の吸収の指数係数:"/>
+ <slider name="absorption_linear" label="光の吸収の線形項:"/>
+ <slider name="absorption_constant" label="光の吸収の定数:"/>
+ <slider name="absorption_max_altitude" label="光の吸収の最大高度:"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_settings_sky_sunmoon.xml b/indra/newview/skins/default/xui/ja/panel_settings_sky_sunmoon.xml
index e5026dc9fd..f8837c40a7 100644
--- a/indra/newview/skins/default/xui/ja/panel_settings_sky_sunmoon.xml
+++ b/indra/newview/skins/default/xui/ja/panel_settings_sky_sunmoon.xml
@@ -1,12 +1,78 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="太陽&月" name="panel_settings_sky_hbodies">
- <layout_stack>
+<panel name="panel_settings_sky_hbodies">
+ <layout_stack name="main_ls">
<layout_panel name="sun_layout">
+ <text name="sun_stars_label">
+ 太陽&星
+ </text>
+ <text name="position_label">
+ 位置:
+ </text>
+ <sun_moon_trackball name="sun_rotation"/>
+ <text name="image_label">
+ 画像:
+ </text>
+ <texture_picker name="sun_image"/>
+ <text name="scale_label">
+ スケール:
+ </text>
+ <slider name="sun_scale"/>
+ <text name="color_label">
+ 色:
+ </text>
+ <color_swatch name="sun_moon_color"/>
+ <text name="sun_azimuth_label">
+ 方位角:
+ </text>
+ <slider name="sun_azimuth"/>
+ <text name="sun_elevation_label">
+ 標高:
+ </text>
+ <slider name="sun_elevation"/>
+ <text name="glow_focus_label">
+ グローフォーカス:
+ </text>
+ <slider name="glow_focus"/>
+ <text name="glow_size_label">
+ グローサイズ:
+ </text>
+ <slider name="glow_size"/>
+ <text name="star_brightness_label">
+ 星の輝度:
+ </text>
+ <slider name="star_brightness"/>
<check_box label="ビーコンを表示" name="sunbeacon"/>
</layout_panel>
- <layout_panel>
- <layout_stack>
+ <layout_panel name="moon_layout">
+ <layout_stack name="moon_stack">
<layout_panel name="moon_layout">
+ <text name="moon_label">
+ 月
+ </text>
+ <text name="position_label">
+ 位置:
+ </text>
+ <sun_moon_trackball name="moon_rotation"/>
+ <text name="moon_image_label">
+ 画像:
+ </text>
+ <texture_picker name="moon_image"/>
+ <text name="scale_label">
+ スケール:
+ </text>
+ <slider name="moon_scale"/>
+ <text name="moon_azimuth_label">
+ 方位角:
+ </text>
+ <slider name="moon_azimuth"/>
+ <text name="moon_elevation_label">
+ 標高:
+ </text>
+ <slider name="moon_elevation"/>
+ <text name="brightness_label">
+ 輝度:
+ </text>
+ <slider name="moon_brightness"/>
<check_box label="ビーコンを表示" name="moonbeacon"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/ja/panel_settings_water.xml b/indra/newview/skins/default/xui/ja/panel_settings_water.xml
index 20341fcb8d..ead1ca9b2f 100644
--- a/indra/newview/skins/default/xui/ja/panel_settings_water.xml
+++ b/indra/newview/skins/default/xui/ja/panel_settings_water.xml
@@ -1,17 +1,69 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="水" name="panel_settings_water">
- <layout_stack name="water_stack1">
- <layout_panel>
- <text name="FresnelOffsetText">
- フレネル・オフセット:
+ <layout_stack name="water_stack1" follows="all" layout="topleft" left="5" top="5" right="-5" bottom="-5" orientation="vertical">
+ <layout_panel border="true" bevel_style="in" auto_resize="false" user_resize="false" visible="true" height="105">
+ <text follows="left|top" height="20" font="SansSerif" layout="topleft" left="5" top="5" width="215">
+ 水中のフォグ:
</text>
+ <text follows="left|top" height="10" layout="left|top" left_delta="15" top_delta="0" width="60">
+ 色:
+ </text>
+ <color_swatch can_apply_immediately="true" follows="left|top" height="37" label_height="0" layout="topleft" left_delta="0" name="water_fog_color" top_pad="5" width="60"/>
+ <text follows="left|top" height="10" top_delta="-15" left_delta="80" width="150">
+ 密度指数:
+ </text>
+ <slider decimal_digits="1" follows="left|top" height="16" increment="0.01" initial_value="0" layout="top" left_delta="15" min_val="-10" max_val="10" name="water_fog_density" top_delta="5" width="150" can_edit_text="true"/>
+ <text follows="left|top" height="10" top_delta="25" left_delta="-15" width="150">
+ 水中の修飾子:
+ </text>
+ <slider decimal_digits="2" follows="left|top" height="16" increment="0.01" initial_value="0" layout="top" left_delta="15" min_val="0.0" max_val="20.0" name="water_underwater_mod" top_delta="20" width="150" can_edit_text="true"/>
+ <text follows="left|top|right" height="10" layout="topleft" left_delta="165" top_delta="-53" width="150">
+ フレネル係数:
+ </text>
+ <slider decimal_digits="2" follows="left|top" height="16" increment="0.01" initial_value="0.7" layout="topleft" left_delta="5" name="water_fresnel_scale" top_delta="15" width="150" can_edit_text="true"/>
+ <text follows="left|top|right" layout="topleft" left_delta="-5" name="FresnelOffsetText" top_delta="25" width="150">
+ フレネルオフセット:
+ </text>
+ <slider decimal_digits="2" follows="left|top" increment="0.01" initial_value="0.7" height="16" layout="topleft" left_delta="5" name="water_fresnel_offset" top_pad="5" width="150" can_edit_text="true"/>
</layout_panel>
- <layout_panel>
- <layout_stack name="water_stack2">
- <layout_panel>
- <slider label="X:" name="water_normal_scale_x"/>
- <slider label="Y:" name="water_normal_scale_y"/>
- <slider label="Z:" name="water_normal_scale_z"/>
+ <layout_panel auto_resize="true" user_resize="false" visible="true">
+ <layout_stack name="water_stack2" left="5" top="5" right="-5" bottom="-5" follows="left|top|right|bottom" orientation="horizontal">
+ <layout_panel border="true" bevel_style="in" auto_resize="true" user_resize="false" visible="true" min_width="460" width="50">
+ <text follows="left|top|right" height="16" layout="topleft" left="15" top="5" width="215">
+ ノーマルマップ
+ </text>
+ <texture_picker height="84" layout="topleft" left_delta="0" name="water_normal_map" top_pad="5" width="61"/>
+ <text follows="left|top" height="16" width="120" layout="topleft" top_delta="-20" left_delta="175">
+ 大波の速度
+ </text>
+ <xy_vector follows="top|left" name="water_wave1_xy" width="120" height="145" visible="true" left_delta="0" top_delta="21" min_val_x="-20" max_val_x="20" increment_x="0.01f" min_val_y="-20" max_val_y="20" increment_y="0.01f" arrow_color="white"/>
+ <text follows="left|top" height="16" layout="topleft" top_delta="-20" left_delta="140">
+ 小波の速度
+ </text>
+ <xy_vector follows="top|left" name="water_wave2_xy" width="120" height="145" visible="true" left_delta="0" top_delta="21" min_val_x="-20" max_val_x="20" min_val_y="-20" max_val_y="20" increment_x="0.01f" increment_y="0.01f" arrow_color="white"/>
+ <text follows="left|top|right" height="16" layout="topleft" left="10" top="90" width="215">
+ さざ波の反射係数
+ </text>
+ <slider decimal_digits="1" follows="left|top" increment="0.01" height="16" initial_value="0.7" layout="topleft" label="X:" left_delta="10" max_val="10" name="water_normal_scale_x" top_pad="5" width="150" can_edit_text="true"/>
+ <slider decimal_digits="1" follows="left|top" increment="0.01" initial_value="0.7" height="16" layout="topleft" max_val="10" name="water_normal_scale_y" top_pad="6" label="Y:" width="150" can_edit_text="true"/>
+ <slider decimal_digits="1" follows="left|top" increment="0.01" initial_value="0.7" height="16" layout="topleft" max_val="10" name="water_normal_scale_z" top_pad="6" label="Z:" width="150" can_edit_text="true"/>
+ </layout_panel>
+ <layout_panel border="true" bevel_style="in" auto_resize="true" user_resize="false" width="50" visible="true">
+ <text follows="left|top" height="20" font="SansSerif" layout="topleft" left="5" top="5" width="215">
+ 反射とブラー:
+ </text>
+ <text follows="left|top|right" height="16" layout="topleft" top_delta="25" left_delta="5" width="215">
+ 反射係数(上)
+ </text>
+ <slider control_name="water_scale_above" decimal_digits="2" follows="left|top" increment="0.01" initial_value="0.1" height="16" layout="topleft" left_delta="5" min_val="0" max_val="3" name="water_scale_above" top_pad="5" width="200" can_edit_text="true"/>
+ <text type="string" length="1" follows="left|top|right" height="16" layout="topleft" left_delta="-5" top_pad="5" width="215">
+ 反射係数(下)
+ </text>
+ <slider control_name="water_scale_below" decimal_digits="2" follows="left|top" height="16" increment="0.01" initial_value="0" layout="topleft" left_delta="5" min_val="0" max_val="3" name="water_scale_below" top_pad="5" width="200" can_edit_text="true"/>
+ <text follows="left|top|right" font="SansSerif" height="16" layout="topleft" left_delta="-5" top_pad="5" width="215">
+ ブラー乗数
+ </text>
+ <slider control_name="water_blur_multip" follows="left|top" height="16" increment="0.001" initial_value="0" layout="topleft" left_delta="5" min_val="-0.5" max_val="0.5" name="water_blur_multip" top_pad="5" width="200" can_edit_text="true"/>
</layout_panel>
</layout_stack>
</layout_panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_sidetray_home_tab.xml b/indra/newview/skins/default/xui/ja/panel_sidetray_home_tab.xml
index ea17cd6526..bbece3c340 100644
--- a/indra/newview/skins/default/xui/ja/panel_sidetray_home_tab.xml
+++ b/indra/newview/skins/default/xui/ja/panel_sidetray_home_tab.xml
@@ -1,12 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- Part of side tray, see that XML file for panel config -->
<panel label="home_tab" name="home_tab">
<scroll_container name="profile_scroll">
<panel name="profile_scroll_panel">
<panel name="sidebar_people">
- <text name="tab_name" value="人"/>
+ <text name="tab_name" value="人物"/>
<text name="tab_description">
- あなたのフレンド、グループ、連絡先、近くの人を探します。
+ あなたのフレンド、グループ、連絡先、近隣の人物を探します。
</text>
</panel>
<panel name="sidebar_places">
@@ -16,21 +15,21 @@
</text>
</panel>
<panel name="sidebar_me">
- <text name="tab_name" value="マイ プロフィール"/>
+ <text name="tab_name" value="プロフィール"/>
<text name="tab_description">
- あなたの公開プロフィールを編集します。
+ 公開プロフィールを編集します。
</text>
</panel>
<panel name="sidebar_appearance">
<text name="tab_name" value="容姿"/>
<text name="tab_description">
- あなたの容姿や現在の見た目を変更します。
+ 現在の見た目を変更します。
</text>
</panel>
<panel name="sidebar_inventory">
- <text name="tab_name" value="持ち物"/>
+ <text name="tab_name" value="インベントリ"/>
<text name="tab_description">
- あなたの持ち物を眺めます。
+ 現在のインベントリを確認します。
</text>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml
index 32aeca0026..c55c11e928 100644
--- a/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/panel_snapshot_inventory.xml
@@ -1,21 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_inventory">
+ <icon name="title_icon"/>
<text name="title">
- インベントリ
- </text>
- <text name="hint_lbl">
- 画像をインベントリに保存するには L$[UPLOAD_COST] の費用がかかります。画像をテクスチャとして保存するには平方形式の 1 つを選択してください。
+ インベントリに保存
</text>
+ <view_border name="hr"/>
<combo_box label="解像度" name="texture_size_combo">
- <combo_box.item label="現在のウィンドウ (512x512)" name="CurrentWindow"/>
- <combo_box.item label="小(128x128)" name="Small(128x128)"/>
- <combo_box.item label="中(256x256)" name="Medium(256x256)"/>
- <combo_box.item label="大(512x512)" name="Large(512x512)"/>
+ <combo_box.item label="現在のウィンドウ (512✕512)" name="CurrentWindow"/>
+ <combo_box.item label="小(128✕128)" name="Small(128x128)"/>
+ <combo_box.item label="中(256✕256)" name="Medium(256x256)"/>
+ <combo_box.item label="大(512✕512)" name="Large(512x512)"/>
<combo_box.item label="カスタム" name="Custom"/>
</combo_box>
- <spinner label="横幅 x 高さ" name="inventory_snapshot_width"/>
+ <spinner label="横幅✕高さ" name="inventory_snapshot_width"/>
<spinner label="" name="inventory_snapshot_height"/>
<check_box label="縦横比の固定" name="inventory_keep_aspect_check"/>
- <button label="取り消し" name="cancel_btn"/>
+ <text name="hint_lbl">
+ 画像をテクスチャとして保存する場合は、いずれかの正方形を選択してください。
+ </text>
+ <button label="キャンセル" name="cancel_btn"/>
<button label="保存" name="save_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_local.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_local.xml
index d23056a3d5..46bf6e15bf 100644
--- a/indra/newview/skins/default/xui/ja/panel_snapshot_local.xml
+++ b/indra/newview/skins/default/xui/ja/panel_snapshot_local.xml
@@ -1,32 +1,32 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_local">
<text name="title">
- ディスク
+ ディスクに保存
</text>
<combo_box label="解像度" name="local_size_combo">
<combo_box.item label="現在のウィンドウ" 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="320✕240" name="320x240"/>
+ <combo_box.item label="640✕480" name="640x480"/>
+ <combo_box.item label="800✕600" name="800x600"/>
+ <combo_box.item label="1024✕768" name="1024x768"/>
+ <combo_box.item label="1280✕1024" name="1280x1024"/>
+ <combo_box.item label="1600✕1200" name="1600x1200"/>
<combo_box.item label="カスタム" name="Custom"/>
</combo_box>
- <spinner label="横幅 x 高さ" name="local_snapshot_width"/>
+ <spinner label="横幅✕高さ" name="local_snapshot_width"/>
<check_box label="縦横比の固定" name="local_keep_aspect_check"/>
<text name="local_format_label">
- フォーマット:
+ 形式:
</text>
- <combo_box label="書式" name="local_format_combo">
+ <combo_box label="ファイル形式" 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>
<slider label="品質:" name="image_quality_slider"/>
- <button label="取り消し" name="cancel_btn"/>
- <flyout_button label="保存" name="save_btn" tool_tip="画像をファイルに保存">
+ <button label="キャンセル" name="cancel_btn"/>
+ <flyout_button label="保存" name="save_btn" tool_tip="画像をファイルとして保存">
<flyout_button.item label="保存" name="save_item"/>
- <flyout_button.item label="別名で保存..." name="saveas_item"/>
+ <flyout_button.item label="名前をつけて保存…" name="saveas_item"/>
</flyout_button>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml
index f222a4d61a..7a1aa280ec 100644
--- a/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml
+++ b/indra/newview/skins/default/xui/ja/panel_snapshot_options.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_options">
<button label="ディスクに保存" name="save_to_computer_btn"/>
- <button label="持ち物に保存(L$[AMOUNT])" name="save_to_inventory_btn"/>
+ <button label="インベントリに保存(L$ [AMOUNT])" name="save_to_inventory_btn"/>
<button label="プロフィールフィードで共有する" name="save_to_profile_btn"/>
- <button label="Facebook でシェア" name="send_to_facebook_btn"/>
- <button label="Twitter で共有する" name="send_to_twitter_btn"/>
- <button label="Flickr で共有する" name="send_to_flickr_btn"/>
- <button label="メールにより送信" name="save_to_email_btn"/>
+ <button label="メールで送信" name="save_to_email_btn"/>
+ <text name="fee_hint_lbl">
+ 料金はサブスクリプションレベルに基づきます。レベルが高くなるほど、料金は安くなります。
+ </text>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml
index 569c07ad47..9cb0b8f116 100644
--- a/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml
+++ b/indra/newview/skins/default/xui/ja/panel_snapshot_postcard.xml
@@ -1,21 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_snapshot_postcard">
<string name="default_subject">
- [SECOND_LIFE] からのポストカードです。
+ [SECOND_LIFE]からのポストカードです。
</string>
<string name="default_message">
ぜひご覧ください!
</string>
<string name="upload_message">
- 送信中...
+ 送信中…
</string>
<text name="title">
- E メール
+ Eメール
</text>
<tab_container name="postcard_tabs">
<panel label="メッセージ" name="panel_postcard_message"/>
<panel label="設定" name="panel_postcard_settings"/>
</tab_container>
- <button label="取り消し" name="cancel_btn"/>
+ <button label="キャンセル" name="cancel_btn"/>
<button label="送信" name="send_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/ja/panel_snapshot_profile.xml
index 80d400c846..571d818375 100644
--- a/indra/newview/skins/default/xui/ja/panel_snapshot_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_snapshot_profile.xml
@@ -5,17 +5,17 @@
</text>
<combo_box label="解像度" name="profile_size_combo">
<combo_box.item label="現在のウィンドウ" 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="640✕480" name="640x480"/>
+ <combo_box.item label="800✕600" name="800x600"/>
+ <combo_box.item label="1024✕768" name="1024x768"/>
<combo_box.item label="カスタム" name="Custom"/>
</combo_box>
- <spinner label="横幅 x 高さ" name="profile_snapshot_width"/>
+ <spinner label="横幅✕高さ" name="profile_snapshot_width"/>
<check_box label="縦横比の固定" name="profile_keep_aspect_check"/>
<text name="caption_label">
キャプション:
</text>
- <check_box initial_value="true" label="場所を含む" name="add_location_cb"/>
- <button label="取り消し" name="cancel_btn"/>
+ <check_box label="場所を含む" name="add_location_cb"/>
+ <button label="キャンセル" name="cancel_btn"/>
<button label="投稿" name="post_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_sound_devices.xml b/indra/newview/skins/default/xui/ja/panel_sound_devices.xml
index d57e6c796c..ecd8c1caa6 100644
--- a/indra/newview/skins/default/xui/ja/panel_sound_devices.xml
+++ b/indra/newview/skins/default/xui/ja/panel_sound_devices.xml
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="機器の設定" name="device_settings_panel">
<panel.string name="default_text">
デフォルト
</panel.string>
<string name="name_no_device">
- 機器が設定されていません
+ 機器が設定されていません。
</string>
<string name="name_default_system_device">
デフォルトのシステム機器
@@ -16,9 +16,9 @@
出力
</text>
<text name="My volume label">
- マイク音量:
+ マイク音量:
</text>
- <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="スライダーを使ってマイクレベルを調節します"/>
+ <slider_bar name="mic_volume_slider" tool_tip="スライダーを使ってマイクレベルを調節します。"/>
<text name="wait_text">
しばらくお待ちください。
</text>
diff --git a/indra/newview/skins/default/xui/ja/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/ja/panel_stand_stop_flying.xml
index 2308aff19b..892bcf54df 100644
--- a/indra/newview/skins/default/xui/ja/panel_stand_stop_flying.xml
+++ b/indra/newview/skins/default/xui/ja/panel_stand_stop_flying.xml
@@ -1,5 +1,4 @@
<?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="立ち上がる" name="stand_btn" tool_tip="ここをクリックして立ち上がります。"/>
<button label="飛行停止" name="stop_fly_btn" tool_tip="飛行停止"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_status_bar.xml b/indra/newview/skins/default/xui/ja/panel_status_bar.xml
index 139c4d7fdd..9feae80624 100644
--- a/indra/newview/skins/default/xui/ja/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_status_bar.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="status">
+<panel name="status" title="ステータスバー">
<panel.string name="packet_loss_tooltip">
パケット損失
</panel.string>
@@ -7,10 +7,10 @@
帯域幅
</panel.string>
<panel.string name="time">
- [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+ [ampm, datetime, slt] [hour12, datetime, slt]:[min, datetime, slt] [timezone,datetime, slt]
</panel.string>
<panel.string name="timeTooltip">
- [year, datetime, slt] [month, datetime, slt] [day, datetime, slt] ([weekday, datetime, slt])
+ [year, datetime, slt]年[month, datetime, slt]月[day, datetime, slt]日([weekday, datetime, slt])
</panel.string>
<panel.string name="buycurrencylabel">
L$ [AMT]
@@ -18,14 +18,16 @@
<panel name="menu_search_panel">
<search_editor label="メニューの検索" name="search_menu_edit" tool_tip="検索したい内容をここに入力してください。メニューに部分的に一致する結果が表示されます。"/>
</panel>
- <panel left="-391" name="balance_bg" width="160">
- <text name="balance" tool_tip="クリックして L$ 残高を更新" value="L$??"/>
- <button label="L$ の購入" name="buyL" tool_tip="クリックして L$ を購入します"/>
- <button label="店" name="goShop" tool_tip="Second Life マーケットプレイスを開く" width="40"/>
+ <panel name="balance_bg">
+ <text tool_tip="クリックしてL$残高を更新" value="L$ ??"/>
+ <button label="L$を購入" name="buyL" tool_tip="クリックしてL$を購入します" width="60"/>
+ <button label="ショップ" name="goShop" tool_tip="Second Lifeのマーケットプレイスを開きます。" width="70"/>
</panel>
<text name="TimeText" tool_tip="現在時刻(太平洋)">
- 24:00 AM PST
+ 午前 24:00 PST
</text>
- <button name="media_toggle_btn" tool_tip="すべてのメディアを開始・停止(音楽、ビデオ、Web ページ)"/>
- <button name="volume_btn" tool_tip="グローバル音量設定"/>
+ <icon image_name="Cam_FreeCam_Off" name="presets_icon_camera" tool_tip="カメラ"/>
+ <icon image_name="Presets_Icon" name="presets_icon_graphic" tool_tip="グラフィックのプリセット"/>
+ <button name="media_toggle_btn" tool_tip="すべてのメディアを開始・停止(音楽、ビデオ、Webページ)"/>
+ <button name="volume_btn" tool_tip="ボリューム"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_sys_well_item.xml b/indra/newview/skins/default/xui/ja/panel_sys_well_item.xml
index 81db7c8989..6553307e32 100644
--- a/indra/newview/skins/default/xui/ja/panel_sys_well_item.xml
+++ b/indra/newview/skins/default/xui/ja/panel_sys_well_item.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<!-- All our XML is utf-8 encoded. -->
<panel name="sys_well_item" title="sys_well_item">
<text name="title">
- Beware the trout. BEWARE! THE! TROUT!
+ 鱒にご用心!鱒!に!ご用心!
</text>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_teleport_history.xml b/indra/newview/skins/default/xui/ja/panel_teleport_history.xml
index 58e396877c..8ccaa52de3 100644
--- a/indra/newview/skins/default/xui/ja/panel_teleport_history.xml
+++ b/indra/newview/skins/default/xui/ja/panel_teleport_history.xml
@@ -1,16 +1,16 @@
<?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="お探しのものは見つかりましたか?[secondlife:///app/search/places/[SEARCH_TERM]をお試しください。"/>
- <no_visible_tabs_text name="no_teleports_msg" value="テレポートの履歴には何も情報がありません。[secondlife:///app/search/places/ Search]をお試しください。"/>
+ <no_matched_tabs_text name="no_matched_teleports_msg" value="お探しのものは見つかりましたか?[secondlife:///app/search/places/[SEARCH_TERM] 検索]をお試しください。"/>
+ <no_visible_tabs_text name="no_teleports_msg" value="テレポートの履歴には何も情報がありません。[secondlife:///app/search/places/ 検索]をお試しください。"/>
<accordion_tab name="today" title="今日"/>
<accordion_tab name="yesterday" title="昨日"/>
- <accordion_tab name="2_days_ago" title="2日前"/>
- <accordion_tab name="3_days_ago" title="3日前"/>
- <accordion_tab name="4_days_ago" title="4日前"/>
- <accordion_tab name="5_days_ago" title="5日前"/>
- <accordion_tab name="6_days_and_older" title="6日以上前"/>
- <accordion_tab name="1_month_and_older" title="1ヶ月以上前"/>
+ <accordion_tab name="2_days_ago" title="一昨日"/>
+ <accordion_tab name="3_days_ago" title="3日前"/>
+ <accordion_tab name="4_days_ago" title="4日前"/>
+ <accordion_tab name="5_days_ago" title="5日前"/>
+ <accordion_tab name="6_days_and_older" title="6日以上前"/>
+ <accordion_tab name="1_month_and_older" title="1ヶ月以上前"/>
<accordion_tab name="6_months_and_older" title="半年以上前"/>
</accordion>
<panel label="bottom_panel" name="bottom_panel">
diff --git a/indra/newview/skins/default/xui/ja/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/ja/panel_teleport_history_item.xml
index 0340bfe754..01be31ede1 100644
--- a/indra/newview/skins/default/xui/ja/panel_teleport_history_item.xml
+++ b/indra/newview/skins/default/xui/ja/panel_teleport_history_item.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="teleport_history_item">
- <text name="region" value="..."/>
- <text name="timestamp" value="..."/>
+ <text name="region" value="…"/>
+ <text name="timestamp" value="…"/>
<button name="profile_btn" tool_tip="アイテム情報を表示"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_tools_texture.xml b/indra/newview/skins/default/xui/ja/panel_tools_texture.xml
index 75bc8eb86f..49efc529e4 100644
--- a/indra/newview/skins/default/xui/ja/panel_tools_texture.xml
+++ b/indra/newview/skins/default/xui/ja/panel_tools_texture.xml
@@ -5,7 +5,7 @@
</text>
<color_swatch label="" name="colorswatch" tool_tip="クリックしてカラーピッカーを開きます"/>
<text name="color trans">
- 透過度 %
+ 透過度%
</text>
<text name="glow label">
グロー
@@ -21,7 +21,7 @@
<radio_item label="輝き (反射)" name="Shininess (specular)" value="2"/>
</radio_group>
<check_box initial_value="false" label="繰り返しをロックする" name="checkbox_sync_settings" tool_tip="すべてのマップの繰り返しを調整する"/>
- <texture_picker label="テクスチャ" name="texture control" tool_tip="クリックして写真を選択します"/>
+ <texture_picker label="テクスチャ" name="texture control" tool_tip="クリックして画像を選択します"/>
<text name="label alphamode">
アルファモード
</text>
@@ -34,16 +34,16 @@
<text name="label maskcutoff">
マスクカットオフ
</text>
- <texture_picker label="テクスチャ" name="bumpytexture control" tool_tip="クリックして写真を選択します"/>
+ <texture_picker label="テクスチャ" name="bumpytexture control" tool_tip="クリックして画像を選択します"/>
<text name="label bumpiness">
凹凸
</text>
<combo_box name="combobox bumpiness">
<combo_box.item label="なし" name="None"/>
<combo_box.item label="明るさ" name="Brightness"/>
- <combo_box.item label="暗さ" name="Darkness"/>
+ <combo_box.item label="暗い" name="Darkness"/>
<combo_box.item label="木目調" name="woodgrain"/>
- <combo_box.item label="バーク" name="bark"/>
+ <combo_box.item label="樹皮" name="bark"/>
<combo_box.item label="レンガ" name="bricks"/>
<combo_box.item label="市松模様" name="checker"/>
<combo_box.item label="コンクリート" name="concrete"/>
@@ -52,13 +52,13 @@
<combo_box.item label="円板" name="discs"/>
<combo_box.item label="小石" name="gravel"/>
<combo_box.item label="ペトリ皿" name="petridish"/>
- <combo_box.item label="サイディング" name="siding"/>
+ <combo_box.item label="側線" name="siding"/>
<combo_box.item label="ストーンタイル" name="stonetile"/>
<combo_box.item label="化粧しっくい" name="stucco"/>
- <combo_box.item label="サクション" name="suction"/>
- <combo_box.item label="ウィーブ" name="weave"/>
+ <combo_box.item label="吸盤" name="suction"/>
+ <combo_box.item label="織物" name="weave"/>
</combo_box>
- <texture_picker label="テクスチャ" name="shinytexture control" tool_tip="クリックして写真を選択します"/>
+ <texture_picker label="テクスチャ" name="shinytexture control" tool_tip="クリックして画像を選択します"/>
<text name="label shininess">
輝き
</text>
@@ -79,9 +79,9 @@
</text>
<color_swatch label="" name="shinycolorswatch" tool_tip="クリックしてカラーピッカーを開きます"/>
<text name="media_info">
- 選択したメディアの URL がもしあれば、ここに入ります
+ 選択したメディアのURLがもしあれば、ここに入ります。
</text>
- <button label="選択..." name="add_media" tool_tip="メディアを追加します"/>
+ <button label="選択…" name="add_media" tool_tip="メディアを追加します"/>
<button label="削除" name="delete_media" tool_tip="このメディアテクスチャを削除します"/>
<button label="揃える" label_selected="メディアを一列に揃えます" name="button align" tool_tip="メディアテクスチャを一列に揃える(最初に読み込む必要があります)"/>
<text name="tex gen">
diff --git a/indra/newview/skins/default/xui/ja/panel_voice_effect.xml b/indra/newview/skins/default/xui/ja/panel_voice_effect.xml
index 530f0fb59d..57a1bb7838 100644
--- a/indra/newview/skins/default/xui/ja/panel_voice_effect.xml
+++ b/indra/newview/skins/default/xui/ja/panel_voice_effect.xml
@@ -4,12 +4,12 @@
ボイスモーフィングなし
</string>
<string name="preview_voice_effects">
- ボイスモーフィングをプレビュー ▶
+ ボイスモーフィングをプレビュー
</string>
<string name="get_voice_effects">
- ボイスモーフィングを取得 ▶
+ ボイスモーフィングを取得
</string>
- <combo_box name="voice_effect" tool_tip="ボイスモーフィングを選択して音声を変更">
+ <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/ja/panel_volume_pulldown.xml b/indra/newview/skins/default/xui/ja/panel_volume_pulldown.xml
index 967dedf061..849a65d0c1 100644
--- a/indra/newview/skins/default/xui/ja/panel_volume_pulldown.xml
+++ b/indra/newview/skins/default/xui/ja/panel_volume_pulldown.xml
@@ -4,11 +4,11 @@
<slider label="ボタン" name="UI Volume"/>
<slider label="環境音" name="Wind Volume"/>
<slider label="サウンド" name="SFX Volume"/>
- <check_box name="gesture_audio_play_btn" tool_tip="ジェスチャーの音を有効にする"/>
+ <check_box name="gesture_audio_play_btn" tool_tip="ジェスチャーの音を有効にする。"/>
<slider label="音楽" name="Music Volume"/>
- <check_box name="enable_music" tool_tip="ストリーミング音楽を有効にする"/>
+ <check_box name="enable_music" tool_tip="ストリーミング音楽を有効にする。"/>
<slider label="メディア" name="Media Volume"/>
- <check_box name="enable_media" tool_tip="ストリーミングメディアを有効にする"/>
+ <check_box name="enable_media" tool_tip="ストリーミングメディアを有効にする。"/>
<slider label="ボイス" name="Voice Volume"/>
- <check_box name="enable_voice_check" tool_tip="ボイスチャットを有効にする"/>
+ <check_box name="enable_voice_check" tool_tip="ボイスチャットを有効にする。"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_world_map.xml b/indra/newview/skins/default/xui/ja/panel_world_map.xml
index 8ff853193a..b7c787b4c8 100644
--- a/indra/newview/skins/default/xui/ja/panel_world_map.xml
+++ b/indra/newview/skins/default/xui/ja/panel_world_map.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="world_map">
<panel.string name="Loading">
- ローディング...
+ 読み込んでいます…
</panel.string>
<panel.string name="InvalidLocation">
無効な位置
@@ -31,10 +31,10 @@
北西
</panel.string>
<panel.string name="world_map_person">
- 1 人
+ 1人
</panel.string>
<panel.string name="world_map_people">
- [NUMBER] 人
+ [NUMBER]人
</panel.string>
<text label="北" name="floater_map_north" text="北">
diff --git a/indra/newview/skins/default/xui/ja/role_actions.xml b/indra/newview/skins/default/xui/ja/role_actions.xml
index 05eca2cca3..a929cb6ac6 100644
--- a/indra/newview/skins/default/xui/ja/role_actions.xml
+++ b/indra/newview/skins/default/xui/ja/role_actions.xml
@@ -1,76 +1,76 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<role_actions>
<action_set description="これらの能力には、グループメンバーを追加、排除し、招待状なしに新メンバーの参加を認める権限が含まれます。" name="Membership">
- <action description="このグループに人を招待" longdescription="「役割&amp;メンバー」セクションの「メンバー」タブ内にある「招待」ボタンを押して、このグループにメンバーを招待します。" name="member invite" value="1"/>
- <action description="このグループから「全員(Everyone)」の役割に属するメンバーを追放します" longdescription="「役割&amp;メンバー」セクションの「メンバー」タブ内にある「追放」ボタンを押して、このグループからメンバーを追放します。「オーナー」は、他の「オーナー」以外は誰でも追放できます。「オーナー」ではない人が「全員(Everyone)」にしか役割がない場合、メンバーはグループから追放されることがあります。「役割」からメンバーを削除するには、「役割からメンバーを削除」の能力が与えられている必要があります。" name="member eject" value="2"/>
+ <action description="このグループに人を招待" longdescription="「役割とメンバー」セクションの「メンバー」タブ内にある「招待」ボタンを押して、このグループにメンバーを招待します。" name="member invite" value="1"/>
+ <action description="このグループから「全員(Everyone)」の役割に属するメンバーを追放します" longdescription="「役割とメンバー」セクションの「メンバー」タブ内にある「追放」ボタンを押して、このグループからメンバーを追放します。「オーナー」は、他の「オーナー」以外は誰でも追放できます。「オーナー」ではない人が「全員(Everyone)」にしか役割がない場合、メンバーはグループから追放されることがあります。「役割」からメンバーを削除するには、「役割からメンバーを削除」の能力が与えられている必要があります。" name="member eject" value="2"/>
<action description="立入禁止リストの管理" longdescription="グループのメンバーに、このグループから住人を立入禁止/立入禁止解除できるようにします。" name="allow ban" value="51"/>
<action description="「自由参加」と「入会費」の切り替え" longdescription="「自由参加」に切り替えると、招待されなくても新しいメンバーが入会できます。「入会費」は「一般」セクションで変更します。" name="member options" value="3"/>
</action_set>
<action_set description="これらの能力には、グループ内の役割を追加、削除、変更し、役割にメンバーを追加、削除し、さらに役割へ能力を割り当てる権限が含まれます。" name="Roles">
- <action description="新しい役割を作成" longdescription="新しい「役割」は、「役割&amp;メンバー」セクション &gt; 「役割」タブで作成します。" name="role create" value="4"/>
- <action description="役割を削除" longdescription="「役割」は、「役割&amp;メンバー」セクション &gt; 「役割」タブで削除します。" name="role delete" value="5"/>
- <action description="「役割」の名前、タイトル、説明、メンバー公開の有無を変更" longdescription="「役割」の名前、肩書き、説明、メンバー公開の有無を変更します。「役割」を選択後に、「役割&amp;メンバー」セクション &gt; 「役割」タブ の下で設定できます。" name="role properties" value="6"/>
- <action description="メンバーを割り当て人の役割に割り当てる" longdescription="「割り当てられた役割」(「役割&amp;メンバー」セクション &gt; 「メンバー」タブ)のリストで、メンバーを「役割」に割り当てます。この能力があるメンバーは、割り当てる人が既に所属する「役割」にのみメンバーを追加できます。" name="role assign member limited" value="7"/>
- <action description="メンバーを任意の役割に割り当てる" longdescription="「割り当てられた役割」(「役割&amp;メンバー」セクション &gt; 「メンバー」タブ)のリストで、メンバーを「いずれかの役割」に割り当てます。*警告* この「能力」がある「役割」を持つメンバーなら誰でも自分自身と、他の「オーナー」以外のメンバーを現在以上の権限のある「役割」に割り当てることができます。つまり、「オーナー」以外の人が「オーナー」に近い力を持つよう設定できることになります。この「能力」を割り当てる前に、自分がしようとしていることをよく把握してください。" name="role assign member" value="8"/>
- <action description="役割からメンバーを解除" longdescription="「割り当てられた役割」(「役割&amp;メンバー」セクション &gt; 「メンバー」タブ)のリストで、メンバーを「役割」から削除します。「オーナー」は削除できません。" name="role remove member" value="9"/>
- <action description="役割の能力の割り当てと解除" longdescription="「許可された能力」(「役割&amp;メンバー」セクション &gt; 「役割」タブ)のリストで、各「役割」に対する「能力」を割り当てたり削除したりします。*警告* この「能力」がある「役割」を持つメンバーなら誰でも自分自身と、他の「オーナー」以外のメンバーをすべての「能力」」に割り当てることができます。つまり、「オーナー」以外の人が「オーナー」に近い権限を持つよう設定できることになります。この「能力」を割り当てる前に、自分がしようとしていることをよく把握してください。" name="role change actions" value="10"/>
+ <action description="新しい役割を作成" longdescription="新しい「役割」は、「役割とメンバー」セクション>「役割」タブで作成します。" name="role create" value="4"/>
+ <action description="役割を削除" longdescription="「役割」は、「役割とメンバー」セクション>「役割」タブで削除します。" name="role delete" value="5"/>
+ <action description="「役割」の名前、タイトル、説明、メンバー公開の有無を変更" longdescription="「役割」の名前、肩書き、説明、メンバー公開の有無を変更します。「役割」を選択後に、「役割とメンバー」セクション>「役割」タブ の下で設定できます。" name="role properties" value="6"/>
+ <action description="メンバーを割り当て人の役割に割り当てる" longdescription="「割り当てられた役割」(「役割とメンバー」セクション>「メンバー」タブ)のリストで、メンバーを「役割」に割り当てます。この能力があるメンバーは、割り当てる人が既に所属する「役割」にのみメンバーを追加できます。" name="role assign member limited" value="7"/>
+ <action description="メンバーを任意の役割に割り当てる" longdescription="「割り当てられた役割」(「役割とメンバー」セクション>「メンバー」タブ)のリストで、メンバーを「いずれかの役割」に割り当てます。*警告* この「能力」がある「役割」を持つメンバーなら誰でも自分自身と、他の「オーナー」以外のメンバーを現在以上の権限のある「役割」に割り当てることができます。つまり、「オーナー」以外の人が「オーナー」に近い力を持つよう設定できることになります。この「能力」を割り当てる前に、自分がしようとしていることをよく把握してください。" name="role assign member" value="8"/>
+ <action description="役割からメンバーを解除" longdescription="「割り当てられた役割」(「役割とメンバー」セクション>「メンバー」タブ)のリストで、メンバーを「役割」から削除します。「オーナー」は削除できません。" name="role remove member" value="9"/>
+ <action description="役割の能力の割り当てと解除" longdescription="「許可された能力」(「役割とメンバー」セクション>「役割」タブ)のリストで、各「役割」に対する「能力」を割り当てたり削除したりします。*警告* この「能力」がある「役割」を持つメンバーなら誰でも自分自身と、他の「オーナー」以外のメンバーをすべての「能力」」に割り当てることができます。つまり、「オーナー」以外の人が「オーナー」に近い権限を持つよう設定できることになります。この「能力」を割り当てる前に、自分がしようとしていることをよく把握してください。" name="role change actions" value="10"/>
</action_set>
<action_set description="これらの能力には、グループの公開性や理念、記章の変更といった、グループのアイデンティティを修正する権限が含まれます。" name="Group Identity">
- <action description="理念、記章、「Web 上で公開」、およびグループ情報内で公開のメンバーを変更。" longdescription="理念、記章、「検索に表示」の変更をします。 「一般」セクションで行えます。" name="group change identity" value="11"/>
+ <action description="理念、記章、「Web 上で公開」、およびグループ情報内で公開のメンバーを変更。" longdescription="理念、記章、「検索に表示」の変更をします。「一般」セクションで行えます。" name="group change identity" value="11"/>
</action_set>
- <action_set description="これらの「能力」には、このグループの所有地の譲渡、修正、販売をする権限があります。 「土地情報」ウィンドウを見るには、地面を右クリックして「土地情報」を選ぶか、ナビゲーションバーの「i」アイコンをクリックします。" name="Parcel Management">
- <action description="グループ用の土地の譲渡と購入" longdescription="グループ用の土地の譲渡と購入を行います。 この操作には、土地情報画面 > 一般タブを使います。" name="land deed" value="12"/>
- <action description="リンデン総督に土地を明け渡す" longdescription="リンデン総督に土地を明け渡します。 *警告* この能力を持つ役割のメンバーは、「土地情報」>「一般」でグループ所有の土地を放棄して、売り上げなしでリンデン総督に明け渡すことができます。 この能力の割り当ては、そのことを理解した上で行ってください。" name="land release" value="13"/>
- <action description="売り地情報の設定" longdescription="売り地情報を設定します。 *警告* この能力を持つ役割のメンバーは、「土地情報」>「一般」タブでグループ所有の土地を自分の思いどおりに販売することができます。 この能力の割り当ては、そのことを理解した上で行ってください。" name="land set sale info" value="14"/>
- <action description="区画の再分割と統合" longdescription="区画を再分割、統合します。 地面を右クリックして「地形を編集」を選び、マウスを土地の上でドラッグして範囲を選択します。 再分割するには、分割対象を選んで「再分割」をクリックします。 統合するには、2つ以上の隣接する区画を選んで「統合」をクリックします。" name="land divide join" value="15"/>
+ <action_set description="これらの「能力」には、このグループの所有地の譲渡、修正、販売をする権限があります。「土地情報」ウィンドウを見るには、地面を右クリックして「土地情報」を選ぶか、ナビゲーションバーの「i」アイコンをクリックします。" name="Parcel Management">
+ <action description="グループ用の土地の譲渡と購入" longdescription="グループ用の土地の譲渡と購入を行います。この操作には、「土地情報」>「一般」タブを使います。" name="land deed" value="12"/>
+ <action description="リンデン総督に土地を明け渡す" longdescription="リンデン総督に土地を明け渡します。*警告* この能力を持つ役割のメンバーは、「土地情報」>「一般」でグループ所有の土地を放棄して、売り上げなしでリンデン総督に明け渡すことができます。この能力の割り当ては、そのことを理解した上で行ってください。" name="land release" value="13"/>
+ <action description="売り地情報の設定" longdescription="売り地情報を設定します。*警告* この能力を持つ役割のメンバーは、「土地情報」>「一般」タブでグループ所有の土地を自分の思いどおりに販売することができます。この能力の割り当ては、そのことを理解した上で行ってください。" name="land set sale info" value="14"/>
+ <action description="区画の再分割と統合" longdescription="区画を再分割、統合します。地面を右クリックして「地形を編集」を選び、マウスを土地の上でドラッグして範囲を選択します。再分割するには、分割対象を選んで「再分割」をクリックします。統合するには、2つ以上の隣接する区画を選んで「統合」をクリックします。" name="land divide join" value="15"/>
</action_set>
- <action_set description="これらの能力には、区画名、公開設定、検索ディレクトリへの登録、着地点ならびに TP ルートのオプションを変更する権限が含まれます。" name="Parcel Identity">
- <action description="「場所検索に表示」を切り替えカテゴリを設定" longdescription="「場所検索に表示」に切り替え、「土地情報」 &gt; 「オプション」タブで区画のカテゴリを設定します。" name="land find places" value="17"/>
- <action description="区画名、説明、および「Moderate コンテンツ」設定を変更" longdescription="区画名、説明、および「Moderate コンテンツ」設定を変更します。「土地情報」 &gt; 「オプション」タブで行います。" name="land change identity" value="18"/>
- <action description="着地点およびテレポートルートを設定" longdescription="この能力を持つ役割のメンバーは、グループ所有の区画上で着地点を設定することにより外部からのテレポートの到着位置を指定できると共に、テレポートルートを設定して細かく制御することができます。 この操作は、「土地情報」>「オプション」タブで行います。" name="land set landing point" value="19"/>
+ <action_set description="これらの能力には、区画名、公開設定、検索ディレクトリへの登録、着地点ならびにTPルートのオプションを変更する権限が含まれます。" name="Parcel Identity">
+ <action description="「場所検索に表示」を切り替えカテゴリを設定" longdescription="「場所検索に表示」に切り替え、「土地情報」>「オプション」タブで区画のカテゴリを設定します。" name="land find places" value="17"/>
+ <action description="区画名、説明、および「Moderate コンテンツ」設定を変更" longdescription="区画名、説明、および「Moderateコンテンツ」設定を変更します。「土地情報」>「オプション」タブで行います。" name="land change identity" value="18"/>
+ <action description="着地点およびテレポートルートを設定" longdescription="この能力を持つ役割のメンバーは、グループ所有の区画上で着地点を設定することにより外部からのテレポートの到着位置を指定できると共に、テレポートルートを設定して細かく制御することができます。この操作は、「土地情報」>「オプション」タブで行います。" name="land set landing point" value="19"/>
</action_set>
<action_set description="これらの能力には、「オブジェクトを作成」、「地形を編集」、音楽とメディアの設定など、区画のオプションに関連する権限が含まれます。" name="Parcel Settings">
- <action description="音楽とメディアの設定を変更" longdescription="ストリーミングミュージックと動画の設定を変更するには、「土地情報」 > 「メディア」タブを使います。" name="land change media" value="20"/>
- <action description="「地形を編集」に切り替え" longdescription="「地形を編集」に切り替えます。 *警告* 「土地情報」>「オプション」>「地形を編集」の順で進むと、誰でもあなたの土地の形の整備や、リンデン製の樹木の設置、移動ができます。 この能力を割り振る前に、このことをよく理解しておいてください。 「土地情報」>「オプション」タブから「地形を編集」に切り替えられます。" name="land edit" value="21"/>
- <action description="「土地情報」>「オプション」タブ内のさまざまな設定を切り替え" longdescription="「安全(ダメージなし)」、「飛行」を切り替え、住人に以下を許可します: グループ所有地の「土地情報」 &gt; 「オプション」タブ内の、「地形を編集」、「制作」、「ランドマークの作成」、「スクリプトの実行」。" name="land options" value="22"/>
- <action description="自然環境の設定とデイサイクルを修正する。" longdescription="「土地について」 &gt; 「環境」タブから自然環境の設定とデイサイクルを変更する。" name="land change environment" value="46"/>
+ <action description="音楽とメディアの設定を変更" longdescription="ストリーミングミュージックと動画の設定を変更するには、「土地情報」>「メディア」タブを使います。" name="land change media" value="20"/>
+ <action description="「地形を編集」に切り替え" longdescription="「地形を編集」に切り替えます.*警告* 「土地情報」>「オプション」>「地形を編集」の順で進むと、誰でもあなたの土地の形の整備や、リンデン製の樹木の設置、移動ができます。この能力を割り振る前に、このことをよく理解しておいてください。「土地情報」>「オプション」タブから「地形を編集」に切り替えられます。" name="land edit" value="21"/>
+ <action description="「土地情報」>「オプション」タブ内のさまざまな設定を切り替え" longdescription="「安全(ダメージなし)」、「飛行」を切り替え、住人に以下を許可します: グループ所有地の「土地情報」>「オプション」タブ内の、「地形を編集」、「制作」、「ランドマークの作成」、「スクリプトの実行」。" name="land options" value="22"/>
+ <action description="自然環境の設定とデイサイクルを修正する。" longdescription="「土地について」>「環境」タブから自然環境の設定とデイサイクルを変更する。" name="land change environment" value="46"/>
</action_set>
<action_set description="これらの能力には、グループ所有の区画に関する規制を迂回することを、メンバーに許可する権限が含まれます。" name="Parcel Powers">
<action description="常に「地形を編集」を許可" longdescription="この能力を持つ役割のメンバーは、グループ所有の区画上で地形を編集することができます。その区画が「土地情報」>「オプション」タブでオフになっていても、地形の編集が可能です。" name="land allow edit land" value="23"/>
<action description="常に「飛行」を許可" longdescription="この能力を持つ役割のメンバーは、グループ所有の区画上を飛行することができます。その区画が「土地情報」>「オプション」タブでオフになっていても、飛行が可能です。" name="land allow fly" value="24"/>
<action description="常に「オブジェクト作成」を許可" longdescription="この能力を持つ役割のメンバーは、グループ所有の区画上にオブジェクトを作成することができます。その区画が「土地情報」>「オプション」タブでオフになっていても、オブジェクトの作成が可能です。" name="land allow create" value="25"/>
- <action description="着地点を無視する" longdescription="この能力を持つ役割のメンバーは、。[土地について &gt; オプション] タブで着地点が設定されている場合でもグループ所有の区画に直接テレポートできます。" name="land allow direct teleport" value="26"/>
- <action description="グループの土地への「ホーム設定」を許可" longdescription="この「役割」を持つメンバーは、このグループに譲渡された区画上で「世界」メニュー &gt; ランドマーク &gt; 現在地をホームに設定 を使用して、ホームの設定を行うことができます。" name="land allow set home" value="28"/>
+ <action description="着地点を無視する" longdescription="この能力を持つ役割のメンバーは、。「土地情報」>「オプション」タブで着地点が設定されている場合でもグループ所有の区画に直接テレポートできます。" name="land allow direct teleport" value="26"/>
+ <action description="グループの土地への「ホーム設定」を許可" longdescription="この「役割」を持つメンバーは、このグループに譲渡された区画上で「ワールド」>「ランドマーク」>「現在地をホームに設定」を使用して、ホームの設定を行うことができます。" name="land allow set home" value="28"/>
<action description="グループ所有地での「イベント主催」を許可" longdescription="この「能力」を持つ「役割」のメンバーは、グループ所有区画を利用してイベントを開催することができます。" name="land allow host event" value="41"/>
</action_set>
<action_set description="これらの能力には、住人の凍結や追放を含む、グループ所有の区画へのアクセスを許可、制限する権限が含まれます。" name="Parcel Access">
<action description="区画アクセスリストの管理" longdescription="区画アクセス・リストの管理は、「土地情報」>「アクセス」タブで行います。" name="land manage allowed" value="29"/>
- <action description="区画禁止リストの管理" longdescription="「土地情報」 &gt; 「アクセス」タブの、区画の禁止リストの管理ができます。" name="land manage banned" value="30"/>
- <action description="「入場許可を販売」の設定を変更" longdescription="「土地情報」 &gt; 「アクセス」タブで、区画の「入場許可を販売」の設定を変更します。" name="land manage passes" value="31"/>
+ <action description="区画禁止リストの管理" longdescription="「土地情報」>「アクセス」タブの、区画の禁止リストの管理ができます。" name="land manage banned" value="30"/>
+ <action description="「入場許可を販売」の設定を変更" longdescription="「土地情報」>「アクセス」タブで、区画の「入場許可を販売」の設定を変更します。" name="land manage passes" value="31"/>
<action description="区画上の住人の追放とフリーズ" longdescription="この「能力」を持つ「役割」のメンバーは、グループ所有地にいて欲しくない住人を右クリックし、「追放」や「フリーズ」を選んで対応できます。" name="land admin" value="32"/>
</action_set>
- <action_set description="これらの能力には、オブジェクトの返却、リンデンプラントの設置や移動を、メンバーに許可する権限が含まれます。 これはメンバーがゴミ処理や景観作成をする際に便利ですが、返却したオブジェクトは元に戻せないので、注意して行いましょう。" name="Parcel Content">
+ <action_set description="これらの能力には、オブジェクトの返却、リンデンプラントの設置や移動を、メンバーに許可する権限が含まれます。これはメンバーがゴミ処理や景観作成をする際に便利ですが、返却したオブジェクトは元に戻せないので、注意して行いましょう。" name="Parcel Content">
<action description="グループ所有オブジェクトの返却" longdescription="グループ所有の区画上のオブジェクトのうち、グループ所有のオブジェクトを返却するには、「土地情報」>「オブジェクト」タブを使います。" name="land return group owned" value="48"/>
<action description="グループに設定されているオブジェクトを返却" longdescription="グループ所有の区画上のオブジェクトのうち、グループに設定されているオブジェクトを返却するには、「土地情報」>「オブジェクト」タブを使います。" name="land return group set" value="33"/>
<action description="非グループオブジェクトの返却" longdescription="グループ所有の区画上のオブジェクトのうち、グループ以外のオブジェクトを返却するには、「土地情報」>「オブジェクト」タブを使います。" name="land return non group" value="34"/>
- <action description="リンデン製の植物を使用して景観作成" longdescription="リンデン製の樹木、植物、草を植える、景観づくりの能力です。 これらの植物はあなたのインベントリ内の「ライブラリ」 &gt; 「オブジェクト」フォルダにあります。「制作」メニューで作成することもできます。" name="land gardening" value="35"/>
+ <action description="リンデン製の植物を使用して景観作成" longdescription="リンデン製の樹木、植物、草を植える、景観づくりの能力です。これらの植物はあなたのインベントリ内の「ライブラリ」>「オブジェクト」フォルダにあります。「制作」メニューで作成することもできます。" name="land gardening" value="35"/>
</action_set>
- <action_set description="これらの「能力」には、グループ所有のオブジェクトを譲渡、修正、販売する権限が含まれます。 変更は「制作ツール」 &gt; 「一般」タブで行います。 オブジェクトを右クリックして「編集」を開くと設定内容を確認できます。" name="Object Management">
- <action description="グループにオブジェクトを譲渡" longdescription="「制作ツール」 &gt; 「一般」タブで、オブジェクトをグループに譲渡します。" name="object deed" value="36"/>
- <action description="グループ所有オブジェクトの操作(移動、コピー、修正)" longdescription="「制作ツール」 &gt; 「一般」タブで、グループ所有のオブジェクトを操作(移動、コピー、修正)します。" name="object manipulate" value="38"/>
- <action description="グループ所有オブジェクトを販売可能に設定" longdescription="「制作ツール」 &gt; 「一般」タブで、グループ所有のオブジェクトを販売対象に設定します。" name="object set sale" value="39"/>
+ <action_set description="これらの「能力」には、グループ所有のオブジェクトを譲渡、修正、販売する権限が含まれます。変更は「制作ツール」>「一般」タブで行います。オブジェクトを右クリックして「編集」を開くと設定内容を確認できます。" name="Object Management">
+ <action description="グループにオブジェクトを譲渡" longdescription="「制作ツール」>「一般」タブで、オブジェクトをグループに譲渡します。" name="object deed" value="36"/>
+ <action description="グループ所有オブジェクトの操作(移動、コピー、修正)" longdescription="「制作ツール」>「一般」タブで、グループ所有のオブジェクトを操作(移動、コピー、修正)します。" name="object manipulate" value="38"/>
+ <action description="グループ所有オブジェクトを販売可能に設定" longdescription="「制作ツール」>「一般」タブで、グループ所有のオブジェクトを販売対象に設定します。" name="object set sale" value="39"/>
</action_set>
<action_set description="これらの能力には、メンバーに、グループの負債の支払いと利子受け取りを要求する権限、グループ口座履歴へのアクセスを制限する権限が含まれます。" name="Accounting">
- <action description="グループ負債の返済とグループ配当の受領" longdescription="この能力を持つ役割のメンバーについては、グループ負債の支払いとグループ配当の受け取りが自動的に行われます。 つまり、これらのメンバーは、毎日配当されるグループ所有地の売り上げ金の一部を受け取ると共に、区画の広告費などを負担することになります。" name="accounting accountable" value="40"/>
+ <action description="グループ負債の返済とグループ配当の受領" longdescription="この能力を持つ役割のメンバーについては、グループ負債の支払いとグループ配当の受け取りが自動的に行われます。つまり、これらのメンバーは、毎日配当されるグループ所有地の売り上げ金の一部を受け取ると共に、区画の広告費などを負担することになります。" name="accounting accountable" value="40"/>
</action_set>
<action_set description="これらの能力には、グループ通知の送信、受信、表示をメンバーに許可する権限が含まれます。" name="Notices">
- <action description="通知を送信" longdescription="この「能力」を持つ「役割」のメンバーは、「グループ」 &gt; 「通知」セクションから通知を送信できます。" name="notices send" value="42"/>
- <action description="通知の受信と過去の通知の閲覧" longdescription="この「能力」を持つ「役割」のメンバーは、「グループ」 &gt; 「通知」セクションで通知を受信したり過去の通知を見ることができます。" name="notices receive" value="43"/>
+ <action description="通知を送信" longdescription="この「能力」を持つ「役割」のメンバーは、「グループ」>「通知」セクションから通知を送信できます。" name="notices send" value="42"/>
+ <action description="通知の受信と過去の通知の閲覧" longdescription="この「能力」を持つ「役割」のメンバーは、「グループ」>「通知」セクションで通知を受信したり過去の通知を見ることができます。" name="notices receive" value="43"/>
</action_set>
- <action_set description=" これらの能力には、グループチャットセッションやグループボイスチャットへのアクセスの許可や制限の権限が含まれます。 " name="Chat">
- <action description="グループチャットに参加する" longdescription=" この能力を持つ役割のメンバーは、グループチャットセッションにテキストおよびボイスで参加できます。 " name="join group chat" value="16"/>
- <action description="グループボイスチャットに参加する" longdescription=" この能力を持つ役割のメンバーは、グループボイスチャットセッションに参加できます。 注: ボイスチャットセッションにアクセスするには、グループチャットに参加する能力が必要です。 " name="join voice chat" value="27"/>
- <action description="グループチャットを管理する" longdescription=" この能力を持つ役割のメンバーは、グループボイスチャットセッションおよびグループテキストチャットセッションへのアクセスや参加をコントロールすることができます。 " name="moderate group chat" value="37"/>
+ <action_set description="これらの能力には、グループチャットセッションやグループボイスチャットへのアクセスの許可や制限の権限が含まれます。" name="Chat">
+ <action description="グループチャットに参加する" longdescription="この能力を持つ役割のメンバーは、グループチャットセッションにテキストおよびボイスで参加できます。" name="join group chat" value="16"/>
+ <action description="グループボイスチャットに参加する" longdescription="この能力を持つ役割のメンバーは、グループボイスチャットセッションに参加できます。注:ボイスチャットセッションにアクセスするには、グループチャットに参加する能力が必要です。" name="join voice chat" value="27"/>
+ <action description="グループチャットを管理する" longdescription="この能力を持つ役割のメンバーは、グループボイスチャットセッションおよびグループテキストチャットセッションへのアクセスや参加をコントロールすることができます。" name="moderate group chat" value="37"/>
</action_set>
<action_set description="これらの機能には、このグループにより所有される体験を変更する機能が含まれます。" name="experience_tools_experience">
<action description="体験管理者" longdescription="この機能を持つ役割のメンバーは、体験のメタデータを編集できます。" name="experience admin" value="49"/>
diff --git a/indra/newview/skins/default/xui/ja/sidepanel_appearance.xml b/indra/newview/skins/default/xui/ja/sidepanel_appearance.xml
index 30cef9ccc0..3919ed0bc8 100644
--- a/indra/newview/skins/default/xui/ja/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/ja/sidepanel_appearance.xml
@@ -2,7 +2,7 @@
<panel label="アウトフィット" name="appearance panel">
<string name="No Outfit" value="アウトフィットなし"/>
<string name="Unsaved Changes" value="保存されていない変更"/>
- <string name="Now Wearing" value="着用しています..."/>
+ <string name="Now Wearing" value="着用しています…"/>
<string name="Changing outfits" value="アウトフィットの変更"/>
<panel name="panel_currentlook">
<button label="E" name="editappearance_btn"/>
@@ -11,9 +11,9 @@
(状態)
</text>
<text name="currentlook_name">
- MyOutfit With a really Long Name like MOOSE
+ MOOSEみたいな長い名前の私のアウトフィット
</text>
<button label="" name="edit_outfit_btn" tool_tip="このアウトフィットを編集"/>
</panel>
- <filter_editor label="アウトフィットをフィルター" name="Filter"/>
+ <filter_editor label="アウトフィットをフィルタ" name="Filter"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/sidepanel_inventory.xml b/indra/newview/skins/default/xui/ja/sidepanel_inventory.xml
index 5aa0e86a5b..675d3ee1a6 100644
--- a/indra/newview/skins/default/xui/ja/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/sidepanel_inventory.xml
@@ -1,18 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="もの" name="objects panel">
+<panel label="オブジェクト" name="objects panel">
<panel label="" name="sidepanel_inventory_panel">
<layout_stack name="inventory_layout_stack">
<layout_panel name="inbox_layout_panel">
<panel label="" name="marketplace_inbox">
<string name="InboxLabelWithArg">
- 受け取ったアイテム([NUM])
+ 受け取ったアイテム([NUM]個)
</string>
<string name="InboxLabelNoArg">
受け取ったアイテム
</string>
<button label="受け取ったアイテム" name="inbox_btn"/>
<text name="inbox_fresh_new_count">
- [NUM] 個の新アイテム
+ [NUM]個の新アイテム
</text>
<panel name="inbox_inventory_placeholder_panel" tool_tip="アイテムを使用するには、そのアイテムをインベントリにドラッグアンドドロップ">
<text name="inbox_inventory_placeholder">
@@ -28,13 +28,13 @@
<button label="プロフィール" name="info_btn" tool_tip="オブジェクトのプロフィールを表示する"/>
</layout_panel>
<layout_panel name="share_btn_lp">
- <button label="共有" name="share_btn" tool_tip="「持ち物」のアイテムを共有する"/>
+ <button label="共有" name="share_btn" tool_tip="インベントリ内のアイテムを共有する。"/>
</layout_panel>
<layout_panel name="shop_btn_lp">
<button label="ショッピング" name="shop_btn" tool_tip="マーケットプレイスのサイトを開く"/>
- <button label="装着" name="wear_btn" tool_tip="選択したアウトフィットを着用する"/>
+ <button label="装着" name="wear_btn" tool_tip="選択したアウトフィットを着用す。る"/>
<button label="再生" name="play_btn"/>
- <button label="テレポート" name="teleport_btn" tool_tip="該当するエリアにテレポートする"/>
+ <button label="テレポート" name="teleport_btn" tool_tip="該当するエリアにテレポートする。"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml
index 3bdf8405e7..fe9998b4ce 100644
--- a/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/ja/sidepanel_item_info.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="item properties" title="アイテムのプロフィール">
<panel.string name="loading_experience">
- (ローディング)
+ (読み込んでいます…)
</panel.string>
<panel.string name="unknown">
(不明)
</panel.string>
<panel.string name="unknown_multiple">
- (不明/複数)
+ (不明/複数)
</panel.string>
<panel.string name="public">
(公開)
@@ -19,7 +19,7 @@
所有者ができること:
</panel.string>
<panel.string name="acquiredDate">
- [year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ [year,datetime,local]年[mth,datetime,local]月[day,datetime,local]日[wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
</panel.string>
<panel.string name="origin_inventory">
(インベントリ)
@@ -34,11 +34,11 @@
<text name="LabelItemNameTitle">
名前:
</text>
- <line_editor name="LabelItemName" tool_tip="使用できる名前の文字数は最大 63 文字までです。長いプリム名は短縮されます。名前に使用できる文字は ASCII-7 (非拡張)に含まれる印字可能な文字のみです(縦線「|」は例外)。"/>
+ <line_editor name="LabelItemName" tool_tip="使用できる名前の文字数は最大63文字までです。長いプリム名は短縮されます。名前に使用できる文字は ASCII-7(非拡張)に含まれる印字可能な文字のみです(縦線「|」は例外)。"/>
<text name="LabelItemDescTitle">
説明:
</text>
- <line_editor name="LabelItemDesc" tool_tip="ビューワの設定で [すべてのオブジェクト上でヒントを表示] が選択されている場合、オブジェクトにマウスのポインタをかざすとそのオブジェクトの説明がポップアップ表示されます。プリムの説明は最大 127 バイトまでに制限されているため、それよりも長い文字列は切り捨てられます。"/>
+ <line_editor name="LabelItemDesc" tool_tip="ビューアの設定で[すべてのオブジェクト上でヒントを表示]が選択されている場合、オブジェクトにマウスのポインタをかざすとそのオブジェクトの説明がポップアップ表示されます。プリムの説明は最大127バイトまでに制限されているため、それよりも長い文字列は切り捨てられます。"/>
<text name="LabelCreatorTitle">
制作者:
</text>
@@ -57,7 +57,7 @@
</text>
<check_box label="修正" name="CheckOwnerModify"/>
<check_box label="コピー" name="CheckOwnerCopy"/>
- <check_box label="再販・プレゼント" name="CheckOwnerTransfer"/>
+ <check_box label="再販・譲渡" name="CheckOwnerTransfer"/>
<text name="AnyoneLabel">
全員:
</text>
@@ -65,21 +65,21 @@
<text name="GroupLabel">
グループ:
</text>
- <check_box label="共有" name="CheckShareWithGroup" tool_tip="設定したグループのメンバー全員にこのオブジェクトの修正権限を与えます。 譲渡しない限り、役割制限を有効にはできません。"/>
+ <check_box label="共有" name="CheckShareWithGroup" tool_tip="設定したグループのメンバー全員にこのオブジェクトの修正権限を与えます。譲渡しない限り、役割制限を有効にはできません。"/>
<text name="NextOwnerLabel">
次の所有者:
</text>
<check_box label="修正" name="CheckNextOwnerModify" tool_tip="次の所有者は、アイテム名などのプロパティ内容を編集したり、このオブジェクトのサイズを変更することができます。"/>
<check_box label="コピー" name="CheckNextOwnerCopy" tool_tip="次の所有者は、このオブジェクトを無制限にコピーできます。コピーには制作者の情報が含まれ、コピー元のアイテムと違って許可などに関し制限があります。"/>
- <check_box label="再販・プレゼント" name="CheckNextOwnerTransfer" tool_tip="次の所有者はこのオブジェクトを他人にあげたり再販できます。"/>
+ <check_box label="再販・譲渡" name="CheckNextOwnerTransfer" tool_tip="次の所有者はこのオブジェクトを他人にあげたり再販できます。"/>
</panel>
- <check_box label="販売中" name="CheckPurchase" tool_tip="このオブジェクトやオブジェクトの中身が購入できるようになるか、指定価格でインワールドにコピーできるようになります。"/>
+ <check_box label="販売品" name="CheckPurchase" tool_tip="このオブジェクトやオブジェクトの中身が購入できるようになるか、指定価格でインワールドにコピーできるようになります。"/>
<combo_box name="ComboBoxSaleType" tool_tip="購入者がコピー、コピーの中身、またはアイテム自体を受け取るのか選択してください。">
<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" tool_tip="オブジェクトの価格。"/>
+ <spinner label="価格:L$" name="Edit Cost" tool_tip="オブジェクトの価格"/>
</panel>
</scroll_container>
<panel name="button_panel">
diff --git a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml
index d8325d8dc0..8ff543bf92 100644
--- a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml
@@ -1,46 +1,46 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="object properties" title="オブジェクトのプロフィール">
<panel.string name="text deed continued">
- 譲渡
+ 再譲渡
</panel.string>
<panel.string name="text deed">
譲渡
</panel.string>
<panel.string name="text modify info 1">
- このオブジェクトを修正できます
+ このオブジェクトは、修正することができます。
</panel.string>
<panel.string name="text modify info 2">
- これらのオブジェクトを修正できます
+ これらのオブジェクトは、修正することができます。
</panel.string>
<panel.string name="text modify info 3">
- このオブジェクトを修正できません
+ このオブジェクトは、修正することができません。
</panel.string>
<panel.string name="text modify info 4">
- これらのオブジェクトを修正できません
+ これらのオブジェクトは、修正することができません。
</panel.string>
<panel.string name="text modify info 5">
- 地域(リージョン)の境界を越えてこのオブジェクトを修正できません
+ リージョン(地域)の境界を越えて、このオブジェクトを修正することはできません。
</panel.string>
<panel.string name="text modify info 6">
- 地域(リージョン)の境界を越えてこれらのオブジェクトを修正できません
+ リージョン(地域)の境界を越えて、これらのオブジェクトを修正することはできません。
</panel.string>
<panel.string name="text modify warning">
- このオブジェクトには、パーツがリンクされています
+ このオブジェクトには、パーツがリンクされています。
</panel.string>
<panel.string name="Cost Default">
- 価格: L$
+ 価格:L$
</panel.string>
<panel.string name="Cost Total">
- 合計価格: L$
+ 合計価格:L$
</panel.string>
<panel.string name="Cost Per Unit">
- Price Per: L$
+ 単価: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="オブジェクトのプロフィール"/>
<text name="where" value="(インワールド)"/>
@@ -48,11 +48,11 @@
<text name="Name:">
名前:
</text>
- <line_editor name="Object Name" tool_tip="使用できる名前の文字数は最大 63 文字までです。長いプリム名は短縮されます。名前に使用できる文字は ASCII-7 (非拡張)に含まれる印字可能な文字のみです(縦線「|」は例外)。"/>
+ <line_editor name="Object Name" tool_tip="使用できる名前の文字数は最大63文字までです。長いプリム名は短縮されます。名前に使用できる文字はASCII-7 (非拡張)に含まれる印字可能な文字のみです(縦線「|」は例外)。"/>
<text name="Description:">
説明:
</text>
- <line_editor name="Object Description" tool_tip="ビューワの設定で [すべてのオブジェクト上でヒントを表示] が選択されている場合、オブジェクトにマウスのポインタをかざすとそのオブジェクトの説明がポップアップ表示されます。プリムの説明は最大 127 バイトまでに制限されているため、それよりも長い文字列は切り捨てられます。"/>
+ <line_editor name="Object Description" tool_tip="ビューアの設定で[すべてのオブジェクト上でヒントを表示]が選択されている場合、オブジェクトにマウスのポインタをかざすとそのオブジェクトの説明がポップアップ表示されます。プリムの説明は最大127バイトまでに制限されているため、それよりも長い文字列は切り捨てられます。"/>
<text name="CreatorNameLabel">
制作者:
</text>
@@ -63,12 +63,12 @@
グループ:
</text>
<button name="button set group" tool_tip="このオブジェクト権限を共有するグループを選択します"/>
- <name_box initial_value="ローディング..." name="Group Name Proxy"/>
- <button label="譲渡" label_selected="譲渡" name="button deed" tool_tip="このアイテムを譲渡すると「次の所有者」の権限が適用されます。 グループ共有オブジェクトは、グループのオフィサーが譲渡できます。"/>
+ <name_box initial_value="読み込んでいます…" name="Group Name Proxy"/>
+ <button label="譲渡" label_selected="譲渡" name="button deed" tool_tip="このアイテムを譲渡すると「次の所有者」の権限が適用されます。グループ共有オブジェクトは、グループのオフィサーが譲渡できます。"/>
<text name="label click action">
クリックで:
</text>
- <combo_box name="clickaction" tool_tip="マウスを 1 回左クリックすると、オブジェクトに対してアクションを起こせるようになります。各クリックアクションには、何ができるかを示す特別なカーソルがあります。クリックアクションによっては、動作要件が必要なものもあります。たとえば、[タッチ] や [支払い] にはスクリプトが必要になるなどです">
+ <combo_box name="clickaction" tool_tip="マウスで1回左クリックすると、オブジェクトに対してアクションを起こせるようになります。各クリックアクションには、何ができるかを示す特別なカーソルがあります。クリックアクションによっては、動作要件が必要なものもあります。例えば、「触る」や「支払い」にはスクリプトが必要になります。">
<combo_box.item label="触る(デフォルト)" name="Touch/grab(default)"/>
<combo_box.item label="オブジェクトに座る" name="Sitonobject"/>
<combo_box.item label="オブジェクトを買う" name="Buyobject"/>
@@ -79,7 +79,7 @@
</combo_box>
<panel name="perms_inv">
<text name="perm_modify">
- このオブジェクトを修正できます
+ このオブジェクトは以下の条件で修正することができます。
</text>
<text name="Anyone can:">
全員:
@@ -89,15 +89,15 @@
<text name="GroupLabel">
グループ:
</text>
- <check_box label="共有" name="checkbox share with group" tool_tip="設定したグループのメンバー全員にこのオブジェクトの修正権限を与えます。 譲渡しない限り、役割制限を有効にはできません。"/>
+ <check_box label="共有" name="checkbox share with group" tool_tip="設定したグループのメンバー全員にこのオブジェクトの修正権限を与えます。譲渡しない限り、役割制限を有効にはできません。"/>
<text name="NextOwnerLabel">
次の所有者:
</text>
<check_box label="修正" name="checkbox next owner can modify" tool_tip="次の所有者は、アイテム名などのプロパティ内容を編集したり、このオブジェクトのサイズを変更することができます。"/>
<check_box label="コピー" name="checkbox next owner can copy" tool_tip="次の所有者は、このオブジェクトを無制限にコピーできます。コピーには制作者の情報が含まれ、コピー元のアイテムと違って許可などに関し制限があります。"/>
- <check_box label="再販・プレゼント" name="checkbox next owner can transfer" tool_tip="次の所有者はこのオブジェクトを他人にあげたり再販できます"/>
+ <check_box label="再販・譲渡" name="checkbox next owner can transfer" tool_tip="次の所有者は、このオブジェクトを他人に譲渡したり再販できます"/>
</panel>
- <check_box label="販売中" name="checkbox for sale" tool_tip="このオブジェクトやオブジェクトの中身が購入できるようになるか、指定価格でインワールドにコピーできるようになります。"/>
+ <check_box label="販売" name="checkbox for sale" tool_tip="このオブジェクトやオブジェクトの中身が購入できるようになるか、指定価格でインワールドにコピーできるようになります。"/>
<combo_box name="sale type" tool_tip="購入者がコピーを受け取るのか、コピーの中身を受け取るのか、またはアイテム自体を受け取るのかを選択してください。">
<combo_box.item label="コピー" name="Copy"/>
<combo_box.item label="中身" name="Contents"/>
@@ -106,31 +106,31 @@
<spinner label="価格: L$" name="Edit Cost" tool_tip="オブジェクトの価格。"/>
<check_box label="検索に表示" name="search_check" tool_tip="このオブジェクトを検索結果に表示します"/>
<text name="pathfinding_attributes_label">
- パスファインディング属性:
+ 経路探索属性:
</text>
<text name="B:">
- B.
+ B:
</text>
<text name="O:">
- O:
+ O:
</text>
<text name="G:">
- G:
+ G:
</text>
<text name="E:">
- E:
+ E:
</text>
<text name="N:">
- N:
+ N:
</text>
<text name="F:">
- F:
+ F:
</text>
</panel>
<panel name="button_panel">
- <button label="開く" name="open_btn" tool_tip="[オブジェクトの中身] を開いて確認します。"/>
- <button label="支払う" name="pay_btn" tool_tip="[支払い] ウィンドウを開きます。オブジェクトでこの動作を実行するには、支払い用のスクリプトが必要です。"/>
- <button label="買う" name="buy_btn" tool_tip="[購入] ウィンドウを開きます。オブジェクトは販売用に設定する必要があります。"/>
- <button label="詳細" name="details_btn" tool_tip="[オブジェクトを調べる] ウィンドウを開きます。"/>
+ <button label="開く" name="open_btn" tool_tip="「オブジェクトの中身」を開いて確認します。"/>
+ <button label="支払う" name="pay_btn" tool_tip="「支払い」ウィンドウを開きます。オブジェクトでこの動作を実行するには、支払い用のスクリプトが必要です。"/>
+ <button label="買う" name="buy_btn" tool_tip="「購入」ウィンドウを開きます。オブジェクトは販売用に設定する必要があります。"/>
+ <button label="詳細" name="details_btn" tool_tip="「オブジェクトを調べる」ウィンドウを開きます。"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index 367d43fb4c..fa6c329fe7 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -1,618 +1,3257 @@
-<?xml version="1.0" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<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 サポートポータル</string>
- <string name="StartupDetectingHardware">ハードウェアの検出中です...</string>
- <string name="StartupLoading">[APP_NAME] をインストール中です...</string>
- <string name="StartupClearingCache">キャッシュをクリア中です...</string>
- <string name="StartupInitializingTextureCache">テクスチャキャッシュを初期化中です...</string>
- <string name="StartupRequireDriverUpdate">グラフィックを初期化できませんでした。グラフィックドライバを更新してください。</string>
- <string name="AboutHeader">[CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3] ([ADDRESS_SIZE]bit)
-[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]</string>
- <string name="BuildConfig">ビルド構成 [BUILD_CONFIG]</string>
- <string name="AboutPosition">あなたの現在地は、[POSITION_LOCAL_0,number,1]、[POSITION_LOCAL_1,number,1]、[POSITION_LOCAL_2,number,1] の [REGION] です。位置は &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; です。([HOSTIP])
-SLURL:&lt;nolink&gt;[SLURL]&lt;/nolink&gt;
-(グローバル座標 [POSITION_0,number,1]、[POSITION_1,number,1]、[POSITION_2,number,1])
+ <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グリッド
+ </string>
+ <string name="SUPPORT_SITE">
+ Second Lifeサポートポータル
+ </string>
+ <string name="StartupDetectingHardware">
+ ハードウェアの検出中です…
+ </string>
+ <string name="StartupLoading">
+ [APP_NAME]をインストール中です…
+ </string>
+ <string name="StartupClearingCache">
+ キャッシュをクリア中です…
+ </string>
+ <string name="StartupInitializingTextureCache">
+ テクスチャキャッシュを初期化中です…
+ </string>
+ <string name="StartupRequireDriverUpdate">
+ グラフィックを初期化できませんでした。グラフィックドライバを更新してください。
+ </string>
+ <string name="AboutHeader">
+ [CHANNEL] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2].[VIEWER_VERSION_3]([ADDRESS_SIZE]bit)
+[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </string>
+ <string name="BuildConfig">
+ ビルド構成:[BUILD_CONFIG]
+ </string>
+ <string name="AboutPosition">
+ あなたは、現在[REGION]の[POSITION_LOCAL_0,number,1],[POSITION_LOCAL_1,number,1],[POSITION_LOCAL_2,number,1]にいます。
+位置は、&lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt;です。([HOSTIP])
+SLURL:&lt;nolink&gt;[SLURL]&lt;/nolink&gt;
+(グローバル座標は、[POSITION_0,number,1],[POSITION_1,number,1],[POSITION_2,number,1]です。)
[SERVER_VERSION]
-[SERVER_RELEASE_NOTES_URL]</string>
- <string name="AboutSystem">CPU:[CPU]
-メモリ:[MEMORY_MB] MB
-OS バージョン:[OS_VERSION]
+[SERVER_RELEASE_NOTES_URL]
+ </string>
+ <string name="AboutSystem">
+ CPU:[CPU]
+メモリ:[MEMORY_MB]㎆
+OSのバージョン:[OS_VERSION]
グラフィックカード製造元:[GRAPHICS_CARD_VENDOR]
-グラフィックカード:[GRAPHICS_CARD]</string>
- <string name="AboutDriver">Windows グラフィックドライババージョン:[GRAPHICS_DRIVER_VERSION]</string>
- <string name="AboutOGL">OpenGL バージョン:[OPENGL_VERSION]</string>
- <string name="AboutSettings">ウィンドウサイズ: [WINDOW_WIDTH]x[WINDOW_HEIGHT]
-フォントサイズ調整: [FONT_SIZE_ADJUSTMENT]pt
-UI スケーリング: [UI_SCALE]
-描画距離: [DRAW_DISTANCE]m
-帯域幅: [NET_BANDWITH]kbit/s
-LOD 係数: [LOD_FACTOR]
-描画の質: [RENDER_QUALITY]
-高度なライティングモデル: [GPU_SHADERS]
-テクスチャメモリ: [TEXTURE_MEMORY]MB</string>
- <string name="AboutOSXHiDPI">HiDPI 表示モード: [HIDPI]</string>
- <string name="AboutLibs">J2C デコーダバージョン: [J2C_VERSION]
-オーディオドライババージョン: [AUDIO_DRIVER_VERSION]
-[LIBCEF_VERSION] LibVLC バージョン: [LIBVLC_VERSION]
-ボイスサーバーバージョン: [VOICE_VERSION]</string>
- <string name="AboutTraffic">パケットロス:[PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)</string>
- <string name="AboutTime">[month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]</string>
- <string name="ErrorFetchingServerReleaseNotesURL">サーバーのリリースノートの URL を取得中にエラーが発生しました。</string>
- <string name="BuildConfiguration">ビルド構成</string>
- <string name="ProgressRestoring">復元中です...</string>
- <string name="ProgressChangingResolution">解像度を変更中です...</string>
- <string name="Fullbright">明るさ全開(レガシー)</string>
- <string name="LoginInProgress">ログイン中です。[APP_NAME]の表示がフリーズする場合があります。 しばらくお待ちください。</string>
- <string name="LoginInProgressNoFrozen">ログイン中です...</string>
- <string name="LoginAuthenticating">認証しています...</string>
- <string name="LoginMaintenance">アカウントのメンテナンスを実行しています...</string>
- <string name="LoginAttempt">前回のログインに失敗しました。 ログイン中です([NUMBER] 回目)</string>
- <string name="LoginPrecaching">ワールドを読み込んでいます...</string>
- <string name="LoginInitializingBrowser">内蔵 Web ブラウザを初期化しています...</string>
- <string name="LoginInitializingMultimedia">マルチメディアを初期化しています...</string>
- <string name="LoginInitializingFonts">フォントをローディング中...</string>
- <string name="LoginVerifyingCache">キャッシュファイルを検証しています(所要時間は 60 ~ 90 秒)...</string>
- <string name="LoginProcessingResponse">対応を処理中です...</string>
- <string name="LoginInitializingWorld">ワールドを初期化中です...</string>
- <string name="LoginDecodingImages">画像をデコードしています...</string>
- <string name="LoginInitializingQuicktime">QuickTime を初期化しています...</string>
- <string name="LoginQuicktimeNotFound">QuickTime が見つかりません。初期化に失敗しました。</string>
- <string name="LoginQuicktimeOK">QuickTime が正常に初期化されました。</string>
- <string name="LoginRequestSeedCapGrant">リージョンの機能をリクエストしています...</string>
- <string name="LoginRetrySeedCapGrant">リージョンの機能をリクエスト、試行 [NUMBER] 回....</string>
- <string name="LoginWaitingForRegionHandshake">リージョンのハンドシェイクを待っています...</string>
- <string name="LoginConnectingToRegion">リージョンに接続しています...</string>
- <string name="LoginDownloadingClothing">衣類をダウンロードしています...</string>
- <string name="InvalidCertificate">証明書が無効または壊れています。 グリッド管理者にご連絡ください。</string>
- <string name="CertInvalidHostname">無効なホストネームがサーバーにアクセスしていました。SLURL かグリッドのホストネームをご確認ください。</string>
- <string name="CertExpired">グリッドが返した証明書は有効期限が終了していると考えられます。お使いのシステムクロックを確認するか、グリッドの管理者にお問い合わせください。</string>
- <string name="CertKeyUsage">SSL 証明書のエラーが発生しました。 グリッド管理者にご連絡ください。</string>
- <string name="CertBasicConstraints">サーバーの証明書チェーンに証明書が多すぎます。 グリッド管理者にご連絡ください。</string>
- <string name="CertInvalidSignature">グリッドサーバーが返した証明書の署名を認証できませんでした。グリッドの管理者にお問い合わせください。</string>
- <string name="LoginFailedNoNetwork">ネットワークエラー:接続を確立できませんでした。お使いのネットワーク接続をご確認ください。</string>
- <string name="LoginFailedHeader">ログインに失敗しました。</string>
- <string name="Quit">終了</string>
- <string name="create_account_url">http://join.secondlife.com/?sourceid=[sourceid]</string>
- <string name="AgniGridLabel">Second Life メイングリッド (Agni)</string>
- <string name="AditiGridLabel">Second Life ベータテストグリッド (Aditi)</string>
- <string name="ViewerDownloadURL">http://secondlife.com/download</string>
- <string name="LoginFailedViewerNotPermitted">お使いの古いビューワでは Second Life にアクセスできません。以下のページから新しいビューワをダウンロードしてください:
-http://secondlife.com/download
+グラフィックカード:[GRAPHICS_CARD]
+ </string>
+ <string name="AboutDriver">
+ Windowsグラフィックドライババージョン:[GRAPHICS_DRIVER_VERSION]
+ </string>
+ <string name="AboutOGL">
+ OpenGLバージョン:[OPENGL_VERSION]
+ </string>
+ <string name="AboutSettings">
+ ウィンドウサイズ:[WINDOW_WIDTH]x[WINDOW_HEIGHT]
+フォントサイズ調整:[FONT_SIZE_ADJUSTMENT]pt
+UIスケーリング:[UI_SCALE]
+描画距離:[DRAW_DISTANCE]m
+帯域幅:[NET_BANDWITH]kbit/秒
+LOD係数:[LOD_FACTOR]
+描画の質:[RENDER_QUALITY]
+高度な光源モデル:[GPU_SHADERS]
+テクスチャメモリ:[TEXTURE_MEMORY]㎆
+ </string>
+ <string name="AboutOSXHiDPI">
+ 高DPI表示モード:[HIDPI]
+ </string>
+ <string name="AboutLibs">
+ J2Cデコーダバージョン:[J2C_VERSION]
+オーディオドライババージョン:[AUDIO_DRIVER_VERSION]
+LibCEFバージョン:[LIBCEF_VERSION]
+LibVLCバージョン:[LIBVLC_VERSION]
+ボイスサーバーバージョン:[VOICE_VERSION]
+ </string>
+ <string name="AboutTraffic">
+ パケット損失:[PACKETS_LOST,number,0]/[PACKETS_IN,number,0]([PACKETS_PCT,number,1]%)
+ </string>
+ <string name="AboutTime">
+ [year, datetime, slt]年[month, datetime, slt]月[day, datetime, slt]日 [hour, datetime, slt]:[min,datetime, slt]:[second,datetime,slt]
+ </string>
+ <string name="ErrorFetchingServerReleaseNotesURL">
+ サーバーのリリースノートのURL取得時にエラーが発生しました。
+ </string>
+ <string name="BuildConfiguration">
+ ビルド構成
+ </string>
+ <string name="ProgressRestoring">
+ 修復しています…
+ </string>
+ <string name="ProgressChangingResolution">
+ 解像度を変更しています…
+ </string>
+ <string name="Fullbright">
+ 明るさ全開(レガシー)
+ </string>
+ <string name="LoginInProgress">
+ ログイン中です。[APP_NAME]の表示がフリーズする場合があります。しばらくお待ちください。
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ ログイン中です…
+ </string>
+ <string name="LoginAuthenticating">
+ 認証しています…
+ </string>
+ <string name="LoginMaintenance">
+ アカウントのメンテナンスを実行しています…
+ </string>
+ <string name="LoginAttempt">
+ 前回のログインに失敗しました。ログイン中です([NUMBER]回目)
+ </string>
+ <string name="LoginPrecaching">
+ ワールドを読み込んでいます…
+ </string>
+ <string name="LoginInitializingBrowser">
+ 内蔵Webブラウザを初期化しています…
+ </string>
+ <string name="LoginInitializingMultimedia">
+ マルチメディアを初期化しています…
+ </string>
+ <string name="LoginInitializingFonts">
+ フォントを読み込んでいます…
+ </string>
+ <string name="LoginVerifyingCache">
+ キャッシュファイルを検証しています(所要時間は60~90秒)…
+ </string>
+ <string name="LoginProcessingResponse">
+ レスポンスを処理しています…
+ </string>
+ <string name="LoginInitializingWorld">
+ ワールドを初期化しています…
+ </string>
+ <string name="LoginDecodingImages">
+ 画像をデコードしています…
+ </string>
+ <string name="LoginInitializingQuicktime">
+ QuickTimeを初期化しています…
+ </string>
+ <string name="LoginQuicktimeNotFound">
+ QuickTimeが見つかりません。初期化に失敗しました。
+ </string>
+ <string name="LoginQuicktimeOK">
+ QuickTimeが正常に初期化されました。
+ </string>
+ <string name="LoginRequestSeedCapGrant">
+ リージョン(地域)の機能をリクエストしています…
+ </string>
+ <string name="LoginRetrySeedCapGrant">
+ リージョン(地域)の機能をリクエストしています…(試行[NUMBER]回目)
+ </string>
+ <string name="LoginWaitingForRegionHandshake">
+ リージョン(地域)のハンドシェイクを待っています…
+ </string>
+ <string name="LoginConnectingToRegion">
+ リージョン(地域)に接続しています…
+ </string>
+ <string name="LoginDownloadingClothing">
+ 服装をダウンロードしています…
+ </string>
+ <string name="InvalidCertificate">
+ 証明書が無効であるか、壊れています。グリッド管理者にご連絡ください。
+ </string>
+ <string name="CertInvalidHostname">
+ 無効なホストネームがサーバーにアクセスしようとしています。SLURLかグリッドのホストネームをご確認ください。
+ </string>
+ <string name="CertExpired">
+ グリッドが返した証明書は、有効期限が過ぎていると考えられます。お使いのシステムクロックを確認するか、グリッドの管理者にお問い合わせください。
+ </string>
+ <string name="CertKeyUsage">
+ SSL証明書のエラーが発生しました。グリッド管理者にご連絡ください。
+ </string>
+ <string name="CertBasicConstraints">
+ サーバーの証明書チェーンに証明書が多すぎます。グリッド管理者にご連絡ください。
+ </string>
+ <string name="CertInvalid">
+ 証明書が読み込めませんでした。グリッド管理者に連絡してください。
+ </string>
+ <string name="CertInvalidSignature">
+ グリッドが返したサーバー証明書の署名を認証できませんでした。グリッドの管理者にお問い合わせください。
+ </string>
+ <string name="CertAllocationFailure">
+ 証明書にOpenSSLメモリを割り当てることができませんでした。
+ </string>
+ <string name="LoginFailedNoNetwork">
+ ネットワークエラー:接続を確立できませんでした。お使いのネットワーク接続をご確認ください。
+ </string>
+ <string name="LoginFailedHeader">
+ ログインに失敗しました。
+ </string>
+ <string name="Quit">
+ 終了
+ </string>
+ <string name="create_account_url">
+ https://join.secondlife.com/?lang=ja&amp;sourceid=[sourceid]
+ </string>
+ <string name="AgniGridLabel">
+ Second Lifeメイングリッド (Agni)
+ </string>
+ <string name="AditiGridLabel">
+ Second Lifeベータテストグリッド (Aditi)
+ </string>
+ <string name="ViewerDownloadURL">
+ https://secondlife.com/support/downloads/?lang=ja
+ </string>
+ <string name="LoginFailedViewerNotPermitted">
+ お使いの古いビューアでは、Second Lifeにアクセスできません。以下のページから新しいビューアをダウンロードしてください: https://secondlife.com/support/downloads/?lang=ja
詳細については、FAQ を参照してください:
-http://secondlife.com/viewer-access-faq</string>
- <string name="LoginIntermediateOptionalUpdateAvailable">ビューワアップデート(オプション)があります: [VERSION]</string>
- <string name="LoginFailedRequiredUpdate">ビューワアップデート(必須): [VERSION]</string>
- <string name="LoginFailedAlreadyLoggedIn">このエージェントは既にログインされています。</string>
- <string name="LoginFailedAuthenticationFailed">申し訳ありませんが、ログインできませんでした。
+https://secondlife.com/viewer-access-faq
+ </string>
+ <string name="LoginIntermediateOptionalUpdateAvailable">
+ ビューアの更新(オプション)があります:[VERSION]
+ </string>
+ <string name="LoginFailedRequiredUpdate">
+ ビューアの更新(必須):[VERSION]
+ </string>
+ <string name="LoginFailedAlreadyLoggedIn">
+ このエージェントは既にログインしています。
+ </string>
+ <string name="LoginFailedAuthenticationFailed">
+ 申し訳ありませんが、ログインできませんでした。
以下の情報が正しく入力されたことを確認してください:
-* ユーザー名(bobsmith12 または steller.sunshine など)
-* パスワード
-また、Caps Lock キーが有効になっていないこともお確かめください。</string>
- <string name="LoginFailedPasswordChanged">セキュリティ上の理由により、あなたのパスワードは変更されました。
-アカウントページ(http://secondlife.com/password)に移動し、
+・ユーザー名(bobsmith12 または steller.sunshine など)
+・パスワード
+・2段階認証(使用している場合)
+また、Caps Lockが入っていないこともご確認ください。
+ </string>
+ <string name="LoginFailedPasswordChanged">
+ セキュリティ上の理由により、あなたのパスワードは変更されました。 アカウントページ(https://secondlife.com/my/account/request.php?lang=ja-JP)へ移動し、
秘密の質問に答えて、パスワードをリセットしてください。
-ご迷惑をおかけして申し訳ございません。</string>
- <string name="LoginFailedPasswordReset">弊社はシステムを若干変更しました。お手数ですが、パスワードのリセットをお願いします。
-アカウントページ(http://secondlife.com/password)に移動し、
+ご迷惑をおかけして申し訳ございません。
+ </string>
+ <string name="LoginFailedPasswordReset">
+ 弊社はシステムを若干変更しました。お手数ですが、パスワードのリセットをお願いします。アカウントページ( https://secondlife.com/my/account/request.php?lang=ja-JP )に移動し、
秘密の質問に答えて、パスワードをリセットしてください。
-ご迷惑をおかけして申し訳ございません。</string>
- <string name="LoginFailedEmployeesOnly">Second Life はメンテナンスのため、一時的にご利用いただけません。
+ご迷惑をおかけして申し訳ございません。
+ </string>
+ <string name="LoginFailedEmployeesOnly">
+ Second Lifeは、メンテナンス中につき一時的にご利用いただけません。
従業員以外にはログインをご遠慮いただいています。
-最新の状況については www.secondlife.com/status でお確かめください。</string>
- <string name="LoginFailedPremiumOnly">既にログインしているユーザーに最上のインワールド体験を提供するため、Second Life へのログインは一時的に制限されています。
-
-申し訳ございませんが、有料アカウントのユーザーを優先するため、現在のところ無料アカウントのユーザーには Second Life へのアクセスをご遠慮いただいています。</string>
- <string name="LoginFailedComputerProhibited">このパソコンからは Second Life にアクセスできません。
-システムのエラーだと思われる場合は、
-support@secondlife.com にお問い合わせください。</string>
- <string name="LoginFailedAcountSuspended">あなたのアカウントは
-太平洋時間の [TIME] までご利用いただけません。</string>
- <string name="LoginFailedAccountDisabled">現在リクエストを完了することができません。
-Second Life のサポート(http://support.secondlife.com)にお問い合わせください。</string>
- <string name="LoginFailedTransformError">ログイン時にデータの不一致が見つかりました。
-support@secondlife.com にお問い合わせください。</string>
- <string name="LoginFailedAccountMaintenance">現在アカウントのメインテナンスが行われています。
-あなたのアカウントは
-太平洋時間の [TIME] までご利用いただけません。
-システムのエラーだと思われる場合は、support@secondlife.com にお問い合わせください。</string>
- <string name="LoginFailedPendingLogoutFault">ログアウトをリスクエストしたら、シミュレーターから「fault」が返されました。</string>
- <string name="LoginFailedPendingLogout">システムによるログアウトが実行されました。
-しばらくしてから再度お試しください。</string>
- <string name="LoginFailedUnableToCreateSession">有効なセッションを生成できません。</string>
- <string name="LoginFailedUnableToConnectToSimulator">シミュレーターに接続できませんでした。</string>
- <string name="LoginFailedRestrictedHours">あなたの Second Life アカウントにアクセスできるのは、
-太平洋時間の [START] ~ [END] の間に限られます。
+最新の状況については www.secondlife.com/status でお確かめください。
+ </string>
+ <string name="LoginFailedPremiumOnly">
+ 既にログインしているユーザーに最上のインワールド体験を提供するため、Second Lifeへのログインは一時的に制限されています。
+申し訳ございませんが、有料アカウントのユーザーを優先するため、現在のところ無料アカウントのユーザーには Second Lifeへのアクセスをご遠慮いただいています。
+ </string>
+ <string name="LoginFailedComputerProhibited">
+ お使いのパソコンからは、Second Lifeにアクセスできません。
+システムエラーだと思われる場合は、 support@secondlife.com にお問い合わせください。
+ </string>
+ <string name="LoginFailedAcountSuspended">
+ あなたのアカウントは、太平洋時間の[TIME]までご利用いただけません。
+ </string>
+ <string name="LoginFailedAccountDisabled">
+ 現在リクエストを完了することができません。
+Second Life のサポート( https://support.secondlife.com/ )にお問い合わせください。
+ </string>
+ <string name="LoginFailedTransformError">
+ ログイン時にデータの不一致が見つかりました。
+support@secondlife.com にお問い合わせください。
+ </string>
+ <string name="PacificTime">
+ 太平洋時間
+ </string>
+ <string name="LoginFailedAccountMaintenance">
+ 現在アカウントのメンテナンスが行われています。
+あなたのアカウントは、
+太平洋時間の[TIME]までご利用いただけません。
+システムのエラーだと思われる場合は、support@secondlife.com にお問い合わせください。
+ </string>
+ <string name="LoginFailedPendingLogoutFault">
+ ログアウトのリスクエスト時に、シミュレーターから「fault」が返されました。
+ </string>
+ <string name="LoginFailedPendingLogout">
+ システムによるログアウトが実行されました。
+しばらくしてから再度お試しください。
+ </string>
+ <string name="LoginFailedUnableToCreateSession">
+ 有効なセッションを生成できませんでした。
+ </string>
+ <string name="LoginFailedUnableToConnectToSimulator">
+ シミュレーターに接続できませんでした。
+ </string>
+ <string name="LoginFailedRestrictedHours">
+ あなたのSecond Lifeアカウントにアクセスできるのは、
+太平洋時間の[START]~[END]の間に限られます。
有効な時間帯に再度お試しください。
-システムのエラーだと思われる場合は、support@secondlife.com にお問い合わせください。</string>
- <string name="LoginFailedIncorrectParameters">パラメーターが正しくありません。
-システムのエラーだと思われる場合は、support@secondlife.com にお問い合わせください。</string>
- <string name="LoginFailedFirstNameNotAlphanumeric">ファーストネームのパラメーターは英数字です。
-システムのエラーだと思われる場合は、support@secondlife.com にお問い合わせください。</string>
- <string name="LoginFailedLastNameNotAlphanumeric">ラストネームのパラメーターは英数字です。
-システムのエラーだと思われる場合は、support@secondlife.com にお問い合わせください。</string>
- <string name="LogoutFailedRegionGoingOffline">リージョンはオフライン中です。
-しばらくしてから再度お試しください。</string>
- <string name="LogoutFailedAgentNotInRegion">エージェントがリージョンに不在です。
-しばらくしてから再度お試しください。</string>
- <string name="LogoutFailedPendingLogin">このリージョンでは別のセッションがログインされていました。
-しばらくしてから再度お試しください。</string>
- <string name="LogoutFailedLoggingOut">このリージョンでは前のセッションがログアウトされました。
-しばらくしてから再度お試しください。</string>
- <string name="LogoutFailedStillLoggingOut">このリージョンでは現在も前のセッションのログアウトが処理されています。
-しばらくしてから再度お試しください。</string>
- <string name="LogoutSucceeded">リージョンでは前のセッションがログアウトされました。
-しばらくしてから再度お試しください。</string>
- <string name="LogoutFailedLogoutBegun">リージョンではログアウトプロセスが開始されました。
-しばらくしてから再度お試しください。</string>
- <string name="LoginFailedLoggingOutSession">あなたの前のセッションはシステムによってログアウトされています。
-しばらくしてから再度お試しください。</string>
- <string name="AgentLostConnection">このリージョンに不都合が発生している可能性があります。 ご使用のインターネット接続をご確認ください。</string>
- <string name="SavingSettings">設定を保存中です...</string>
- <string name="LoggingOut">ログアウト中です...</string>
- <string name="ShuttingDown">シャットダウン中です...</string>
- <string name="YouHaveBeenDisconnected">あなたがいたリージョンへの接続が切れました。</string>
- <string name="SentToInvalidRegion">無効なリージョンにテレポートされました。</string>
- <string name="TestingDisconnect">ビューワの接続を切るテスト中</string>
- <string name="SocialFacebookConnecting">Facebook に接続中...</string>
- <string name="SocialFacebookPosting">投稿中...</string>
- <string name="SocialFacebookDisconnecting">Facebook から切断中...</string>
- <string name="SocialFacebookErrorConnecting">Facebook への接続時のエラー</string>
- <string name="SocialFacebookErrorPosting">Facebook への投稿時のエラー</string>
- <string name="SocialFacebookErrorDisconnecting">Facebook からの切断時のエラー</string>
- <string name="SocialFlickrConnecting">Flickr に接続中...</string>
- <string name="SocialFlickrPosting">投稿中...</string>
- <string name="SocialFlickrDisconnecting">Flickr から切断中...</string>
- <string name="SocialFlickrErrorConnecting">Flickr への接続時のエラー</string>
- <string name="SocialFlickrErrorPosting">Flickr への投稿時のエラー</string>
- <string name="SocialFlickrErrorDisconnecting">Flickr からの切断時のエラー</string>
- <string name="SocialTwitterConnecting">Twitter に接続中...</string>
- <string name="SocialTwitterPosting">投稿中...</string>
- <string name="SocialTwitterDisconnecting">Twitter から切断中...</string>
- <string name="SocialTwitterErrorConnecting">Twitter への接続時のエラー</string>
- <string name="SocialTwitterErrorPosting">Twitter への投稿時のエラー</string>
- <string name="SocialTwitterErrorDisconnecting">Twitter からの切断時のエラー</string>
- <string name="BlackAndWhite">白黒</string>
- <string name="Colors1970">1970 年代のカラー</string>
- <string name="Intense">強調</string>
- <string name="Newspaper">新聞紙</string>
- <string name="Sepia">セピア</string>
- <string name="Spotlight">スポットライト</string>
- <string name="Video">ビデオ</string>
- <string name="Autocontrast">オートコントラスト</string>
- <string name="LensFlare">レンズフレア</string>
- <string name="Miniature">ミニチュア</string>
- <string name="Toycamera">おもちゃのカメラ</string>
- <string name="TooltipPerson">人</string>
- <string name="TooltipNoName">(名前なし)</string>
- <string name="TooltipOwner">所有者:</string>
- <string name="TooltipPublic">公共</string>
- <string name="TooltipIsGroup">(グループ)</string>
- <string name="TooltipForSaleL$">売り出し中:L$ [AMOUNT]</string>
- <string name="TooltipFlagGroupBuild">グループ作成</string>
- <string name="TooltipFlagNoBuild">作成禁止</string>
- <string name="TooltipFlagNoEdit">グループ作成</string>
- <string name="TooltipFlagNotSafe">危険</string>
- <string name="TooltipFlagNoFly">飛行禁止</string>
- <string name="TooltipFlagGroupScripts">グループスクリプト</string>
- <string name="TooltipFlagNoScripts">スクリプトなし</string>
- <string name="TooltipLand">土地:</string>
- <string name="TooltipMustSingleDrop">アイテムは 1 つだけここにドラッグできます</string>
- <string name="TooltipTooManyWearables">[AMOUNT] 以上のアイテムを含むフォルダを装着できません。「詳細設定」 &gt; 「デバッグ設定を表示」 &gt; 「WearFolderLimit」でこの制限を変更できます。</string>
- <string name="TooltipPrice" value="L$[AMOUNT]:"/>
- <string name="TooltipSLIcon">これは、SecondLife.com または LindenLab.com の公式ドメイン上のページにリンクします。</string>
- <string name="TooltipOutboxDragToWorld">マーケットプレイスのリストフォルダからアイテムを Rez できません</string>
- <string name="TooltipOutboxWorn">着ているアイテムをマーケットプレイスのリストフォルダに置くことはできません</string>
- <string name="TooltipOutboxFolderLevels">ネスト入りフォルダの深さが [AMOUNT] 階層を超えています必要に応じてアイテムを箱に入れ、フォルダの階層を減らします。</string>
- <string name="TooltipOutboxTooManyFolders">サブフォルダ数が [AMOUNT] 個を超えています。必要に応じてアイテムを箱に入れ、リストのフォルダ階層を減らします。</string>
- <string name="TooltipOutboxTooManyObjects">アイテム数が [AMOUNT] 個を超えています。1 つのリスト内で [AMOUNT] 個を超えるアイテムを販売するためには、いくつかのアイテムを箱に入れる必要があります。</string>
- <string name="TooltipOutboxTooManyStockItems">在庫アイテム数が [AMOUNT] 個を超えています。</string>
- <string name="TooltipOutboxCannotDropOnRoot">アイテムまたはフォルダは「すべて」または「関連付けされていない」タブによってのみドロップできます。これらのタブのいずれかを選択してから、もう一度アイテムまたはフォルダを選択してください。</string>
- <string name="TooltipOutboxNoTransfer">これらのオブジェクトの 1 つまたは複数は売り渡したり譲渡したりできないものです</string>
- <string name="TooltipOutboxNotInInventory">アイテムはインベントリからマーケットプレイスへの移動のみできます</string>
- <string name="TooltipOutboxLinked">リンクされた相手またはフォルダをマーケットプレイスに置くことはできません</string>
- <string name="TooltipOutboxCallingCard">コーリングカードをマーケットプレイスに置くことはできません</string>
- <string name="TooltipOutboxDragActive">表示されているリストを移動できません</string>
- <string name="TooltipOutboxCannotMoveRoot">ルートフォルダをリストに表示するマーケットプレイスを移動できません</string>
- <string name="TooltipOutboxMixedStock">在庫フォルダ内のアイテムはすべて同じ種類と権限でなければなりません</string>
- <string name="TooltipDragOntoOwnChild">フォルダをその子フォルダに移動することはできません</string>
- <string name="TooltipDragOntoSelf">フォルダをそのフォルダ自身に移動することはできません</string>
- <string name="TooltipHttpUrl">クリックしてこの Web ページを見ます</string>
- <string name="TooltipSLURL">クリックしてこの場所の情報を見ます</string>
- <string name="TooltipAgentUrl">クリックしてこの住人のプロフィールを見ます</string>
- <string name="TooltipAgentInspect">この住人の詳細を参照</string>
- <string name="TooltipAgentMute">クリックしてこの住人に対して無視設定をします</string>
- <string name="TooltipAgentUnmute">クリックしてこの住人に対する無視設定を解除します</string>
- <string name="TooltipAgentIM">クリックしてこの住人に IM を送ります</string>
- <string name="TooltipAgentPay">クリックしてこの住人に支払います</string>
- <string name="TooltipAgentOfferTeleport">クリックしてこの住人にテレポートのリクエストを送ります</string>
- <string name="TooltipAgentRequestFriend">クリックしてこの住人にフレンド登録リクエストを送ります</string>
- <string name="TooltipGroupUrl">クリックしてこのグループの説明文を見ます</string>
- <string name="TooltipEventUrl">クリックしてこのグループの説明文を見ます</string>
- <string name="TooltipClassifiedUrl">クリックしてこのクラシファイド広告を見ます</string>
- <string name="TooltipParcelUrl">クリックしてこの区画の説明文を見ます</string>
- <string name="TooltipTeleportUrl">クリックしてこの場所にテレポートします</string>
- <string name="TooltipObjectIMUrl">クリックしてこのオブジェクトの説明文を見ます</string>
- <string name="TooltipMapUrl">クリックしてこの場所を地図に表示します</string>
- <string name="TooltipSLAPP">クリックして secondlife:// コマンドを出します</string>
- <string name="CurrentURL" value=" 現在の URL: [CurrentURL]"/>
- <string name="TooltipEmail">クリックして電子メールを作成</string>
- <string name="SLurlLabelTeleport">テレポート</string>
- <string name="SLurlLabelShowOnMap">地図に表示</string>
- <string name="SLappAgentMute">無視</string>
- <string name="SLappAgentUnmute">ミュート解除</string>
- <string name="SLappAgentIM">IM</string>
- <string name="SLappAgentPay">支払う</string>
- <string name="SLappAgentOfferTeleport">次の場所にテレポートを送ります:</string>
- <string name="SLappAgentRequestFriend">フレンド登録リクエスト</string>
- <string name="SLappAgentRemoveFriend">フレンドの削除</string>
- <string name="BUTTON_CLOSE_DARWIN">閉じる (⌘W)</string>
- <string name="BUTTON_CLOSE_WIN">閉じる (Ctrl+W)</string>
- <string name="BUTTON_CLOSE_CHROME">閉じる</string>
- <string name="BUTTON_RESTORE">復元</string>
- <string name="BUTTON_MINIMIZE">元に戻す(縮小)</string>
- <string name="BUTTON_TEAR_OFF">別ウィンドウで開く</string>
- <string name="BUTTON_DOCK">ドッキング</string>
- <string name="BUTTON_HELP">ヘルプを表示</string>
- <string name="TooltipNotecardNotAllowedTypeDrop">このタイプのアイテムは、このリージョンのノートカード
-に添付することができません。</string>
- <string name="TooltipNotecardOwnerRestrictedDrop">制限のない「次の所有者」の
+システムのエラーだと思われる場合は、support@secondlife.com にお問い合わせください。
+ </string>
+ <string name="LoginFailedIncorrectParameters">
+ パラメーターが正しくありません。
+システムのエラーだと思われる場合は、support@secondlife.com にお問い合わせください。
+ </string>
+ <string name="LoginFailedFirstNameNotAlphanumeric">
+ ファーストネームのパラメーターは英数字です。
+システムのエラーだと思われる場合は、support@secondlife.com にお問い合わせください。
+ </string>
+ <string name="LoginFailedLastNameNotAlphanumeric">
+ ラストネームのパラメーターは英数字です。
+システムのエラーだと思われる場合は、support@secondlife.com にお問い合わせください。
+ </string>
+ <string name="LogoutFailedRegionGoingOffline">
+ リージョンは、オフライン中です。
+しばらくしてから再度お試しください。
+ </string>
+ <string name="LogoutFailedPendingLogin">
+ このリージョンでは、別のセッションでログインされていました。
+しばらくしてから再度お試しください。
+ </string>
+ <string name="LogoutFailedLoggingOut">
+ このリージョンでは前のセッションがログアウトされました。
+しばらくしてから再度お試しください。
+ </string>
+ <string name="LogoutFailedStillLoggingOut">
+ このリージョンでは現在も前のセッションのログアウトが処理されています。
+しばらくしてから再度お試しください。
+ </string>
+ <string name="LogoutSucceeded">
+ リージョンでは、前のセッションがログアウトされました。
+しばらくしてから再度お試しください。
+ </string>
+ <string name="LogoutFailedLogoutBegun">
+ このリージョンで、ログアウトプロセスが開始されました。
+しばらくしてから再度お試しください。
+ </string>
+ <string name="LoginFailedLoggingOutSession">
+ あなたの前のセッションはシステムによってログアウトされています。
+しばらくしてから再度お試しください。
+ </string>
+ <string name="AgentLostConnection">
+ このリージョンに不都合が発生している可能性があります。ご使用のインターネット接続をご確認ください。
+ </string>
+ <string name="SavingSettings">
+ 設定を保存中です…
+ </string>
+ <string name="LoggingOut">
+ ログアウト中です…
+ </string>
+ <string name="ShuttingDown">
+ シャットダウン中です…
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ あなたがいたリージョンへの接続が切れました。
+ </string>
+ <string name="SentToInvalidRegion">
+ 無効なリージョンにテレポートされました。
+ </string>
+ <string name="TestingDisconnect">
+ ビューアの接続を切るテスト中
+ </string>
+ <string name="BlackAndWhite">
+ 白黒
+ </string>
+ <string name="Colors1970">
+ 1970年代のカラー
+ </string>
+ <string name="Intense">
+ 強調
+ </string>
+ <string name="Newspaper">
+ 新聞紙
+ </string>
+ <string name="Sepia">
+ セピア
+ </string>
+ <string name="Spotlight">
+ スポットライト
+ </string>
+ <string name="Video">
+ ビデオ
+ </string>
+ <string name="Autocontrast">
+ オートコントラスト
+ </string>
+ <string name="LensFlare">
+ レンズフレア
+ </string>
+ <string name="Miniature">
+ ミニチュア
+ </string>
+ <string name="Toycamera">
+ トイカメラ
+ </string>
+ <string name="TooltipPerson">
+ 人
+ </string>
+ <string name="TooltipNoName">
+ (名前なし)
+ </string>
+ <string name="TooltipOwner">
+ 所有者:
+ </string>
+ <string name="TooltipPublic">
+ 公共
+ </string>
+ <string name="TooltipIsGroup">
+ (グループ)
+ </string>
+ <string name="TooltipForSaleL$">
+ 売り出し中:L$[AMOUNT]
+ </string>
+ <string name="TooltipFlagGroupBuild">
+ グループ作成
+ </string>
+ <string name="TooltipFlagNoBuild">
+ 作成禁止
+ </string>
+ <string name="TooltipFlagNoEdit">
+ グループ作成
+ </string>
+ <string name="TooltipFlagNotSafe">
+ 危険
+ </string>
+ <string name="TooltipFlagNoFly">
+ 飛行禁止
+ </string>
+ <string name="TooltipFlagGroupScripts">
+ グループスクリプト
+ </string>
+ <string name="TooltipFlagNoScripts">
+ スクリプトなし
+ </string>
+ <string name="TooltipLand">
+ 土地:
+ </string>
+ <string name="TooltipMustSingleDrop">
+ アイテムは1つだけここにドラッグできます。
+ </string>
+ <string name="TooltipTooManyWearables">
+ [AMOUNT]個以上のアイテムを含むフォルダを装着できません。「詳細設定」>「デバッグ設定を表示」>「WearFolderLimit」でこの制限を変更できます。
+ </string>
+ <string name="TooltipPrice" value="L$ [AMOUNT]:"/>
+ <string name="TooltipSLIcon">
+ これは、SecondLife.com または LindenLab.com の公式ドメイン上のページにリンクします。
+ </string>
+ <string name="TooltipOutboxDragToWorld">
+ マーケットプレイスのリストフォルダから、直接アイテムをRezすることはできません
+ </string>
+ <string name="TooltipOutboxWorn">
+ 着用しているアイテムをマーケットプレイスのリストフォルダに置くことはできません。
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ フォルダの階層の深さが、[AMOUNT]階層を超えています。必要に応じてアイテムをボックスに入れるなどをして、フォルダの階層数を減らしてください。
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ サブフォルダの数が、[AMOUNT]個を超えています。必要に応じてアイテムをボックスに入れ、リストのフォルダ階層を減らしてください。
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ アイテムの数が、[AMOUNT]個を超えています。1つのリスト内で[AMOUNT]個を超えるアイテムを販売するためには、いくつかのアイテムをボックスに入れる必要があります。
+ </string>
+ <string name="TooltipOutboxTooManyStockItems">
+ 在庫アイテム数が[AMOUNT]個を超えています。
+ </string>
+ <string name="TooltipOutboxCannotDropOnRoot">
+ アイテムまたはフォルダは、「すべて」または「関連付けされていない」タブによってのみドロップできます。これらのタブのいずれかを選択してから、もう一度アイテムまたはフォルダを選択してください。
+ </string>
+ <string name="TooltipOutboxNoTransfer">
+ これらのオブジェクトは、再販したり譲渡することができません。
+ </string>
+ <string name="TooltipOutboxNotInInventory">
+ アイテムは、インベントリからマーケットプレイスへの移動のみできます。
+ </string>
+ <string name="TooltipOutboxLinked">
+ リンクされた相手またはフォルダは、マーケットプレイスに置くことはできません。
+ </string>
+ <string name="TooltipOutboxCallingCard">
+ コーリングカードは、マーケットプレイスに置くことはできません。
+ </string>
+ <string name="TooltipOutboxDragActive">
+ 表示されているリストを移動できません。
+ </string>
+ <string name="TooltipOutboxCannotMoveRoot">
+ ルートフォルダをリストに表示するマーケットプレイスを移動できません。
+ </string>
+ <string name="TooltipOutboxMixedStock">
+ 在庫フォルダ内のアイテムは、すべて同じ種類と権限でなければなりません。
+ </string>
+ <string name="TooltipDragOntoOwnChild">
+ フォルダをその子フォルダに移動することはできません。
+ </string>
+ <string name="TooltipDragOntoSelf">
+ フォルダをそのフォルダ自身に移動することはできません。
+ </string>
+ <string name="TooltipHttpUrl">
+ クリックしてこのWebページを開きます。
+ </string>
+ <string name="TooltipSLURL">
+ クリックしてこの場所の情報を閲覧します。
+ </string>
+ <string name="TooltipAgentUrl">
+ クリックしてこの住人のプロフィールを閲覧します。
+ </string>
+ <string name="TooltipAgentInspect">
+ この住人の詳細を参照
+ </string>
+ <string name="TooltipAgentMute">
+ クリックしてこの住人に対して無視設定をします。
+ </string>
+ <string name="TooltipAgentUnmute">
+ クリックしてこの住人に対する無視設定を解除します。
+ </string>
+ <string name="TooltipAgentIM">
+ クリックしてこの住人に IM を送ります。
+ </string>
+ <string name="TooltipAgentPay">
+ クリックしてこの住人に支払います。
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ クリックしてこの住人にテレポートのオファーを送ります。
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ クリックしてこの住人にフレンド登録リクエストを送ります。
+ </string>
+ <string name="TooltipGroupUrl">
+ クリックしてこのグループの説明文を閲覧します。
+ </string>
+ <string name="TooltipEventUrl">
+ クリックしてこのグループの説明文を閲覧します。
+ </string>
+ <string name="TooltipClassifiedUrl">
+ クリックしてこのクラシファイド広告を見ます。
+ </string>
+ <string name="TooltipParcelUrl">
+ クリックしてこの区画の説明文を見ます。
+ </string>
+ <string name="TooltipTeleportUrl">
+ クリックしてこの場所にテレポートします。
+ </string>
+ <string name="TooltipObjectIMUrl">
+ クリックしてこのオブジェクトの説明文を見ます。
+ </string>
+ <string name="TooltipMapUrl">
+ クリックしてこの場所をマップに表示します。
+ </string>
+ <string name="TooltipSLAPP">
+ クリックして secondlife:// コマンドを出します。
+ </string>
+ <string name="CurrentURL" value="現在のURL:[CurrentURL]"/>
+ <string name="TooltipEmail">
+ クリックして電子メールを作成します。
+ </string>
+ <string name="SLurlLabelTeleport">
+ テレポート
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ マップに表示
+ </string>
+ <string name="SLappAgentMute">
+ 無視
+ </string>
+ <string name="SLappAgentUnmute">
+ ミュート解除
+ </string>
+ <string name="SLappAgentIM">
+ IM
+ </string>
+ <string name="SLappAgentPay">
+ 支払い
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ 次の場所へのテレポートのオファーを送ります:
+ </string>
+ <string name="SLappAgentRequestFriend">
+ フレンド登録リクエスト
+ </string>
+ <string name="SLappAgentRemoveFriend">
+ フレンドの削除
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ 閉じる(⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ 閉じる(Ctrl+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ 閉じる
+ </string>
+ <string name="BUTTON_RESTORE">
+ 復帰
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ 元に戻す(縮小)
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ 別ウィンドウで開く
+ </string>
+ <string name="BUTTON_DOCK">
+ ドッキング
+ </string>
+ <string name="BUTTON_HELP">
+ ヘルプを表示
+ </string>
+ <string name="TooltipNotecardNotAllowedTypeDrop">
+ このタイプのアイテムは、このリージョン(地域)のノートカードに添付することができません。
+ </string>
+ <string name="TooltipNotecardOwnerRestrictedDrop">
+ 制限のない「次の所有者」の
許可のみノートカードに
-添付できます。</string>
- <string name="Searching">検索中...</string>
- <string name="NoneFound">見つかりませんでした。</string>
- <string name="RetrievingData">取得中...</string>
- <string name="ReleaseNotes">リリースノート</string>
- <string name="RELEASE_NOTES_BASE_URL">https://releasenotes.secondlife.com/viewer/</string>
- <string name="LoadingData">ローディング...</string>
- <string name="AvatarNameNobody">(なし)</string>
- <string name="AvatarNameWaiting">(待機中)</string>
- <string name="AvatarNameMultiple">(複数)</string>
- <string name="GroupNameNone">(なし)</string>
- <string name="AssetErrorNone">エラーなし</string>
- <string name="AssetErrorRequestFailed">アセットリクエスト: 失敗</string>
- <string name="AssetErrorNonexistentFile">アセットリクエスト: 存在しないファイル</string>
- <string name="AssetErrorNotInDatabase">アセットリクエスト: データベースに見つかりませんでした</string>
- <string name="AssetErrorEOF">終了</string>
- <string name="AssetErrorCannotOpenFile">ファイルを開けません</string>
- <string name="AssetErrorFileNotFound">ファイルが見つかりません</string>
- <string name="AssetErrorTCPTimeout">ファイルの転送タイムアウト</string>
- <string name="AssetErrorCircuitGone">サーキットエラー</string>
- <string name="AssetErrorPriceMismatch">ビューワとサーバーの価格が一致していません</string>
- <string name="AssetErrorUnknownStatus">不明のステータス</string>
- <string name="AssetUploadServerUnreacheble">サービスがご利用いただけません。</string>
- <string name="AssetUploadServerDifficulties">サーバーに予期せぬ問題が発生しました。</string>
- <string name="AssetUploadServerUnavaliable">サービスがご利用いただけないか、アップロードがタイムアウトしました。</string>
- <string name="AssetUploadRequestInvalid">アップロードリクエスト中にエラーが発生しました。問題を解決するには、サポート
-(http://secondlife.com/support)にお問い合わせください。</string>
- <string name="SettingValidationError">インポートする設定 [NAME] の検証に失敗しました。</string>
- <string name="SettingImportFileError">ファイル [FILE] を開くことができません</string>
- <string name="SettingParseFileError">ファイル [FILE] を開くことができません</string>
- <string name="SettingTranslateError">過去のウインドライト [NAME] を変換できません</string>
- <string name="texture">テクスチャ</string>
- <string name="sound">サウンド</string>
- <string name="calling card">コーリングカード</string>
- <string name="landmark">ランドマーク</string>
- <string name="legacy script">レガシースクリプト</string>
- <string name="clothing">衣類</string>
- <string name="object">オブジェクト</string>
- <string name="note card">ノートカード</string>
- <string name="folder">フォルダ</string>
- <string name="root">ルート</string>
- <string name="lsl2 script">LSL2 スクリプト</string>
- <string name="lsl bytecode">LSL バイトコード</string>
- <string name="tga texture">tga テクスチャ</string>
- <string name="body part">身体部位</string>
- <string name="snapshot">スナップショット</string>
- <string name="lost and found">紛失物</string>
- <string name="targa image">targa 画像</string>
- <string name="trash">ごみ箱</string>
- <string name="jpeg image">jpeg 画像</string>
- <string name="animation">アニメーション</string>
- <string name="gesture">ジェスチャー</string>
- <string name="simstate">統計</string>
- <string name="favorite">お気に入り</string>
- <string name="symbolic link">リンク</string>
- <string name="symbolic folder link">フォルダのリンク</string>
- <string name="settings blob">設定</string>
- <string name="mesh">メッシュ</string>
- <string name="AvatarEditingAppearance">(容姿の編集中)</string>
- <string name="AvatarAway">一時退席中</string>
- <string name="AvatarDoNotDisturb">通知を受けない</string>
- <string name="AvatarMuted">ブロック中</string>
- <string name="anim_express_afraid">怖れ</string>
- <string name="anim_express_anger">怒り</string>
- <string name="anim_away">退席中</string>
- <string name="anim_backflip">後ろ宙返り</string>
- <string name="anim_express_laugh">大笑い</string>
- <string name="anim_express_toothsmile">満面の笑顔</string>
- <string name="anim_blowkiss">投げキッス</string>
- <string name="anim_express_bored">退屈</string>
- <string name="anim_bow">おじぎ</string>
- <string name="anim_clap">拍手</string>
- <string name="anim_courtbow">深いおじぎ</string>
- <string name="anim_express_cry">泣く</string>
- <string name="anim_dance1">ダンス 1</string>
- <string name="anim_dance2">ダンス 2</string>
- <string name="anim_dance3">ダンス 3</string>
- <string name="anim_dance4">ダンス 4</string>
- <string name="anim_dance5">ダンス 5</string>
- <string name="anim_dance6">ダンス 6</string>
- <string name="anim_dance7">ダンス 7</string>
- <string name="anim_dance8">ダンス 8</string>
- <string name="anim_express_disdain">侮蔑</string>
- <string name="anim_drink">酔っぱらう</string>
- <string name="anim_express_embarrased">困惑</string>
- <string name="anim_angry_fingerwag">指を振る</string>
- <string name="anim_fist_pump">ガッツポーズ</string>
- <string name="anim_yoga_float">ヨガ浮遊</string>
- <string name="anim_express_frown">しかめっ面</string>
- <string name="anim_impatient">いらいらする</string>
- <string name="anim_jumpforjoy">飛び上がって喜ぶ</string>
- <string name="anim_kissmybutt">挑発ポーズ</string>
- <string name="anim_express_kiss">キス</string>
- <string name="anim_laugh_short">笑う</string>
- <string name="anim_musclebeach">力こぶを見せる</string>
- <string name="anim_no_unhappy">不満げに否定する</string>
- <string name="anim_no_head">否定する</string>
- <string name="anim_nyanya">冷やかす</string>
- <string name="anim_punch_onetwo">ワンツー・パンチ</string>
- <string name="anim_express_open_mouth">口を開けて驚く</string>
- <string name="anim_peace">ピース・サイン</string>
- <string name="anim_point_you">他人を指差す</string>
- <string name="anim_point_me">自分を指差す</string>
- <string name="anim_punch_l">左パンチ</string>
- <string name="anim_punch_r">右パンチ</string>
- <string name="anim_rps_countdown">じゃんけんポーズ</string>
- <string name="anim_rps_paper">パー</string>
- <string name="anim_rps_rock">グー</string>
- <string name="anim_rps_scissors">チョキ</string>
- <string name="anim_express_repulsed">嫌悪感</string>
- <string name="anim_kick_roundhouse_r">まわし蹴り</string>
- <string name="anim_express_sad">悲しむ</string>
- <string name="anim_salute">敬礼する</string>
- <string name="anim_shout">叫ぶ</string>
- <string name="anim_express_shrug">肩をすくめる</string>
- <string name="anim_express_smile">微笑む</string>
- <string name="anim_smoke_idle">たばこをくゆらす</string>
- <string name="anim_smoke_inhale">たばこを吸う</string>
- <string name="anim_smoke_throw_down">たばこを捨てる</string>
- <string name="anim_express_surprise">驚く</string>
- <string name="anim_sword_strike_r">剣で斬りつける</string>
- <string name="anim_angry_tantrum">じだんだを踏む</string>
- <string name="anim_express_tongue_out">舌を出す</string>
- <string name="anim_hello">手を振る</string>
- <string name="anim_whisper">小声で話す</string>
- <string name="anim_whistle">口笛を吹く</string>
- <string name="anim_express_wink">ウィンク</string>
- <string name="anim_wink_hollywood">ウィンク(ハリウッド)</string>
- <string name="anim_express_worry">心配する</string>
- <string name="anim_yes_happy">笑顔で頷く</string>
- <string name="anim_yes_head">頷く</string>
- <string name="multiple_textures">複数</string>
- <string name="use_texture">テクスチャを使用</string>
- <string name="manip_hint1">マウスカーソルをルーラに合わせて</string>
- <string name="manip_hint2">グリッドにスナップ</string>
- <string name="texture_loading">ローディング...</string>
- <string name="worldmap_offline">オフライン</string>
- <string name="worldmap_item_tooltip_format">[AREA] 平方メートル L$[PRICE]</string>
- <string name="worldmap_results_none_found">見つかりませんでした。</string>
- <string name="Ok">OK</string>
- <string name="Premature end of file">不完全なファイル</string>
- <string name="ST_NO_JOINT">ROOT または JOINT が見つかりません</string>
- <string name="NearbyChatTitle">近くのチャット</string>
- <string name="NearbyChatLabel">(近くのチャット)</string>
- <string name="whisper">のささやき:</string>
- <string name="shout">の叫び:</string>
- <string name="ringing">インワールドボイスチャットに接続中...</string>
- <string name="connected">接続しました</string>
- <string name="unavailable">現在地では、ボイスを利用できません。</string>
- <string name="hang_up">インワールドボイスチャットの通話が切断されました</string>
- <string name="reconnect_nearby">「近くのボイスチャット」に再接続されます</string>
- <string name="ScriptQuestionCautionChatGranted">[REGIONNAME] の [REGIONPOS] という場所にある、「 [OWNERNAME] 」が所有する「 [OBJECTNAME] 」というオブジェクトは、次の権限を許可しました: [PERMISSIONS]</string>
- <string name="ScriptQuestionCautionChatDenied">[REGIONNAME] の [REGIONPOS] という場所にある、「 [OWNERNAME] 」が所有する「 [OBJECTNAME] 」というオブジェクトは、次の権限を拒否しました: [PERMISSIONS]</string>
- <string name="AdditionalPermissionsRequestHeader">あなたのアカウントへのアクセスを許可すると、このオブジェクトには次の操作も許可されます:</string>
- <string name="ScriptTakeMoney">リンデンドル(L$)を支払う</string>
- <string name="ActOnControlInputs">制御入力に基づいて行動</string>
- <string name="RemapControlInputs">制御入力のリマップ</string>
- <string name="AnimateYourAvatar">アバターへのアニメーション動作</string>
- <string name="AttachToYourAvatar">アバターに装着</string>
- <string name="ReleaseOwnership">所有権を解放し公のものとする</string>
- <string name="LinkAndDelink">他のオブジェクトのリンクとリンク解除</string>
- <string name="AddAndRemoveJoints">他のオブジェクトとのジョイントの追加と削除</string>
- <string name="ChangePermissions">権限の変更</string>
- <string name="TrackYourCamera">カメラ追従</string>
- <string name="ControlYourCamera">カメラのコントロール</string>
- <string name="TeleportYourAgent">あなたをテレポート</string>
- <string name="ForceSitAvatar">アバターを強制的に座らせる</string>
- <string name="ChangeEnvSettings">自然環境の設定を変更する</string>
- <string name="NotConnected">接続されていません</string>
- <string name="AgentNameSubst">(あなた)</string>
- <string name="JoinAnExperience"/>
- <string name="SilentlyManageEstateAccess">土地のアクセスリストを管理するときにアラートを表示しない</string>
- <string name="OverrideYourAnimations">デフォルトのアニメーションを置き換え</string>
- <string name="ScriptReturnObjects">あなたの代わりにオブジェクトを返却</string>
- <string name="UnknownScriptPermission">(不明)!</string>
- <string name="SIM_ACCESS_PG">General</string>
- <string name="SIM_ACCESS_MATURE">Moderate</string>
- <string name="SIM_ACCESS_ADULT">Adult</string>
- <string name="SIM_ACCESS_DOWN">オフライン</string>
- <string name="SIM_ACCESS_MIN">不明</string>
- <string name="land_type_unknown">(不明)</string>
- <string name="Estate / Full Region">不動産 / フルリージョン</string>
- <string name="Estate / Homestead">エステート/ホームステッド</string>
- <string name="Mainland / Homestead">メインランド/ホームステッド</string>
- <string name="Mainland / Full Region">メインランド / フルリージョン</string>
- <string name="all_files">全てのファイル</string>
- <string name="sound_files">サウンド</string>
- <string name="animation_files">アニメーション</string>
- <string name="image_files">画像</string>
- <string name="save_file_verb">保存</string>
- <string name="load_file_verb">ロード</string>
- <string name="targa_image_files">Targa 画像</string>
- <string name="bitmap_image_files">ビットマップ画像</string>
- <string name="png_image_files">PNG 画像</string>
- <string name="save_texture_image_files">Targa または PNG 画像</string>
- <string name="avi_movie_file">AVI ムービーファイル</string>
- <string name="xaf_animation_file">XAF アニメーションファイル</string>
- <string name="xml_file">XML ファイル</string>
- <string name="raw_file">RAW ファイル</string>
- <string name="compressed_image_files">圧縮画像</string>
- <string name="load_files">ファイルのロード</string>
- <string name="choose_the_directory">参照</string>
- <string name="script_files">スクリプト</string>
- <string name="dictionary_files">辞書</string>
- <string name="shape">シェイプ</string>
- <string name="skin">スキン</string>
- <string name="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">アルファ</string>
- <string name="tattoo">タトゥ</string>
- <string name="universal">ユニバーサル</string>
- <string name="physics">物理作用</string>
- <string name="invalid">無効</string>
- <string name="none">なし</string>
- <string name="shirt_not_worn">シャツ未着用</string>
- <string name="pants_not_worn">パンツ未着用</string>
- <string name="shoes_not_worn">靴未着用</string>
- <string name="socks_not_worn">靴下未着用</string>
- <string name="jacket_not_worn">ジャケット未着用</string>
- <string name="gloves_not_worn">手袋未着用</string>
- <string name="undershirt_not_worn">下着(上)未着用</string>
- <string name="underpants_not_worn">下着(下)未着用</string>
- <string name="skirt_not_worn">スカート未着用</string>
- <string name="alpha_not_worn">アルファ未着用</string>
- <string name="tattoo_not_worn">タトゥー未着用</string>
- <string name="universal_not_worn">ユニバーサルなし</string>
- <string name="physics_not_worn">物理作用なし</string>
- <string name="invalid_not_worn">無効</string>
- <string name="create_new_shape">新しいシェイプを作成</string>
- <string name="create_new_skin">新しいスキンを作成</string>
- <string name="create_new_hair">新しい髪を作成</string>
- <string name="create_new_eyes">新しい目を作成</string>
- <string name="create_new_shirt">新しいシャツを作成</string>
- <string name="create_new_pants">新しいパンツを作成</string>
- <string name="create_new_shoes">新しい靴を作成</string>
- <string name="create_new_socks">新しい靴下を作成</string>
- <string name="create_new_jacket">新しい上着を作成</string>
- <string name="create_new_gloves">新しい手袋を作成</string>
- <string name="create_new_undershirt">新しい下着シャツを作成</string>
- <string name="create_new_underpants">新しい下着パンツを作成</string>
- <string name="create_new_skirt">新しいスカートを作成</string>
- <string name="create_new_alpha">新しいアルファを作成</string>
- <string name="create_new_tattoo">新しいタトゥを作成</string>
- <string name="create_new_universal">新しいユニバーサルを作成</string>
- <string name="create_new_physics">新しい物理作用を作成</string>
- <string name="create_new_invalid">無効</string>
- <string name="NewWearable">新しい [WEARABLE_ITEM]</string>
- <string name="next">次へ</string>
- <string name="ok">OK</string>
- <string name="GroupNotifyGroupNotice">グループ通知</string>
- <string name="GroupNotifyGroupNotices">グループ通知</string>
- <string name="GroupNotifySentBy">送信者</string>
- <string name="GroupNotifyAttached">添付:</string>
- <string name="GroupNotifyViewPastNotices">ここで過去の通知を表示するか、メッセージを受け取らない設定をします。</string>
- <string name="GroupNotifyOpenAttachment">添付アイテムを開く</string>
- <string name="GroupNotifySaveAttachment">添付アイテムを保存</string>
- <string name="TeleportOffer">テレポートを送る</string>
- <string name="StartUpNotifications">不在中に新しい通知が届きました。</string>
- <string name="OverflowInfoChannelString">あなたにはさらに %d 通の通知があります</string>
- <string name="BodyPartsRightArm">右腕</string>
- <string name="BodyPartsHead">頭</string>
- <string name="BodyPartsLeftArm">左腕</string>
- <string name="BodyPartsLeftLeg">左脚</string>
- <string name="BodyPartsTorso">上半身</string>
- <string name="BodyPartsRightLeg">右脚</string>
- <string name="BodyPartsEnhancedSkeleton">拡張スケルトン</string>
- <string name="GraphicsQualityLow">低</string>
- <string name="GraphicsQualityMid">中</string>
- <string name="GraphicsQualityHigh">高</string>
- <string name="LeaveMouselook">ESC キーを押してワールドビューに戻ります</string>
- <string name="InventoryNoMatchingItems">お探しのものは見つかりましたか? [secondlife:///app/search/all/[SEARCH_TERM] 検索] をお試しください。</string>
- <string name="InventoryNoMatchingRecentItems">お探しのものは見つかりましたか?[secondlife:///app/inventory/filters Show filters] をお試しください。</string>
- <string name="PlacesNoMatchingItems">お探しのものは見つかりましたか? [secondlife:///app/search/places/[SEARCH_TERM] 検索] をお試しください。</string>
- <string name="FavoritesNoMatchingItems">ここにランドマークをドラッグしてお気に入りに追加します。</string>
- <string name="MarketplaceNoMatchingItems">アイテムが見つかりませんでした。検索文字列のスペルを確認して、もう一度やり直してください。</string>
- <string name="InventoryNoTexture">インベントリ内にこのテクスチャのコピーがありません</string>
- <string name="InventoryInboxNoItems">マーケットプレイスで購入した商品はここに表示されます。その後、アイテムをインベントリにドラッグすれば、それらのアイテムを使用できます。</string>
- <string name="MarketplaceURL">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/</string>
- <string name="MarketplaceURL_CreateStore">http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3</string>
- <string name="MarketplaceURL_Dashboard">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard</string>
- <string name="MarketplaceURL_Imports">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports</string>
- <string name="MarketplaceURL_LearnMore">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more</string>
- <string name="InventoryPlayAnimationTooltip">[再生] オプションでウィンドウを開ける。</string>
- <string name="InventoryPlayGestureTooltip">インワールドで選択済みのジェスチャーを実行する。</string>
- <string name="InventoryPlaySoundTooltip">[再生] オプションでウィンドウを開ける。</string>
- <string name="InventoryOutboxNotMerchantTitle">マーケットプレイスでは誰でもアイテムを売ることができます。</string>
+添付できます。
+ </string>
+ <string name="Searching">
+ 検索中…
+ </string>
+ <string name="NoneFound">
+ 見つかりませんでした。
+ </string>
+ <string name="RetrievingData">
+ 取得中…
+ </string>
+ <string name="ReleaseNotes">
+ リリースノート
+ </string>
+ <string name="RELEASE_NOTES_BASE_URL" translate="false">
+ https://releasenotes.secondlife.com/viewer/
+ </string>
+ <string name="LoadingData">
+ 読み込んでいます…
+ </string>
+ <string name="AvatarNameNobody">
+ (なし)
+ </string>
+ <string name="AvatarNameWaiting">
+ (待機中)
+ </string>
+ <string name="AvatarNameMultiple">
+ (複数)
+ </string>
+ <string name="GroupNameNone">
+ (なし)
+ </string>
+ <string name="AssetErrorNone">
+ エラーなし
+ </string>
+ <string name="AssetErrorRequestFailed">
+ アセットリクエスト:失敗
+ </string>
+ <string name="AssetErrorNonexistentFile">
+ アセットリクエスト:存在しないファイル
+ </string>
+ <string name="AssetErrorNotInDatabase">
+ アセットリクエスト:データベースに見つかりませんでした。
+ </string>
+ <string name="AssetErrorEOF">
+ 終了
+ </string>
+ <string name="AssetErrorCannotOpenFile">
+ ファイルを開けません
+ </string>
+ <string name="AssetErrorFileNotFound">
+ ファイルが見つかりません
+ </string>
+ <string name="AssetErrorTCPTimeout">
+ ファイルの転送タイムアウト
+ </string>
+ <string name="AssetErrorCircuitGone">
+ サーキットエラー
+ </string>
+ <string name="AssetErrorPriceMismatch">
+ ビューアとサーバー上の値段が一致していません。
+ </string>
+ <string name="AssetErrorUnknownStatus">
+ 不明のステータス
+ </string>
+ <string name="AssetUploadServerUnreacheble">
+ 現在、サービスをご利用いただけません。
+ </string>
+ <string name="AssetUploadServerDifficulties">
+ サーバーで予期せぬ問題が発生しました。
+ </string>
+ <string name="AssetUploadServerUnavaliable">
+ サービスがご利用いただけないか、アップロードがタイムアウトしました。
+ </string>
+ <string name="AssetUploadRequestInvalid">
+ アップロードリクエスト中にエラーが発生しました。問題を解決するには、サポート
+( https://support.secondlife.com/ )にお問い合わせください。
+ </string>
+ <string name="SettingValidationError">
+ インポートする設定[NAME]の検証に失敗しました。
+ </string>
+ <string name="SettingImportFileError">
+ ファイル[FILE]を開くことができません。
+ </string>
+ <string name="SettingParseFileError">
+ ファイル[FILE]を開くことができません。
+ </string>
+ <string name="SettingTranslateError">
+ 過去のウインドライト[NAME]を変換できません。
+ </string>
+ <string name="texture">
+ テクスチャ
+ </string>
+ <string name="sound">
+ サウンド
+ </string>
+ <string name="calling card">
+ コーリングカード
+ </string>
+ <string name="landmark">
+ ランドマーク
+ </string>
+ <string name="legacy script">
+ レガシースクリプト
+ </string>
+ <string name="clothing">
+ 服装
+ </string>
+ <string name="object">
+ オブジェクト
+ </string>
+ <string name="note card">
+ ノートカード
+ </string>
+ <string name="folder">
+ フォルダ
+ </string>
+ <string name="root">
+ ルート
+ </string>
+ <string name="lsl2 script">
+ LSL2スクリプト
+ </string>
+ <string name="lsl bytecode">
+ LSLバイトコード
+ </string>
+ <string name="tga texture">
+ tgaテクスチャ
+ </string>
+ <string name="body part">
+ 身体部位
+ </string>
+ <string name="snapshot">
+ スナップショット
+ </string>
+ <string name="lost and found">
+ 遺失物
+ </string>
+ <string name="targa image">
+ targa画像
+ </string>
+ <string name="trash">
+ ごみ箱
+ </string>
+ <string name="jpeg image">
+ jpeg画像
+ </string>
+ <string name="animation">
+ アニメーション
+ </string>
+ <string name="gesture">
+ ジェスチャー
+ </string>
+ <string name="simstate">
+ 統計
+ </string>
+ <string name="favorite">
+ お気に入り
+ </string>
+ <string name="symbolic link">
+ リンク
+ </string>
+ <string name="symbolic folder link">
+ フォルダのリンク
+ </string>
+ <string name="settings blob">
+ 設定
+ </string>
+ <string name="mesh">
+ メッシュ
+ </string>
+ <string name="AvatarEditingAppearance">
+ (容姿の編集中)
+ </string>
+ <string name="AvatarAway">
+ 一時退席中
+ </string>
+ <string name="AvatarDoNotDisturb">
+ 着信拒否
+ </string>
+ <string name="AvatarMuted">
+ ブロック中
+ </string>
+ <string name="anim_express_afraid">
+ 怖れ
+ </string>
+ <string name="anim_express_anger">
+ 怒り
+ </string>
+ <string name="anim_away">
+ 退席中
+ </string>
+ <string name="anim_backflip">
+ 後ろ宙返り
+ </string>
+ <string name="anim_express_laugh">
+ 大笑い
+ </string>
+ <string name="anim_express_toothsmile">
+ 満面の笑顔
+ </string>
+ <string name="anim_blowkiss">
+ 投げキッス
+ </string>
+ <string name="anim_express_bored">
+ 退屈
+ </string>
+ <string name="anim_bow">
+ おじぎ
+ </string>
+ <string name="anim_clap">
+ 拍手
+ </string>
+ <string name="anim_courtbow">
+ 深いおじぎ
+ </string>
+ <string name="anim_express_cry">
+ 泣く
+ </string>
+ <string name="anim_dance1">
+ ダンス1
+ </string>
+ <string name="anim_dance2">
+ ダンス2
+ </string>
+ <string name="anim_dance3">
+ ダンス3
+ </string>
+ <string name="anim_dance4">
+ ダンス4
+ </string>
+ <string name="anim_dance5">
+ ダンス5
+ </string>
+ <string name="anim_dance6">
+ ダンス6
+ </string>
+ <string name="anim_dance7">
+ ダンス7
+ </string>
+ <string name="anim_dance8">
+ ダンス8
+ </string>
+ <string name="anim_express_disdain">
+ 侮蔑
+ </string>
+ <string name="anim_drink">
+ 酔っぱらう
+ </string>
+ <string name="anim_express_embarrased">
+ 困惑
+ </string>
+ <string name="anim_angry_fingerwag">
+ 指を振る
+ </string>
+ <string name="anim_fist_pump">
+ ガッツポーズ
+ </string>
+ <string name="anim_yoga_float">
+ ヨガ浮遊
+ </string>
+ <string name="anim_express_frown">
+ しかめっ面
+ </string>
+ <string name="anim_impatient">
+ いらいらする
+ </string>
+ <string name="anim_jumpforjoy">
+ 飛び上がって喜ぶ
+ </string>
+ <string name="anim_kissmybutt">
+ 挑発ポーズ
+ </string>
+ <string name="anim_express_kiss">
+ キス
+ </string>
+ <string name="anim_laugh_short">
+ 笑う
+ </string>
+ <string name="anim_musclebeach">
+ 力こぶを見せる
+ </string>
+ <string name="anim_no_unhappy">
+ 不満げに否定する
+ </string>
+ <string name="anim_no_head">
+ 否定する
+ </string>
+ <string name="anim_nyanya">
+ 冷やかす
+ </string>
+ <string name="anim_punch_onetwo">
+ ワンツー・パンチ
+ </string>
+ <string name="anim_express_open_mouth">
+ 口を開けて驚く
+ </string>
+ <string name="anim_peace">
+ ピース・サイン
+ </string>
+ <string name="anim_point_you">
+ 他人を指差す
+ </string>
+ <string name="anim_point_me">
+ 自分を指差す
+ </string>
+ <string name="anim_punch_l">
+ 左パンチ
+ </string>
+ <string name="anim_punch_r">
+ 右パンチ
+ </string>
+ <string name="anim_rps_countdown">
+ じゃんけんポーズ
+ </string>
+ <string name="anim_rps_paper">
+ パー
+ </string>
+ <string name="anim_rps_rock">
+ グー
+ </string>
+ <string name="anim_rps_scissors">
+ チョキ
+ </string>
+ <string name="anim_express_repulsed">
+ 嫌悪感
+ </string>
+ <string name="anim_kick_roundhouse_r">
+ まわし蹴り
+ </string>
+ <string name="anim_express_sad">
+ 悲しむ
+ </string>
+ <string name="anim_salute">
+ 敬礼する
+ </string>
+ <string name="anim_shout">
+ 叫ぶ
+ </string>
+ <string name="anim_express_shrug">
+ 肩をすくめる
+ </string>
+ <string name="anim_express_smile">
+ 微笑む
+ </string>
+ <string name="anim_smoke_idle">
+ たばこをくゆらす
+ </string>
+ <string name="anim_smoke_inhale">
+ たばこを吸う
+ </string>
+ <string name="anim_smoke_throw_down">
+ たばこを捨てる
+ </string>
+ <string name="anim_express_surprise">
+ 驚く
+ </string>
+ <string name="anim_sword_strike_r">
+ 剣で斬りつける
+ </string>
+ <string name="anim_angry_tantrum">
+ じだんだを踏む
+ </string>
+ <string name="anim_express_tongue_out">
+ 舌を出す
+ </string>
+ <string name="anim_hello">
+ 手を振る
+ </string>
+ <string name="anim_whisper">
+ 小声で話す
+ </string>
+ <string name="anim_whistle">
+ 口笛を吹く
+ </string>
+ <string name="anim_express_wink">
+ ウィンク
+ </string>
+ <string name="anim_wink_hollywood">
+ ウィンク(ハリウッド)
+ </string>
+ <string name="anim_express_worry">
+ 心配する
+ </string>
+ <string name="anim_yes_happy">
+ 笑顔で頷く
+ </string>
+ <string name="anim_yes_head">
+ 頷く
+ </string>
+ <string name="multiple_textures">
+ 複数
+ </string>
+ <string name="use_texture">
+ テクスチャを使用
+ </string>
+ <string name="manip_hint1">
+ マウスカーソルをルーラに合わせて
+ </string>
+ <string name="manip_hint2">
+ グリッドにスナップ
+ </string>
+ <string name="texture_loading">
+ 読み込んでいます…
+ </string>
+ <string name="worldmap_offline">
+ オフライン
+ </string>
+ <string name="worldmap_item_tooltip_format">
+ [AREA]㎡ L$ [PRICE]([SQMPRICE] L$/㎡)
+ </string>
+ <string name="worldmap_results_none_found">
+ 何も見つかりませんでした。
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ 不完全なファイル
+ </string>
+ <string name="ST_NO_JOINT">
+ ROOT または JOINT が見つかりません
+ </string>
+ <string name="NearbyChatTitle">
+ 近隣チャット
+ </string>
+ <string name="NearbyChatLabel">
+ (近隣のチャット)
+ </string>
+ <string name="whisper">
+ のささやき:
+ </string>
+ <string name="shout">
+ のシャウト:
+ </string>
+ <string name="ringing">
+ インワールドボイスチャットに接続中…
+ </string>
+ <string name="connected">
+ 接続しました
+ </string>
+ <string name="unavailable">
+ 現在地では、ボイスを利用できません。
+ </string>
+ <string name="hang_up">
+ インワールドボイスチャットの通話が切断されました。
+ </string>
+ <string name="reconnect_nearby">
+ 「近隣ボイスチャット」に再接続されます。
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ リージョン(地域)「[REGIONNAME]」の「[REGIONPOS]」という場所にある、「[OWNERNAME]」が所有する「[OBJECTNAME]」というオブジェクトは、以下の権限を許可しました:[PERMISSIONS]
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ リージョン(地域)「[REGIONNAME]」の「[REGIONPOS]」という場所にある、「[OWNERNAME]」が所有する「[OBJECTNAME]」というオブジェクトは、以下の権限を拒否しました:[PERMISSIONS]
+ </string>
+ <string name="AdditionalPermissionsRequestHeader">
+ あなたのアカウントへのアクセスを許可すると、このオブジェクトには次の操作も許可されます:
+ </string>
+ <string name="ScriptTakeMoney">
+ リンデンドル(L$)のお支払い
+ </string>
+ <string name="ActOnControlInputs">
+ 制御入力に基づいて行動
+ </string>
+ <string name="RemapControlInputs">
+ 制御入力のリマップ
+ </string>
+ <string name="AnimateYourAvatar">
+ アバターへのアニメーション動作
+ </string>
+ <string name="AttachToYourAvatar">
+ アバターに装着
+ </string>
+ <string name="ReleaseOwnership">
+ 所有権を解放し公共物とする
+ </string>
+ <string name="LinkAndDelink">
+ 他のオブジェクトのリンクとリンク解除
+ </string>
+ <string name="AddAndRemoveJoints">
+ 他のオブジェクトとのジョイントの追加と削除
+ </string>
+ <string name="ChangePermissions">
+ 権限の変更
+ </string>
+ <string name="TrackYourCamera">
+ カメラ追従
+ </string>
+ <string name="ControlYourCamera">
+ カメラ操作
+ </string>
+ <string name="TeleportYourAgent">
+ あなたをテレポート
+ </string>
+ <string name="ForceSitAvatar">
+ アバターを強制的に座らせる
+ </string>
+ <string name="ChangeEnvSettings">
+ 自然環境の設定を変更する
+ </string>
+ <string name="NotConnected">
+ 接続されていません
+ </string>
+ <string name="AgentNameSubst">
+ (あなた)
+ </string>
+ <string name="JoinAnExperience">
+ 体験に参加
+ </string>
+ <string name="SilentlyManageEstateAccess">
+ 土地のアクセスリストを管理するときにアラートを表示しない
+ </string>
+ <string name="OverrideYourAnimations">
+ デフォルトのアニメーションを置き換え
+ </string>
+ <string name="ScriptReturnObjects">
+ あなたの代わりにオブジェクトを返却
+ </string>
+ <string name="UnknownScriptPermission">
+ (不明)!
+ </string>
+ <string name="SIM_ACCESS_PG">
+ General
+ </string>
+ <string name="SIM_ACCESS_MATURE">
+ Moderate
+ </string>
+ <string name="SIM_ACCESS_ADULT">
+ Adult
+ </string>
+ <string name="SIM_ACCESS_DOWN">
+ オフライン
+ </string>
+ <string name="SIM_ACCESS_MIN">
+ 不明
+ </string>
+ <string name="land_type_unknown">
+ (不明)
+ </string>
+ <string name="Estate / Full Region">
+ 不動産/フルリージョン
+ </string>
+ <string name="Estate / Homestead">
+ 不動産/入植地
+ </string>
+ <string name="Mainland / Homestead">
+ メインランド/入植地
+ </string>
+ <string name="Mainland / Full Region">
+ メインランド/フルリージョン
+ </string>
+ <string name="all_files">
+ 全てのファイル
+ </string>
+ <string name="sound_files">
+ サウンド
+ </string>
+ <string name="animation_files">
+ アニメーション
+ </string>
+ <string name="image_files">
+ 画像
+ </string>
+ <string name="save_file_verb">
+ 保存
+ </string>
+ <string name="load_file_verb">
+ ロード
+ </string>
+ <string name="targa_image_files">
+ Targa画像
+ </string>
+ <string name="bitmap_image_files">
+ ビットマップ画像
+ </string>
+ <string name="png_image_files">
+ PNG画像
+ </string>
+ <string name="save_texture_image_files">
+ TargaまたはPNG画像
+ </string>
+ <string name="avi_movie_file">
+ AVIムービーファイル
+ </string>
+ <string name="xaf_animation_file">
+ XAFアニメーションファイル
+ </string>
+ <string name="xml_file">
+ XMLファイル
+ </string>
+ <string name="raw_file">
+ RAWファイル
+ </string>
+ <string name="compressed_image_files">
+ 圧縮画像
+ </string>
+ <string name="load_files">
+ ファイルのロード
+ </string>
+ <string name="choose_the_directory">
+ 参照
+ </string>
+ <string name="script_files">
+ スクリプト
+ </string>
+ <string name="dictionary_files">
+ 辞書
+ </string>
+ <string name="LSLTipSleepTime" translate="false">
+ Sleeps script for [SLEEP_TIME] seconds.
+ </string>
+ <string name="LSLTipText_llSin" translate="false">
+ float llSin(float theta)
+Returns the sine of theta (theta in radians)
+ </string>
+ <string name="LSLTipText_llCos" translate="false">
+ float llCos(float theta)
+Returns the cosine of theta (theta in radians)
+ </string>
+ <string name="LSLTipText_llTan" translate="false">
+ float llTan(float theta)
+Returns the tangent of theta (theta in radians)
+ </string>
+ <string name="LSLTipText_llAtan2" translate="false">
+ float llAtan2(float y, float x)
+Returns the arctangent2 of y, x
+ </string>
+ <string name="LSLTipText_llSqrt" translate="false">
+ float llSqrt(float val)
+Returns the square root of val, or returns 0 and triggers a Math Error for imaginary results
+ </string>
+ <string name="LSLTipText_llPow" translate="false">
+ float llPow(float base, float exponent)
+Returns the base raised to the power exponent, or returns 0 and triggers Math Error for imaginary results
+ </string>
+ <string name="LSLTipText_llAbs" translate="false">
+ integer llAbs(integer val)
+Returns the positive version of val
+ </string>
+ <string name="LSLTipText_llFabs" translate="false">
+ float llFabs(float val)
+Returns the positive version of val
+ </string>
+ <string name="LSLTipText_llFrand" translate="false">
+ float llFrand(float mag)
+Returns a pseudo random number in the range [0,mag) or (mag,0]
+ </string>
+ <string name="LSLTipText_llFloor" translate="false">
+ integer llFloor(float val)
+Returns largest integer value &lt;= val
+ </string>
+ <string name="LSLTipText_llCeil" translate="false">
+ integer llCeil(float val)
+Returns smallest integer value &gt;= val
+ </string>
+ <string name="LSLTipText_llRound" translate="false">
+ integer llRound(float val)
+Returns val rounded to the nearest integer
+ </string>
+ <string name="LSLTipText_llVecMag" translate="false">
+ float llVecMag(vector v)
+Returns the magnitude of v
+ </string>
+ <string name="LSLTipText_llVecNorm" translate="false">
+ vector llVecNorm(vector v)
+Returns the v normalized
+ </string>
+ <string name="LSLTipText_llVecDist" translate="false">
+ float llVecDist(vector v1, vector v2)
+Returns the 3D distance between v1 and v2
+ </string>
+ <string name="LSLTipText_llRot2Euler" translate="false">
+ vector llRot2Euler(rotation q)
+Returns the Euler representation (roll, pitch, yaw) of q
+ </string>
+ <string name="LSLTipText_llEuler2Rot" translate="false">
+ rotation llEuler2Rot(vector v)
+Returns the rotation representation of Euler Angles v
+ </string>
+ <string name="LSLTipText_llAxes2Rot" translate="false">
+ rotation llAxes2Rot(vector fwd, vector left, vector up)
+Returns the rotation defined by the coordinate axes
+ </string>
+ <string name="LSLTipText_llRot2Fwd" translate="false">
+ vector llRot2Fwd(rotation q)
+Returns the forward vector defined by q
+ </string>
+ <string name="LSLTipText_llRot2Left" translate="false">
+ vector llRot2Left(rotation q)
+Returns the left vector defined by q
+ </string>
+ <string name="LSLTipText_llRot2Up" translate="false">
+ vector llRot2Up(rotation q)
+Returns the up vector defined by q
+ </string>
+ <string name="LSLTipText_llRotBetween" translate="false">
+ rotation llRotBetween(vector v1, vector v2)
+Returns the rotation to rotate v1 to v2
+ </string>
+ <string name="LSLTipText_llWhisper" translate="false">
+ llWhisper(integer channel, string msg)
+Whispers the text of msg on channel
+ </string>
+ <string name="LSLTipText_llSay" translate="false">
+ llSay(integer channel, string msg)
+Says the text of msg on channel
+ </string>
+ <string name="LSLTipText_llShout" translate="false">
+ llShout(integer channel, string msg)
+Shouts the text of msg on channel
+ </string>
+ <string name="LSLTipText_llListen" translate="false">
+ integer llListen(integer channel, string name, key id, string msg)
+Sets a callback for msg on channel from name and id (name, id, and/or msg can be empty) and returns an identifier that can be used to deactivate or remove the listen
+ </string>
+ <string name="LSLTipText_llListenControl" translate="false">
+ llListenControl(integer number, integer active)
+Makes a listen event callback active or inactive
+ </string>
+ <string name="LSLTipText_llListenRemove" translate="false">
+ llListenRemove(integer number)
+Removes listen event callback number
+ </string>
+ <string name="LSLTipText_llSensor" translate="false">
+ llSensor(string name, key id, integer type, float range, float arc)
+Performs a single scan for name and id with type (AGENT, ACTIVE, PASSIVE, and/or SCRIPTED) within range meters and arc radians of forward vector (name, id, and/or keytype can be empty or 0)
+ </string>
+ <string name="LSLTipText_llSensorRepeat" translate="false">
+ llSensorRepeat(string name, key id, integer type, float range, float arc, float rate)
+Sets a callback for name and id with type (AGENT, ACTIVE, PASSIVE, and/or SCRIPTED) within range meters and arc radians of forward vector (name, id, and/or keytype can be empty or 0) and repeats every rate seconds
+ </string>
+ <string name="LSLTipText_llSensorRemove" translate="false">
+ llSensorRemove()
+Removes the sensor setup by llSensorRepeat
+ </string>
+ <string name="LSLTipText_llDetectedName" translate="false">
+ string llDetectedName(integer number)
+Returns the name of detected object number (returns empty string if number is not a valid sensed object)
+ </string>
+ <string name="LSLTipText_llDetectedKey" translate="false">
+ key llDetectedKey(integer number)
+Returns the key of detected object number (returns empty key if number is not a valid sensed object)
+ </string>
+ <string name="LSLTipText_llDetectedOwner" translate="false">
+ key llDetectedOwner(integer number)
+Returns the key of detected object's owner (returns empty key if number is not a valid sensed object)
+ </string>
+ <string name="LSLTipText_llDetectedType" translate="false">
+ integer llDetectedType(integer number)
+Returns the type (AGENT, ACTIVE, PASSIVE, SCRIPTED) of detected object (returns 0 if number is not a valid sensed object)
+ </string>
+ <string name="LSLTipText_llDetectedPos" translate="false">
+ vector llDetectedPos(integer number)
+Returns the position of detected object number (returns &lt;0,0,0&gt; if number is not a valid sensed object)
+ </string>
+ <string name="LSLTipText_llDetectedVel" translate="false">
+ vector llDetectedVel(integer number)
+Returns the velocity of detected object number (returns &lt;0,0,0&gt; if number is not a valid sensed object)
+ </string>
+ <string name="LSLTipText_llDetectedGrab" translate="false">
+ vector llDetectedGrab(integer number)
+Returns the grab offset of the user touching object (returns &lt;0,0,0&gt; if number is not a valid sensed object)
+ </string>
+ <string name="LSLTipText_llDetectedRot" translate="false">
+ rotation llDetectedRot(integer number)
+Returns the rotation of detected object number (returns &lt;0,0,0,1&gt; if number is not a valid sensed object)
+ </string>
+ <string name="LSLTipText_llDetectedGroup" translate="false">
+ integer llDetectedGroup(integer number)
+Returns TRUE if detected object is part of same group as owner
+ </string>
+ <string name="LSLTipText_llDetectedLinkNumber" translate="false">
+ integer llDetectedLinkNumber(integer number)
+Returns the link position of the triggered event for touches and collisions only
+ </string>
+ <string name="LSLTipText_llDie" translate="false">
+ llDie()
+Deletes the object
+ </string>
+ <string name="LSLTipText_llGround" translate="false">
+ float llGround(vector offset)
+Returns the ground height below the object position + offset
+ </string>
+ <string name="LSLTipText_llCloud" translate="false">
+ float llCloud(vector offset)
+Returns the cloud density at the object position + offset
+ </string>
+ <string name="LSLTipText_llWind" translate="false">
+ vector llWind(vector offset)
+Returns the wind velocity at the object position + offset
+ </string>
+ <string name="LSLTipText_llSetStatus" translate="false">
+ llSetStatus(integer status, integer value)
+Sets status (STATUS_PHYSICS, STATUS_PHANTOM, STATUS_BLOCK_GRAB, STATUS_BLOCK_GRAB_OBJECT, STATUS_ROTATE_X, STATUS_ROTATE_Y, and/or STATUS_ROTATE_Z) to value
+ </string>
+ <string name="LSLTipText_llGetStatus" translate="false">
+ integer llGetStatus(integer status)
+Returns the boolean value of status (STATUS_PHYSICS, STATUS_PHANTOM, STATUS_BLOCK_GRAB, STATUS_BLOCK_GRAB_OBJECT, STATUS_ROTATE_X, STATUS_ROTATE_Y, or STATUS_ROTATE_Z)
+ </string>
+ <string name="LSLTipText_llSetScale" translate="false">
+ llSetScale(vector scale)
+Sets the scale of the prim
+ </string>
+ <string name="LSLTipText_llGetScale" translate="false">
+ vector llGetScale()
+Returns the scale of the prim
+ </string>
+ <string name="LSLTipText_llSetColor" translate="false">
+ llSetColor(vector color, integer face)
+Sets the color on face of the prim
+ </string>
+ <string name="LSLTipText_llGetAlpha" translate="false">
+ float llGetAlpha(integer face)
+Returns the alpha of face
+ </string>
+ <string name="LSLTipText_llSetAlpha" translate="false">
+ llSetAlpha(float alpha, integer face)
+Sets the alpha on face
+ </string>
+ <string name="LSLTipText_llGetColor" translate="false">
+ vector llGetColor(integer face)
+Returns the color on face
+ </string>
+ <string name="LSLTipText_llSetTexture" translate="false">
+ llSetTexture(string texture, integer face)
+Sets the texture of face or ALL_SIDES
+ </string>
+ <string name="LSLTipText_llScaleTexture" translate="false">
+ llScaleTexture(float u, float v, integer face)
+Sets the texture u &amp; v scales for the chosen face or ALL_SIDES
+ </string>
+ <string name="LSLTipText_llOffsetTexture" translate="false">
+ llOffsetTexture(float u, float v, integer face)
+Sets the texture u &amp; v offsets for the chosen face or ALL_SIDES
+ </string>
+ <string name="LSLTipText_llRotateTexture" translate="false">
+ llRotateTexture(float rotation, integer face)
+Sets the texture rotation for the chosen face
+ </string>
+ <string name="LSLTipText_llGetTexture" translate="false">
+ string llGetTexture(integer face)
+Returns a string that is the texture on face (the inventory name if it is a texture in the prim's inventory, otherwise the key)
+ </string>
+ <string name="LSLTipText_llSetPos" translate="false">
+ llSetPos(vector pos)
+Moves the object or prim towards pos without using physics (if the script isn't physical)
+ </string>
+ <string name="LSLTipText_llGetPos" translate="false">
+ vector llGetPos()
+Returns the position of the task in region coordinates
+ </string>
+ <string name="LSLTipText_llGetLocalPos" translate="false">
+ vector llGetLocalPos()
+Returns the position relative to the root
+ </string>
+ <string name="LSLTipText_llSetRot" translate="false">
+ llSetRot(rotation rot)
+Sets the rotation
+ </string>
+ <string name="LSLTipText_llGetRot" translate="false">
+ rotation llGetRot()
+Returns the rotation relative to the region's axes
+ </string>
+ <string name="LSLTipText_llGetLocalRot" translate="false">
+ rotation llGetLocalRot()
+Returns the rotation local to the root
+ </string>
+ <string name="LSLTipText_llSetForce" translate="false">
+ llSetForce(vector force, integer local)
+Applies force to the object (if the script is physical), in local coords if local == TRUE
+ </string>
+ <string name="LSLTipText_llGetForce" translate="false">
+ vector llGetForce()
+Returns the force (if the script is physical)
+ </string>
+ <string name="LSLTipText_llTarget" translate="false">
+ integer llTarget(vector position, float range)
+Sets positions within range of position as a target and return an ID for the target
+ </string>
+ <string name="LSLTipText_llTargetRemove" translate="false">
+ llTargetRemove(integer number)
+Removes positional target number registered with llTarget
+ </string>
+ <string name="LSLTipText_llRotTarget" translate="false">
+ integer llRotTarget(rotation rot, float error)
+Set rotations with error of rot as a rotational target and return an ID for the rotational target
+ </string>
+ <string name="LSLTipText_llRotTargetRemove" translate="false">
+ llRotTargetRemove(integer number)
+Removes rotational target number registered with llRotTarget
+ </string>
+ <string name="LSLTipText_llMoveToTarget" translate="false">
+ llMoveToTarget(vector target, float tau)
+Critically damps to target in tau seconds (if the script is physical)
+ </string>
+ <string name="LSLTipText_llStopMoveToTarget" translate="false">
+ llStopMoveToTarget()
+Stops critically damped motion
+ </string>
+ <string name="LSLTipText_llApplyImpulse" translate="false">
+ llApplyImpulse(vector force, integer local)
+Applies impulse to object (if the script is physical), in local coords if local == TRUE
+ </string>
+ <string name="LSLTipText_llApplyRotationalImpulse" translate="false">
+ llApplyRotationalImpulse(vector force, integer local)
+Applies rotational impulse to object (if the script is physical), in local coords if local == TRUE
+ </string>
+ <string name="LSLTipText_llSetTorque" translate="false">
+ llSetTorque(vector torque, integer local)
+Sets the torque of object (if the script is physical), in local coords if local == TRUE
+ </string>
+ <string name="LSLTipText_llGetTorque" translate="false">
+ vector llGetTorque()
+Returns the torque (if the script is physical)
+ </string>
+ <string name="LSLTipText_llSetForceAndTorque" translate="false">
+ llSetForceAndTorque(vector force, vector torque, integer local)
+Sets the force and torque of object (if the script is physical), in local coords if local == TRUE
+ </string>
+ <string name="LSLTipText_llGetVel" translate="false">
+ vector llGetVel()
+Returns the velocity of the object
+ </string>
+ <string name="LSLTipText_llGetAccel" translate="false">
+ vector llGetAccel()
+Returns the acceleration of the object relative to the region's axes
+ </string>
+ <string name="LSLTipText_llGetOmega" translate="false">
+ vector llGetOmega()
+Returns the rotation velocity in radians per second
+ </string>
+ <string name="LSLTipText_llGetTimeOfDay" translate="false">
+ float llGetTimeOfDay()
+Returns the time in seconds since [SECOND_LIFE] server midnight or since region up-time, whichever is smaller
+ </string>
+ <string name="LSLTipText_llGetWallclock" translate="false">
+ float llGetWallclock()
+Returns the time in seconds since midnight California Pacific time (PST/PDT)
+ </string>
+ <string name="LSLTipText_llGetTime" translate="false">
+ float llGetTime()
+Returns the time in seconds since the last region reset, script reset, or call to either llResetTime or llGetAndResetTime
+ </string>
+ <string name="LSLTipText_llResetTime" translate="false">
+ llResetTime()
+Sets the script timer to zero
+ </string>
+ <string name="LSLTipText_llGetAndResetTime" translate="false">
+ float llGetAndResetTime()
+Returns the script time in seconds and then resets the script timer to zero
+ </string>
+ <string name="LSLTipText_llSound" translate="false">
+ llSound(string sound, float volume, integer queue, integer loop)
+Plays sound at volume and whether it should loop or not.
+ </string>
+ <string name="LSLTipText_llPlaySound" translate="false">
+ llPlaySound(string sound, float volume)
+Plays attached sound once at volume (0.0 - 1.0)
+ </string>
+ <string name="LSLTipText_llLoopSound" translate="false">
+ llLoopSound(string sound, float volume)
+Plays attached sound looping indefinitely at volume (0.0 - 1.0)
+ </string>
+ <string name="LSLTipText_llLoopSoundMaster" translate="false">
+ llLoopSoundMaster(string sound, float volume)
+Plays attached sound looping at volume (0.0 - 1.0), declares it a sync master
+ </string>
+ <string name="LSLTipText_llLoopSoundSlave" translate="false">
+ llLoopSoundSlave(string sound, float volume)
+Plays attached sound looping at volume (0.0 - 1.0), synced to most audible sync master
+ </string>
+ <string name="LSLTipText_llPlaySoundSlave" translate="false">
+ llPlaySoundSlave(string sound, float volume)
+Plays attached sound once at volume (0.0 - 1.0), synced to next loop of most audible sync master
+ </string>
+ <string name="LSLTipText_llTriggerSound" translate="false">
+ llTriggerSound(string sound, float volume)
+Plays sound at volume (0.0 - 1.0), centered at but not attached to object
+ </string>
+ <string name="LSLTipText_llStopSound" translate="false">
+ llStopSound()
+Stops currently attached sound
+ </string>
+ <string name="LSLTipText_llPreloadSound" translate="false">
+ llPreloadSound(string sound)
+Preloads a sound on viewers within range
+ </string>
+ <string name="LSLTipText_llGetSubString" translate="false">
+ string llGetSubString(string src, integer start, integer end)
+Returns the indicated substring
+ </string>
+ <string name="LSLTipText_llDeleteSubString" translate="false">
+ string llDeleteSubString(string src, integer start, integer end)
+Removes the indicated substring and returns the result
+ </string>
+ <string name="LSLTipText_llInsertString" translate="false">
+ string llInsertString(string dst, integer position, string src)
+Returns a destination string dst with the string src inserted starting at position pos
+ </string>
+ <string name="LSLTipText_llToUpper" translate="false">
+ string llToUpper(string src)
+Returns a string that is src with all upper-case characters
+ </string>
+ <string name="LSLTipText_llToLower" translate="false">
+ string llToLower(string src)
+Returns a string that is src with all lower-case characters
+ </string>
+ <string name="LSLTipText_llGiveMoney" translate="false">
+ llGiveMoney(key destination, integer amount)
+Transfers amount of L$ from script owner to destination
+ </string>
+ <string name="LSLTipText_llMakeExplosion" translate="false">
+ llMakeExplosion(integer particles, float scale, float vel, float lifetime, float arc, string texture, vector offset)
+Makes a round explosion of particles
+ </string>
+ <string name="LSLTipText_llMakeFountain" translate="false">
+ llMakeFountain(integer particles, float scale, float vel, float lifetime, float arc, integer bounce, string texture, vector offset, float bounce_offset)
+Makes a fountain of particles
+ </string>
+ <string name="LSLTipText_llMakeSmoke" translate="false">
+ llMakeSmoke(integer particles, float scale, float vel, float lifetime, float arc, string texture, vector offset)
+Makes smoke like particles
+ </string>
+ <string name="LSLTipText_llMakeFire" translate="false">
+ llMakeFire(integer particles, float scale, float vel, float lifetime, float arc, string texture, vector offset)
+Makes fire like particles
+ </string>
+ <string name="LSLTipText_llRezObject" translate="false">
+ llRezObject(string inventory, vector pos, vector vel, rotation rot, integer param)
+Instantiates owner's inventory object at pos with velocity vel and rotation rot with start parameter param
+ </string>
+ <string name="LSLTipText_llLookAt" translate="false">
+ llLookAt(vector target, float strength, float damping)
+Causes object to point its up axis (positive z) towards target, while keeping its forward axis (positive x) below the horizon
+ </string>
+ <string name="LSLTipText_llStopLookAt" translate="false">
+ llStopLookAt()
+Stops causing object to point at a target
+ </string>
+ <string name="LSLTipText_llSetTimerEvent" translate="false">
+ llSetTimerEvent(float sec)
+Causes the timer event to be triggered a maximum of once every sec seconds
+ </string>
+ <string name="LSLTipText_llSleep" translate="false">
+ llSleep(float sec)
+Puts the script to sleep for sec seconds
+ </string>
+ <string name="LSLTipText_llGetMass" translate="false">
+ float llGetMass()
+Returns the mass of object that the script is attached to
+ </string>
+ <string name="LSLTipText_llCollisionFilter" translate="false">
+ llCollisionFilter(string name, key id, integer accept)
+Sets the collision filter, exclusively or inclusively. If accept == TRUE, only accept collisions with objects name and id (either is optional), otherwise with objects not name or id
+ </string>
+ <string name="LSLTipText_llTakeControls" translate="false">
+ llTakeControls(integer controls, integer accept, integer pass_on)
+Allows for intercepting keyboard and mouse clicks from the agent the script has permissions for
+ </string>
+ <string name="LSLTipText_llReleaseControls" translate="false">
+ llReleaseControls()
+Stops taking inputs that were taken with llTakeControls
+ </string>
+ <string name="LSLTipText_llAttachToAvatar" translate="false">
+ llAttachToAvatar(integer attach_point)
+Attaches the object to the avatar who has granted permission to the script
+ </string>
+ <string name="LSLTipText_llDetachFromAvatar" translate="false">
+ llDetachFromAvatar()
+Detaches object from avatar
+ </string>
+ <string name="LSLTipText_llTakeCamera" translate="false">
+ llTakeCamera(key avatar)
+Moves avatar's viewpoint to task
+ </string>
+ <string name="LSLTipText_llReleaseCamera" translate="false">
+ llReleaseCamera(key avatar)
+Returns camera to agent avatar
+ </string>
+ <string name="LSLTipText_llGetOwner" translate="false">
+ key llGetOwner()
+Returns the object owner's UUID
+ </string>
+ <string name="LSLTipText_llInstantMessage" translate="false">
+ llInstantMessage(key user, string message)
+Sends the specified string as an Instant Message to the user
+ </string>
+ <string name="LSLTipText_llEmail" translate="false">
+ llEmail(string address, string subject, string message)
+Sends an email to address with the subject and message
+ </string>
+ <string name="LSLTipText_llGetNextEmail" translate="false">
+ llGetNextEmail(string address, string subject)
+Gets the next waiting email that comes from address, with specified subject
+ </string>
+ <string name="LSLTipText_llGetKey" translate="false">
+ key llGetKey()
+Returns the key of the prim the script is attached to
+ </string>
+ <string name="LSLTipText_llSetBuoyancy" translate="false">
+ llSetBuoyancy(float buoyancy)
+Sets the buoyancy of the task or object (0 is disabled, &lt; 1.0 sinks, 1.0 floats, &gt; 1.0 rises)
+ </string>
+ <string name="LSLTipText_llSetHoverHeight" translate="false">
+ llSetHoverHeight(float height, integer water, float tau)
+Critically damps to a height above the ground (or water) in tau seconds
+ </string>
+ <string name="LSLTipText_llStopHover" translate="false">
+ llStopHover()
+Stops hovering to a height
+ </string>
+ <string name="LSLTipText_llMinEventDelay" translate="false">
+ llMinEventDelay(float delay)
+Sets the minimum time between events being handled
+ </string>
+ <string name="LSLTipText_llSoundPreload" translate="false">
+ llSoundPreload(string sound)
+Preloads a sound on viewers within range
+ </string>
+ <string name="LSLTipText_llRotLookAt" translate="false">
+ llRotLookAt(rotation target, float strength, float damping)
+Causes object to point its forward axis towards target
+ </string>
+ <string name="LSLTipText_llStringLength" translate="false">
+ integer llStringLength(string str)
+Returns the length of string
+ </string>
+ <string name="LSLTipText_llStartAnimation" translate="false">
+ llStartAnimation(string anim)
+Starts animation anim for agent that granted PERMISSION_TRIGGER_ANIMATION if the permission has not been revoked
+ </string>
+ <string name="LSLTipText_llStopAnimation" translate="false">
+ llStopAnimation(string anim)
+Stops animation anim for agent that granted permission
+ </string>
+ <string name="LSLTipText_llPointAt" translate="false">
+ llPointAt(vector pos)
+Makes agent that owns object point at pos
+ </string>
+ <string name="LSLTipText_llStopPointAt" translate="false">
+ llStopPointAt()
+Stops pointing agent that owns object
+ </string>
+ <string name="LSLTipText_llTargetOmega" translate="false">
+ llTargetOmega(vector axis, float spinrate, float gain)
+Rotates the object around axis at spinrate with strength gain
+ </string>
+ <string name="LSLTipText_llGetStartParameter" translate="false">
+ integer llGetStartParameter()
+Returns an integer that is the script start/rez parameter
+ </string>
+ <string name="LSLTipText_llGodLikeRezObject" translate="false">
+ llGodLikeRezObject(key inventory, vector pos)
+Rezzes directly off of UUID if owner is in God Mode
+ </string>
+ <string name="LSLTipText_llRequestPermissions" translate="false">
+ llRequestPermissions(key agent, integer perm)
+Asks the agent for permission to run certain classes of functions
+ </string>
+ <string name="LSLTipText_llGetPermissionsKey" translate="false">
+ key llGetPermissionsKey()
+Returns the key of the avatar that last granted permissions to the script
+ </string>
+ <string name="LSLTipText_llGetPermissions" translate="false">
+ integer llGetPermissions()
+Returns an integer bitfield with the permissions that have been granted
+ </string>
+ <string name="LSLTipText_llGetLinkNumber" translate="false">
+ integer llGetLinkNumber()
+Returns the link number of the prim containing the script (0 means not linked, 1 the prim is the root, 2 the prim is the first child, etc)
+ </string>
+ <string name="LSLTipText_llSetLinkColor" translate="false">
+ llSetLinkColor(integer linknumber, vector color, integer face)
+Sets face to color if a task exists in the link chain at linknumber
+ </string>
+ <string name="LSLTipText_llCreateLink" translate="false">
+ llCreateLink(key target, integer parent)
+Attempts to link the script's object with the target (requires that PERMISSION_CHANGE_LINKS be granted). If parent == TRUE, then the script's object becomes the root
+ </string>
+ <string name="LSLTipText_llBreakLink" translate="false">
+ llBreakLink(integer linknum)
+Delinks the prim with the given link number in a linked object set (requires that PERMISSION_CHANGE_LINKS be granted)
+ </string>
+ <string name="LSLTipText_llBreakAllLinks" translate="false">
+ llBreakAllLinks()
+Delinks all prims in the link set (requires that PERMISSION_CHANGE_LINKS be granted)
+ </string>
+ <string name="LSLTipText_llGetLinkKey" translate="false">
+ key llGetLinkKey(integer linknumber)
+Returns the key of the linked prim linknumber
+ </string>
+ <string name="LSLTipText_llGetLinkName" translate="false">
+ string llGetLinkName(integer linknumber)
+Returns the name of linknumber in a link set
+ </string>
+ <string name="LSLTipText_llGetInventoryNumber" translate="false">
+ integer llGetInventoryNumber(integer type)
+Returns the number of items of a given type (INVENTORY_* flag) in the prim's inventory
+ </string>
+ <string name="LSLTipText_llGetInventoryName" translate="false">
+ string llGetInventoryName(integer type, integer number)
+Returns the name of the inventory item number of a given type
+ </string>
+ <string name="LSLTipText_llSetScriptState" translate="false">
+ llSetScriptState(string name, integer run)
+Sets the running state of the specified script
+ </string>
+ <string name="LSLTipText_llGetEnergy" translate="false">
+ float llGetEnergy()
+Returns how much energy is in the object as a percentage of maximum
+ </string>
+ <string name="LSLTipText_llGiveInventory" translate="false">
+ llGiveInventory(key destination, string inventory)
+Gives inventory to destination
+ </string>
+ <string name="LSLTipText_llRemoveInventory" translate="false">
+ llRemoveInventory(string item)
+Removes the named inventory item
+ </string>
+ <string name="LSLTipText_llSetText" translate="false">
+ llSetText(string text, vector color, float alpha)
+Displays text that hovers over the prim with specific color and translucency specified with alpha
+ </string>
+ <string name="LSLTipText_llWater" translate="false">
+ float llWater(vector offset)
+Returns the water height below the object position + offset
+ </string>
+ <string name="LSLTipText_llPassTouches" translate="false">
+ llPassTouches(integer pass)
+If pass == TRUE, touches are passed from children on to parents
+ </string>
+ <string name="LSLTipText_llRequestAgentData" translate="false">
+ key llRequestAgentData(key id, integer data)
+Requests data about agent id. When data is available the dataserver event will be raised.
+ </string>
+ <string name="LSLTipText_llRequestInventoryData" translate="false">
+ key llRequestInventoryData(string name)
+Requests data from object's inventory object. When data is available the dataserver event will be raised.
+ </string>
+ <string name="LSLTipText_llSetDamage" translate="false">
+ llSetDamage(float damage)
+Sets the amount of damage that will be done when this object hits an avatar.
+ </string>
+ <string name="LSLTipText_llTeleportAgentHome" translate="false">
+ llTeleportAgentHome(key id)
+Teleports avatar on the owner's land to their home location without any warning
+ </string>
+ <string name="LSLTipText_llModifyLand" translate="false">
+ llModifyLand(integer action, integer brush)
+Modifies land using the specified action on the specified brush size of land
+ </string>
+ <string name="LSLTipText_llCollisionSound" translate="false">
+ llCollisionSound(string impact_sound, float impact_volume)
+Suppresses default collision sounds, replaces default impact sounds with impact_sound at the volume impact_volume
+ </string>
+ <string name="LSLTipText_llCollisionSprite" translate="false">
+ llCollisionSprite(string impact_sprite)
+Suppresses default collision sprites, replaces default impact sprite with impact_sprite (use an empty string to just suppress)
+ </string>
+ <string name="LSLTipText_llGetAnimation" translate="false">
+ string llGetAnimation(key id)
+Returns the name of the currently playing locomotion animation for avatar id
+ </string>
+ <string name="LSLTipText_llResetScript" translate="false">
+ llResetScript()
+Resets the script
+ </string>
+ <string name="LSLTipText_llMessageLinked" translate="false">
+ llMessageLinked(integer linknum, integer num, string str, key id)
+Allows scripts in the same object to communicate. Triggers a link_message event with the same parameters num, str, and id in all scripts in the prim(s) described by linknum.
+ </string>
+ <string name="LSLTipText_llPushObject" translate="false">
+ llPushObject(key id, vector impulse, vector ang_impulse, integer local)
+Applies impulse and ang_impulse to object id
+ </string>
+ <string name="LSLTipText_llPassCollisions" translate="false">
+ llPassCollisions(integer pass)
+If pass == TRUE, collisions are passed from children on to parents (default is FALSE)
+ </string>
+ <string name="LSLTipText_llGetScriptName" translate="false">
+ string llGetScriptName()
+Returns the name of the script that this function is used in
+ </string>
+ <string name="LSLTipText_llGetNumberOfSides" translate="false">
+ integer llGetNumberOfSides()
+Returns the number of faces (or sides) of the prim
+ </string>
+ <string name="LSLTipText_llAxisAngle2Rot" translate="false">
+ rotation llAxisAngle2Rot(vector axis, float angle)
+Returns the rotation that is a generated angle about axis
+ </string>
+ <string name="LSLTipText_llRot2Axis" translate="false">
+ vector llRot2Axis(rotation rot)
+Returns the rotation axis represented by rot
+ </string>
+ <string name="LSLTipText_llRot2Angle" translate="false">
+ float llRot2Angle(rotation rot)
+Returns the rotation angle represented by rot
+ </string>
+ <string name="LSLTipText_llAcos" translate="false">
+ float llAcos(float val)
+Returns the arccosine in radians of val
+ </string>
+ <string name="LSLTipText_llAsin" translate="false">
+ float llAsin(float val)
+Returns the arcsine in radians of val
+ </string>
+ <string name="LSLTipText_llAngleBetween" translate="false">
+ float llAngleBetween(rotation a, rotation b)
+Returns angle between rotation a and b
+ </string>
+ <string name="LSLTipText_llGetInventoryKey" translate="false">
+ key llGetInventoryKey(string name)
+Returns the key that is the UUID of the inventory name
+ </string>
+ <string name="LSLTipText_llAllowInventoryDrop" translate="false">
+ llAllowInventoryDrop(integer add)
+If add == TRUE, users without modify permissions can still drop inventory items onto a prim
+ </string>
+ <string name="LSLTipText_llGetSunDirection" translate="false">
+ vector llGetSunDirection()
+Returns a normalized vector of the direction of the sun in the region
+ </string>
+ <string name="LSLTipText_llGetTextureOffset" translate="false">
+ vector llGetTextureOffset(integer face)
+Returns the texture offset of face in the x and y components of a vector
+ </string>
+ <string name="LSLTipText_llGetTextureScale" translate="false">
+ vector llGetTextureScale(integer side)
+Returns the texture scale of side in the x and y components of a vector
+ </string>
+ <string name="LSLTipText_llGetTextureRot" translate="false">
+ float llGetTextureRot(integer side)
+Returns the texture rotation of side
+ </string>
+ <string name="LSLTipText_llSubStringIndex" translate="false">
+ integer llSubStringIndex(string source, string pattern)
+Returns an integer that is the index in source where pattern first appears.
+(Returns -1 if not found)
+ </string>
+ <string name="LSLTipText_llGetOwnerKey" translate="false">
+ key llGetOwnerKey(key id)
+Returns the owner of object id
+ </string>
+ <string name="LSLTipText_llGetCenterOfMass" translate="false">
+ vector llGetCenterOfMass()
+Returns the prim's center of mass (unless called from the root prim, where it returns the object's center of mass)
+ </string>
+ <string name="LSLTipText_llListSort" translate="false">
+ list llListSort(list src, integer stride, integer ascending)
+Sorts the list into blocks of stride, in ascending order if ascending == TRUE.
+The sort order is affected by type.
+ </string>
+ <string name="LSLTipText_llGetListLength" translate="false">
+ integer llGetListLength(list src)
+Returns the number of elements in the list
+ </string>
+ <string name="LSLTipText_llList2Integer" translate="false">
+ integer llList2Integer(list src, integer index)
+Copies the integer at index in the list
+ </string>
+ <string name="LSLTipText_llList2Float" translate="false">
+ float llList2Float(list src, integer index)
+Copies the float at index in the list
+ </string>
+ <string name="LSLTipText_llList2String" translate="false">
+ string llList2String(list src, integer index)
+Copies the string at index in the list
+ </string>
+ <string name="LSLTipText_llList2Key" translate="false">
+ key llList2Key(list src, integer index)
+Copies the key at index in the list
+ </string>
+ <string name="LSLTipText_llList2Vector" translate="false">
+ vector llList2Vector(list src, integer index)
+Copies the vector at index in the list
+ </string>
+ <string name="LSLTipText_llList2Rot" translate="false">
+ rotation llList2Rot(list src, integer index)
+Copies the rotation at index in the list
+ </string>
+ <string name="LSLTipText_llList2List" translate="false">
+ list llList2List(list src, integer start, integer end)
+Copies the slice of the list from start to end
+ </string>
+ <string name="LSLTipText_llDeleteSubList" translate="false">
+ list llDeleteSubList(list src, integer start, integer end)
+Removes the slice from start to end and returns the remainder of the list
+ </string>
+ <string name="LSLTipText_llGetListEntryType" translate="false">
+ integer llGetListEntryType(list src, integer index)
+Returns the type of the index entry in the list
+(TYPE_INTEGER, TYPE_FLOAT, TYPE_STRING, TYPE_KEY, TYPE_VECTOR, TYPE_ROTATION, or TYPE_INVALID if index is off list)
+ </string>
+ <string name="LSLTipText_llList2CSV" translate="false">
+ string llList2CSV(list src)
+Creates a string of comma separated values from list
+ </string>
+ <string name="LSLTipText_llCSV2List" translate="false">
+ list llCSV2List(string src)
+Creates a list from a string of comma separated values
+ </string>
+ <string name="LSLTipText_llListRandomize" translate="false">
+ list llListRandomize(list src, integer stride)
+Returns a randomized list of blocks of size stride
+ </string>
+ <string name="LSLTipText_llList2ListStrided" translate="false">
+ list llList2ListStrided(list src, integer start, integer end, integer stride)
+Copies the strided slice of the list from start to end
+ </string>
+ <string name="LSLTipText_llGetRegionCorner" translate="false">
+ vector llGetRegionCorner()
+Returns a vector in meters that is the global location of the south-west corner of the region which the object is in
+ </string>
+ <string name="LSLTipText_llListInsertList" translate="false">
+ list llListInsertList(list dest, list src, integer start)
+Returns a list that contains all the elements from dest but with the elements from src inserted at position start
+ </string>
+ <string name="LSLTipText_llListFindList" translate="false">
+ integer llListFindList(list src, list test)
+Returns the index of the first instance of test in src.
+(Returns -1 if not found)
+ </string>
+ <string name="LSLTipText_llGetObjectName" translate="false">
+ string llGetObjectName()
+Returns the name of the prim which the script is attached to
+ </string>
+ <string name="LSLTipText_llSetObjectName" translate="false">
+ llSetObjectName(string name)
+Sets the prim's name to the name parameter
+ </string>
+ <string name="LSLTipText_llGetDate" translate="false">
+ string llGetDate()
+Returns the current date in the UTC time zone in the format YYYY-MM-DD
+ </string>
+ <string name="LSLTipText_llEdgeOfWorld" translate="false">
+ integer llEdgeOfWorld(vector pos, vector dir)
+Checks to see whether the border hit by dir from pos is the edge of the world (has no neighboring region)
+ </string>
+ <string name="LSLTipText_llGetAgentInfo" translate="false">
+ integer llGetAgentInfo(key id)
+Returns an integer bitfield containing the agent information about id.
+Returns AGENT_FLYING, AGENT_ATTACHMENTS, AGENT_SCRIPTED, AGENT_SITTING, AGENT_ON_OBJECT, AGENT_MOUSELOOK, AGENT_AWAY, AGENT_BUSY, AGENT_TYPING, AGENT_CROUCHING, AGENT_ALWAYS_RUN, AGENT_WALKING and/or AGENT_IN_AIR.
+ </string>
+ <string name="LSLTipText_llAdjustSoundVolume" translate="false">
+ llAdjustSoundVolume(float volume)
+Adjusts volume of attached sound (0.0 - 1.0)
+ </string>
+ <string name="LSLTipText_llSetSoundQueueing" translate="false">
+ llSetSoundQueueing(integer queue)
+Sets whether attached sounds wait for the current sound to finish (If queue == TRUE then queuing is enabled, if FALSE queuing is disabled [default])
+ </string>
+ <string name="LSLTipText_llSetSoundRadius" translate="false">
+ llSetSoundRadius(float radius)
+Establishes a hard cut-off radius for audibility of scripted sounds (both attached and triggered)
+ </string>
+ <string name="LSLTipText_llKey2Name" translate="false">
+ string llKey2Name(key id)
+Returns the name of the prim or avatar specified by id.
+(The id must be a valid rezzed prim or avatar key in the current simulator, otherwise an empty string is returned.)
+ </string>
+ <string name="LSLTipText_llSetTextureAnim" translate="false">
+ llSetTextureAnim(integer mode, integer face, integer sizex, integer sizey, float start, float length, float rate)
+Animates the texture on the specified face/faces
+ </string>
+ <string name="LSLTipText_llTriggerSoundLimited" translate="false">
+ llTriggerSoundLimited(string sound, float volume, vector top_north_east, vector bottom_south_west)
+Plays sound at volume (0.0 - 1.0), centered at but not attached to object, limited to the box defined by vectors top_north_east and bottom_south_west
+ </string>
+ <string name="LSLTipText_llEjectFromLand" translate="false">
+ llEjectFromLand(key avatar)
+Ejects avatar from the parcel
+ </string>
+ <string name="LSLTipText_llParseString2List" translate="false">
+ list llParseString2List(string src, list separators, list spacers)
+Breaks src into a list, discarding separators, keeping spacers
+(separators and spacers must be lists of strings, maximum of 8 each)
+ </string>
+ <string name="LSLTipText_llOverMyLand" translate="false">
+ integer llOverMyLand(key id)
+Returns TRUE if id is over land owned by the script owner, otherwise FALSE
+ </string>
+ <string name="LSLTipText_llGetLandOwnerAt" translate="false">
+ key llGetLandOwnerAt(vector pos)
+Returns the key of the land owner, returns NULL_KEY if public
+ </string>
+ <string name="LSLTipText_llGetNotecardLine" translate="false">
+ key llGetNotecardLine(string name, integer line)
+Returns line line of notecard name via the dataserver event
+ </string>
+ <string name="LSLTipText_llGetAgentSize" translate="false">
+ vector llGetAgentSize(key id)
+If the avatar is in the same region, returns the size of the bounding box of the requested avatar by id, otherwise returns ZERO_VECTOR
+ </string>
+ <string name="LSLTipText_llSameGroup" translate="false">
+ integer llSameGroup(key id)
+Returns TRUE if avatar id is in the same region and has the same active group, otherwise FALSE
+ </string>
+ <string name="LSLTipText_llUnSit" translate="false">
+ key llUnSit(key id)
+If avatar identified by id is sitting on the object the script is attached to or is over land owned by the object's owner, the avatar is forced to stand up
+ </string>
+ <string name="LSLTipText_llGroundSlope" translate="false">
+ vector llGroundSlope(vector offset)
+Returns the ground slope below the object position + offset
+ </string>
+ <string name="LSLTipText_llGroundNormal" translate="false">
+ vector llGroundNormal(vector offset)
+Returns the ground normal below the object position + offset
+ </string>
+ <string name="LSLTipText_llGroundContour" translate="false">
+ vector llGroundCountour(vector offset)
+Returns the ground contour direction below the object position + offset
+ </string>
+ <string name="LSLTipText_llGetAttached" translate="false">
+ integer llGetAttached()
+Returns the object's attachment point, or 0 if not attached
+ </string>
+ <string name="LSLTipText_llGetFreeMemory" translate="false">
+ integer llGetFreeMemory()
+Returns the number of free bytes of memory the script can use
+ </string>
+ <string name="LSLTipText_llGetRegionName" translate="false">
+ string llGetRegionName()
+Returns the current region name
+ </string>
+ <string name="LSLTipText_llGetRegionTimeDilation" translate="false">
+ float llGetRegionTimeDilation()
+Returns the current time dilation as a float between 0.0 (full dilation) and 1.0 (no dilation)
+ </string>
+ <string name="LSLTipText_llGetRegionFPS" translate="false">
+ float llGetRegionFPS()
+Returns the mean region frames per second
+ </string>
+ <string name="LSLTipText_llParticleSystem" translate="false">
+ llParticleSystem(list rules)
+Creates a particle system based on rules. An empty list removes the particle system.
+List format is [ rule1, data1, rule2, data2 . . . rulen, datan ]
+ </string>
+ <string name="LSLTipText_llGroundRepel" translate="false">
+ llGroundRepel(float height, integer water, float tau)
+Critically damps to height if within height*0.5 of level (either above ground level, or above the higher of land and water if water == TRUE)
+ </string>
+ <string name="LSLTipText_llGiveInventoryList" translate="false">
+ llGiveInventoryList(key target, string folder, list inventory)
+Gives inventory items to target, creating a new folder to put them in
+ </string>
+ <string name="LSLTipText_llSetVehicleType" translate="false">
+ llSetVehicleType(integer type)
+Sets the vehicle to one of the default types
+ </string>
+ <string name="LSLTipText_llSetVehicleFloatParam" translate="false">
+ llSetVehicleFloatParam(integer param, float value)
+Sets the specified vehicle float parameter
+ </string>
+ <string name="LSLTipText_llSetVehicleVectorParam" translate="false">
+ llSetVehicleVectorParam(integer param, vector vec)
+Sets the specified vehicle vector parameter
+ </string>
+ <string name="LSLTipText_llSetVehicleRotationParam" translate="false">
+ llSetVehicleVectorParam(integer param, rotation rot)
+Sets the specified vehicle rotation parameter
+ </string>
+ <string name="LSLTipText_llSetVehicleFlags" translate="false">
+ llSetVehicleFlags(integer flags)
+Sets the enabled bits in 'flags'
+ </string>
+ <string name="LSLTipText_llRemoveVehicleFlags" translate="false">
+ llRemoveVehicleFlags(integer flags)
+Removes the enabled bits in 'flags'
+ </string>
+ <string name="LSLTipText_llSitTarget" translate="false">
+ llSitTarget(vector offset, rotation rot)
+Sets the sit location for the prim. If offset == &lt;0,0,0&gt; then the sit target is removed.
+ </string>
+ <string name="LSLTipText_llAvatarOnSitTarget" translate="false">
+ key llAvatarOnSitTarget()
+If an avatar is seated on the sit target, returns the avatar's key, otherwise NULL_KEY
+ </string>
+ <string name="LSLTipText_llAddToLandPassList" translate="false">
+ llAddToLandPassList(key avatar, float hours)
+Adds avatar to the land pass list for hours, or indefinitely if hours is 0
+ </string>
+ <string name="LSLTipText_llSetTouchText" translate="false">
+ llSetTouchText(string text)
+Displays text rather than the default 'Touch' in the pie menu
+ </string>
+ <string name="LSLTipText_llSetSitText" translate="false">
+ llSetSitText(string text)
+Displays text rather than the default 'Sit Here' in the pie menu
+ </string>
+ <string name="LSLTipText_llSetCameraEyeOffset" translate="false">
+ llSetCameraEyeOffset(vector offset)
+Sets the camera eye offset for avatars that sit on the object
+ </string>
+ <string name="LSLTipText_llSetCameraAtOffset" translate="false">
+ llSetCameraAtOffset(vector offset)
+Sets the point the camera is looking at to offset for avatars that sit on the object
+ </string>
+ <string name="LSLTipText_llDumpList2String" translate="false">
+ string llDumpList2String(list src, string separator)
+Returns the list in a single string, using separator between the entries
+ </string>
+ <string name="LSLTipText_llScriptDanger" translate="false">
+ integer llScriptDanger(vector pos)
+Returns TRUE if pos is over public land, sandbox land, land that doesn't allow everyone to edit and build, or land that doesn't allow outside scripts
+ </string>
+ <string name="LSLTipText_llDialog" translate="false">
+ llDialog(key avatar, string message, list buttons, integer chat_channel)
+Shows a dialog box on the avatar's screen with a message and up to 12 buttons.
+If a button is pressed, the avatar says the text of the button label on chat_channel.
+ </string>
+ <string name="LSLTipText_llVolumeDetect" translate="false">
+ llVolumeDetect(integer detect)
+If detect = TRUE, object works much like Phantom, but triggers collision_start and collision_end events when other objects start and stop interpenetrating.
+Must be applied to the root prim.
+ </string>
+ <string name="LSLTipText_llResetOtherScript" translate="false">
+ llResetOtherScript(string name)
+Resets script name
+ </string>
+ <string name="LSLTipText_llGetScriptState" translate="false">
+ integer llGetScriptState(string name)
+Returns TRUE if the script name is running
+ </string>
+ <string name="LSLTipText_llRemoteLoadScript" translate="false">
+ DEPRECATED! Please use llRemoteLoadScriptPin instead.
+ </string>
+ <string name="LSLTipText_llSetRemoteScriptAccessPin" translate="false">
+ llSetRemoteScriptAccessPin(integer pin)
+If pin is set to a non-zero number, allows a prim to have scripts remotely loaded via llRemoteLoadScriptPin when it passes in the correct pin. Otherwise, llRemoteLoadScriptPin is ignored.
+ </string>
+ <string name="LSLTipText_llRemoteLoadScriptPin" translate="false">
+ llRemoteLoadScriptPin(key target, string name, integer pin, integer running, integer start_param)
+Copies script name onto target, if the owner of this scripted object can modify target and is in the same region, and the matching pin is used.
+If running == TRUE, starts the script with start_param
+ </string>
+ <string name="LSLTipText_llOpenRemoteDataChannel" translate="false">
+ llOpenRemoteDataChannel()
+Creates a channel to listen for XML-RPC calls, and will trigger a remote_data event with channel id once it is available
+ </string>
+ <string name="LSLTipText_llSendRemoteData" translate="false">
+ key llSendRemoteData(key channel, string dest, integer idata, string sdata)
+Sends an XML-RPC request to dest through channel with payload of channel (in a string), integer idata and string sdata.
+Returns a key that is the message_id for the resulting remote_data events.
+ </string>
+ <string name="LSLTipText_llRemoteDataReply" translate="false">
+ llRemoteDataReply(key channel, key message_id, string sdata, integer idata)
+Sends an XML-RPC reply to message_id on channel with payload of string sdata and integer idata
+ </string>
+ <string name="LSLTipText_llCloseRemoteDataChannel" translate="false">
+ llCloseRemoteDataChannel(key channel)
+Closes XML-RPC channel
+ </string>
+ <string name="LSLTipText_llMD5String" translate="false">
+ string llMD5String(string src, integer nonce)
+Returns a string of 32 hex characters that is a RSA Data Security, Inc. MD5 Message-Digest Algorithm of src with nonce
+ </string>
+ <string name="LSLTipText_llSetPrimitiveParams" translate="false">
+ llSetPrimitiveParams(list rules)
+Sets the prim's parameters according to rules
+ </string>
+ <string name="LSLTipText_llStringToBase64" translate="false">
+ string llStringToBase64(string str)
+Converts a string to the Base64 representation of the string
+ </string>
+ <string name="LSLTipText_llBase64ToString" translate="false">
+ string llBase64ToString(string str)
+Converts a Base64 string to a conventional string.
+If the conversion creates any unprintable characters, they are converted to spaces.
+ </string>
+ <string name="LSLTipText_llXorBase64Strings" translate="false">
+ string llXorBase64Strings(string s1, string s2)
+DEPRECATED! Please use llXorBase64StringsCorrect instead.
+Incorrectly performs an exclusive or on two Base64 strings and returns a Base64 string. s2 repeats if it is shorter than s1. Retained for backwards compatability.
+ </string>
+ <string name="LSLTipText_llRemoteDataSetRegion" translate="false">
+ llRemoteDataSetRegion()
+DEPRECATED! Please use llOpenRemoteDataChannel instead.
+If an object using remote data channels changes regions, you must call this function to reregister the remote data channels. This call is not needed if the prim does not change regions.
+ </string>
+ <string name="LSLTipText_llLog10" translate="false">
+ float llLog10(float val)
+Returns the base 10 logarithm of val. Returns zero if val &lt;= 0.
+ </string>
+ <string name="LSLTipText_llLog" translate="false">
+ float llLog(float val)
+Returns the natural logarithm of val. Returns zero if val &lt;= 0.
+ </string>
+ <string name="LSLTipText_llGetAnimationList" translate="false">
+ list llGetAnimationList(key id)
+Returns a list of keys of playing animations for avatar described by id
+ </string>
+ <string name="LSLTipText_llSetParcelMusicURL" translate="false">
+ llSetParcelMusicURL(string url)
+Sets the streaming audio URL for the parcel which the object is on
+ </string>
+ <string name="LSLTipText_llGetRootPosition" translate="false">
+ vector llGetRootPosition()
+Returns the position (in region coordinates) of the root prim of the object which the script is attached to
+ </string>
+ <string name="LSLTipText_llGetRootRotation" translate="false">
+ rotation llGetRootRotation()
+Returns the rotation (relative to the region) of the root prim of the object which the script is attached to
+ </string>
+ <string name="LSLTipText_llGetObjectDesc" translate="false">
+ string llGetObjectDesc()
+Returns the description of the prim the script is attached to
+ </string>
+ <string name="LSLTipText_llSetObjectDesc" translate="false">
+ llSetObjectDesc(string name)
+Sets the prim's description
+ </string>
+ <string name="LSLTipText_llGetCreator" translate="false">
+ key llGetCreator()
+Returns a key for the creator of the prim
+ </string>
+ <string name="LSLTipText_llGetTimestamp" translate="false">
+ string llGetTimestamp()
+Returns the timestamp in the UTC time zone in the format: YYYY-MM-DDThh:mm:ss.ff..fZ
+ </string>
+ <string name="LSLTipText_llSetLinkAlpha" translate="false">
+ llSetLinkAlpha(integer linknumber, float alpha, integer face)
+If a prim exists in the link chain at linknumber, sets face to alpha
+ </string>
+ <string name="LSLTipText_llGetNumberOfPrims" translate="false">
+ integer llGetNumberOfPrims()
+Returns the number of prims in a link set the script is attached to
+ </string>
+ <string name="LSLTipText_llGetNumberOfNotecardLines" translate="false">
+ key llGetNumberOfNotecardLines(string name)
+Returns number of lines in notecard name via the dataserver event (cast return value to integer)
+ </string>
+ <string name="LSLTipText_llGetBoundingBox" translate="false">
+ list llGetBoundingBox(key object)
+Returns the bounding box around the object (including any linked prims) relative to its root prim, in a list in the format [ (vector) min_corner, (vector) max_corner ]
+ </string>
+ <string name="LSLTipText_llGetGeometricCenter" translate="false">
+ vector llGetGeometricCenter()
+Returns the geometric center of the linked set the script is attached to.
+ </string>
+ <string name="LSLTipText_llGetPrimitiveParams" translate="false">
+ list llGetPrimitiveParams(list params)
+Returns the primitive parameters specified in the params list.
+ </string>
+ <string name="LSLTipText_llIntegerToBase64" translate="false">
+ string llIntegerToBase64(integer number)
+Returns a string that is a Base64 big endian encode of number
+ </string>
+ <string name="LSLTipText_llBase64ToInteger" translate="false">
+ integer llBase64ToInteger(string str)
+Returns an integer that is the str Base64 decoded as a big endian integer
+ </string>
+ <string name="LSLTipText_llGetGMTclock" translate="false">
+ float llGetGMTclock()
+Returns the time in seconds since midnight GMT
+ </string>
+ <string name="LSLTipText_llGetSimulatorHostname" translate="false">
+ string llGetSimulatorHostname()
+Returns the hostname of the machine which the script is running on (same as string in viewer Help dialog)
+ </string>
+ <string name="LSLTipText_llSetLocalRot" translate="false">
+ llSetLocalRot(rotation rot)
+Sets the rotation of a child prim relative to the root prim
+ </string>
+ <string name="LSLTipText_llParseStringKeepNulls" translate="false">
+ list llParseStringKeepNulls(string src, list separators, list spacers)
+Breaks src into a list, discarding separators, keeping spacers, keeping any null values generated.
+(separators and spacers must be lists of strings, maximum of 8 each)
+ </string>
+ <string name="LSLTipText_llRezAtRoot" translate="false">
+ llRezAtRoot(string inventory, vector pos, vector vel, rotation rot, integer param)
+Instantiates owner's inventory object rotated to rot with its root at pos, moving at vel, using param as the start parameter
+ </string>
+ <string name="LSLTipText_llGetObjectPermMask" translate="false">
+ integer llGetObjectPermMask(integer mask)
+Returns the requested permission mask for the root object the task is attached to
+ </string>
+ <string name="LSLTipText_llSetObjectPermMask" translate="false">
+ llSetObjectPermMask(integer mask, integer value)
+Sets the given permission mask to the new value on the root object the task is attached to (requires God Mode)
+ </string>
+ <string name="LSLTipText_llGetInventoryPermMask" translate="false">
+ integer llGetInventoryPermMask(string item, integer mask)
+Returns the requested permission mask for the inventory item
+ </string>
+ <string name="LSLTipText_llSetInventoryPermMask" translate="false">
+ llSetInventoryPermMask(string item, integer mask, integer value)
+Sets the given permission mask to the new value on the inventory item (requires God Mode)
+ </string>
+ <string name="LSLTipText_llGetInventoryCreator" translate="false">
+ key llGetInventoryCreator(string item)
+Returns a key for the creator of the inventory item
+ </string>
+ <string name="LSLTipText_llOwnerSay" translate="false">
+ llOwnerSay(string msg)
+Says msg to owner only. (Owner must be in the same region.)
+ </string>
+ <string name="LSLTipText_llRequestSimulatorData" translate="false">
+ key llRequestSimulatorData(string simulator, integer data)
+Requests data about simulator. When data is available the dataserver event will be raised.
+ </string>
+ <string name="LSLTipText_llForceMouselook" translate="false">
+ llForceMouselook(integer mouselook)
+If mouselook is TRUE, any avatar that sits upon the prim will be forced into mouselook mode
+ </string>
+ <string name="LSLTipText_llGetObjectMass" translate="false">
+ float llGetObjectMass(key id)
+Returns the mass of the avatar or object in the region
+ </string>
+ <string name="LSLTipText_llListReplaceList" translate="false">
+ list llListReplaceList(list dest, list src, integer start, integer end)
+Returns a list that is dest with start through end removed and src inserted at start
+ </string>
+ <string name="LSLTipText_llLoadURL" translate="false">
+ llLoadURL(key avatar, string message, string url)
+Shows a dialog to avatar offering to load the web page at url with a message.
+If user clicks yes, launches the page in their web browser.
+ </string>
+ <string name="LSLTipText_llParcelMediaCommandList" translate="false">
+ llParcelMediaCommandList(list command)
+Sends a list of commands, some with arguments, to a parcel to control the playback of movies and other media
+ </string>
+ <string name="LSLTipText_llParcelMediaQuery" translate="false">
+ list llParcelMediaQuery(list query)
+Returns a list containing results of the sent query
+ </string>
+ <string name="LSLTipText_llModPow" translate="false">
+ integer llModPow(integer a, integer b, integer c)
+Returns a raised to the b power, mod c. ( (a**b)%c )
+b is capped at 0xFFFF (16 bits).
+ </string>
+ <string name="LSLTipText_llGetInventoryType" translate="false">
+ integer llGetInventoryType(string name)
+Returns the type of the inventory item name
+ </string>
+ <string name="LSLTipText_llSetPayPrice" translate="false">
+ llSetPayPrice(integer price, list quick_pay_buttons)
+Sets the default amount on the dialog that appears when someone chooses to pay this prim
+ </string>
+ <string name="LSLTipText_llGetCameraPos" translate="false">
+ vector llGetCameraPos()
+Returns the current camera position for the agent the task has permissions for
+ </string>
+ <string name="LSLTipText_llGetCameraRot" translate="false">
+ rotation llGetCameraRot()
+Returns the current camera orientation for the agent the task has permissions for
+ </string>
+ <string name="LSLTipText_llSetPrimURL" translate="false">
+ llSetPrimURL(string url)
+Updates the URL for the web page shown on the sides of the object
+ </string>
+ <string name="LSLTipText_llRefreshPrimURL" translate="false">
+ llRefreshPrimURL()
+Reloads the web page shown on the sides of the object
+ </string>
+ <string name="LSLTipText_llEscapeURL" translate="false">
+ string llEscapeURL(string url)
+Returns an escaped/encoded version of url, replacing spaces with %20 etc.
+ </string>
+ <string name="LSLTipText_llUnescapeURL" translate="false">
+ string llUnescapeURL(string url)
+Returns an unescaped/ unencoded version of url, replacing %20 with spaces etc.
+ </string>
+ <string name="LSLTipText_llMapDestination" translate="false">
+ llMapDestination(string simname, vector pos, vector look_at)
+Opens the World Map centered on the region simname with pos highlighted. (NOTE: look_at currently does nothing.)
+Only works for scripts attached to avatar, or during touch events.
+ </string>
+ <string name="LSLTipText_llAddToLandBanList" translate="false">
+ llAddToLandBanList(key avatar, float hours)
+Adds avatar to the land ban list for hours, or indefinitely if hours is 0
+ </string>
+ <string name="LSLTipText_llRemoveFromLandPassList" translate="false">
+ llRemoveFromLandPassList(key avatar)
+Removes avatar from the land pass list
+ </string>
+ <string name="LSLTipText_llRemoveFromLandBanList" translate="false">
+ llRemoveFromLandBanList(key avatar)
+Removes avatar from the land ban list
+ </string>
+ <string name="LSLTipText_llSetCameraParams" translate="false">
+ llSetCameraParams(list rules)
+Sets multiple camera parameters at once.
+List format is [ rule1, data1, rule2, data2 . . . rulen, datan ]
+ </string>
+ <string name="LSLTipText_llClearCameraParams" translate="false">
+ llClearCameraParams()
+Resets all camera parameters to default values and turns off scripted camera control
+ </string>
+ <string name="LSLTipText_llListStatistics" translate="false">
+ float llListStatistics(integer operation, list src)
+Performs statistical aggregate functions on list src using LIST_STAT_* operations
+ </string>
+ <string name="LSLTipText_llGetUnixTime" translate="false">
+ integer llGetUnixTime()
+Returns the number of seconds elapsed since 00:00 hours, Jan 1, 1970 UTC from the system clock
+ </string>
+ <string name="LSLTipText_llGetParcelFlags" translate="false">
+ integer llGetParcelFlags(vector pos)
+Returns a mask of the parcel flags (PARCEL_FLAG_*) for the parcel that includes the point pos
+ </string>
+ <string name="LSLTipText_llGetRegionFlags" translate="false">
+ integer llGetRegionFlags()
+Returns the region flags (REGION_FLAG_*) for the region the object is in
+ </string>
+ <string name="LSLTipText_llXorBase64StringsCorrect" translate="false">
+ string llXorBase64StringsCorrect(string s1, string s2)
+Correctly performs an exclusive or on two Base64 strings and returns a Base64 string.
+s2 repeats if it is shorter than s1.
+ </string>
+ <string name="LSLTipText_llHTTPRequest" translate="false">
+ llHTTPRequest(string url, list parameters, string body)
+Sends an HTTP request to the specified url with the body of the request and parameters
+ </string>
+ <string name="LSLTipText_llResetLandBanList" translate="false">
+ llResetLandBanList()
+Removes all Residents from the land ban list
+ </string>
+ <string name="LSLTipText_llResetLandPassList" translate="false">
+ llResetLandPassList()
+Removes all Residents from the land access/pass list
+ </string>
+ <string name="LSLTipText_llGetObjectPrimCount" translate="false">
+ integer llGetObjectPrimCount(key object_id)
+Returns the total number of prims for an object in the region
+ </string>
+ <string name="LSLTipText_llGetParcelPrimOwners" translate="false">
+ list llGetParcelPrimOwners(vector pos)
+Returns a list of all Residents who own objects on the parcel at pos and with individual prim counts.
+Requires owner-like permissions for the parcel.
+ </string>
+ <string name="LSLTipText_llGetParcelPrimCount" translate="false">
+ integer llGetParcelPrimCount(vector pos, integer category, integer sim_wide)
+Returns the number of prims on the parcel at pos of the given category.
+Categories: PARCEL_COUNT_TOTAL, _OWNER, _GROUP, _OTHER, _SELECTED, _TEMP
+ </string>
+ <string name="LSLTipText_llGetParcelMaxPrims" translate="false">
+ integer llGetParcelMaxPrims(vector pos, integer sim_wide)
+Returns the maximum number of prims allowed on the parcel at pos
+ </string>
+ <string name="LSLTipText_llGetParcelDetails" translate="false">
+ list llGetParcelDetails(vector pos, list params)
+Returns the parcel details specified in params for the parcel at pos.
+Params is one or more of: PARCEL_DETAILS_NAME, _DESC, _OWNER, _GROUP, _AREA, _ID, _SEE_AVATARS
+ </string>
+ <string name="LSLTipText_llSetLinkPrimitiveParams" translate="false">
+ llSetLinkPrimitiveParams(integer linknumber, list rules)
+Sets primitive parameters for linknumber based on rules
+ </string>
+ <string name="LSLTipText_llSetLinkTexture" translate="false">
+ llSetLinkTexture(integer linknumber, string texture, integer face)
+Sets the texture of face for a task that exists in the link chain at linknumber
+ </string>
+ <string name="LSLTipText_llStringTrim" translate="false">
+ string llStringTrim(string src, integer trim_type)
+Trims the leading and/or trailing white spaces from a string.
+trim_type can be STRING_TRIM, STRING_TRIM_HEAD or STRING_TRIM_TAIL.
+ </string>
+ <string name="LSLTipText_llRegionSay" translate="false">
+ llRegionSay(integer channel, string msg)
+Broadcasts msg on channel (not 0) that can be heard anywhere in the region by a script listening on channel
+ </string>
+ <string name="LSLTipText_llGetObjectDetails" translate="false">
+ list llGetObjectDetails(key id, list params)
+Returns the object details specified in params for the object with key id.
+Params are OBJECT_NAME, _DESC, _POS, _ROT, _VELOCITY, _OWNER, _GROUP, _CREATOR
+ </string>
+ <string name="LSLTipText_llSetClickAction" translate="false">
+ llSetClickAction(integer action)
+Sets the action performed when a prim is clicked upon
+ </string>
+ <string name="LSLTipText_llGetRegionAgentCount" translate="false">
+ integer llGetRegionAgentCount()
+Returns the number of avatars in the region
+ </string>
+ <string name="LSLTipText_llTextBox" translate="false">
+ llTextBox(key avatar, string message, integer chat_channel)
+Shows a window on the avatar's screen with the message.
+It contains a text box for input, and if entered that text is chatted on chat_channel.
+ </string>
+ <string name="LSLTipText_llGetAgentLanguage" translate="false">
+ string llGetAgentLanguage(key avatar)
+Returns the language code of the preferred interface language of the avatar
+ </string>
+ <string name="LSLTipText_llDetectedTouchUV" translate="false">
+ vector llDetectedTouchUV(integer index)
+Returns the u and v coordinates in the first two components of a vector, for the texture coordinates where the prim was touched in a triggered touch event
+ </string>
+ <string name="LSLTipText_llDetectedTouchFace" translate="false">
+ integer llDetectedTouchFace(integer index)
+Returns the index of the face where the avatar clicked in a triggered touch event
+ </string>
+ <string name="LSLTipText_llDetectedTouchPos" translate="false">
+ vector llDetectedTouchPos(integer index)
+Returns the position where the object was touched in a triggered touch event
+ </string>
+ <string name="LSLTipText_llDetectedTouchNormal" translate="false">
+ vector llDetectedTouchNormal(integer index)
+Returns the surface normal for a triggered touch event
+ </string>
+ <string name="LSLTipText_llDetectedTouchBinormal" translate="false">
+ vector llDetectedTouchBinormal(integer index)
+Returns the surface binormal for a triggered touch event
+ </string>
+ <string name="LSLTipText_llDetectedTouchST" translate="false">
+ vector llDetectedTouchST(integer index)
+Returns the s and t coordinates in the first two components of a vector, for the surface coordinates where the prim was touched in a triggered touch event
+ </string>
+ <string name="LSLTipText_llSHA1String" translate="false">
+ string llSHA1String(string src)
+Returns a string of 40 hex characters that is the SHA1 security Hash of src
+ </string>
+ <string name="LSLTipText_llGetFreeURLs" translate="false">
+ integer llGetFreeURLs()
+Returns the number of available URLs for the current script
+ </string>
+ <string name="LSLTipText_llRequestURL" translate="false">
+ key llRequestURL()
+Requests one HTTP:// url for use by this object.
+An http_request event is triggered with the results.
+ </string>
+ <string name="LSLTipText_llRequestSecureURL" translate="false">
+ key llRequestSecureURL()
+Requests one HTTPS:// (SSL) url for use by this object.
+An http_request event is triggered with the results.
+ </string>
+ <string name="LSLTipText_llReleaseURL" translate="false">
+ llReleaseURL(string url)
+Releases the specified URL, it will no longer be usable
+ </string>
+ <string name="LSLTipText_llHTTPResponse" translate="false">
+ llHTTPResponse(key request_id, integer status, string body)
+Responds to request_id with status and body
+ </string>
+ <string name="LSLTipText_llGetHTTPHeader" translate="false">
+ string llGetHTTPHeader(key request_id, string header)
+Returns the value for header for request_id
+ </string>
+ <string name="LSLTipText_llSetPrimMediaParams" translate="false">
+ llSetPrimMediaParams(integer face, list params)
+Sets the media params for a particular face on an object. If media is not already on this object, add it.
+List is a set of name/value pairs in no particular order. Params not specified are unchanged, or if new media is added then set to the default specified.
+The possible names are below, along with the types of values and what they mean.
+ </string>
+ <string name="LSLTipText_llGetPrimMediaParams" translate="false">
+ list llGetPrimMediaParams(integer face, list params)
+Returns the media params for a particular face on an object, given the desired list of names, in the order requested.
+(Returns an empty list if no media exists on the face.)
+ </string>
+ <string name="LSLTipText_llClearPrimMedia" translate="false">
+ llClearPrimMedia(integer face)
+Clears (deletes) the media and all params from the given face.
+ </string>
+ <string name="LSLTipText_llSetLinkPrimitiveParamsFast" translate="false">
+ llSetLinkPrimitiveParamsFast(integer linknumber,list rules)
+Set primitive parameters for linknumber based on rules.
+ </string>
+ <string name="LSLTipText_llGetLinkPrimitiveParams" translate="false">
+ llGetLinkPrimitiveParams(integer linknumber,list rules)
+Get primitive parameters for linknumber based on rules.
+ </string>
+ <string name="LSLTipText_llLinkParticleSystem" translate="false">
+ llLinkParticleSystem(integer linknumber,list rules)
+Creates a particle system based on rules. Empty list removes particle system from object.
+List format is [ rule1, data1, rule2, data2 . . . rulen, datan ].
+ </string>
+ <string name="LSLTipText_llSetLinkTextureAnim" translate="false">
+ llSetLinkTextureAnim(integer link, integer mode, integer face, integer sizex, integer sizey, float start, float length, float rate)
+Animate the texture on the specified prim's face/faces.
+ </string>
+ <string name="LSLTipText_llGetLinkNumberOfSides" translate="false">
+ integer llGetLinkNumberOfSides(integer link)
+Returns the number of sides of the specified linked prim.
+ </string>
+ <string name="LSLTipText_llGetUsername" translate="false">
+ string llGetUsername(key id)
+Returns the single-word username of an avatar, iff the avatar is in the current region, otherwise the empty string.
+ </string>
+ <string name="LSLTipText_llRequestUsername" translate="false">
+ key llRequestUsername(key id)
+Requests single-word username of an avatar. When data is available the dataserver event will be raised.
+ </string>
+ <string name="LSLTipText_llGetDisplayName" translate="false">
+ string llGetDisplayName(key id)
+Returns the name of an avatar, iff the avatar is in the current simulator, and the name has been cached, otherwise the same as llGetUsername. Use llRequestDisplayName if you absolutely must have the display name.
+ </string>
+ <string name="LSLTipText_llRequestDisplayName" translate="false">
+ key llRequestDisplayName(key id)
+Requests name of an avatar. When data is available the dataserver event will be raised.
+ </string>
+ <string name="LSLTipText_llGetEnv" translate="false">
+ llGetEnv(string name)
+Returns a string with the requested data about the region
+ </string>
+ <string name="LSLTipText_llCastRay" translate="false">
+ llCastRay(vector start, vector end, list params)
+Casts a ray into the physics world from 'start' to 'end' and returns data according to details in params.
+ </string>
+ <string name="LSLTipText_llRegionSayTo" translate="false">
+ llRegionSayTo(key target, integer channel, string msg)
+Sends msg on channel (not DEBUG_CHANNEL) directly to prim or avatar target anywhere within the region.
+ </string>
+ <string name="LSLTipText_llGetSPMaxMemory" translate="false">
+ integer llGetSPMaxMemory()
+Returns the maximum used memory for the current script. Only valid after using PROFILE_SCRIPT_MEMORY. Non-mono scripts always use 16k.
+ </string>
+ <string name="LSLTipText_llGetUsedMemory" translate="false">
+ integer llGetUsedMemory()
+Returns the current used memory for the current script. Non-mono scripts always use 16k.
+ </string>
+ <string name="LSLTipText_llScriptProfiler" translate="false">
+ llScriptProfiler(integer flags)
+Enabled or disables script profiling options. Currently only supports PROFILE_SCRIPT_MEMORY (mono only) and PROFILE_NONE.
+MAY SIGNIFICANTLY REDUCE SCRIPT PERFORMANCE!
+ </string>
+ <string name="LSLTipText_llSetMemoryLimit" translate="false">
+ integer llSetMemoryLimit(integer mem)
+ </string>
+ <string name="LSLTipText_llGetMemoryLimit" translate="false">
+ integer llGetMemoryLimit()
+ </string>
+ <string name="LSLTipText_llSetLinkMedia" translate="false">
+ llSetLinkMedia(integer link, integer face, list params)
+Set the media params for a particular face on linked prim. List is a set of name/value pairs (in no particular order). The possible names are below, along with the types of values and what they mean. If media is not already on this object, add it. Params not specified are unchanged, or if new media is added set to the default specified.
+ </string>
+ <string name="LSLTipText_llGetLinkMedia" translate="false">
+ list llGetLinkMedia(integer link, integer face, list params)
+Get the media params for a particular face on linked prim, given the desired list of names. Returns a list of values in the order requested. Returns an empty list if no media exists on the face.
+ </string>
+ <string name="LSLTipText_llClearLinkMedia" translate="false">
+ llClearLinkMedia(integer link, integer face)
+Clears (deletes) the media and all params from the given face on linked prim.
+ </string>
+ <string name="LSLTipText_llSetContentType" translate="false">
+ llSetContentType(key id, integer content_type)
+ </string>
+ <string name="LSLTipText_llLinkSitTarget" translate="false">
+ llLinkSitTarget(integer link, vector offset, rotation rot)
+Set the sit location for this object (if offset == &lt;0,0,0&gt; clear it)
+ </string>
+ <string name="LSLTipText_llAvatarOnLinkSitTarget" translate="false">
+ key llAvatarOnLinkSitTarget(integer link)
+If an avatar is sitting on the sit target, return the avatar's key, NULL_KEY otherwise
+ </string>
+ <string name="LSLTipText_llSetLinkCamera" translate="false">
+ llSetLinkCamera(integer link, vector eye, vector at)
+ </string>
+ <string name="LSLTipText_llSetVelocity" translate="false">
+ llSetVelocity(vector velocity, integer local)
+Sets an objects velocity, in local coords if local == TRUE (if the script is physical)
+ </string>
+ <string name="LSLTipText_llSetAngularVelocity" translate="false">
+ llSetAngularVelocity(vector angular_velocity, integer local)
+Sets an objects angular velocity, in local coords if local == TRUE (if the script is physical)
+ </string>
+ <string name="LSLTipText_llSetPhysicsMaterial" translate="false">
+ llSetPhysicsMaterial(integer flags, float gravity_multiplier, float restitution, float friction, float density )
+Sets the requested attributes of the root object's physics material.
+ </string>
+ <string name="LSLTipText_llGetPhysicsMaterial" translate="false">
+ llGetPhysicsMaterial() returns the gravity multiplier, restitution, friction, and density of the linkset as a list in that order.
+ </string>
+ <string name="LSLTipText_llGetMassMKS" translate="false">
+ llGetMassMKS() returns the mass of the linkset in kilograms.
+ </string>
+ <string name="LSLTipText_llGenerateKey" translate="false">
+ llGenerateKey()
+Retun a unique generated key
+ </string>
+ <string name="LSLTipText_llSetKeyframedMotion" translate="false">
+ llSetKeyframedMotion(list keyframes, list options)
+Requests that a nonphysical object be keyframed according to keyframe list.
+ </string>
+ <string name="LSLTipText_llTransferLindenDollars" translate="false">
+ key llTransferLindenDollars(key destination, integer amount)
+Transfer amount of linden dollars (L$) from script owner to destination. Returns a key to a corresponding transaction_result event for the success of the transfer.
+ </string>
+ <string name="LSLTipText_llGetParcelMusicURL" translate="false">
+ string llGetParcelMusicURL()
+Gets the streaming audio URL for the parcel of land on which the object is located.
+ </string>
+ <string name="LSLTipText_llSetRegionPos" translate="false">
+ integer llSetRegionPos(vector pos)
+Sets the position anywhere within the region (if the object isn't physical)
+ </string>
+ <string name="LSLTipText_llNavigateTo" translate="false">
+ llNavigateTo(vector point, list options)
+For AI Character: Navigate to destination.
+ </string>
+ <string name="LSLTipText_llCreateCharacter" translate="false">
+ llCreateCharacter(list options)
+Convert linkset to AI Character which can navigate the world.
+ </string>
+ <string name="LSLTipText_llPursue" translate="false">
+ llPursue(key target, list options)
+For AI Character: Chase after a target.
+ </string>
+ <string name="LSLTipText_llWanderWithin" translate="false">
+ llWanderWithin(vector center, float radius, list options)
+For AI Character: Wander within a specified volume.
+ </string>
+ <string name="LSLTipText_llFleeFrom" translate="false">
+ llFleeFrom(vector source, float radius, list options)
+For AI Character: Flee from a point.
+ </string>
+ <string name="LSLTipText_llPatrolPoints" translate="false">
+ llPatrolPoints(list points, list options)
+For AI Character: Patrol a list of points.
+ </string>
+ <string name="LSLTipText_llExecCharacterCmd" translate="false">
+ llExecCharacterCmd(integer cmd, list options)
+For AI Character: Execute a character command.
+ </string>
+ <string name="LSLTipText_llDeleteCharacter" translate="false">
+ llDeleteCharacter()
+Convert linkset from AI Character to Physics object.
+ </string>
+ <string name="LSLTipText_llUpdateCharacter" translate="false">
+ llUpdateCharacter(list options)
+Change the AI Character's settings.
+ </string>
+ <string name="LSLTipText_llEvade" translate="false">
+ llEvade(key target, list options)
+For AI Character: Evade a specified target.
+ </string>
+ <string name="LSLTipText_llGetClosestNavPoint" translate="false">
+ list llGetClosestNavPoint(vector point, list options)
+For AI Character: Get the closest navigable point to the point provided.
+ </string>
+ <string name="shape">
+ シェイプ
+ </string>
+ <string name="skin">
+ スキン
+ </string>
+ <string name="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">
+ アルファ
+ </string>
+ <string name="tattoo">
+ タトゥ
+ </string>
+ <string name="universal">
+ ユニバーサル
+ </string>
+ <string name="physics">
+ 物理作用
+ </string>
+ <string name="invalid">
+ 無効
+ </string>
+ <string name="none">
+ なし
+ </string>
+ <string name="shirt_not_worn">
+ シャツ未着用
+ </string>
+ <string name="pants_not_worn">
+ ズボン未着用
+ </string>
+ <string name="shoes_not_worn">
+ 靴未着用
+ </string>
+ <string name="socks_not_worn">
+ 靴下未着用
+ </string>
+ <string name="jacket_not_worn">
+ ジャケット未着用
+ </string>
+ <string name="gloves_not_worn">
+ 手袋未着用
+ </string>
+ <string name="undershirt_not_worn">
+ 下着(上半身)未着用
+ </string>
+ <string name="underpants_not_worn">
+ 下着(下半身)未着用
+ </string>
+ <string name="skirt_not_worn">
+ スカート未着用
+ </string>
+ <string name="alpha_not_worn">
+ アルファ未着用
+ </string>
+ <string name="tattoo_not_worn">
+ タトゥ未着用
+ </string>
+ <string name="universal_not_worn">
+ ユニバーサルなし
+ </string>
+ <string name="physics_not_worn">
+ 物理作用なし
+ </string>
+ <string name="invalid_not_worn">
+ 無効
+ </string>
+ <string name="create_new_shape">
+ 新しいシェイプを作成
+ </string>
+ <string name="create_new_skin">
+ 新しいスキンを作成
+ </string>
+ <string name="create_new_hair">
+ 新しい髪を作成
+ </string>
+ <string name="create_new_eyes">
+ 新しい目を作成
+ </string>
+ <string name="create_new_shirt">
+ 新しいシャツを作成
+ </string>
+ <string name="create_new_pants">
+ 新しいズボンを作成
+ </string>
+ <string name="create_new_shoes">
+ 新しい靴を作成
+ </string>
+ <string name="create_new_socks">
+ 新しい靴下を作成
+ </string>
+ <string name="create_new_jacket">
+ 新しい上着を作成
+ </string>
+ <string name="create_new_gloves">
+ 新しい手袋を作成
+ </string>
+ <string name="create_new_undershirt">
+ 新しい下着(上半身)を作成
+ </string>
+ <string name="create_new_underpants">
+ 新しい下着(下半身)を作成
+ </string>
+ <string name="create_new_skirt">
+ 新しいスカートを作成
+ </string>
+ <string name="create_new_alpha">
+ 新しいアルファを作成
+ </string>
+ <string name="create_new_tattoo">
+ 新しいタトゥを作成
+ </string>
+ <string name="create_new_universal">
+ 新しいユニバーサルを作成
+ </string>
+ <string name="create_new_physics">
+ 新しい物理作用を作成
+ </string>
+ <string name="create_new_invalid">
+ 無効
+ </string>
+ <string name="NewWearable">
+ 新しい[WEARABLE_ITEM]
+ </string>
+ <string name="next">
+ 次へ
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ グループ通知
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ グループ通知
+ </string>
+ <string name="GroupNotifySentBy">
+ 送信者
+ </string>
+ <string name="GroupNotifyAttached">
+ 添付:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ ここで過去の通知を表示するか、メッセージを受け取らない設定をします。
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ 添付アイテムを開く
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ 添付アイテムを保存
+ </string>
+ <string name="TeleportOffer">
+ テレポートを送る
+ </string>
+ <string name="StartUpNotifications">
+ 不在中に新しい通知が届きました。
+ </string>
+ <string name="OverflowInfoChannelString">
+ あなたにはさらに%d件の通知があります
+ </string>
+ <string name="BodyPartsRightArm">
+ 右腕
+ </string>
+ <string name="BodyPartsHead">
+ 頭
+ </string>
+ <string name="BodyPartsLeftArm">
+ 左腕
+ </string>
+ <string name="BodyPartsLeftLeg">
+ 左脚
+ </string>
+ <string name="BodyPartsTorso">
+ 上半身
+ </string>
+ <string name="BodyPartsRightLeg">
+ 右脚
+ </string>
+ <string name="BodyPartsEnhancedSkeleton">
+ 拡張スケルトン
+ </string>
+ <string name="GraphicsQualityLow">
+ 低
+ </string>
+ <string name="GraphicsQualityMid">
+ 中
+ </string>
+ <string name="GraphicsQualityHigh">
+ 高
+ </string>
+ <string name="LeaveMouselook">
+ ESCキーを押してワールドビューに戻ります
+ </string>
+ <string name="InventoryNoMatchingItems">
+ お探しのものは見つかりましたか?[secondlife:///app/search/all/[SEARCH_TERM] 検索]をお試しください。
+ </string>
+ <string name="InventoryNoMatchingRecentItems">
+ お探しのものは見つかりましたか?[secondlife:///app/inventory/filters フィルタを表示]をお試しください。
+ </string>
+ <string name="PlacesNoMatchingItems">
+ お探しのものは見つかりましたか?[secondlife:///app/search/places/[SEARCH_TERM] 検索]をお試しください。
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ ここにランドマークをドラッグしてお気に入りに追加します。
+ </string>
+ <string name="MarketplaceNoMatchingItems">
+ アイテムが見つかりませんでした。検索文字列のスペルを確認して、もう一度やり直してください。
+ </string>
+ <string name="InventoryNoTexture">
+ インベントリ内にこのテクスチャのコピーがありません
+ </string>
+ <string name="InventoryInboxNoItems">
+ マーケットプレイスで購入した商品はここに表示されます。その後、アイテムをインベントリにドラッグすれば、それらのアイテムを使用できます。
+ </string>
+ <string name="MarketplaceURL">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/?lang=ja-JP
+ </string>
+ <string name="MarketplaceURL_CreateStore">
+ https://community.secondlife.com/knowledgebase/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B8%E3%83%99%E3%83%BC%E3%82%B9/%E3%83%9E%E3%83%BC%E3%82%B1%E3%83%83%E3%83%88%E3%83%97%E3%83%AC%E3%82%A4%E3%82%B9%E3%81%A7%E8%B2%A9%E5%A3%B2%E3%81%99%E3%82%8B-r769/
+ </string>
+ <string name="MarketplaceURL_Dashboard">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard?lang=ja-JP
+ </string>
+ <string name="MarketplaceURL_Imports">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports?lang=ja-JP
+ </string>
+ <string name="MarketplaceURL_LearnMore">
+ https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more?lang=ja-JP
+ </string>
+ <string name="InventoryPlayAnimationTooltip">
+ [再生]オプションでウィンドウを開ける。
+ </string>
+ <string name="InventoryPlayGestureTooltip">
+ インワールドで選択済みのジェスチャーを実行する。
+ </string>
+ <string name="InventoryPlaySoundTooltip">
+ [再生]オプションでウィンドウを開ける。
+ </string>
+ <string name="InventoryOutboxNotMerchantTitle">
+ マーケットプレイスでは誰でもアイテムを売ることができます。
+ </string>
<string name="InventoryOutboxNotMerchantTooltip"/>
- <string name="InventoryOutboxNotMerchant">マーチャントになりたい方は、[[MARKETPLACE_CREATE_STORE_URL] マーケットプレイスストアを作成]する必要があります。</string>
- <string name="InventoryOutboxNoItemsTitle">アウトボックスは空です。</string>
+ <string name="InventoryOutboxNotMerchant">
+ 販売者になりたい方は、[[MARKETPLACE_CREATE_STORE_URL] マーケットプレイスストアを作成]する必要があります。
+ </string>
+ <string name="InventoryOutboxNoItemsTitle">
+ アウトボックスは空です。
+ </string>
<string name="InventoryOutboxNoItemsTooltip"/>
- <string name="InventoryOutboxNoItems">[[MARKETPLACE_DASHBOARD_URL] マーケットプレイス]に販売するアイテムを一覧するには、フォルダをこのエリアにドラッグし、「マーケットプレイスに送信」をクリックします。</string>
- <string name="InventoryOutboxInitializingTitle">マーケットプレイスの初期化。</string>
- <string name="InventoryOutboxInitializing">[[MARKETPLACE_CREATE_STORE_URL] マーケットプレイス ストア] のアカウントにアクセスしています。</string>
- <string name="InventoryOutboxErrorTitle">マーケットプレイス エラー。</string>
- <string name="InventoryOutboxError">[[MARKETPLACE_CREATE_STORE_URL] マーケットプレイス ストア] がエラーを返しています。</string>
- <string name="InventoryMarketplaceError">マーケットプレイスのリストを開くときにエラーが発生しました。引き続きこのメッセージを受信するには、Second Life のサポート (http://support.secondlife.com) にお問い合わせください</string>
- <string name="InventoryMarketplaceListingsNoItemsTitle">マーケットプレイスのリストフォルダが空です。</string>
- <string name="InventoryMarketplaceListingsNoItems">[[MARKETPLACE_DASHBOARD_URL] マーケットプレイス]に販売するアイテムを一覧するには、フォルダをこのエリアにドラッグします。</string>
- <string name="InventoryItemsCount">([ITEMS_COUNT] 個のアイテム)</string>
- <string name="Marketplace Validation Warning Stock">バージョンフォルダに在庫フォルダが含まれなければなりません</string>
- <string name="Marketplace Validation Error Mixed Stock">: エラー:在庫フォルダ内のすべてのアイテムはコピー不可で同じ種類でなければなりません</string>
- <string name="Marketplace Validation Error Subfolder In Stock">: エラー:在庫フォルダにサブフォルダを含めることはできません</string>
- <string name="Marketplace Validation Warning Empty">: 警告:フォルダにアイテムが含まれていません</string>
- <string name="Marketplace Validation Warning Create Stock">: 警告:在庫フォルダを作成しています</string>
- <string name="Marketplace Validation Warning Create Version">: 警告:バージョンフォルダ作成中</string>
- <string name="Marketplace Validation Warning Move">: 警告:アイテム移動中</string>
- <string name="Marketplace Validation Warning Delete">: 警告:フォルダの中身が在庫フォルダに移されました。空のフォルダを削除します</string>
- <string name="Marketplace Validation Error Stock Item">: エラー:在庫フォルダにコピー不可アイテムを含める必要があります</string>
- <string name="Marketplace Validation Warning Unwrapped Item">: 警告:バージョンフォルダにアイテムが含まれていなければなりません</string>
- <string name="Marketplace Validation Error">: エラー:</string>
- <string name="Marketplace Validation Warning">: 警告:</string>
- <string name="Marketplace Validation Error Empty Version">: 警告:バージョンフォルダには、最低 1 アイテムが含まれなければなりません</string>
- <string name="Marketplace Validation Error Empty Stock">: 警告:在庫フォルダには、最低 1 アイテムが含まれていなければなりません</string>
- <string name="Marketplace Validation No Error">報告するエラーまたは警告はありません</string>
- <string name="Marketplace Error None">エラーなし</string>
- <string name="Marketplace Error Prefix">エラー:</string>
- <string name="Marketplace Error Not Merchant">マーケットプレイスに商品を送る前に、あなた自身をマーチャント登録する必要があります(登録は無料です)。</string>
- <string name="Marketplace Error Not Accepted">アイテムをそのフォルダに移動できません。</string>
- <string name="Marketplace Error Unsellable Item">このアイテムをマーケットプレイスで販売することはできません。</string>
- <string name="MarketplaceNoID">Mkt ID なし</string>
- <string name="MarketplaceLive">リスト掲載済み</string>
- <string name="MarketplaceActive">有効</string>
- <string name="MarketplaceMax">最大</string>
- <string name="MarketplaceStock">在庫</string>
- <string name="MarketplaceNoStock">在庫なし</string>
- <string name="MarketplaceUpdating">アップデート中...</string>
- <string name="UploadFeeInfo">費用はサブスクリプションのレベルにより異なります。レベルが高いほど費用が下がります。[https://secondlife.com/my/account/membership.php? 詳細]</string>
- <string name="Open landmarks">オープン ランドマーク</string>
- <string name="Unconstrained">アンコンストレインド(制約なし)</string>
- <string name="no_transfer" value=" (再販・プレゼント不可)"/>
+ <string name="InventoryOutboxNoItems">
+ [[MARKETPLACE_DASHBOARD_URL] マーケットプレイス]に販売するアイテムを一覧するには、フォルダをこのエリアにドラッグし、「マーケットプレイスに送信」をクリックします。
+ </string>
+ <string name="InventoryOutboxInitializingTitle">
+ マーケットプレイスの初期化。
+ </string>
+ <string name="InventoryOutboxInitializing">
+ [[MARKETPLACE_CREATE_STORE_URL] マーケットプレイス ストア]のアカウントにアクセスしています。
+ </string>
+ <string name="InventoryOutboxErrorTitle">
+ マーケットプレイス エラー
+ </string>
+ <string name="InventoryOutboxError">
+ [[MARKETPLACE_CREATE_STORE_URL] マーケットプレイスストア]がエラーを返しています。
+ </string>
+ <string name="InventoryMarketplaceError">
+ マーケットプレイスのリストを開くときにエラーが発生しました。引き続きこのメッセージを受信するには、Second Lifeのサポート(http://support.secondlife.com)にお問い合わせください
+ </string>
+ <string name="InventoryMarketplaceListingsNoItemsTitle">
+ マーケットプレイスのリストフォルダが空です。
+ </string>
+ <string name="InventoryMarketplaceListingsNoItems">
+ [[MARKETPLACE_DASHBOARD_URL] マーケットプレイス]に販売するアイテムを一覧するには、フォルダをこのエリアにドラッグします。
+ </string>
+ <string name="InventoryItemsCount">
+ ([ITEMS_COUNT]個のアイテム)
+ </string>
+ <string name="Marketplace Validation Warning Stock">
+ バージョンフォルダには、在庫フォルダが含まれなければなりません。
+ </string>
+ <string name="Marketplace Validation Error Mixed Stock">
+ エラー:在庫フォルダ内のすべてのアイテムは、コピー不可で同じ種類でなければなりません。
+ </string>
+ <string name="Marketplace Validation Error Subfolder In Stock">
+ エラー:在庫フォルダにサブフォルダを含めることはできません。
+ </string>
+ <string name="Marketplace Validation Warning Empty">
+ 警告:フォルダにアイテムが含まれていません。
+ </string>
+ <string name="Marketplace Validation Warning Create Stock">
+ 警告:在庫フォルダを作成しています。
+ </string>
+ <string name="Marketplace Validation Warning Create Version">
+ 警告:バージョンフォルダを作成しています。
+ </string>
+ <string name="Marketplace Validation Warning Move">
+ : 警告:アイテムを移動しています。
+ </string>
+ <string name="Marketplace Validation Warning Delete">
+ : 警告:フォルダの中身が在庫フォルダに移されました。空のフォルダを削除します。
+ </string>
+ <string name="Marketplace Validation Error Stock Item">
+ : エラー:在庫フォルダには、コピー不可アイテムを含める必要があります。
+ </string>
+ <string name="Marketplace Validation Warning Unwrapped Item">
+ : 警告:バージョンフォルダには、アイテムが含まれていなければなりません。
+ </string>
+ <string name="Marketplace Validation Error">
+ エラー:
+ </string>
+ <string name="Marketplace Validation Warning">
+ 警告:
+ </string>
+ <string name="Marketplace Validation Error Empty Version">
+ 警告:バージョンフォルダには、最低1アイテムが含まれなければなりません
+ </string>
+ <string name="Marketplace Validation Error Empty Stock">
+ 警告:在庫フォルダには、最低1アイテムが含まれていなければなりません
+ </string>
+ <string name="Marketplace Validation No Error">
+ 報告するエラーまたは警告はありません
+ </string>
+ <string name="Marketplace Error None">
+ エラーなし
+ </string>
+ <string name="Marketplace Error Prefix">
+ エラー:
+ </string>
+ <string name="Marketplace Error Not Merchant">
+ マーケットプレイスに商品を送る前に、あなた自身をマーチャント登録する必要があります(登録は無料です)。
+ </string>
+ <string name="Marketplace Error Not Accepted">
+ アイテムをそのフォルダに移動できません。
+ </string>
+ <string name="Marketplace Error Unsellable Item">
+ このアイテムをマーケットプレイスで販売することはできません。
+ </string>
+ <string name="MarketplaceNoID">
+ Mkt ID なし
+ </string>
+ <string name="MarketplaceLive">
+ リスト掲載済み
+ </string>
+ <string name="MarketplaceActive">
+ 有効
+ </string>
+ <string name="MarketplaceMax">
+ 最大
+ </string>
+ <string name="MarketplaceStock">
+ 在庫
+ </string>
+ <string name="MarketplaceNoStock">
+ 在庫なし
+ </string>
+ <string name="MarketplaceUpdating">
+ アップデート中…
+ </string>
+ <string name="UploadFeeInfo">
+ 料金はサブスクリプションのレベルにより異なります。レベルが高いほど、料金が下がります。[https://accounts.secondlife.com/change_membership/?lang=ja-JP 詳細]
+ </string>
+ <string name="Open landmarks">
+ オープン ランドマーク
+ </string>
+ <string name="Unconstrained">
+ アンコンストレインド(制約なし)
+ </string>
+ <string name="no_transfer" value=" (再販・譲渡不可)"/>
<string name="no_modify" value=" (編集不可)"/>
<string name="no_copy" value=" (コピー不可)"/>
<string name="worn" value=" (着用中)"/>
<string name="link" value=" (リンク)"/>
<string name="broken_link" value=" (壊れたリンク)"/>
- <string name="LoadingContents">コンテンツをロード中です...</string>
- <string name="NoContents">コンテンツなし</string>
- <string name="WornOnAttachmentPoint" value=" ([ATTACHMENT_POINT] に装着中)"/>
+ <string name="LoadingContents">
+ コンテンツをロード中です…
+ </string>
+ <string name="NoContents">
+ コンテンツなし
+ </string>
+ <string name="WornOnAttachmentPoint" value=" ([ATTACHMENT_POINT]に装着中)"/>
<string name="AttachmentErrorMessage" value="([ATTACHMENT_ERROR])"/>
- <string name="ActiveGesture" value="[GESLABEL] (アクティブ)"/>
- <string name="PermYes">はい</string>
- <string name="PermNo">いいえ</string>
+ <string name="ActiveGesture" value="[GESLABEL](アクティブ)"/>
+ <string name="PermYes">
+ はい
+ </string>
+ <string name="PermNo">
+ いいえ
+ </string>
<string name="Chat Message" value="チャット:"/>
<string name="Sound" value=" サウンド:"/>
<string name="Wait" value=" --- 待機::"/>
@@ -621,11 +3260,11 @@ support@secondlife.com にお問い合わせください。</string>
<string name="Wave" value=" 手を振る"/>
<string name="GestureActionNone" value="なし"/>
<string name="HelloAvatar" value=" やあ、アバター!"/>
- <string name="ViewAllGestures" value=" すべて表示 &gt;&gt;"/>
+ <string name="ViewAllGestures" value="すべて表示 &gt;&gt;"/>
<string name="GetMoreGestures" value="ショッピング &gt;&gt;"/>
<string name="Animations" value="アニメーション、"/>
<string name="Calling Cards" value="コーリングカード、"/>
- <string name="Clothing" value="衣類、"/>
+ <string name="Clothing" value="服装、"/>
<string name="Gestures" value="ジェスチャー、"/>
<string name="Landmarks" value="ランドマーク、"/>
<string name="Notecards" value="ノートカード、"/>
@@ -634,1441 +3273,4232 @@ support@secondlife.com にお問い合わせください。</string>
<string name="Sounds" value="サウンド、"/>
<string name="Textures" value="テクスチャ、"/>
<string name="Snapshots" value="スナップショット、"/>
- <string name="No Filters" value="いいえ "/>
- <string name="Since Logoff" value=" - ログオフ以来"/>
- <string name="InvFolder My Inventory">インベントリ</string>
- <string name="InvFolder Library">ライブラリ</string>
- <string name="InvFolder Textures">テクスチャ</string>
- <string name="InvFolder Sounds">サウンド</string>
- <string name="InvFolder Calling Cards">コーリングカード</string>
- <string name="InvFolder Landmarks">ランドマーク</string>
- <string name="InvFolder Scripts">スクリプト</string>
- <string name="InvFolder Clothing">衣類</string>
- <string name="InvFolder Objects">オブジェクト</string>
- <string name="InvFolder Notecards">ノートカード</string>
- <string name="InvFolder New Folder">新規フォルダ</string>
- <string name="InvFolder Inventory">インベントリ</string>
- <string name="InvFolder Uncompressed Images">圧縮されていない画像</string>
- <string name="InvFolder Body Parts">身体部位</string>
- <string name="InvFolder Trash">ごみ箱</string>
- <string name="InvFolder Photo Album">フォトアルバム</string>
- <string name="InvFolder Lost And Found">紛失物</string>
- <string name="InvFolder Uncompressed Sounds">圧縮されていないサウンド</string>
- <string name="InvFolder Animations">アニメーション</string>
- <string name="InvFolder Gestures">ジェスチャー</string>
- <string name="InvFolder Favorite">お気に入り</string>
- <string name="InvFolder favorite">お気に入り</string>
- <string name="InvFolder Favorites">お気に入り</string>
- <string name="InvFolder favorites">お気に入り</string>
- <string name="InvFolder Current Outfit">着用中のアウトフィット</string>
- <string name="InvFolder Initial Outfits">最初のアウトフィット</string>
- <string name="InvFolder My Outfits">マイ アウトフィット</string>
- <string name="InvFolder Accessories">アクセサリ</string>
- <string name="InvFolder Meshes">メッシュ</string>
- <string name="InvFolder Received Items">受け取った商品</string>
- <string name="InvFolder Merchant Outbox">マーチャントのアウトボックス</string>
- <string name="InvFolder Friends">フレンド</string>
- <string name="InvFolder All">全員</string>
- <string name="no_attachments">着用しているアタッチメントはありません</string>
- <string name="Attachments remain">アタッチメント(残りのスロット数:[COUNT])</string>
- <string name="Buy">買う</string>
- <string name="BuyforL$">L$ で購入</string>
- <string name="Stone">石</string>
- <string name="Metal">金属</string>
- <string name="Glass">ガラス</string>
- <string name="Wood">木</string>
- <string name="Flesh">肌</string>
- <string name="Plastic">プラスチック</string>
- <string name="Rubber">ゴム</string>
- <string name="Light">ライト</string>
- <string name="KBShift">Shift</string>
- <string name="KBCtrl">Ctrl</string>
- <string name="Chest">胸部</string>
- <string name="Skull">頭蓋</string>
- <string name="Left Shoulder">左肩</string>
- <string name="Right Shoulder">右肩</string>
- <string name="Left Hand">左手</string>
- <string name="Right Hand">右手</string>
- <string name="Left Foot">左足</string>
- <string name="Right Foot">右足</string>
- <string name="Spine">背骨</string>
- <string name="Pelvis">骨盤</string>
- <string name="Mouth">口</string>
- <string name="Chin">あご</string>
- <string name="Left Ear">左耳</string>
- <string name="Right Ear">右耳</string>
- <string name="Left Eyeball">左目眼球</string>
- <string name="Right Eyeball">右目眼球</string>
- <string name="Nose">鼻</string>
- <string name="R Upper Arm">右上腕</string>
- <string name="R Forearm">右前腕</string>
- <string name="L Upper Arm">左上腕</string>
- <string name="L Forearm">左前腕</string>
- <string name="Right Hip">右腰</string>
- <string name="R Upper Leg">右上脚</string>
- <string name="R Lower Leg">右下脚</string>
- <string name="Left Hip">左腰</string>
- <string name="L Upper Leg">左上脚</string>
- <string name="L Lower Leg">左下脚</string>
- <string name="Stomach">腹</string>
- <string name="Left Pec">左胸筋</string>
- <string name="Right Pec">右胸筋</string>
- <string name="Neck">首</string>
- <string name="Avatar Center">アバターの中央</string>
- <string name="Left Ring Finger">左薬指</string>
- <string name="Right Ring Finger">右薬指</string>
- <string name="Tail Base">しっぽのベース</string>
- <string name="Tail Tip">しっぽの先</string>
- <string name="Left Wing">左の翼</string>
- <string name="Right Wing">右の翼</string>
- <string name="Jaw">顎</string>
- <string name="Alt Left Ear">代わりの左耳</string>
- <string name="Alt Right Ear">代わりの右耳</string>
- <string name="Alt Left Eye">代わりの左目</string>
- <string name="Alt Right Eye">代わりの右目</string>
- <string name="Tongue">舌</string>
- <string name="Groin">脚の付け根</string>
- <string name="Left Hind Foot">左後足</string>
- <string name="Right Hind Foot">右後足</string>
- <string name="Invalid Attachment">装着先が正しくありません</string>
- <string name="ATTACHMENT_MISSING_ITEM">エラー:アイテムが見つかりません</string>
- <string name="ATTACHMENT_MISSING_BASE_ITEM">エラー:ベースアイテムが見つかりません</string>
- <string name="ATTACHMENT_NOT_ATTACHED">エラー:オブジェクトは現在のアウトフィット内にありますが、添付されていません</string>
- <string name="YearsMonthsOld">[AGEYEARS] [AGEMONTHS]</string>
- <string name="YearsOld">[AGEYEARS]</string>
- <string name="MonthsOld">[AGEMONTHS]</string>
- <string name="WeeksOld">[AGEWEEKS]</string>
- <string name="DaysOld">[AGEDAYS]</string>
- <string name="TodayOld">今日参加</string>
- <string name="av_render_everyone_now">全員にあなたが見えるようになりました。</string>
- <string name="av_render_not_everyone">あなたのまわりの一部の人には、あなたが見えない可能性があります。</string>
- <string name="av_render_over_half">あなたの周囲の半分以上の人に、あなたが表示されない可能性があります。</string>
- <string name="av_render_most_of">あなたのまわりのほとんどの人に、あなたが見えない可能性があります。</string>
- <string name="av_render_anyone">あなたのまわりの誰にもあなたが見えない可能性があります。</string>
- <string name="hud_description_total">ご利用の HUD</string>
- <string name="hud_name_with_joint">[OBJ_NAME]([JNT_NAME] に装着中)</string>
- <string name="hud_render_memory_warning">[HUD_DETAILS] はたくさんのテクスチャメモリを使用します</string>
- <string name="hud_render_cost_warning">[HUD_DETAILS] には高価なオブジェクトやテクスチャがたくさん含まれています</string>
- <string name="hud_render_heavy_textures_warning">[HUD_DETAILS] は大きなテクスチャがたくさん含まれています</string>
- <string name="hud_render_cramped_warning">[HUD_DETAILS] に含まれるオブジェクトが多すぎます</string>
- <string name="hud_render_textures_warning">[HUD_DETAILS] に含まれるテクスチャが多すぎます</string>
- <string name="AgeYearsA">[COUNT] 年</string>
- <string name="AgeYearsB">[COUNT] 年</string>
- <string name="AgeYearsC">[COUNT] 年</string>
- <string name="AgeMonthsA">[COUNT] ヶ月</string>
- <string name="AgeMonthsB">[COUNT] ヶ月</string>
- <string name="AgeMonthsC">[COUNT] ヶ月</string>
- <string name="AgeWeeksA">[COUNT] 週間</string>
- <string name="AgeWeeksB">[COUNT] 週間</string>
- <string name="AgeWeeksC">[COUNT] 週間</string>
- <string name="AgeDaysA">[COUNT] 日間</string>
- <string name="AgeDaysB">[COUNT] 日間</string>
- <string name="AgeDaysC">[COUNT] 日間</string>
- <string name="GroupMembersA">[COUNT] 人</string>
- <string name="GroupMembersB">[COUNT] 人</string>
- <string name="GroupMembersC">[COUNT] 人</string>
- <string name="AcctTypeResident">住人</string>
- <string name="AcctTypeTrial">トライアル</string>
- <string name="AcctTypeCharterMember">創立メンバー</string>
- <string name="AcctTypeEmployee">Linden Lab 従業員</string>
- <string name="PaymentInfoUsed">支払情報使用履歴あり</string>
- <string name="PaymentInfoOnFile">支払情報登録済</string>
- <string name="NoPaymentInfoOnFile">支払情報未登録</string>
- <string name="AgeVerified">年齢確認済</string>
- <string name="NotAgeVerified">年齢未確認</string>
- <string name="Center 2">中心 2</string>
- <string name="Top Right">右上</string>
- <string name="Top">上部</string>
- <string name="Top Left">左上</string>
- <string name="Center">中心</string>
- <string name="Bottom Left">左下</string>
- <string name="Bottom">下部</string>
- <string name="Bottom Right">右下</string>
- <string name="CompileQueueDownloadedCompiling">ダウンロード完了、コンパイル中</string>
- <string name="CompileQueueServiceUnavailable">スクリプト コンパイル サービスを利用できません</string>
- <string name="CompileQueueScriptNotFound">サーバー上にスクリプトが見つかりません。</string>
- <string name="CompileQueueProblemDownloading">ダウンロードに問題があります</string>
- <string name="CompileQueueInsufficientPermDownload">権限不足のためスクリプトをダウンロードできません。</string>
- <string name="CompileQueueInsufficientPermFor">権限不足:</string>
- <string name="CompileQueueUnknownFailure">原因不明の失敗によりダウンロードができません</string>
- <string name="CompileNoExperiencePerm">[EXPERIENCE] 体験による [SCRIPT] スクリプトのスキップ。</string>
- <string name="CompileQueueTitle">リコンパイル進行</string>
- <string name="CompileQueueStart">リコンパイル</string>
- <string name="ResetQueueTitle">進行をリセット</string>
- <string name="ResetQueueStart">リセット</string>
- <string name="RunQueueTitle">実行を続けるよう設定</string>
- <string name="RunQueueStart">実行中に設定</string>
- <string name="NotRunQueueTitle">実行を停止するよう設定</string>
- <string name="NotRunQueueStart">実行停止に設定</string>
- <string name="CompileSuccessful">コンパイルが完了しました!</string>
- <string name="CompileSuccessfulSaving">コンパイル完了、保存中です...</string>
- <string name="SaveComplete">保存完了。</string>
- <string name="UploadFailed">ファイルのアップロードが失敗しました:</string>
- <string name="ObjectOutOfRange">スクリプト(オブジェクトが範囲外にあります)</string>
- <string name="ScriptWasDeleted">スクリプト(インベントリから削除済み)</string>
- <string name="GodToolsObjectOwnedBy">[OWNER] 所有のオブジェクト「[OBJECT]」</string>
- <string name="GroupsNone">なし</string>
- <string name="Group" value=" (グループ)"/>
- <string name="Unknown">(不明)</string>
+ <string name="No Filters" value="いいえ"/>
+ <string name="Since Logoff" value="–ログオフ以来"/>
+ <string name="InvFolder My Inventory">
+ インベントリ
+ </string>
+ <string name="InvFolder Library">
+ ライブラリ
+ </string>
+ <string name="InvFolder Textures">
+ テクスチャ
+ </string>
+ <string name="InvFolder Sounds">
+ サウンド
+ </string>
+ <string name="InvFolder Calling Cards">
+ コーリングカード
+ </string>
+ <string name="InvFolder Landmarks">
+ ランドマーク
+ </string>
+ <string name="InvFolder Scripts">
+ スクリプト
+ </string>
+ <string name="InvFolder Clothing">
+ 服装
+ </string>
+ <string name="InvFolder Objects">
+ オブジェクト
+ </string>
+ <string name="InvFolder Notecards">
+ ノートカード
+ </string>
+ <string name="InvFolder New Folder">
+ 新規フォルダ
+ </string>
+ <string name="InvFolder Inventory">
+ インベントリ
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ 圧縮されていない画像
+ </string>
+ <string name="InvFolder Body Parts">
+ 身体部位
+ </string>
+ <string name="InvFolder Trash">
+ ごみ箱
+ </string>
+ <string name="InvFolder Photo Album">
+ フォトアルバム
+ </string>
+ <string name="InvFolder Lost And Found">
+ 遺失物
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ 圧縮されていないサウンド
+ </string>
+ <string name="InvFolder Animations">
+ アニメーション
+ </string>
+ <string name="InvFolder Gestures">
+ ジェスチャー
+ </string>
+ <string name="InvFolder Favorite">
+ お気に入り
+ </string>
+ <string name="InvFolder favorite">
+ お気に入り
+ </string>
+ <string name="InvFolder Favorites">
+ お気に入り
+ </string>
+ <string name="InvFolder favorites">
+ お気に入り
+ </string>
+ <string name="InvFolder Current Outfit">
+ 着用中のアウトフィット
+ </string>
+ <string name="InvFolder Initial Outfits">
+ 最初のアウトフィット
+ </string>
+ <string name="InvFolder My Outfits">
+ アウトフィット
+ </string>
+ <string name="InvFolder Accessories">
+ アクセサリ
+ </string>
+ <string name="InvFolder Meshes">
+ メッシュ
+ </string>
+ <string name="InvFolder Received Items">
+ 受け取った商品
+ </string>
+ <string name="InvFolder Merchant Outbox">
+ 販売品ボックス
+ </string>
+ <string name="InvFolder Friends">
+ フレンド
+ </string>
+ <string name="InvFolder All">
+ 全員
+ </string>
+ <string name="no_attachments">
+ 着用している装着物はありません
+ </string>
+ <string name="Attachments remain">
+ 装着物(残りのスロット数:[COUNT])
+ </string>
+ <string name="Buy">
+ 購入
+ </string>
+ <string name="BuyforL$">
+ L$ で購入
+ </string>
+ <string name="Stone">
+ 石
+ </string>
+ <string name="Metal">
+ 金属
+ </string>
+ <string name="Glass">
+ ガラス
+ </string>
+ <string name="Wood">
+ 木
+ </string>
+ <string name="Flesh">
+ 肌
+ </string>
+ <string name="Plastic">
+ プラスチック
+ </string>
+ <string name="Rubber">
+ ゴム
+ </string>
+ <string name="Light">
+ ライト
+ </string>
+ <string name="KBShift">
+ Shift
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ 胸部
+ </string>
+ <string name="Skull">
+ 頭蓋
+ </string>
+ <string name="Left Shoulder">
+ 左肩
+ </string>
+ <string name="Right Shoulder">
+ 右肩
+ </string>
+ <string name="Left Hand">
+ 左手
+ </string>
+ <string name="Right Hand">
+ 右手
+ </string>
+ <string name="Left Foot">
+ 左足
+ </string>
+ <string name="Right Foot">
+ 右足
+ </string>
+ <string name="Spine">
+ 背骨
+ </string>
+ <string name="Pelvis">
+ 骨盤
+ </string>
+ <string name="Mouth">
+ 口
+ </string>
+ <string name="Chin">
+ あご
+ </string>
+ <string name="Left Ear">
+ 左耳
+ </string>
+ <string name="Right Ear">
+ 右耳
+ </string>
+ <string name="Left Eyeball">
+ 左目眼球
+ </string>
+ <string name="Right Eyeball">
+ 右目眼球
+ </string>
+ <string name="Nose">
+ 鼻
+ </string>
+ <string name="R Upper Arm">
+ 右上腕
+ </string>
+ <string name="R Forearm">
+ 右前腕
+ </string>
+ <string name="L Upper Arm">
+ 左上腕
+ </string>
+ <string name="L Forearm">
+ 左前腕
+ </string>
+ <string name="Right Hip">
+ 右腰
+ </string>
+ <string name="R Upper Leg">
+ 右上脚
+ </string>
+ <string name="R Lower Leg">
+ 右下脚
+ </string>
+ <string name="Left Hip">
+ 左腰
+ </string>
+ <string name="L Upper Leg">
+ 左上脚
+ </string>
+ <string name="L Lower Leg">
+ 左下脚
+ </string>
+ <string name="Stomach">
+ 腹
+ </string>
+ <string name="Left Pec">
+ 左胸筋
+ </string>
+ <string name="Right Pec">
+ 右胸筋
+ </string>
+ <string name="Neck">
+ 首
+ </string>
+ <string name="Avatar Center">
+ アバターの中央
+ </string>
+ <string name="Left Ring Finger">
+ 左薬指
+ </string>
+ <string name="Right Ring Finger">
+ 右薬指
+ </string>
+ <string name="Tail Base">
+ しっぽのベース
+ </string>
+ <string name="Tail Tip">
+ しっぽの先
+ </string>
+ <string name="Left Wing">
+ 左の翼
+ </string>
+ <string name="Right Wing">
+ 右の翼
+ </string>
+ <string name="Jaw">
+ 顎
+ </string>
+ <string name="Alt Left Ear">
+ 代わりの左耳
+ </string>
+ <string name="Alt Right Ear">
+ 代わりの右耳
+ </string>
+ <string name="Alt Left Eye">
+ 代わりの左目
+ </string>
+ <string name="Alt Right Eye">
+ 代わりの右目
+ </string>
+ <string name="Tongue">
+ 舌
+ </string>
+ <string name="Groin">
+ 脚の付け根
+ </string>
+ <string name="Left Hind Foot">
+ 左後足
+ </string>
+ <string name="Right Hind Foot">
+ 右後足
+ </string>
+ <string name="Invalid Attachment">
+ 装着先が正しくありません
+ </string>
+ <string name="ATTACHMENT_MISSING_ITEM">
+ エラー:アイテムが見つかりません。
+ </string>
+ <string name="ATTACHMENT_MISSING_BASE_ITEM">
+ エラー:ベースアイテムが見つかりません。
+ </string>
+ <string name="ATTACHMENT_NOT_ATTACHED">
+ エラー:オブジェクトは現在のアウトフィットにありますが、添付されていません。
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS][AGEMONTHS]
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS]
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS]
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS]
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS]
+ </string>
+ <string name="TodayOld">
+ 本日参加
+ </string>
+ <string name="av_render_everyone_now">
+ あなたは、全員から見えるようになりました。
+ </string>
+ <string name="av_render_not_everyone">
+ あなたは、周囲にいる一部の人から、見えない可能性があります。
+ </string>
+ <string name="av_render_over_half">
+ あなたは、周囲にいる半分以上の人から、見えない可能性があります。
+ </string>
+ <string name="av_render_most_of">
+ あなたは、周囲にいるほとんどの人から、見えない可能性があります。
+ </string>
+ <string name="av_render_anyone">
+ あなたは、周囲の誰からも見えていない可能性があります。
+ </string>
+ <string name="hud_description_total">
+ 利用中のHUD
+ </string>
+ <string name="hud_name_with_joint">
+ [OBJ_NAME]([JNT_NAME]に装着中)
+ </string>
+ <string name="hud_render_memory_warning">
+ [HUD_DETAILS]は、大量のテクスチャメモリを使用しています。
+ </string>
+ <string name="hud_render_cost_warning">
+ [HUD_DETAILS]は、計算コストが高いオブジェクトやテクスチャがたくさん含まれています。
+ </string>
+ <string name="hud_render_heavy_textures_warning">
+ [HUD_DETAILS]には、容量が多いテクスチャが使用されています。
+ </string>
+ <string name="hud_render_cramped_warning">
+ [HUD_DETAILS]は、使用されているオブジェクトが多すぎます。
+ </string>
+ <string name="hud_render_textures_warning">
+ [HUD_DETAILS]は、使用されているテクスチャが多すぎます。
+ </string>
+ <string name="AgeYearsA">
+ [COUNT]年
+ </string>
+ <string name="AgeYearsB">
+ [COUNT]年
+ </string>
+ <string name="AgeYearsC">
+ [COUNT]年
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT]ヶ月
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT]ヶ月
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT]ヶ月
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT]週間
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT]週間
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT]週間
+ </string>
+ <string name="AgeDaysA">
+ [COUNT]日間
+ </string>
+ <string name="AgeDaysB">
+ [COUNT]日間
+ </string>
+ <string name="AgeDaysC">
+ [COUNT]日間
+ </string>
+ <string name="GroupMembersA">
+ [COUNT]人
+ </string>
+ <string name="GroupMembersB">
+ [COUNT]人
+ </string>
+ <string name="GroupMembersC">
+ [COUNT]人
+ </string>
+ <string name="AcctTypeResident">
+ 住人
+ </string>
+ <string name="AcctTypeTrial">
+ トライアル
+ </string>
+ <string name="AcctTypeCharterMember">
+ 創立メンバー
+ </string>
+ <string name="AcctTypeEmployee">
+ Linden Lab従業員
+ </string>
+ <string name="PaymentInfoUsed">
+ 支払情報使用履歴あり
+ </string>
+ <string name="PaymentInfoOnFile">
+ 支払情報登録済
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ 支払情報未登録
+ </string>
+ <string name="AgeVerified">
+ 年齢確認済
+ </string>
+ <string name="NotAgeVerified">
+ 年齢未確認
+ </string>
+ <string name="Center 2">
+ 中央2
+ </string>
+ <string name="Top Right">
+ 右上
+ </string>
+ <string name="Top">
+ 上部
+ </string>
+ <string name="Top Left">
+ 左上
+ </string>
+ <string name="Center">
+ 中央
+ </string>
+ <string name="Bottom Left">
+ 左下
+ </string>
+ <string name="Bottom">
+ 下部
+ </string>
+ <string name="Bottom Right">
+ 右下
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ ダウンロードが完了しました。コンパイルしています。
+ </string>
+ <string name="CompileQueueServiceUnavailable">
+ スクリプトのコンパイルサービスを利用できません
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ サーバー上にスクリプトが見つかりません。
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ ダウンロードに問題があります
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ 権限不足のためスクリプトをダウンロードできません。
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ 権限不足:
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ 原因不明の失敗によりダウンロードができません
+ </string>
+ <string name="CompileNoExperiencePerm">
+ [EXPERIENCE]体験による[SCRIPT]スクリプトのスキップ。
+ </string>
+ <string name="CompileQueueTitle">
+ 再コンパイル進行
+ </string>
+ <string name="CompileQueueStart">
+ 再コンパイル
+ </string>
+ <string name="ResetQueueTitle">
+ 進行をリセット
+ </string>
+ <string name="ResetQueueStart">
+ リセット
+ </string>
+ <string name="RunQueueTitle">
+ 実行を続けるよう設定
+ </string>
+ <string name="RunQueueStart">
+ 実行中に設定
+ </string>
+ <string name="NotRunQueueTitle">
+ 実行を停止するよう設定
+ </string>
+ <string name="NotRunQueueStart">
+ 実行停止に設定
+ </string>
+ <string name="CompileSuccessful">
+ コンパイルが完了しました!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ コンパイル完了、保存しています…
+ </string>
+ <string name="SaveComplete">
+ 保存完了。
+ </string>
+ <string name="UploadFailed">
+ ファイルのアップロードが失敗しました:
+ </string>
+ <string name="ObjectOutOfRange">
+ スクリプト(オブジェクトが範囲外にあります)
+ </string>
+ <string name="ScriptWasDeleted">
+ スクリプト(インベントリから削除済み)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ [OWNER]が所有している「[OBJECT]」というオブジェクト
+ </string>
+ <string name="GroupsNone">
+ なし
+ </string>
+ <string name="Group" value="(グループ)"/>
+ <string name="Unknown">
+ (不明)
+ </string>
<string name="SummaryForTheWeek" value="今週のまとめ。開始日は"/>
<string name="NextStipendDay" value="です。次回のお小遣い支給日:"/>
- <string name="GroupPlanningDate">[year,datetime,utc]/[mthnum,datetime,utc]/[day,datetime,utc]</string>
- <string name="GroupIndividualShare" value=" グループ 個人の割り当て"/>
+ <string name="GroupPlanningDate">
+ [year,datetime,utc]年[mthnum,datetime,utc]月[day,datetime,utc]日
+ </string>
+ <string name="GroupIndividualShare" value="グループ 個人の割り当て"/>
<string name="GroupColumn" value="グループの設定"/>
- <string name="Balance">残高</string>
- <string name="Credits">収入</string>
- <string name="Debits">支出</string>
- <string name="Total">合計</string>
- <string name="NoGroupDataFound">グループのデータが見つかりませんでした</string>
- <string name="IMParentEstate">parent estate</string>
- <string name="IMMainland">メインランド</string>
- <string name="IMTeen">ティーン</string>
- <string name="Anyone">全員</string>
- <string name="RegionInfoError">エラー</string>
- <string name="RegionInfoAllEstatesOwnedBy">[OWNER] が所有するすべての不動産</string>
- <string name="RegionInfoAllEstatesYouOwn">あなたが所有するすべての不動産</string>
- <string name="RegionInfoAllEstatesYouManage">あなたが [OWNER] のために管理するすべての不動産</string>
- <string name="RegionInfoAllowedResidents">常に許可:([ALLOWEDAGENTS] 人、最大 [MAXACCESS] 人)</string>
- <string name="RegionInfoAllowedGroups">グループを常に許可:([ALLOWEDGROUPS]、最大 [MAXACCESS])</string>
- <string name="RegionInfoBannedResidents">常に禁止:([BANNEDAGENTS] 人、最大 [MAXBANNED] 人)</string>
- <string name="RegionInfoListTypeAllowedAgents">常に許可</string>
- <string name="RegionInfoListTypeBannedAgents">常に禁止</string>
- <string name="RegionInfoAllEstates">すべての不動産</string>
- <string name="RegionInfoManagedEstates">管理されている不動産</string>
- <string name="RegionInfoThisEstate">この不動産</string>
- <string name="AndNMore">および [EXTRA_COUNT] つの不動産</string>
- <string name="ScriptLimitsParcelScriptMemory">区画スクリプトメモリ</string>
- <string name="ScriptLimitsParcelsOwned">区画一覧: [PARCELS]</string>
- <string name="ScriptLimitsMemoryUsed">使用されたメモリ: [MAX] kb 中 [COUNT] kb:[AVAILABLE] kb 利用可</string>
- <string name="ScriptLimitsMemoryUsedSimple">使用されたメモリ: [COUNT] kb</string>
- <string name="ScriptLimitsParcelScriptURLs">区画のスクリプトURL</string>
- <string name="ScriptLimitsURLsUsed">使用された URL: [MAX] 中 [COUNT] :[AVAILABLE] 利用可</string>
- <string name="ScriptLimitsURLsUsedSimple">使用された URL: [COUNT]</string>
- <string name="ScriptLimitsRequestError">情報のリクエスト中にエラーが発生しました</string>
- <string name="ScriptLimitsRequestNoParcelSelected">区画が選択されていません。</string>
- <string name="ScriptLimitsRequestWrongRegion">エラー: スクリプト情報は現在地のみ取得できます</string>
- <string name="ScriptLimitsRequestWaiting">情報を取得中...</string>
- <string name="ScriptLimitsRequestDontOwnParcel">この区画を調査する権限がありません。</string>
- <string name="SITTING_ON">着席中</string>
- <string name="ATTACH_CHEST">胸部</string>
- <string name="ATTACH_HEAD">頭蓋</string>
- <string name="ATTACH_LSHOULDER">左肩</string>
- <string name="ATTACH_RSHOULDER">右肩</string>
- <string name="ATTACH_LHAND">左手</string>
- <string name="ATTACH_RHAND">右手</string>
- <string name="ATTACH_LFOOT">左足</string>
- <string name="ATTACH_RFOOT">右足</string>
- <string name="ATTACH_BACK">背骨</string>
- <string name="ATTACH_PELVIS">骨盤</string>
- <string name="ATTACH_MOUTH">口</string>
- <string name="ATTACH_CHIN">あご</string>
- <string name="ATTACH_LEAR">左耳</string>
- <string name="ATTACH_REAR">右耳</string>
- <string name="ATTACH_LEYE">左目</string>
- <string name="ATTACH_REYE">右目</string>
- <string name="ATTACH_NOSE">鼻</string>
- <string name="ATTACH_RUARM">右腕(上)</string>
- <string name="ATTACH_RLARM">右前腕</string>
- <string name="ATTACH_LUARM">左腕(上)</string>
- <string name="ATTACH_LLARM">左前腕</string>
- <string name="ATTACH_RHIP">右腰</string>
- <string name="ATTACH_RULEG">右脚(上)</string>
- <string name="ATTACH_RLLEG">右脚(下)</string>
- <string name="ATTACH_LHIP">左腰</string>
- <string name="ATTACH_LULEG">左脚(上)</string>
- <string name="ATTACH_LLLEG">左脚(下)</string>
- <string name="ATTACH_BELLY">腹</string>
- <string name="ATTACH_LEFT_PEC">左胸筋</string>
- <string name="ATTACH_RIGHT_PEC">右胸筋</string>
- <string name="ATTACH_HUD_CENTER_2">HUD(中央 2)</string>
- <string name="ATTACH_HUD_TOP_RIGHT">HUD(右上)</string>
- <string name="ATTACH_HUD_TOP_CENTER">HUD(上・中央)</string>
- <string name="ATTACH_HUD_TOP_LEFT">HUD(左上)</string>
- <string name="ATTACH_HUD_CENTER_1">HUD(中央 1)</string>
- <string name="ATTACH_HUD_BOTTOM_LEFT">HUD(左下)</string>
- <string name="ATTACH_HUD_BOTTOM">HUD(下)</string>
- <string name="ATTACH_HUD_BOTTOM_RIGHT">HUD(右下)</string>
- <string name="ATTACH_NECK">首</string>
- <string name="ATTACH_AVATAR_CENTER">アバターの中央</string>
- <string name="ATTACH_LHAND_RING1">左薬指</string>
- <string name="ATTACH_RHAND_RING1">右薬指</string>
- <string name="ATTACH_TAIL_BASE">しっぽのベース</string>
- <string name="ATTACH_TAIL_TIP">しっぽの先</string>
- <string name="ATTACH_LWING">左の翼</string>
- <string name="ATTACH_RWING">右の翼</string>
- <string name="ATTACH_FACE_JAW">顎</string>
- <string name="ATTACH_FACE_LEAR">代わりの左耳</string>
- <string name="ATTACH_FACE_REAR">代わりの右耳</string>
- <string name="ATTACH_FACE_LEYE">代わりの左目</string>
- <string name="ATTACH_FACE_REYE">代わりの右目</string>
- <string name="ATTACH_FACE_TONGUE">舌</string>
- <string name="ATTACH_GROIN">脚の付け根</string>
- <string name="ATTACH_HIND_LFOOT">左後足</string>
- <string name="ATTACH_HIND_RFOOT">右後足</string>
- <string name="CursorPos">[LINE] 行目、[COLUMN] 列目</string>
- <string name="PanelDirCountFound">[COUNT] 件見つかりました</string>
- <string name="PanelDirTimeStr">[hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]</string>
- <string name="PanelDirEventsDateText">[mthnum,datetime,slt]/[day,datetime,slt]</string>
- <string name="PanelContentsTooltip">オブジェクトの中身</string>
- <string name="PanelContentsNewScript">新規スクリプト</string>
- <string name="DoNotDisturbModeResponseDefault">この住民が「通知を受けない」をオンにすると、あなたのメッセージが後で表示されるようになります。</string>
- <string name="MuteByName">(名称別)</string>
- <string name="MuteAgent">(住人)</string>
- <string name="MuteObject">(オブジェクト)</string>
- <string name="MuteGroup">(グループ)</string>
- <string name="MuteExternal">(外部)</string>
- <string name="RegionNoCovenant">この不動産には約款がありません。</string>
- <string name="RegionNoCovenantOtherOwner">この不動産には約款がありません。 この不動産上の土地は不動産所有者により販売され、Linden Lab は販売しません。 販売に関するお問い合わせは、不動産所有者までお願い致します。</string>
- <string name="covenant_last_modified" value="最終修正日:"/>
- <string name="none_text" value=" (なし) "/>
- <string name="never_text" value=" (無) "/>
- <string name="GroupOwned">グループ所有</string>
- <string name="Public">パブリック</string>
- <string name="LocalSettings">ローカル設定</string>
- <string name="RegionSettings">リージョン(地域)の設定</string>
- <string name="NoEnvironmentSettings">このリージョンは環境設定をサポートしていません。</string>
- <string name="EnvironmentSun">太陽</string>
- <string name="EnvironmentMoon">月</string>
- <string name="EnvironmentBloom">花</string>
- <string name="EnvironmentCloudNoise">雲の音</string>
- <string name="EnvironmentNormalMap">ノーマル・マップ</string>
- <string name="EnvironmentTransparent">Transparent</string>
- <string name="ClassifiedClicksTxt">クリック数: [TELEPORT] テレポート、 [MAP] 地図、 [PROFILE] プロフィール</string>
- <string name="ClassifiedUpdateAfterPublish">(掲載後更新)</string>
- <string name="NoPicksClassifiedsText">ピックやクラシファイド広告を作成していません。 作成するには、下にある「プラス」ボタンをクリックします。</string>
- <string name="NoPicksText">ピックを作成していません。[新規] ボタンをクリックしてピックを作成する。</string>
- <string name="NoClassifiedsText">クラシファイド広告を作成していません。[新規] ボタンをクリックしてクラシファイド広告を作成する。</string>
- <string name="NoAvatarPicksClassifiedsText">ピック、またはクラシファイド広告がありません</string>
- <string name="NoAvatarPicksText">ピックがありません</string>
- <string name="NoAvatarClassifiedsText">クラシファイド広告がありません</string>
- <string name="PicksClassifiedsLoadingText">ローディング...</string>
- <string name="MultiPreviewTitle">プレビュー</string>
- <string name="MultiPropertiesTitle">プロパティ</string>
- <string name="InvOfferAnObjectNamed">オブジェクト名</string>
- <string name="InvOfferOwnedByGroup">所有グループ</string>
- <string name="InvOfferOwnedByUnknownGroup">不明なグループ所有</string>
- <string name="InvOfferOwnedBy">所有者</string>
- <string name="InvOfferOwnedByUnknownUser">不明なユーザー所有</string>
- <string name="InvOfferGaveYou">が渡しました</string>
- <string name="InvOfferDecline">&lt;nolink&gt;[NAME]&lt;/nolink&gt; からの [DESC] を拒否しました。</string>
- <string name="GroupMoneyTotal">合計</string>
- <string name="GroupMoneyBought">購入:</string>
- <string name="GroupMoneyPaidYou">あなたに支払い:</string>
- <string name="GroupMoneyPaidInto">paid into</string>
- <string name="GroupMoneyBoughtPassTo">入場許可を購入:</string>
- <string name="GroupMoneyPaidFeeForEvent">がイベント用の費用を支払いました</string>
- <string name="GroupMoneyPaidPrizeForEvent">がイベント用の賞金を支払いました</string>
- <string name="GroupMoneyBalance">残高</string>
- <string name="GroupMoneyCredits">収入</string>
- <string name="GroupMoneyDebits">支出</string>
- <string name="GroupMoneyDate">[year,datetime,utc]年[mth,datetime,utc]月[day,datetime,utc]日[weekday,datetime,utc]</string>
- <string name="AcquiredItems">取得アイテム</string>
- <string name="Cancel">キャンセル</string>
- <string name="UploadingCosts">[NAME] のアップロード料金は L$[AMOUNT] です</string>
- <string name="BuyingCosts">これを L$[AMOUNT] で購入します</string>
- <string name="UnknownFileExtension">不明の拡張子: %s
-使用可能な拡張子: .wav, .tga, .bmp, .jpg, .jpeg, or .bvh</string>
- <string name="MuteObject2">ブロック</string>
- <string name="MuteAvatar">ブロック</string>
- <string name="UnmuteObject">ブロック解除</string>
- <string name="UnmuteAvatar">ブロック解除</string>
- <string name="AddLandmarkNavBarMenu">マイ ランドマークに追加...</string>
- <string name="EditLandmarkNavBarMenu">マイ ランドマークを編集...</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">ファイルが保存されました</string>
- <string name="Receiving">取得中</string>
- <string name="AM">AM</string>
- <string name="PM">PM</string>
- <string name="PST">太平洋標準時</string>
- <string name="PDT">太平洋夏時間</string>
- <string name="Direction_Forward">前</string>
- <string name="Direction_Left">左</string>
- <string name="Direction_Right">右</string>
- <string name="Direction_Back">戻る</string>
- <string name="Direction_North">北</string>
- <string name="Direction_South">南</string>
- <string name="Direction_West">西</string>
- <string name="Direction_East">東</string>
- <string name="Direction_Up">上</string>
- <string name="Direction_Down">下</string>
- <string name="Any Category">全カテゴリ</string>
- <string name="Shopping">ショッピング</string>
- <string name="Land Rental">土地のレンタル</string>
- <string name="Property Rental">プロパティのレンタル</string>
- <string name="Special Attraction">特別アトラクション</string>
- <string name="New Products">新製品</string>
- <string name="Employment">雇用</string>
- <string name="Wanted">求む</string>
- <string name="Service">サービス</string>
- <string name="Personal">パーソナル</string>
- <string name="None">なし</string>
- <string name="Linden Location">Linden 所在地</string>
- <string name="Adult">Adult</string>
- <string name="Arts&amp;Culture">アートとカルチャー</string>
- <string name="Business">ビジネス</string>
- <string name="Educational">教育的</string>
- <string name="Gaming">ゲーム</string>
- <string name="Hangout">たまり場</string>
- <string name="Newcomer Friendly">新住人に優しい</string>
- <string name="Parks&amp;Nature">公園と自然</string>
- <string name="Residential">住宅用</string>
- <string name="Stage">ステージ</string>
- <string name="Other">その他</string>
- <string name="Rental">レンタル</string>
- <string name="Any">全員</string>
- <string name="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="'">'</string>
- <string name="---">---</string>
- <string name="Multiple Media">複数のメディア</string>
- <string name="Play Media">メディアを再生/一時停止</string>
- <string name="IntelDriverPage">http://www.intel.com/p/en_US/support/detect/graphics</string>
- <string name="NvidiaDriverPage">http://www.nvidia.com/Download/index.aspx?lang=en-us</string>
- <string name="AMDDriverPage">http://support.amd.com/us/Pages/AMDSupportHub.aspx</string>
- <string name="MBCmdLineError">コマンドラインにエラーが見つかりました。
-リンク先を参照してください: http://wiki.secondlife.com/wiki/Client_parameters
-エラー:</string>
- <string name="MBCmdLineUsg">[APP_NAME] コマンドライン使用:</string>
- <string name="MBUnableToAccessFile">[APP_NAME] は必要なファイルにアクセスできません。
+ <string name="Balance">
+ 残高
+ </string>
+ <string name="Credits">
+ 収入
+ </string>
+ <string name="Debits">
+ 支出
+ </string>
+ <string name="Total">
+ 合計
+ </string>
+ <string name="NoGroupDataFound">
+ グループのデータが見つかりませんでした。
+ </string>
+ <string name="IMParentEstate">
+ 親の不動産
+ </string>
+ <string name="IMMainland">
+ メインランド
+ </string>
+ <string name="IMTeen">
+ ティーン
+ </string>
+ <string name="Anyone">
+ 全員
+ </string>
+ <string name="RegionInfoError">
+ エラー
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ [OWNER]が所有するすべての不動産
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ あなたが所有するすべての不動産
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ あなたが[OWNER]のために管理するすべての不動産
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ 常に許可:([ALLOWEDAGENTS]人、最大[MAXACCESS]人)
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ グループを常に許可:([ALLOWEDGROUPS]、最大[MAXACCESS])
+ </string>
+ <string name="RegionInfoBannedResidents">
+ 常に禁止:([BANNEDAGENTS]人、最大[MAXBANNED]人)
+ </string>
+ <string name="RegionInfoListTypeAllowedAgents">
+ 常に許可
+ </string>
+ <string name="RegionInfoListTypeBannedAgents">
+ 常に禁止
+ </string>
+ <string name="RegionInfoAllEstates">
+ すべての不動産
+ </string>
+ <string name="RegionInfoManagedEstates">
+ 管理されている不動産
+ </string>
+ <string name="RegionInfoThisEstate">
+ この不動産
+ </string>
+ <string name="AndNMore">
+ および[EXTRA_COUNT]つの不動産
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ 区画スクリプトメモリ
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ 区画一覧:[PARCELS]個
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ 使用されたメモリ:[MAX]㎅中[COUNT]㎅ [AVAILABLE]㎅利用可
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ 使用されたメモリ:[COUNT]㎅
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ 区画のスクリプトURL
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ 使用されたURL:[MAX]件中[COUNT]件 [AVAILABLE]件利用可
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ 使用されたURL:[COUNT]件
+ </string>
+ <string name="ScriptLimitsRequestError">
+ 情報のリクエスト中にエラーが発生しました
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ 区画が選択されていません。
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ エラー:スクリプト情報は現在地のみ取得できます
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ 情報を取得中…
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ この区画を調査する権限がありません。
+ </string>
+ <string name="SITTING_ON">
+ 着席中
+ </string>
+ <string name="ATTACH_CHEST">
+ 胸部
+ </string>
+ <string name="ATTACH_HEAD">
+ 頭頂部
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ 左肩
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ 右肩
+ </string>
+ <string name="ATTACH_LHAND">
+ 左手
+ </string>
+ <string name="ATTACH_RHAND">
+ 右手
+ </string>
+ <string name="ATTACH_LFOOT">
+ 左足
+ </string>
+ <string name="ATTACH_RFOOT">
+ 右足
+ </string>
+ <string name="ATTACH_BACK">
+ 背骨
+ </string>
+ <string name="ATTACH_PELVIS">
+ 骨盤
+ </string>
+ <string name="ATTACH_MOUTH">
+ 口
+ </string>
+ <string name="ATTACH_CHIN">
+ あご
+ </string>
+ <string name="ATTACH_LEAR">
+ 左耳
+ </string>
+ <string name="ATTACH_REAR">
+ 右耳
+ </string>
+ <string name="ATTACH_LEYE">
+ 左目
+ </string>
+ <string name="ATTACH_REYE">
+ 右目
+ </string>
+ <string name="ATTACH_NOSE">
+ 鼻
+ </string>
+ <string name="ATTACH_RUARM">
+ 右上腕
+ </string>
+ <string name="ATTACH_RLARM">
+ 右前腕
+ </string>
+ <string name="ATTACH_LUARM">
+ 左上腕
+ </string>
+ <string name="ATTACH_LLARM">
+ 左前腕
+ </string>
+ <string name="ATTACH_RHIP">
+ 右腰
+ </string>
+ <string name="ATTACH_RULEG">
+ 右脚(上)
+ </string>
+ <string name="ATTACH_RLLEG">
+ 右脚(下)
+ </string>
+ <string name="ATTACH_LHIP">
+ 左腰
+ </string>
+ <string name="ATTACH_LULEG">
+ 左脚(上)
+ </string>
+ <string name="ATTACH_LLLEG">
+ 左脚(下)
+ </string>
+ <string name="ATTACH_BELLY">
+ 腹
+ </string>
+ <string name="ATTACH_LEFT_PEC">
+ 左胸筋
+ </string>
+ <string name="ATTACH_RIGHT_PEC">
+ 右胸筋
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD(中央 2)
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD(右上)
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD(上・中央)
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD(左上)
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD(中央 1)
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ HUD(左下)
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ HUD(下)
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ HUD(右下)
+ </string>
+ <string name="ATTACH_NECK">
+ 首
+ </string>
+ <string name="ATTACH_AVATAR_CENTER">
+ アバターの中央
+ </string>
+ <string name="ATTACH_LHAND_RING1">
+ 左薬指
+ </string>
+ <string name="ATTACH_RHAND_RING1">
+ 右薬指
+ </string>
+ <string name="ATTACH_TAIL_BASE">
+ しっぽのベース
+ </string>
+ <string name="ATTACH_TAIL_TIP">
+ しっぽの先
+ </string>
+ <string name="ATTACH_LWING">
+ 左の翼
+ </string>
+ <string name="ATTACH_RWING">
+ 右の翼
+ </string>
+ <string name="ATTACH_FACE_JAW">
+ 顎
+ </string>
+ <string name="ATTACH_FACE_LEAR">
+ 代わりの左耳
+ </string>
+ <string name="ATTACH_FACE_REAR">
+ 代わりの右耳
+ </string>
+ <string name="ATTACH_FACE_LEYE">
+ 代わりの左目
+ </string>
+ <string name="ATTACH_FACE_REYE">
+ 代わりの右目
+ </string>
+ <string name="ATTACH_FACE_TONGUE">
+ 舌
+ </string>
+ <string name="ATTACH_GROIN">
+ 脚の付け根
+ </string>
+ <string name="ATTACH_HIND_LFOOT">
+ 左後足
+ </string>
+ <string name="ATTACH_HIND_RFOOT">
+ 右後足
+ </string>
+ <string name="CursorPos">
+ [LINE]行目、[COLUMN]列目
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT]件見つかりました
+ </string>
+ <string name="PanelDirTimeStr">
+ [ampm,datetime,utc] [hour12,datetime,utc]:[min,datetime,utc]
+ </string>
+ <string name="PanelDirEventsDateText">
+ [mthnum,datetime,slt]/[day,datetime,slt]
+ </string>
+ <string name="PanelContentsTooltip">
+ オブジェクトの中身
+ </string>
+ <string name="PanelContentsNewScript">
+ 新規スクリプト
+ </string>
+ <string name="DoNotDisturbModeResponseDefault">
+ この住民が「着信拒否」をオンにすると、あなたのメッセージが後で表示されるようになります。
+ </string>
+ <string name="MuteByName">
+ (名前で)
+ </string>
+ <string name="MuteAgent">
+ (住人)
+ </string>
+ <string name="MuteObject">
+ (オブジェクト)
+ </string>
+ <string name="MuteGroup">
+ (グループ)
+ </string>
+ <string name="MuteExternal">
+ (外部)
+ </string>
+ <string name="RegionNoCovenant">
+ この不動産には約款がありません。
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ この不動産には約款がありません。この不動産上の土地は不動産所有者により販売され、Linden Labは販売しません。販売に関するお問い合わせは、不動産所有者までお願い致します。
+ </string>
+ <string name="covenant_last_modified" value="最終更新日:"/>
+ <string name="none_text" value="(なし)"/>
+ <string name="never_text" value="(無)"/>
+ <string name="GroupOwned">
+ グループ所有
+ </string>
+ <string name="Public">
+ 公共
+ </string>
+ <string name="LocalSettings">
+ ローカル設定
+ </string>
+ <string name="RegionSettings">
+ リージョン(地域)の設定
+ </string>
+ <string name="NoEnvironmentSettings">
+ このリージョンは環境設定をサポートしていません。
+ </string>
+ <string name="EnvironmentSun">
+ 太陽
+ </string>
+ <string name="EnvironmentMoon">
+ 月
+ </string>
+ <string name="EnvironmentBloom">
+ 花
+ </string>
+ <string name="EnvironmentCloudNoise">
+ 雲の音
+ </string>
+ <string name="EnvironmentNormalMap">
+ ノーマル・マップ
+ </string>
+ <string name="EnvironmentTransparent">
+ 透過
+ </string>
+ <string name="ClassifiedClicksTxt">
+ クリック数:[TELEPORT]テレポート、[MAP]マップ、[PROFILE]プロフィール
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (掲載後更新)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ ピックやクラシファイド広告を作成していません。作成するには、下にある「+」ボタンをクリックします。
+ </string>
+ <string name="NoPicksText">
+ ピックを作成していません。「新規」ボタンをクリックしてピックを作成する。
+ </string>
+ <string name="NoClassifiedsText">
+ クラシファイド広告を作成していません。「新規」ボタンをクリックしてクラシファイド広告を作成する。
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ ピック、またはクラシファイド広告がありません
+ </string>
+ <string name="NoAvatarPicksText">
+ ピックがありません
+ </string>
+ <string name="NoAvatarClassifiedsText">
+ クラシファイド広告がありません
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ 読み込んでいます…
+ </string>
+ <string name="MultiPreviewTitle">
+ プレビュー
+ </string>
+ <string name="MultiPropertiesTitle">
+ プロパティ
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ オブジェクト名
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ グループが所有している
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ 不明なグループが所有している
+ </string>
+ <string name="InvOfferOwnedBy">
+ が所有している
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ 不明なユーザーが所有している
+ </string>
+ <string name="InvOfferGaveYou">
+ を渡してきました。
+ </string>
+ <string name="InvOfferDecline">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt;からの[DESC]を拒否しました。
+ </string>
+ <string name="GroupMoneyTotal">
+ 合計
+ </string>
+ <string name="GroupMoneyBought">
+ 購入:
+ </string>
+ <string name="GroupMoneyPaidYou">
+ あなたに支払い:
+ </string>
+ <string name="GroupMoneyPaidInto">
+ 支払情報
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ 入場許可を購入:
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ が、イベントの費用を支払いました。
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ が、イベントの賞金を支払いました。
+ </string>
+ <string name="GroupMoneyBalance">
+ 残高
+ </string>
+ <string name="GroupMoneyCredits">
+ 収入
+ </string>
+ <string name="GroupMoneyDebits">
+ 支出
+ </string>
+ <string name="GroupMoneyDate">
+ [year,datetime,utc]年[mth,datetime,utc]月[day,datetime,utc]日 [weekday,datetime,utc]
+ </string>
+ <string name="AcquiredItems">
+ 取得アイテム
+ </string>
+ <string name="Cancel">
+ キャンセル
+ </string>
+ <string name="UploadingCosts">
+ [NAME]のアップロード料金は L$ [AMOUNT]です。
+ </string>
+ <string name="BuyingCosts">
+ これをL$ [AMOUNT]で購入します。
+ </string>
+ <string name="UnknownFileExtension">
+ 不明な拡張子:%s
+使用可能な拡張子:.wav,.tga,.bmp,.jpg,.jpeg,.bvh
+ </string>
+ <string name="MuteObject2">
+ オブジェクトのブロック
+ </string>
+ <string name="MuteAvatar">
+ アバターのブロック
+ </string>
+ <string name="UnmuteObject">
+ オブジェクトのブロック解除
+ </string>
+ <string name="UnmuteAvatar">
+ アバターのブロック解除
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ ランドマークに追加…
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ ランドマークを編集…
+ </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">
+ ファイルが保存されました。
+ </string>
+ <string name="Receiving">
+ 取得中
+ </string>
+ <string name="AM">
+ 午前
+ </string>
+ <string name="PM">
+ 午後
+ </string>
+ <string name="PST">
+ 太平洋標準時
+ </string>
+ <string name="PDT">
+ 太平洋夏時間
+ </string>
+ <string name="Direction_Forward">
+ 前
+ </string>
+ <string name="Direction_Left">
+ 左
+ </string>
+ <string name="Direction_Right">
+ 右
+ </string>
+ <string name="Direction_Back">
+ 後
+ </string>
+ <string name="Direction_North">
+ 北
+ </string>
+ <string name="Direction_South">
+ 南
+ </string>
+ <string name="Direction_West">
+ 西
+ </string>
+ <string name="Direction_East">
+ 東
+ </string>
+ <string name="Direction_Up">
+ 上
+ </string>
+ <string name="Direction_Down">
+ 下
+ </string>
+ <string name="Any Category">
+ 全カテゴリ
+ </string>
+ <string name="Shopping">
+ ショッピング
+ </string>
+ <string name="Land Rental">
+ 土地のレンタル
+ </string>
+ <string name="Property Rental">
+ プロパティのレンタル
+ </string>
+ <string name="Special Attraction">
+ 特別なアトラクション
+ </string>
+ <string name="New Products">
+ 新製品
+ </string>
+ <string name="Employment">
+ 雇用
+ </string>
+ <string name="Wanted">
+ 求む
+ </string>
+ <string name="Service">
+ サービス
+ </string>
+ <string name="Personal">
+ パーソナル
+ </string>
+ <string name="None">
+ なし
+ </string>
+ <string name="Linden Location">
+ Linden 所在地
+ </string>
+ <string name="Adult">
+ 成人向け
+ </string>
+ <string name="Arts&amp;Culture">
+ 芸術と文化
+ </string>
+ <string name="Business">
+ ビジネス
+ </string>
+ <string name="Educational">
+ 教育
+ </string>
+ <string name="Gaming">
+ ゲーム
+ </string>
+ <string name="Hangout">
+ たまり場
+ </string>
+ <string name="Newcomer Friendly">
+ 新規住民歓迎
+ </string>
+ <string name="Parks&amp;Nature">
+ 公園と自然
+ </string>
+ <string name="Residential">
+ 住宅用
+ </string>
+ <string name="Stage">
+ ステージ
+ </string>
+ <string name="Other">
+ その他
+ </string>
+ <string name="Rental">
+ レンタル
+ </string>
+ <string name="Any">
+ 全員
+ </string>
+ <string name="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="'">
+ '
+ </string>
+ <string name="---">
+ ─
+ </string>
+ <string name="Multiple Media">
+ 複数のメディア
+ </string>
+ <string name="Play Media">
+ メディアの再生/一時停止
+ </string>
+ <string name="IntelDriverPage">
+ https://www.intel.co.jp/content/www/jp/ja/support/detect.html
+ </string>
+ <string name="NvidiaDriverPage">
+ https://www.nvidia.com/Download/index.aspx?lang=ja-jp
+ </string>
+ <string name="AMDDriverPage">
+ https://www.amd.com/ja/support
+ </string>
+ <string name="MBCmdLineError">
+ コマンドラインにエラーが見つかりました。
+リンク先を参照してください:https://wiki.secondlife.com/wiki/%E3%83%93%E3%83%A5%E3%83%BC%E3%83%AF%E5%BC%95%E6%95%B0
+エラー:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME]コマンドライン使用:
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME]は必要なファイルにアクセスできません。
複数のコピーを実行中か、ファイルが既に開いているとあなたのシステムが誤認識している可能性があります。
このメッセージが何度も出る場合は、コンピューターを再起動してもう一度お試しください。
-それでも問題が続く場合、[APP_NAME] を完全にアンインストールして、再インストールをしてください。</string>
- <string name="MBFatalError">致命的なエラー</string>
- <string name="MBRequiresAltiVec">[APP_NAME] は、AltiVec搭載のプロセッサが必要です。(G4 以降)</string>
- <string name="MBAlreadyRunning">[APP_NAME] はすでに実行中です。
+それでも問題が続く場合、[APP_NAME]を完全にアンインストールして、再インストールをしてください。
+ </string>
+ <string name="MBFatalError">
+ 致命的なエラー
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME]は、AltiVec搭載のプロセッサが必要です。(G4 以降)
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME]はすでに実行中です。
最小化されたプログラムのコピーをタスクバーで確認してください。
-このメッセージが何度も出る場合はコンピューターを再起動してください。</string>
- <string name="MBFrozenCrashed">[APP_NAME] は前回の実行時にフリーズしています。
-クラッシュ報告を送信しますか?</string>
- <string name="MBAlert">通知</string>
- <string name="MBNoDirectX">[APP_NAME] は DirectX 9.0b 及びそれ以降のバージョンを検出することができませんでした。
-[APP_NAME] は DirectX を使用して安定性の問題、低パフォーマンス、クラッシュ等悪影響を与えるハードウェアや古いドライバを検出します。 DirectX 9.0b がなくても [APP_NAME] を実行できますが、DirectX 9.0bとのご使用を強く推奨します。
+このメッセージが何度も出る場合はコンピューターを再起動してください。
+ </string>
+ <string name="MBFrozenCrashed">
+ [APP_NAME]は前回の実行時にフリーズしています。
+クラッシュ報告を送信しますか?
+ </string>
+ <string name="MBAlert">
+ 通知
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME]は、DirectX 9.0b及びそれ以降のバージョンを検出することができませんでした。
+[APP_NAME]は DirectX を使用して安定性の問題、低パフォーマンス、クラッシュ等悪影響を与えるハードウェアや古いドライバを検出します。DirectX 9.0b がなくても
+[APP_NAME]を実行できますが、DirectX 9.0bとのご使用を強く推奨します。
-続けますか?</string>
- <string name="MBWarning">警告</string>
- <string name="MBNoAutoUpdate">自動更新は現在 Linux には対応していません。
-www.secondlife.com から最新バージョンをダウンロードしてください。</string>
- <string name="MBRegClassFailed">RegisterClass 失敗</string>
- <string name="MBError">エラー</string>
- <string name="MBFullScreenErr">[WIDTH] x [HEIGHT] では全画面で実行することができません。
-ウィンドウモードで実行中です。</string>
- <string name="MBDestroyWinFailed">シャットダウンエラー(DestroyWindow() 失敗)</string>
- <string name="MBShutdownErr">シャットダウンエラー</string>
- <string name="MBDevContextErr">GL ディバイスコンテキストが作れません</string>
- <string name="MBPixelFmtErr">適切なピクセル形式が見つかりません</string>
- <string name="MBPixelFmtDescErr">ピクセル形式情報が見つかりません</string>
- <string name="MBTrueColorWindow">[APP_NAME] を実行するには、True Color (32ビット)が必要です。
-お使いのコンピューターの「コントロールパネル」>「画面」>「設定」に行き、「最高 (32 ビット)」に設定してください。</string>
- <string name="MBAlpha">[APP_NAME] は 8 ビットのアルファチャンネルを取得できないため実行できません。 通常ビデオカードのドライバの問題で起こります。
+続けますか?
+ </string>
+ <string name="MBWarning">
+ 警告
+ </string>
+ <string name="MBNoAutoUpdate">
+ 自動更新は現在 Linux には対応していません。
+www.secondlife.com から最新バージョンをダウンロードしてください。
+ </string>
+ <string name="MBRegClassFailed">
+ RegisterClass 失敗
+ </string>
+ <string name="MBError">
+ エラー
+ </string>
+ <string name="MBFullScreenErr">
+ [WIDTH]✕[HEIGHT]では全画面で実行することができません。
+ウィンドウモードで実行中です。
+ </string>
+ <string name="MBDestroyWinFailed">
+ シャットダウンエラー(DestroyWindow() 失敗)
+ </string>
+ <string name="MBShutdownErr">
+ シャットダウンエラー
+ </string>
+ <string name="MBDevContextErr">
+ GL ディバイスコンテキストが作れません
+ </string>
+ <string name="MBPixelFmtErr">
+ 適切なピクセル形式が見つかりません
+ </string>
+ <string name="MBPixelFmtDescErr">
+ ピクセル形式情報が見つかりません
+ </string>
+ <string name="MBTrueColorWindow">
+ [APP_NAME]を実行するには、True Color(32ビット)が必要です。
+お使いのコンピューターの「コントロールパネル」>「画面」>「設定」に行き、「最高 (32ビット)」に設定してください。
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME]は8ビットのアルファチャンネルを取得できないため実行できません。通常ビデオカードのドライバの問題で起こります。
お使いのコンピューターに最新のビデオカードドライバがインストールされているかご確認ください。
-また、「コントロールパネル」>「画面」>「設定」内で、モニターが「最高 (32 ビット)」に設定されていることもご確認ください。
-このメッセージが何度も出る場合は、[SUPPORT_SITE] へご連絡ください。</string>
- <string name="MBPixelFmtSetErr">ピクセル形式が設定できません</string>
- <string name="MBGLContextErr">GL レンダーコンテキストが作れません</string>
- <string name="MBGLContextActErr">GL レンダーコンテキストをアクティベートできません</string>
- <string name="MBVideoDrvErr">お使いのコンピューターのビデオカードドライバが正常にインストールできなかった、または古いかサポート対象外のため、[APP_NAME] は実行できません。 最新のビデオカードドライバがインストールされているのを確認し、されている場合は再インストールをお試しください。
-
-このメッセージが何度も出る場合は、[SUPPORT_SITE] へご連絡ください。</string>
- <string name="5 O'Clock Shadow">うっすらとしたヒゲ</string>
- <string name="All White">真っ白</string>
- <string name="Anime Eyes">アニメ風の目</string>
- <string name="Arced">アーチ</string>
- <string name="Arm Length">腕の長さ</string>
- <string name="Attached">小</string>
- <string name="Attached Earlobes">耳たぶ</string>
- <string name="Back Fringe">後ろ髪の毛先</string>
- <string name="Baggy">たるんだ下まぶた</string>
- <string name="Bangs">前髪</string>
- <string name="Beady Eyes">ビーズのような目</string>
- <string name="Belly Size">お腹の大きさ</string>
- <string name="Big">大</string>
- <string name="Big Butt">大</string>
- <string name="Big Hair Back">髪の大部分: 後ろ</string>
- <string name="Big Hair Front">髪の大部分: 前</string>
- <string name="Big Hair Top">髪の大部分: 上部</string>
- <string name="Big Head">大</string>
- <string name="Big Pectorals">大</string>
- <string name="Big Spikes">とげあり</string>
- <string name="Black">黒</string>
- <string name="Blonde">ブロンド</string>
- <string name="Blonde Hair">ブロンドの髪</string>
- <string name="Blush">チーク</string>
- <string name="Blush Color">チークカラー</string>
- <string name="Blush Opacity">チークの濃さ</string>
- <string name="Body Definition">体の精細度</string>
- <string name="Body Fat">体脂肪</string>
- <string name="Body Freckles">体のしみ・そばかす</string>
- <string name="Body Thick">骨太</string>
- <string name="Body Thickness">体の厚み</string>
- <string name="Body Thin">細め</string>
- <string name="Bow Legged">外股</string>
- <string name="Breast Buoyancy">胸の重力</string>
- <string name="Breast Cleavage">胸の谷間</string>
- <string name="Breast Size">胸の大きさ</string>
- <string name="Bridge Width">両目の間の幅</string>
- <string name="Broad">広</string>
- <string name="Brow Size">眉毛上の隆起</string>
- <string name="Bug Eyes">Bug Eyes</string>
- <string name="Bugged Eyes">突き出た目</string>
- <string name="Bulbous">だんご</string>
- <string name="Bulbous Nose">だんご鼻</string>
- <string name="Breast Physics Mass">胸の豊かさ</string>
- <string name="Breast Physics Smoothing">胸の平滑化</string>
- <string name="Breast Physics Gravity">胸の垂れ具合</string>
- <string name="Breast Physics Drag">胸の空気抵抗</string>
- <string name="Breast Physics InOut Max Effect">最大エフェクト数</string>
- <string name="Breast Physics InOut Spring">振動速度</string>
- <string name="Breast Physics InOut Gain">増加率</string>
- <string name="Breast Physics InOut Damping">減衰</string>
- <string name="Breast Physics UpDown Max Effect">最大エフェクト数</string>
- <string name="Breast Physics UpDown Spring">振動速度</string>
- <string name="Breast Physics UpDown Gain">増加率</string>
- <string name="Breast Physics UpDown Damping">減衰</string>
- <string name="Breast Physics LeftRight Max Effect">最大エフェクト数</string>
- <string name="Breast Physics LeftRight Spring">振動速度</string>
- <string name="Breast Physics LeftRight Gain">増加率</string>
- <string name="Breast Physics LeftRight Damping">減衰</string>
- <string name="Belly Physics Mass">お腹の豊かさ</string>
- <string name="Belly Physics Smoothing">お腹の平滑化</string>
- <string name="Belly Physics Gravity">お腹の垂れ具合</string>
- <string name="Belly Physics Drag">お腹の空気抵抗</string>
- <string name="Belly Physics UpDown Max Effect">最大エフェクト数</string>
- <string name="Belly Physics UpDown Spring">振動速度</string>
- <string name="Belly Physics UpDown Gain">増加率</string>
- <string name="Belly Physics UpDown Damping">減衰</string>
- <string name="Butt Physics Mass">お尻の豊かさ</string>
- <string name="Butt Physics Smoothing">お尻の平滑化</string>
- <string name="Butt Physics Gravity">お尻の垂れ具合</string>
- <string name="Butt Physics Drag">お尻の空気抵抗</string>
- <string name="Butt Physics UpDown Max Effect">最大エフェクト数</string>
- <string name="Butt Physics UpDown Spring">振動速度</string>
- <string name="Butt Physics UpDown Gain">増加率</string>
- <string name="Butt Physics UpDown Damping">減衰</string>
- <string name="Butt Physics LeftRight Max Effect">最大エフェクト数</string>
- <string name="Butt Physics LeftRight Spring">振動速度</string>
- <string name="Butt Physics LeftRight Gain">増加率</string>
- <string name="Butt Physics LeftRight Damping">減衰</string>
- <string name="Bushy Eyebrows">太</string>
- <string name="Bushy Hair">ぼさぼさヘア</string>
- <string name="Butt Size">お尻の大きさ</string>
- <string name="Butt Gravity">お尻の垂れ具合</string>
- <string name="bustle skirt">後ろの膨らみ</string>
- <string name="no bustle">膨らみなし</string>
- <string name="more bustle">膨らみ大</string>
- <string name="Chaplin">チャップリン</string>
- <string name="Cheek Bones">ほお骨</string>
- <string name="Chest Size">胸部の大きさ</string>
- <string name="Chin Angle">あごの角度</string>
- <string name="Chin Cleft">あごの先の割れ</string>
- <string name="Chin Curtains">あごに沿ったひげ</string>
- <string name="Chin Depth">あごの長さ</string>
- <string name="Chin Heavy">あごを強調</string>
- <string name="Chin In">ひいたあご</string>
- <string name="Chin Out">突き出たあご</string>
- <string name="Chin-Neck">あごと首</string>
- <string name="Clear">クリア</string>
- <string name="Cleft">割れた</string>
- <string name="Close Set Eyes">顔の中心寄りの目</string>
- <string name="Closed">クローズ</string>
- <string name="Closed Back">後ろとじ</string>
- <string name="Closed Front">前とじ</string>
- <string name="Closed Left">左とじ</string>
- <string name="Closed Right">右とじ</string>
- <string name="Coin Purse">コイン入れ</string>
- <string name="Collar Back">後ろえり</string>
- <string name="Collar Front">前えり</string>
- <string name="Corner Down">ダウン</string>
- <string name="Corner Up">アップ</string>
- <string name="Creased">重いまぶた</string>
- <string name="Crooked Nose">曲がった鼻</string>
- <string name="Cuff Flare">袖口のフレア</string>
- <string name="Dark">ダーク</string>
- <string name="Dark Green">ダークグリーン</string>
- <string name="Darker">ダーク</string>
- <string name="Deep">尖った</string>
- <string name="Default Heels">デフォルトのかかと</string>
- <string name="Dense">濃</string>
- <string name="Double Chin">二重あご</string>
- <string name="Downturned">下向き</string>
- <string name="Duffle Bag">ダッフルバッグ</string>
- <string name="Ear Angle">耳の角度</string>
- <string name="Ear Size">耳の大きさ</string>
- <string name="Ear Tips">耳の先</string>
- <string name="Egg Head">たまご頭</string>
- <string name="Eye Bags">下まぶた</string>
- <string name="Eye Color">瞳の色</string>
- <string name="Eye Depth">目のくぼみ</string>
- <string name="Eye Lightness">瞳の明るさ</string>
- <string name="Eye Opening">見開き具合</string>
- <string name="Eye Pop">両目の大きさの対称</string>
- <string name="Eye Size">目の大きさ</string>
- <string name="Eye Spacing">目と目のあいだの幅</string>
- <string name="Eyebrow Arc">眉毛のアーチ</string>
- <string name="Eyebrow Density">眉毛の密集度</string>
- <string name="Eyebrow Height">眉毛の高さ</string>
- <string name="Eyebrow Points">眉毛の角</string>
- <string name="Eyebrow Size">眉毛の大きさ</string>
- <string name="Eyelash Length">まつげの長さ</string>
- <string name="Eyeliner">アイライナー</string>
- <string name="Eyeliner Color">アイライナーの色</string>
- <string name="Eyes Bugged">下まぶたがたるんだ目</string>
- <string name="Face Shear">顔のゆがみ</string>
- <string name="Facial Definition">顔の精細度</string>
- <string name="Far Set Eyes">離れた目</string>
- <string name="Fat Lips">大</string>
- <string name="Female">女性</string>
- <string name="Fingerless">指なし</string>
- <string name="Fingers">指あり</string>
- <string name="Flared Cuffs">広がった袖口</string>
- <string name="Flat">平ら</string>
- <string name="Flat Butt">小</string>
- <string name="Flat Head">絶壁頭</string>
- <string name="Flat Toe">フラット</string>
- <string name="Foot Size">足の大きさ</string>
- <string name="Forehead Angle">ひたいの角度</string>
- <string name="Forehead Heavy">ひたいを強調</string>
- <string name="Freckles">しみ・そばかす</string>
- <string name="Front Fringe">前髪の毛先</string>
- <string name="Full Back">刈られていない髪</string>
- <string name="Full Eyeliner">あり</string>
- <string name="Full Front">刈られていない髪</string>
- <string name="Full Hair Sides">サイドの髪</string>
- <string name="Full Sides">生え揃ったサイド</string>
- <string name="Glossy">あり</string>
- <string name="Glove Fingers">手袋の指</string>
- <string name="Glove Length">手袋の長さ</string>
- <string name="Hair">髪</string>
- <string name="Hair Back">髪: 後ろ</string>
- <string name="Hair Front">髪: 前</string>
- <string name="Hair Sides">髪: サイド</string>
- <string name="Hair Sweep">流す</string>
- <string name="Hair Thickess">髪の量</string>
- <string name="Hair Thickness">髪の量</string>
- <string name="Hair Tilt">髪の向き</string>
- <string name="Hair Tilted Left">左向き</string>
- <string name="Hair Tilted Right">右向き</string>
- <string name="Hair Volume">髪: ボリューム</string>
- <string name="Hand Size">手の大きさ</string>
- <string name="Handlebars">ハンドルバー</string>
- <string name="Head Length">頭の長さ</string>
- <string name="Head Shape">頭の形</string>
- <string name="Head Size">頭の大きさ</string>
- <string name="Head Stretch">縦横の長さ</string>
- <string name="Heel Height">ヒールの高さ</string>
- <string name="Heel Shape">ヒールの形</string>
- <string name="Height">身長</string>
- <string name="High">高</string>
- <string name="High Heels">ハイヒール</string>
- <string name="High Jaw">高</string>
- <string name="High Platforms">厚底</string>
- <string name="High and Tight">高めでタイト</string>
- <string name="Higher">高</string>
- <string name="Hip Length">腰の長さ</string>
- <string name="Hip Width">腰の幅</string>
- <string name="Hover">ホバー</string>
- <string name="In">内向き</string>
- <string name="In Shdw Color">内側のシャドウカラー</string>
- <string name="In Shdw Opacity">内側のシャドウの濃さ</string>
- <string name="Inner Eye Corner">目頭</string>
- <string name="Inner Eye Shadow">内側のアイシャドウ</string>
- <string name="Inner Shadow">内側のシャドウ</string>
- <string name="Jacket Length">ジャケット丈</string>
- <string name="Jacket Wrinkles">ジャケットのしわ</string>
- <string name="Jaw Angle">あごの角度</string>
- <string name="Jaw Jut">あごの突出</string>
- <string name="Jaw Shape">あごの形</string>
- <string name="Join">寄せた胸</string>
- <string name="Jowls">えら</string>
- <string name="Knee Angle">膝の角度</string>
- <string name="Knock Kneed">内股</string>
- <string name="Large">大</string>
- <string name="Large Hands">大</string>
- <string name="Left Part">左分け</string>
- <string name="Leg Length">脚の長さ</string>
- <string name="Leg Muscles">脚の筋肉</string>
- <string name="Less">小</string>
- <string name="Less Body Fat">少なめ</string>
- <string name="Less Curtains">少なめ</string>
- <string name="Less Freckles">少なめ</string>
- <string name="Less Full">薄い</string>
- <string name="Less Gravity">少</string>
- <string name="Less Love">少</string>
- <string name="Less Muscles">少なめ</string>
- <string name="Less Muscular">少なめ</string>
- <string name="Less Rosy">少な目</string>
- <string name="Less Round">丸み少な目</string>
- <string name="Less Saddle">小</string>
- <string name="Less Square">小</string>
- <string name="Less Volume">ボリューム少な目</string>
- <string name="Less soul">小</string>
- <string name="Lighter">ライト</string>
- <string name="Lip Cleft">唇の山</string>
- <string name="Lip Cleft Depth">唇の山の高さ</string>
- <string name="Lip Fullness">唇の厚み</string>
- <string name="Lip Pinkness">唇の赤み</string>
- <string name="Lip Ratio">上下唇の大きさ</string>
- <string name="Lip Thickness">唇の前後幅</string>
- <string name="Lip Width">口の大きさ</string>
- <string name="Lipgloss">リップグロス</string>
- <string name="Lipstick">口紅</string>
- <string name="Lipstick Color">口紅の色</string>
- <string name="Long">ロング</string>
- <string name="Long Head">前後幅が広い頭</string>
- <string name="Long Hips">長</string>
- <string name="Long Legs">長</string>
- <string name="Long Neck">長</string>
- <string name="Long Pigtails">長</string>
- <string name="Long Ponytail">長</string>
- <string name="Long Torso">長</string>
- <string name="Long arms">長</string>
- <string name="Loose Pants">ゆったり</string>
- <string name="Loose Shirt">ゆるめ</string>
- <string name="Loose Sleeves">ゆるめ</string>
- <string name="Love Handles">ウエスト周り</string>
- <string name="Low">低</string>
- <string name="Low Heels">ローヒール</string>
- <string name="Low Jaw">低</string>
- <string name="Low Platforms">低め</string>
- <string name="Low and Loose">低めでゆったり</string>
- <string name="Lower">低</string>
- <string name="Lower Bridge">鼻筋</string>
- <string name="Lower Cheeks">ほおの下部</string>
- <string name="Male">男性</string>
- <string name="Middle Part">真ん中分け</string>
- <string name="More">大</string>
- <string name="More Blush">きつめ</string>
- <string name="More Body Fat">多め</string>
- <string name="More Curtains">多め</string>
- <string name="More Eyeshadow">あり</string>
- <string name="More Freckles">多め</string>
- <string name="More Full">厚い</string>
- <string name="More Gravity">大</string>
- <string name="More Lipstick">あり</string>
- <string name="More Love">大</string>
- <string name="More Lower Lip">大</string>
- <string name="More Muscles">多め</string>
- <string name="More Muscular">筋骨隆々</string>
- <string name="More Rosy">多め</string>
- <string name="More Round">まる</string>
- <string name="More Saddle">大</string>
- <string name="More Sloped">なだらか</string>
- <string name="More Square">四角</string>
- <string name="More Upper Lip">大</string>
- <string name="More Vertical">垂直</string>
- <string name="More Volume">大</string>
- <string name="More soul">大</string>
- <string name="Moustache">口ひげ</string>
- <string name="Mouth Corner">口角</string>
- <string name="Mouth Position">口の位置</string>
- <string name="Mowhawk">モヒカン</string>
- <string name="Muscular">筋骨たくましい</string>
- <string name="Mutton Chops">マトンチョップス</string>
- <string name="Nail Polish">マニキュア</string>
- <string name="Nail Polish Color">マニキュアの色</string>
- <string name="Narrow">狭</string>
- <string name="Narrow Back">狭</string>
- <string name="Narrow Front">狭</string>
- <string name="Narrow Lips">おちょぼ口</string>
- <string name="Natural">ナチュラル</string>
- <string name="Neck Length">首の長さ</string>
- <string name="Neck Thickness">首の太さ</string>
- <string name="No Blush">なし</string>
- <string name="No Eyeliner">なし</string>
- <string name="No Eyeshadow">なし</string>
- <string name="No Lipgloss">なし</string>
- <string name="No Lipstick">なし</string>
- <string name="No Part">なし</string>
- <string name="No Polish">なし</string>
- <string name="No Red">なし</string>
- <string name="No Spikes">なし</string>
- <string name="No White">なし</string>
- <string name="No Wrinkles">なし</string>
- <string name="Normal Lower">下</string>
- <string name="Normal Upper">上</string>
- <string name="Nose Left">左曲がり</string>
- <string name="Nose Right">右曲がり</string>
- <string name="Nose Size">鼻の大きさ</string>
- <string name="Nose Thickness">鼻の厚み</string>
- <string name="Nose Tip Angle">鼻先の角度</string>
- <string name="Nose Tip Shape">鼻先の形</string>
- <string name="Nose Width">鼻の幅</string>
- <string name="Nostril Division">鼻の穴の高さ</string>
- <string name="Nostril Width">鼻の穴の幅</string>
- <string name="Opaque">濃いめ</string>
- <string name="Open">オープン</string>
- <string name="Open Back">後ろあき</string>
- <string name="Open Front">前あき</string>
- <string name="Open Left">左あき</string>
- <string name="Open Right">右あき</string>
- <string name="Orange">オレンジ</string>
- <string name="Out">外向き</string>
- <string name="Out Shdw Color">外側のシャドウカラー</string>
- <string name="Out Shdw Opacity">外側のシャドウの濃さ</string>
- <string name="Outer Eye Corner">目尻</string>
- <string name="Outer Eye Shadow">外側のアイシャドウ</string>
- <string name="Outer Shadow">外側のシャドウ</string>
- <string name="Overbite">出っ歯</string>
- <string name="Package">パッケージ</string>
- <string name="Painted Nails">あり</string>
- <string name="Pale">悪い</string>
- <string name="Pants Crotch">パンツの股</string>
- <string name="Pants Fit">パンツのフィット感</string>
- <string name="Pants Length">パンツ丈</string>
- <string name="Pants Waist">ウエスト</string>
- <string name="Pants Wrinkles">パンツのしわ</string>
- <string name="Part">あり</string>
- <string name="Part Bangs">分けた前髪</string>
- <string name="Pectorals">胸筋</string>
- <string name="Pigment">色素</string>
- <string name="Pigtails">下げ髪</string>
- <string name="Pink">ピンク</string>
- <string name="Pinker">ピンク</string>
- <string name="Platform Height">靴底の高さ</string>
- <string name="Platform Width">靴底の幅</string>
- <string name="Pointy">尖った</string>
- <string name="Pointy Heels">幅狭</string>
- <string name="Ponytail">ポニーテール</string>
- <string name="Poofy Skirt">ふんわり</string>
- <string name="Pop Left Eye">左目を大きく</string>
- <string name="Pop Right Eye">右目を大きく</string>
- <string name="Puffy">ふっくら</string>
- <string name="Puffy Eyelids">目の周りの膨らみ</string>
- <string name="Rainbow Color">虹色</string>
- <string name="Red Hair">赤毛</string>
- <string name="Regular">均整のとれた</string>
- <string name="Right Part">右分け</string>
- <string name="Rosy Complexion">ほおの赤らみ</string>
- <string name="Round">まるっこい</string>
- <string name="Ruddiness">血色</string>
- <string name="Ruddy">良い</string>
- <string name="Rumpled Hair">くしゃくしゃヘア</string>
- <string name="Saddle Bags">腰回りの肉付き</string>
- <string name="Scrawny Leg">骨張った脚</string>
- <string name="Separate">離れた胸</string>
- <string name="Shallow">なだらか</string>
- <string name="Shear Back">後方を刈る</string>
- <string name="Shear Face">顔のゆがみ</string>
- <string name="Shear Front">前方を刈る</string>
- <string name="Shear Left Up">左半分を上に</string>
- <string name="Shear Right Up">右半分を上に</string>
- <string name="Sheared Back">後ろを刈られた髪</string>
- <string name="Sheared Front">前を刈られた髪</string>
- <string name="Shift Left">左向き</string>
- <string name="Shift Mouth">口の向き</string>
- <string name="Shift Right">右向き</string>
- <string name="Shirt Bottom">シャツの裾</string>
- <string name="Shirt Fit">シャツのフィット感</string>
- <string name="Shirt Wrinkles">シャツのしわ</string>
- <string name="Shoe Height">靴の長さ</string>
- <string name="Short">ショート</string>
- <string name="Short Arms">短</string>
- <string name="Short Legs">短</string>
- <string name="Short Neck">短</string>
- <string name="Short Pigtails">短</string>
- <string name="Short Ponytail">短</string>
- <string name="Short Sideburns">短め</string>
- <string name="Short Torso">短</string>
- <string name="Short hips">短</string>
- <string name="Shoulders">肩</string>
- <string name="Side Fringe">サイドの毛先</string>
- <string name="Sideburns">もみあげ</string>
- <string name="Sides Hair">サイドの髪</string>
- <string name="Sides Hair Down">ダウン</string>
- <string name="Sides Hair Up">アップ</string>
- <string name="Skinny Neck">細</string>
- <string name="Skirt Fit">スカートのフィット感</string>
- <string name="Skirt Length">スカート丈</string>
- <string name="Slanted Forehead">傾斜した額</string>
- <string name="Sleeve Length">袖丈</string>
- <string name="Sleeve Looseness">袖のフィット感</string>
- <string name="Slit Back">スリット: 後ろ</string>
- <string name="Slit Front">スリット: 前</string>
- <string name="Slit Left">スリット: 左</string>
- <string name="Slit Right">スリット: 右</string>
- <string name="Small">小</string>
- <string name="Small Hands">小</string>
- <string name="Small Head">小</string>
- <string name="Smooth">滑らか</string>
- <string name="Smooth Hair">スムーズ</string>
- <string name="Socks Length">靴下丈</string>
- <string name="Soulpatch">ソウルパッチ</string>
- <string name="Sparse">薄</string>
- <string name="Spiked Hair">とげとげヘア</string>
- <string name="Square">角張った</string>
- <string name="Square Toe">スクエアトゥ</string>
- <string name="Squash Head">カボチャ型</string>
- <string name="Stretch Head">縦長</string>
- <string name="Sunken">こけたほお</string>
- <string name="Sunken Chest">小</string>
- <string name="Sunken Eyes">くぼんだ目</string>
- <string name="Sweep Back">後ろへ</string>
- <string name="Sweep Forward">前へ</string>
- <string name="Tall">トール</string>
- <string name="Taper Back">後ろに先細</string>
- <string name="Taper Front">前に先細</string>
- <string name="Thick Heels">幅広</string>
- <string name="Thick Neck">太</string>
- <string name="Thick Toe">厚め</string>
- <string name="Thin">薄い</string>
- <string name="Thin Eyebrows">細</string>
- <string name="Thin Lips">小</string>
- <string name="Thin Nose">細い鼻</string>
- <string name="Tight Chin">ひきしまったあご</string>
- <string name="Tight Cuffs">タイト</string>
- <string name="Tight Pants">タイト</string>
- <string name="Tight Shirt">タイト</string>
- <string name="Tight Skirt">タイト</string>
- <string name="Tight Sleeves">タイト</string>
- <string name="Toe Shape">つま先の形</string>
- <string name="Toe Thickness">つま先の厚み</string>
- <string name="Torso Length">上半身の長さ</string>
- <string name="Torso Muscles">上半身の筋肉</string>
- <string name="Torso Scrawny">上半身の骨張り</string>
- <string name="Unattached">大</string>
- <string name="Uncreased">軽いまぶた</string>
- <string name="Underbite">受け口</string>
- <string name="Unnatural">ユニーク</string>
- <string name="Upper Bridge">両目のあいだ</string>
- <string name="Upper Cheeks">ほおの上部</string>
- <string name="Upper Chin Cleft">あご上部の割れ</string>
- <string name="Upper Eyelid Fold">二重の幅</string>
- <string name="Upturned">上向き</string>
- <string name="Very Red">真っ赤</string>
- <string name="Waist Height">ウエストの高さ</string>
- <string name="Well-Fed">つまったほお</string>
- <string name="White Hair">白髪</string>
- <string name="Wide">広</string>
- <string name="Wide Back">広</string>
- <string name="Wide Front">広</string>
- <string name="Wide Lips">大きい口</string>
- <string name="Wild">ワイルド</string>
- <string name="Wrinkles">しわ</string>
- <string name="LocationCtrlAddLandmarkTooltip">マイ ランドマークに追加</string>
- <string name="LocationCtrlEditLandmarkTooltip">マイ ランドマークを編集</string>
- <string name="LocationCtrlInfoBtnTooltip">現在地の詳細を見る</string>
- <string name="LocationCtrlComboBtnTooltip">マイ ロケーション履歴</string>
- <string name="LocationCtrlForSaleTooltip">この土地を購入</string>
- <string name="LocationCtrlVoiceTooltip">ここではボイスの利用ができません</string>
- <string name="LocationCtrlFlyTooltip">飛行は禁止されています</string>
- <string name="LocationCtrlPushTooltip">プッシュ禁止</string>
- <string name="LocationCtrlBuildTooltip">オブジェクトの制作・ドロップは禁止されています</string>
- <string name="LocationCtrlScriptsTooltip">スクリプト不可</string>
- <string name="LocationCtrlDamageTooltip">体力</string>
- <string name="LocationCtrlAdultIconTooltip">Adult リージョン</string>
- <string name="LocationCtrlModerateIconTooltip">Moderate リージョン</string>
- <string name="LocationCtrlGeneralIconTooltip">General リージョン</string>
- <string name="LocationCtrlSeeAVsTooltip">この区画内のアバターは、この区画の外にいるアバターからは見ることも聞くこともできません。</string>
- <string name="LocationCtrlPathfindingDirtyTooltip">地域(リージョン)が再構築されるまで、移動するオブジェクトは正しく動作しない可能性があります。</string>
- <string name="LocationCtrlPathfindingDisabledTooltip">この地域(リージョン)でダイナミックパスファインディングが有効になっていません。</string>
- <string name="UpdaterWindowTitle">[APP_NAME] アップデート</string>
- <string name="UpdaterNowUpdating">只今 [APP_NAME] をアップデート中です...</string>
- <string name="UpdaterNowInstalling">[APP_NAME] をインストール中です...</string>
- <string name="UpdaterUpdatingDescriptive">お使いの [APP_NAME] ビューワが最新バージョンにアップデートされています。 数分かかることがありますのでしばらくお待ちください。</string>
- <string name="UpdaterProgressBarTextWithEllipses">アップデートをダウンロード中です...</string>
- <string name="UpdaterProgressBarText">アップデートをダウンロード中</string>
- <string name="UpdaterFailDownloadTitle">アップデートのダウンロードに失敗しました</string>
- <string name="UpdaterFailUpdateDescriptive">[APP_NAME] をアップデート中にエラーが発生しました。 www.secondlife.com から最新バージョンをダウンロードしてください。</string>
- <string name="UpdaterFailInstallTitle">アップデートのインストールに失敗しました</string>
- <string name="UpdaterFailStartTitle">ビューワの起動に失敗しました</string>
- <string name="ItemsComingInTooFastFrom">[APP_NAME] : アイテムが [FROM_NAME] から同時にたくさん読み込まれているため、自動プレビューが [TIME] 秒間無効となります。</string>
- <string name="ItemsComingInTooFast">[APP_NAME] : アイテムが同時にたくさん読み込まれているため、自動プレビューが [TIME] 秒間無効となります。</string>
- <string name="IM_logging_string">-- インスタントメッセージの保存開始 --</string>
- <string name="IM_typing_start_string">[NAME] は入力中です...</string>
- <string name="Unnamed">(名前なし)</string>
- <string name="IM_moderated_chat_label">(モデレート: デフォルトでボイスはオフ)</string>
- <string name="IM_unavailable_text_label">このコールでは文字チャットが利用できません。</string>
- <string name="IM_muted_text_label">グループのモデレータが、あなたの文字チャットを使用禁止にしました。</string>
- <string name="IM_default_text_label">ここをクリックしてインスタントメッセージを開始。</string>
- <string name="IM_to_label">宛先</string>
- <string name="IM_moderator_label">(モデレータ)</string>
- <string name="Saved_message">(保存日時:[LONG_TIMESTAMP])</string>
- <string name="IM_unblock_only_groups_friends">このメッセージを表示するには、「環境設定」の「プライバシー」で「フレンドとグループ以外からはコールと IM を受信しない」チェックボックスをオフにします。</string>
- <string name="OnlineStatus">オンライン</string>
- <string name="OfflineStatus">オフライン</string>
- <string name="not_online_msg">ユーザーがオンラインでありません - メッセージは保存され、後で配信されます。</string>
- <string name="not_online_inventory">ユーザーがオンラインでありません - インベントリが保存されました。</string>
- <string name="answered_call">相手がコールを受けました</string>
- <string name="you_started_call">ボイスコールを開始します</string>
- <string name="you_joined_call">ボイスコールに参加しました</string>
- <string name="you_auto_rejected_call-im">「通知を受けない」がオンのときに、自動的にボイスコールを拒否しました。</string>
- <string name="name_started_call">[NAME] はボイスコールを開始します</string>
- <string name="ringing-im">ボイスコールに参加...</string>
- <string name="connected-im">接続しました。コール終了をクリックして切ります</string>
- <string name="hang_up-im">ボイスコールから退席しました</string>
- <string name="answering-im">接続中...</string>
- <string name="conference-title">複数人チャット</string>
- <string name="conference-title-incoming">[AGENT_NAME] とコンファレンスする</string>
- <string name="inventory_item_offered-im">持ち物アイテム '[ITEM_NAME]' が送られてきました</string>
- <string name="inventory_folder_offered-im">持ち物フォルダ '[ITEM_NAME]' が送られてきました</string>
- <string name="share_alert">インベントリからここにアイテムをドラッグします</string>
- <string name="facebook_post_success">Facebook に投稿しました。</string>
- <string name="flickr_post_success">Flickr に投稿しました。</string>
- <string name="twitter_post_success">Twitter に投稿しました。</string>
- <string name="no_session_message">(IM セッションが存在しません)</string>
- <string name="only_user_message">このセッションにいるユーザーはあなただけです。</string>
- <string name="offline_message">[NAME] はオフライン中です。</string>
- <string name="invite_message">このボイスチャットに応答・接続する場合は、[BUTTON NAME] をクリックしてください。</string>
- <string name="muted_message">この住人をブロックしています。 メッセージを送ると、ブロックが自動的に解除されます。</string>
- <string name="generic">リクエスト中にエラーが発生しました。あとでもう一度お試しください。</string>
- <string name="generic_request_error">要求中にエラーが発生しました。後でもう一度試してください。</string>
- <string name="insufficient_perms_error">あなたには充分な権限がありません。</string>
- <string name="session_does_not_exist_error">このセッションは既に切断されています。</string>
- <string name="no_ability_error">あなたにはその能力がありません。</string>
- <string name="no_ability">あなたにはその能力がありません。</string>
- <string name="not_a_mod_error">あなたはセッションモデレータではありません。</string>
- <string name="muted">グループのモデレーターが、あなたのテキストチャットを禁止しました。</string>
- <string name="muted_error">グループモデレータがあなたのテキストチャットを無効化しました</string>
- <string name="add_session_event">[RECIPIENT] とのチャットセッションにユーザーを追加することができません</string>
- <string name="message">[RECIPIENT] とのチャットセッションに、メッセージを送信することができません。</string>
- <string name="message_session_event">[RECIPIENT] とのチャットセッションにメッセージを送ることができません</string>
- <string name="mute">モデレート中にエラーが発生しました。</string>
- <string name="removed">グループから脱退しました。</string>
- <string name="removed_from_group">あなたはグループから削除されました。</string>
- <string name="close_on_no_ability">このチャットセッションを継続することはできません</string>
- <string name="unread_chat_single">[SOURCES] は何か新しいことを言いました。</string>
- <string name="unread_chat_multiple">[SOURCES] は何か新しいことを言いました。</string>
- <string name="session_initialization_timed_out_error">セッションの初期化がタイムアウトしました</string>
- <string name="Home position set.">家の配置の設定。</string>
- <string name="voice_morphing_url">https://secondlife.com/destination/voice-island</string>
- <string name="premium_voice_morphing_url">https://secondlife.com/destination/voice-morphing-premium</string>
- <string name="paid_you_ldollars">[NAME] は [REASON] のために L$[AMOUNT] を支払いました。</string>
- <string name="paid_you_ldollars_gift">[NAME] は L$[AMOUNT] 支払いました:[REASON]</string>
- <string name="paid_you_ldollars_no_reason">[NAME] は L$[AMOUNT] を支払いました。</string>
- <string name="you_paid_ldollars">[NAME] に L$ [AMOUNT] を支払いました:[REASON]</string>
- <string name="you_paid_ldollars_gift">[NAME] に L$ [AMOUNT] を支払いました:[REASON]</string>
- <string name="you_paid_ldollars_no_info">L$ [AMOUNT] を支払いました。</string>
- <string name="you_paid_ldollars_no_reason">[NAME] に L$ [AMOUNT] を支払いました。</string>
- <string name="you_paid_ldollars_no_name">L$ [AMOUNT] を支払いました:[REASON]</string>
- <string name="you_paid_failure_ldollars">[NAME] に [REASON] の代金 L$ [AMOUNT] を支払えませんでした。</string>
- <string name="you_paid_failure_ldollars_gift">[NAME] に L$ [AMOUNT] を支払えませんでした:[REASON]</string>
- <string name="you_paid_failure_ldollars_no_info">L$ [AMOUNT] を支払えませんでした。</string>
- <string name="you_paid_failure_ldollars_no_reason">[NAME] に L$ [AMOUNT] を支払えませんでした。</string>
- <string name="you_paid_failure_ldollars_no_name">[REASON] の 代金 L$ [AMOUNT] を支払えませんでした。</string>
- <string name="for item">[ITEM] 向け</string>
- <string name="for a parcel of land">土地区画のため</string>
- <string name="for a land access pass">土地の入場許可を得るため</string>
- <string name="for deeding land">土地を譲渡するため</string>
- <string name="to create a group">グループを作成するため</string>
- <string name="to join a group">グループに参加するため</string>
- <string name="to upload">アップロードするため</string>
- <string name="to publish a classified ad">クラシファイド広告を掲載する</string>
- <string name="giving">L$[AMOUNT] を渡します</string>
- <string name="uploading_costs">アップロード料金は L$[AMOUNT] です</string>
- <string name="this_costs">料金は L$[AMOUNT] です</string>
- <string name="buying_selected_land">選択した土地を L$ [AMOUNT] で購入します</string>
- <string name="this_object_costs">このオブジェクトは L$[AMOUNT] です</string>
- <string name="group_role_everyone">全員</string>
- <string name="group_role_officers">オフィサー</string>
- <string name="group_role_owners">オーナー</string>
- <string name="group_member_status_online">オンライン</string>
- <string name="uploading_abuse_report">アップロード中...
+また、「コントロールパネル」>「画面」>「設定」内で、モニターが「最高 (32ビット)」に設定されていることもご確認ください。
+このメッセージが何度も出る場合は、 [SUPPORT_SITE] へご連絡ください。
+ </string>
+ <string name="MBPixelFmtSetErr">
+ ピクセル形式が設定できません。
+ </string>
+ <string name="MBGLContextErr">
+ GLレンダーコンテキストが作れません
+ </string>
+ <string name="MBGLContextActErr">
+ GLレンダーコンテキストを有効化できません。
+ </string>
+ <string name="MBVideoDrvErr">
+ お使いのコンピューターのビデオカードのドライバが正常にインストールされていないか、古いまたはサポート対象外のため、[APP_NAME]を実行することができませんでした。
+最新のビデオカードドライバがインストールされているのを確認し、されている場合は再インストールをお試しください。
-嫌がらせの報告</string>
- <string name="New Shape">新しいシェイプ</string>
- <string name="New Skin">新しいスキン</string>
- <string name="New Hair">新しい髪</string>
- <string name="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">新しいアルファ</string>
- <string name="New Tattoo">新しいタトゥ</string>
- <string name="New Universal">新しいユニバーサル</string>
- <string name="New Physics">新規の物理作用</string>
- <string name="Invalid Wearable">無効な着用物</string>
- <string name="New Gesture">ジェスチャー</string>
- <string name="New Script">新規スクリプト</string>
- <string name="New Note">ノート</string>
- <string name="New Folder">新規フォルダ</string>
- <string name="Contents">コンテンツ</string>
- <string name="Gesture">ジェスチャー</string>
- <string name="Male Gestures">男性用ジェスチャー</string>
- <string name="Female Gestures">女性用ジェスチャー</string>
- <string name="Other Gestures">その他のジェスチャー</string>
- <string name="Speech Gestures">会話ジェスチャー</string>
- <string name="Common Gestures">一般的ジェスチャー</string>
- <string name="Male - Excuse me">男性 - すみません</string>
- <string name="Male - Get lost">男性 - Get lost</string>
- <string name="Male - Blow kiss">男性 - 投げキッス</string>
- <string name="Male - Boo">男性 - Boo</string>
- <string name="Male - Bored">男性 - 退屈</string>
- <string name="Male - Hey">男性 - Hey</string>
- <string name="Male - Laugh">男性 - 笑う</string>
- <string name="Male - Repulsed">男性 - 拒絶</string>
- <string name="Male - Shrug">男性 - 肩をすくめる</string>
- <string name="Male - Stick tougue out">男性 - 舌を出す</string>
- <string name="Male - Wow">男性 - Wow</string>
- <string name="Female - Chuckle">女性 – クスクス</string>
- <string name="Female - Cry">女性 – 泣く</string>
- <string name="Female - Embarrassed">女性 – 恥ずかしい</string>
- <string name="Female - Excuse me">女性 – すみません</string>
- <string name="Female - Get lost">女性 – あっち行ってよ</string>
- <string name="Female - Blow kiss">女性 - 投げキッス</string>
- <string name="Female - Boo">女性 – ワッ!</string>
- <string name="Female - Bored">女性 - 退屈</string>
- <string name="Female - Hey">女性 - Hey</string>
- <string name="Female - Hey baby">女性 – ヘイ、ベィビー!</string>
- <string name="Female - Laugh">女性 - 笑う</string>
- <string name="Female - Looking good">女性 – いい感じ</string>
- <string name="Female - Over here">女性 – こっちよ</string>
- <string name="Female - Please">女性 – プリーズ</string>
- <string name="Female - Repulsed">女性 - 拒絶</string>
- <string name="Female - Shrug">女性 - 肩をすくめる</string>
- <string name="Female - Stick tougue out">女性 - 舌を出す</string>
- <string name="Female - Wow">女性 - Wow</string>
- <string name="New Daycycle">新しいデイサイクル</string>
- <string name="New Water">新しい水</string>
- <string name="New Sky">新しい空</string>
- <string name="/bow">/おじぎする</string>
- <string name="/clap">/拍手</string>
- <string name="/count">/数える</string>
- <string name="/extinguish">/消す</string>
- <string name="/kmb">/くそくらえ</string>
- <string name="/muscle">/筋肉もりもり</string>
- <string name="/no">/いいえ</string>
- <string name="/no!">/だめ!</string>
- <string name="/paper">/パー</string>
- <string name="/pointme">/自分を指差す</string>
- <string name="/pointyou">/相手を指差す</string>
- <string name="/rock">/グー</string>
- <string name="/scissor">/チョキ</string>
- <string name="/smoke">/タバコを吸う</string>
- <string name="/stretch">/伸びをする</string>
- <string name="/whistle">/口笛を吹く</string>
- <string name="/yes">/はい</string>
- <string name="/yes!">/イエス!</string>
- <string name="afk">一時退席中</string>
- <string name="dance1">ダンス1</string>
- <string name="dance2">ダンス2</string>
- <string name="dance3">ダンス3</string>
- <string name="dance4">ダンス4</string>
- <string name="dance5">ダンス5</string>
- <string name="dance6">ダンス6</string>
- <string name="dance7">ダンス7</string>
- <string name="dance8">ダンス8</string>
- <string name="AvatarBirthDateFormat">[year,datetime,slt]/[mthnum,datetime,slt]/[day,datetime,slt]</string>
- <string name="DefaultMimeType">なし/なし</string>
- <string name="texture_load_dimensions_error">[WIDTH]*[HEIGHT] 以上の画像は読み込めません</string>
- <string name="outfit_photo_load_dimensions_error">最大アウトフィット写真サイズは [WIDTH]*[HEIGHT] です。画像のサイズを調整するか、別の画像を使用してください</string>
- <string name="outfit_photo_select_dimensions_error">最大アウトフィット写真サイズは [WIDTH]*[HEIGHT] です。別のテクスチャを選択してください</string>
- <string name="outfit_photo_verify_dimensions_error">写真の寸法を確認できません。写真サイズがピッカーに表示されるまでお待ちください</string>
- <string name="words_separator" value=","/>
- <string name="server_is_down">大変申し訳ございませんが、予期しない問題が発生しました。
+このメッセージが何度も出る場合は、[SUPPORT_SITE]へご連絡ください。
+ </string>
+ <string name="5 O'Clock Shadow">
+ うっすらとしたヒゲ
+ </string>
+ <string name="All White">
+ 真っ白
+ </string>
+ <string name="Anime Eyes">
+ アニメ風の目
+ </string>
+ <string name="Arced">
+ アーチ
+ </string>
+ <string name="Arm Length">
+ 腕の長さ
+ </string>
+ <string name="Attached">
+ 小
+ </string>
+ <string name="Attached Earlobes">
+ 耳たぶ
+ </string>
+ <string name="Back Fringe">
+ 後ろ髪の毛先
+ </string>
+ <string name="Baggy">
+ たるんだ下まぶた
+ </string>
+ <string name="Bangs">
+ 前髪
+ </string>
+ <string name="Beady Eyes">
+ ビーズのような目
+ </string>
+ <string name="Belly Size">
+ お腹の大きさ
+ </string>
+ <string name="Big">
+ 大
+ </string>
+ <string name="Big Butt">
+ 大
+ </string>
+ <string name="Big Hair Back">
+ 髪の大部分:後ろ
+ </string>
+ <string name="Big Hair Front">
+ 髪の大部分:前
+ </string>
+ <string name="Big Hair Top">
+ 髪の大部分:上部
+ </string>
+ <string name="Big Head">
+ 大
+ </string>
+ <string name="Big Pectorals">
+ 大
+ </string>
+ <string name="Big Spikes">
+ とげあり
+ </string>
+ <string name="Black">
+ 黒
+ </string>
+ <string name="Blonde">
+ ブロンド
+ </string>
+ <string name="Blonde Hair">
+ ブロンドの髪
+ </string>
+ <string name="Blush">
+ チーク
+ </string>
+ <string name="Blush Color">
+ チークカラー
+ </string>
+ <string name="Blush Opacity">
+ チークの濃さ
+ </string>
+ <string name="Body Definition">
+ 体の精細度
+ </string>
+ <string name="Body Fat">
+ 体脂肪
+ </string>
+ <string name="Body Freckles">
+ 体のしみ・そばかす
+ </string>
+ <string name="Body Thick">
+ 骨太
+ </string>
+ <string name="Body Thickness">
+ 体の厚み
+ </string>
+ <string name="Body Thin">
+ 細め
+ </string>
+ <string name="Bow Legged">
+ 股
+ </string>
+ <string name="Breast Buoyancy">
+ 胸の重力
+ </string>
+ <string name="Breast Cleavage">
+ 胸の谷間
+ </string>
+ <string name="Breast Size">
+ 胸の大きさ
+ </string>
+ <string name="Bridge Width">
+ 両目の間の幅
+ </string>
+ <string name="Broad">
+ 広
+ </string>
+ <string name="Brow Size">
+ 眉毛上の隆起
+ </string>
+ <string name="Bug Eyes">
+ Bug Eyes
+ </string>
+ <string name="Bugged Eyes">
+ 突き出た目
+ </string>
+ <string name="Bulbous">
+ だんご
+ </string>
+ <string name="Bulbous Nose">
+ だんご鼻
+ </string>
+ <string name="Breast Physics Mass">
+ 胸の豊かさ
+ </string>
+ <string name="Breast Physics Smoothing">
+ 胸の平滑化
+ </string>
+ <string name="Breast Physics Gravity">
+ 胸の垂れ具合
+ </string>
+ <string name="Breast Physics Drag">
+ 胸の空気抵抗
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ 最大エフェクト数
+ </string>
+ <string name="Breast Physics InOut Spring">
+ 振動速度
+ </string>
+ <string name="Breast Physics InOut Gain">
+ 増加率
+ </string>
+ <string name="Breast Physics InOut Damping">
+ 減衰
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ 最大エフェクト数
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ 振動速度
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ 増加率
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ 減衰
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ 最大エフェクト数
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ 振動速度
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ 増加率
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ 減衰
+ </string>
+ <string name="Belly Physics Mass">
+ お腹の豊かさ
+ </string>
+ <string name="Belly Physics Smoothing">
+ お腹の平滑化
+ </string>
+ <string name="Belly Physics Gravity">
+ お腹の垂れ具合
+ </string>
+ <string name="Belly Physics Drag">
+ お腹の空気抵抗
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ 最大エフェクト数
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ 振動速度
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ 増加率
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ 減衰
+ </string>
+ <string name="Butt Physics Mass">
+ お尻の豊かさ
+ </string>
+ <string name="Butt Physics Smoothing">
+ お尻の平滑化
+ </string>
+ <string name="Butt Physics Gravity">
+ お尻の垂れ具合
+ </string>
+ <string name="Butt Physics Drag">
+ お尻の空気抵抗
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ 最大エフェクト数
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ 振動速度
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ 増加率
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ 減衰
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ 最大エフェクト数
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ 振動速度
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ 増加率
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ 減衰
+ </string>
+ <string name="Bushy Eyebrows">
+ 太
+ </string>
+ <string name="Bushy Hair">
+ ぼさぼさヘア
+ </string>
+ <string name="Butt Size">
+ お尻の大きさ
+ </string>
+ <string name="Butt Gravity">
+ お尻の垂れ具合
+ </string>
+ <string name="bustle skirt">
+ 後ろの膨らみ
+ </string>
+ <string name="no bustle">
+ 膨らみなし
+ </string>
+ <string name="more bustle">
+ 膨らみ大
+ </string>
+ <string name="Chaplin">
+ チャップリン
+ </string>
+ <string name="Cheek Bones">
+ ほお骨
+ </string>
+ <string name="Chest Size">
+ 胸部の大きさ
+ </string>
+ <string name="Chin Angle">
+ あごの角度
+ </string>
+ <string name="Chin Cleft">
+ あごの先の割れ
+ </string>
+ <string name="Chin Curtains">
+ あごに沿ったひげ
+ </string>
+ <string name="Chin Depth">
+ あごの長さ
+ </string>
+ <string name="Chin Heavy">
+ あごを強調
+ </string>
+ <string name="Chin In">
+ ひいたあご
+ </string>
+ <string name="Chin Out">
+ 突き出たあご
+ </string>
+ <string name="Chin-Neck">
+ あごと首
+ </string>
+ <string name="Clear">
+ クリア
+ </string>
+ <string name="Cleft">
+ 割れた
+ </string>
+ <string name="Close Set Eyes">
+ 顔の中心寄りの目
+ </string>
+ <string name="Closed">
+ クローズ
+ </string>
+ <string name="Closed Back">
+ 後ろとじ
+ </string>
+ <string name="Closed Front">
+ 前とじ
+ </string>
+ <string name="Closed Left">
+ 左とじ
+ </string>
+ <string name="Closed Right">
+ 右とじ
+ </string>
+ <string name="Coin Purse">
+ コイン入れ
+ </string>
+ <string name="Collar Back">
+ 後ろえり
+ </string>
+ <string name="Collar Front">
+ 前えり
+ </string>
+ <string name="Corner Down">
+ ダウン
+ </string>
+ <string name="Corner Up">
+ アップ
+ </string>
+ <string name="Creased">
+ 重いまぶた
+ </string>
+ <string name="Crooked Nose">
+ 曲がった鼻
+ </string>
+ <string name="Cuff Flare">
+ 袖口のフレア
+ </string>
+ <string name="Dark">
+ ダーク
+ </string>
+ <string name="Dark Green">
+ ダークグリーン
+ </string>
+ <string name="Darker">
+ ダーク
+ </string>
+ <string name="Deep">
+ 尖った
+ </string>
+ <string name="Default Heels">
+ デフォルトのかかと
+ </string>
+ <string name="Dense">
+ 濃
+ </string>
+ <string name="Double Chin">
+ 二重あご
+ </string>
+ <string name="Downturned">
+ 下向き
+ </string>
+ <string name="Duffle Bag">
+ ダッフルバッグ
+ </string>
+ <string name="Ear Angle">
+ 耳の角度
+ </string>
+ <string name="Ear Size">
+ 耳の大きさ
+ </string>
+ <string name="Ear Tips">
+ 耳の先
+ </string>
+ <string name="Egg Head">
+ たまご頭
+ </string>
+ <string name="Eye Bags">
+ 下まぶた
+ </string>
+ <string name="Eye Color">
+ 瞳の色
+ </string>
+ <string name="Eye Depth">
+ 目のくぼみ
+ </string>
+ <string name="Eye Lightness">
+ 瞳の明るさ
+ </string>
+ <string name="Eye Opening">
+ 見開き具合
+ </string>
+ <string name="Eye Pop">
+ 両目の大きさの対称
+ </string>
+ <string name="Eye Size">
+ 目の大きさ
+ </string>
+ <string name="Eye Spacing">
+ 目と目のあいだの幅
+ </string>
+ <string name="Eyebrow Arc">
+ 眉毛のアーチ
+ </string>
+ <string name="Eyebrow Density">
+ 眉毛の密集度
+ </string>
+ <string name="Eyebrow Height">
+ 眉毛の高さ
+ </string>
+ <string name="Eyebrow Points">
+ 眉毛の角
+ </string>
+ <string name="Eyebrow Size">
+ 眉毛の大きさ
+ </string>
+ <string name="Eyelash Length">
+ まつげの長さ
+ </string>
+ <string name="Eyeliner">
+ アイライナー
+ </string>
+ <string name="Eyeliner Color">
+ アイライナーの色
+ </string>
+ <string name="Eyes Bugged">
+ 下まぶたがたるんだ目
+ </string>
+ <string name="Face Shear">
+ 顔のゆがみ
+ </string>
+ <string name="Facial Definition">
+ 顔の精細度
+ </string>
+ <string name="Far Set Eyes">
+ 離れた目
+ </string>
+ <string name="Fat Lips">
+ 大
+ </string>
+ <string name="Female">
+ 女性
+ </string>
+ <string name="Fingerless">
+ 指なし
+ </string>
+ <string name="Fingers">
+ 指あり
+ </string>
+ <string name="Flared Cuffs">
+ 広がった袖口
+ </string>
+ <string name="Flat">
+ 平ら
+ </string>
+ <string name="Flat Butt">
+ 小
+ </string>
+ <string name="Flat Head">
+ 絶壁頭
+ </string>
+ <string name="Flat Toe">
+ フラット
+ </string>
+ <string name="Foot Size">
+ 足の大きさ
+ </string>
+ <string name="Forehead Angle">
+ ひたいの角度
+ </string>
+ <string name="Forehead Heavy">
+ ひたいを強調
+ </string>
+ <string name="Freckles">
+ しみ・そばかす
+ </string>
+ <string name="Front Fringe">
+ 前髪の毛先
+ </string>
+ <string name="Full Back">
+ 刈られていない髪
+ </string>
+ <string name="Full Eyeliner">
+ あり
+ </string>
+ <string name="Full Front">
+ 刈られていない髪
+ </string>
+ <string name="Full Hair Sides">
+ サイドの髪
+ </string>
+ <string name="Full Sides">
+ 生え揃ったサイド
+ </string>
+ <string name="Glossy">
+ あり
+ </string>
+ <string name="Glove Fingers">
+ 手袋の指
+ </string>
+ <string name="Glove Length">
+ 手袋の長さ
+ </string>
+ <string name="Hair">
+ 髪
+ </string>
+ <string name="Hair Back">
+ 髪:後ろ
+ </string>
+ <string name="Hair Front">
+ 髪:前
+ </string>
+ <string name="Hair Sides">
+ 髪:サイド
+ </string>
+ <string name="Hair Sweep">
+ 流す
+ </string>
+ <string name="Hair Thickess">
+ 髪の量
+ </string>
+ <string name="Hair Thickness">
+ 髪の量
+ </string>
+ <string name="Hair Tilt">
+ 髪の向き
+ </string>
+ <string name="Hair Tilted Left">
+ 左向き
+ </string>
+ <string name="Hair Tilted Right">
+ 右向き
+ </string>
+ <string name="Hair Volume">
+ 髪:ボリューム
+ </string>
+ <string name="Hand Size">
+ 手の大きさ
+ </string>
+ <string name="Handlebars">
+ ハンドルバー
+ </string>
+ <string name="Head Length">
+ 頭の長さ
+ </string>
+ <string name="Head Shape">
+ 頭の形
+ </string>
+ <string name="Head Size">
+ 頭の大きさ
+ </string>
+ <string name="Head Stretch">
+ 縦横の長さ
+ </string>
+ <string name="Heel Height">
+ ヒールの高さ
+ </string>
+ <string name="Heel Shape">
+ ヒールの形
+ </string>
+ <string name="Height">
+ 身長
+ </string>
+ <string name="High">
+ 高
+ </string>
+ <string name="High Heels">
+ ハイヒール
+ </string>
+ <string name="High Jaw">
+ 高
+ </string>
+ <string name="High Platforms">
+ 厚底
+ </string>
+ <string name="High and Tight">
+ 高めでタイト
+ </string>
+ <string name="Higher">
+ 高
+ </string>
+ <string name="Hip Length">
+ 腰の長さ
+ </string>
+ <string name="Hip Width">
+ 腰の幅
+ </string>
+ <string name="Hover">
+ ホバー
+ </string>
+ <string name="In">
+ 内向き
+ </string>
+ <string name="In Shdw Color">
+ 内側のシャドウカラー
+ </string>
+ <string name="In Shdw Opacity">
+ 内側のシャドウの濃さ
+ </string>
+ <string name="Inner Eye Corner">
+ 目頭
+ </string>
+ <string name="Inner Eye Shadow">
+ 内側のアイシャドウ
+ </string>
+ <string name="Inner Shadow">
+ 内側のシャドウ
+ </string>
+ <string name="Jacket Length">
+ ジャケット丈
+ </string>
+ <string name="Jacket Wrinkles">
+ ジャケットのしわ
+ </string>
+ <string name="Jaw Angle">
+ あごの角度
+ </string>
+ <string name="Jaw Jut">
+ あごの突出
+ </string>
+ <string name="Jaw Shape">
+ あごの形
+ </string>
+ <string name="Join">
+ 寄せた胸
+ </string>
+ <string name="Jowls">
+ えら
+ </string>
+ <string name="Knee Angle">
+ 膝の角度
+ </string>
+ <string name="Knock Kneed">
+ 内股
+ </string>
+ <string name="Large">
+ 大
+ </string>
+ <string name="Large Hands">
+ 大
+ </string>
+ <string name="Left Part">
+ 左分け
+ </string>
+ <string name="Leg Length">
+ 脚の長さ
+ </string>
+ <string name="Leg Muscles">
+ 脚の筋肉
+ </string>
+ <string name="Less">
+ 小
+ </string>
+ <string name="Less Body Fat">
+ 少なめ
+ </string>
+ <string name="Less Curtains">
+ 少なめ
+ </string>
+ <string name="Less Freckles">
+ 少なめ
+ </string>
+ <string name="Less Full">
+ 薄い
+ </string>
+ <string name="Less Gravity">
+ 少
+ </string>
+ <string name="Less Love">
+ 少
+ </string>
+ <string name="Less Muscles">
+ 少なめ
+ </string>
+ <string name="Less Muscular">
+ 少なめ
+ </string>
+ <string name="Less Rosy">
+ 少な目
+ </string>
+ <string name="Less Round">
+ 丸み少な目
+ </string>
+ <string name="Less Saddle">
+ 小
+ </string>
+ <string name="Less Square">
+ 小
+ </string>
+ <string name="Less Volume">
+ ボリューム少な目
+ </string>
+ <string name="Less soul">
+ 小
+ </string>
+ <string name="Lighter">
+ ライト
+ </string>
+ <string name="Lip Cleft">
+ 唇の山
+ </string>
+ <string name="Lip Cleft Depth">
+ 唇の山の高さ
+ </string>
+ <string name="Lip Fullness">
+ 唇の厚み
+ </string>
+ <string name="Lip Pinkness">
+ 唇の赤み
+ </string>
+ <string name="Lip Ratio">
+ 上下唇の大きさ
+ </string>
+ <string name="Lip Thickness">
+ 唇の前後幅
+ </string>
+ <string name="Lip Width">
+ 口の大きさ
+ </string>
+ <string name="Lipgloss">
+ リップグロス
+ </string>
+ <string name="Lipstick">
+ 口紅
+ </string>
+ <string name="Lipstick Color">
+ 口紅の色
+ </string>
+ <string name="Long">
+ ロング
+ </string>
+ <string name="Long Head">
+ 前後幅が広い頭
+ </string>
+ <string name="Long Hips">
+ 長
+ </string>
+ <string name="Long Legs">
+ 長
+ </string>
+ <string name="Long Neck">
+ 長
+ </string>
+ <string name="Long Pigtails">
+ 長
+ </string>
+ <string name="Long Ponytail">
+ 長
+ </string>
+ <string name="Long Torso">
+ 長
+ </string>
+ <string name="Long arms">
+ 長
+ </string>
+ <string name="Loose Pants">
+ ゆったり
+ </string>
+ <string name="Loose Shirt">
+ ゆるめ
+ </string>
+ <string name="Loose Sleeves">
+ ゆるめ
+ </string>
+ <string name="Love Handles">
+ ウエスト周り
+ </string>
+ <string name="Low">
+ 低
+ </string>
+ <string name="Low Heels">
+ ローヒール
+ </string>
+ <string name="Low Jaw">
+ 低
+ </string>
+ <string name="Low Platforms">
+ 低め
+ </string>
+ <string name="Low and Loose">
+ 低めでゆったり
+ </string>
+ <string name="Lower">
+ 低
+ </string>
+ <string name="Lower Bridge">
+ 鼻筋
+ </string>
+ <string name="Lower Cheeks">
+ ほおの下部
+ </string>
+ <string name="Male">
+ 男性
+ </string>
+ <string name="Middle Part">
+ 真ん中分け
+ </string>
+ <string name="More">
+ 大
+ </string>
+ <string name="More Blush">
+ きつめ
+ </string>
+ <string name="More Body Fat">
+ 多め
+ </string>
+ <string name="More Curtains">
+ 多め
+ </string>
+ <string name="More Eyeshadow">
+ あり
+ </string>
+ <string name="More Freckles">
+ 多め
+ </string>
+ <string name="More Full">
+ 厚い
+ </string>
+ <string name="More Gravity">
+ 大
+ </string>
+ <string name="More Lipstick">
+ あり
+ </string>
+ <string name="More Love">
+ 大
+ </string>
+ <string name="More Lower Lip">
+ 大
+ </string>
+ <string name="More Muscles">
+ 多め
+ </string>
+ <string name="More Muscular">
+ 筋骨隆々
+ </string>
+ <string name="More Rosy">
+ 多め
+ </string>
+ <string name="More Round">
+ まる
+ </string>
+ <string name="More Saddle">
+ 大
+ </string>
+ <string name="More Sloped">
+ なだらか
+ </string>
+ <string name="More Square">
+ 四角
+ </string>
+ <string name="More Upper Lip">
+ 大
+ </string>
+ <string name="More Vertical">
+ 垂直
+ </string>
+ <string name="More Volume">
+ 大
+ </string>
+ <string name="More soul">
+ 大
+ </string>
+ <string name="Moustache">
+ 口ひげ
+ </string>
+ <string name="Mouth Corner">
+ 口角
+ </string>
+ <string name="Mouth Position">
+ 口の位置
+ </string>
+ <string name="Mowhawk">
+ モヒカン
+ </string>
+ <string name="Muscular">
+ 筋骨隆々
+ </string>
+ <string name="Mutton Chops">
+ マトンチョップス
+ </string>
+ <string name="Nail Polish">
+ マニキュア
+ </string>
+ <string name="Nail Polish Color">
+ マニキュアの色
+ </string>
+ <string name="Narrow">
+ 狭
+ </string>
+ <string name="Narrow Back">
+ 狭
+ </string>
+ <string name="Narrow Front">
+ 狭
+ </string>
+ <string name="Narrow Lips">
+ おちょぼ口
+ </string>
+ <string name="Natural">
+ ナチュラル
+ </string>
+ <string name="Neck Length">
+ 首の長さ
+ </string>
+ <string name="Neck Thickness">
+ 首の太さ
+ </string>
+ <string name="No Blush">
+ なし
+ </string>
+ <string name="No Eyeliner">
+ なし
+ </string>
+ <string name="No Eyeshadow">
+ なし
+ </string>
+ <string name="No Lipgloss">
+ なし
+ </string>
+ <string name="No Lipstick">
+ なし
+ </string>
+ <string name="No Part">
+ なし
+ </string>
+ <string name="No Polish">
+ なし
+ </string>
+ <string name="No Red">
+ なし
+ </string>
+ <string name="No Spikes">
+ なし
+ </string>
+ <string name="No White">
+ なし
+ </string>
+ <string name="No Wrinkles">
+ なし
+ </string>
+ <string name="Normal Lower">
+ 下
+ </string>
+ <string name="Normal Upper">
+ 上
+ </string>
+ <string name="Nose Left">
+ 左曲がり
+ </string>
+ <string name="Nose Right">
+ 右曲がり
+ </string>
+ <string name="Nose Size">
+ 鼻の大きさ
+ </string>
+ <string name="Nose Thickness">
+ 鼻の厚み
+ </string>
+ <string name="Nose Tip Angle">
+ 鼻先の角度
+ </string>
+ <string name="Nose Tip Shape">
+ 鼻先の形
+ </string>
+ <string name="Nose Width">
+ 鼻の幅
+ </string>
+ <string name="Nostril Division">
+ 鼻の穴の高さ
+ </string>
+ <string name="Nostril Width">
+ 鼻の穴の幅
+ </string>
+ <string name="Opaque">
+ 濃いめ
+ </string>
+ <string name="Open">
+ オープン
+ </string>
+ <string name="Open Back">
+ 後ろあき
+ </string>
+ <string name="Open Front">
+ 前あき
+ </string>
+ <string name="Open Left">
+ 左あき
+ </string>
+ <string name="Open Right">
+ 右あき
+ </string>
+ <string name="Orange">
+ オレンジ
+ </string>
+ <string name="Out">
+ 外向き
+ </string>
+ <string name="Out Shdw Color">
+ 外側のシャドウカラー
+ </string>
+ <string name="Out Shdw Opacity">
+ 外側のシャドウの濃さ
+ </string>
+ <string name="Outer Eye Corner">
+ 目尻
+ </string>
+ <string name="Outer Eye Shadow">
+ 外側のアイシャドウ
+ </string>
+ <string name="Outer Shadow">
+ 外側のシャドウ
+ </string>
+ <string name="Overbite">
+ 出っ歯
+ </string>
+ <string name="Package">
+ パッケージ
+ </string>
+ <string name="Painted Nails">
+ あり
+ </string>
+ <string name="Pale">
+ 悪い
+ </string>
+ <string name="Pants Crotch">
+ ズボンの股
+ </string>
+ <string name="Pants Fit">
+ ズボンのフィット感
+ </string>
+ <string name="Pants Length">
+ ズボン丈
+ </string>
+ <string name="Pants Waist">
+ ウエスト
+ </string>
+ <string name="Pants Wrinkles">
+ ズボンのしわ
+ </string>
+ <string name="Part">
+ あり
+ </string>
+ <string name="Part Bangs">
+ 分けた前髪
+ </string>
+ <string name="Pectorals">
+ 胸筋
+ </string>
+ <string name="Pigment">
+ 色素
+ </string>
+ <string name="Pigtails">
+ 下げ髪
+ </string>
+ <string name="Pink">
+ ピンク
+ </string>
+ <string name="Pinker">
+ ピンク
+ </string>
+ <string name="Platform Height">
+ 靴底の高さ
+ </string>
+ <string name="Platform Width">
+ 靴底の幅
+ </string>
+ <string name="Pointy">
+ 尖った
+ </string>
+ <string name="Pointy Heels">
+ 幅狭
+ </string>
+ <string name="Ponytail">
+ ポニーテール
+ </string>
+ <string name="Poofy Skirt">
+ ふんわり
+ </string>
+ <string name="Pop Left Eye">
+ 左目を大きく
+ </string>
+ <string name="Pop Right Eye">
+ 右目を大きく
+ </string>
+ <string name="Puffy">
+ ふっくら
+ </string>
+ <string name="Puffy Eyelids">
+ 目の周りの膨らみ
+ </string>
+ <string name="Rainbow Color">
+ 虹色
+ </string>
+ <string name="Red Hair">
+ 赤毛
+ </string>
+ <string name="Regular">
+ 均整のとれた
+ </string>
+ <string name="Right Part">
+ 右分け
+ </string>
+ <string name="Rosy Complexion">
+ 頬紅
+ </string>
+ <string name="Round">
+ まるっこい
+ </string>
+ <string name="Ruddiness">
+ 血色
+ </string>
+ <string name="Ruddy">
+ 良い
+ </string>
+ <string name="Rumpled Hair">
+ くしゃくしゃヘア
+ </string>
+ <string name="Saddle Bags">
+ 腰回りの肉付き
+ </string>
+ <string name="Scrawny Leg">
+ 骨張った脚
+ </string>
+ <string name="Separate">
+ 離れた胸
+ </string>
+ <string name="Shallow">
+ なだらか
+ </string>
+ <string name="Shear Back">
+ 後方を刈る
+ </string>
+ <string name="Shear Face">
+ 顔のゆがみ
+ </string>
+ <string name="Shear Front">
+ 前方を刈る
+ </string>
+ <string name="Shear Left Up">
+ 左半分を上に
+ </string>
+ <string name="Shear Right Up">
+ 右半分を上に
+ </string>
+ <string name="Sheared Back">
+ 後ろを刈られた髪
+ </string>
+ <string name="Sheared Front">
+ 前を刈られた髪
+ </string>
+ <string name="Shift Left">
+ 左向き
+ </string>
+ <string name="Shift Mouth">
+ 口の向き
+ </string>
+ <string name="Shift Right">
+ 右向き
+ </string>
+ <string name="Shirt Bottom">
+ シャツの裾
+ </string>
+ <string name="Shirt Fit">
+ シャツのフィット感
+ </string>
+ <string name="Shirt Wrinkles">
+ シャツのしわ
+ </string>
+ <string name="Shoe Height">
+ 靴の長さ
+ </string>
+ <string name="Short">
+ ショート
+ </string>
+ <string name="Short Arms">
+ 短
+ </string>
+ <string name="Short Legs">
+ 短
+ </string>
+ <string name="Short Neck">
+ 短
+ </string>
+ <string name="Short Pigtails">
+ 短
+ </string>
+ <string name="Short Ponytail">
+ 短
+ </string>
+ <string name="Short Sideburns">
+ 短め
+ </string>
+ <string name="Short Torso">
+ 短
+ </string>
+ <string name="Short hips">
+ 短
+ </string>
+ <string name="Shoulders">
+ 肩
+ </string>
+ <string name="Side Fringe">
+ サイドの毛先
+ </string>
+ <string name="Sideburns">
+ もみあげ
+ </string>
+ <string name="Sides Hair">
+ サイドの髪
+ </string>
+ <string name="Sides Hair Down">
+ ダウン
+ </string>
+ <string name="Sides Hair Up">
+ アップ
+ </string>
+ <string name="Skinny Neck">
+ 細
+ </string>
+ <string name="Skirt Fit">
+ スカートのフィット感
+ </string>
+ <string name="Skirt Length">
+ スカート丈
+ </string>
+ <string name="Slanted Forehead">
+ 傾斜した額
+ </string>
+ <string name="Sleeve Length">
+ 袖丈
+ </string>
+ <string name="Sleeve Looseness">
+ 袖のフィット感
+ </string>
+ <string name="Slit Back">
+ スリット:後ろ
+ </string>
+ <string name="Slit Front">
+ スリット:前
+ </string>
+ <string name="Slit Left">
+ スリット:左
+ </string>
+ <string name="Slit Right">
+ スリット:右
+ </string>
+ <string name="Small">
+ 小
+ </string>
+ <string name="Small Hands">
+ 小
+ </string>
+ <string name="Small Head">
+ 小
+ </string>
+ <string name="Smooth">
+ 滑らか
+ </string>
+ <string name="Smooth Hair">
+ スムーズ
+ </string>
+ <string name="Socks Length">
+ 靴下丈
+ </string>
+ <string name="Soulpatch">
+ ソウルパッチ
+ </string>
+ <string name="Sparse">
+ 薄
+ </string>
+ <string name="Spiked Hair">
+ とげとげヘア
+ </string>
+ <string name="Square">
+ 角張った
+ </string>
+ <string name="Square Toe">
+ スクエアトゥ
+ </string>
+ <string name="Squash Head">
+ カボチャ型
+ </string>
+ <string name="Stretch Head">
+ 縦長
+ </string>
+ <string name="Sunken">
+ こけたほお
+ </string>
+ <string name="Sunken Chest">
+ 小
+ </string>
+ <string name="Sunken Eyes">
+ くぼんだ目
+ </string>
+ <string name="Sweep Back">
+ 後ろへ
+ </string>
+ <string name="Sweep Forward">
+ 前へ
+ </string>
+ <string name="Tall">
+ トール
+ </string>
+ <string name="Taper Back">
+ 後ろに先細
+ </string>
+ <string name="Taper Front">
+ 前に先細
+ </string>
+ <string name="Thick Heels">
+ 幅広
+ </string>
+ <string name="Thick Neck">
+ 太
+ </string>
+ <string name="Thick Toe">
+ 厚め
+ </string>
+ <string name="Thin">
+ 薄い
+ </string>
+ <string name="Thin Eyebrows">
+ 細
+ </string>
+ <string name="Thin Lips">
+ 小
+ </string>
+ <string name="Thin Nose">
+ 細い鼻
+ </string>
+ <string name="Tight Chin">
+ ひきしまったあご
+ </string>
+ <string name="Tight Cuffs">
+ タイト
+ </string>
+ <string name="Tight Pants">
+ タイト
+ </string>
+ <string name="Tight Shirt">
+ タイト
+ </string>
+ <string name="Tight Skirt">
+ タイト
+ </string>
+ <string name="Tight Sleeves">
+ タイト
+ </string>
+ <string name="Toe Shape">
+ つま先の形
+ </string>
+ <string name="Toe Thickness">
+ つま先の厚み
+ </string>
+ <string name="Torso Length">
+ 上半身の長さ
+ </string>
+ <string name="Torso Muscles">
+ 上半身の筋肉
+ </string>
+ <string name="Torso Scrawny">
+ 上半身の骨張り
+ </string>
+ <string name="Unattached">
+ 大
+ </string>
+ <string name="Uncreased">
+ 軽いまぶた
+ </string>
+ <string name="Underbite">
+ 受け口
+ </string>
+ <string name="Unnatural">
+ ユニーク
+ </string>
+ <string name="Upper Bridge">
+ 両目のあいだ
+ </string>
+ <string name="Upper Cheeks">
+ ほおの上部
+ </string>
+ <string name="Upper Chin Cleft">
+ あご上部の割れ
+ </string>
+ <string name="Upper Eyelid Fold">
+ 二重の幅
+ </string>
+ <string name="Upturned">
+ 上向き
+ </string>
+ <string name="Very Red">
+ 真っ赤
+ </string>
+ <string name="Waist Height">
+ ウエストの高さ
+ </string>
+ <string name="Well-Fed">
+ つまったほお
+ </string>
+ <string name="White Hair">
+ 白髪
+ </string>
+ <string name="Wide">
+ 広
+ </string>
+ <string name="Wide Back">
+ 広
+ </string>
+ <string name="Wide Front">
+ 広
+ </string>
+ <string name="Wide Lips">
+ 大きい口
+ </string>
+ <string name="Wild">
+ ワイルド
+ </string>
+ <string name="Wrinkles">
+ しわ
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ ランドマークに追加
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ ランドマークを編集
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ 現在地の詳細を見る
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ ロケーション履歴
+ </string>
+ <string name="LocationCtrlForSaleTooltip">
+ この土地を購入
+ </string>
+ <string name="LocationCtrlVoiceTooltip">
+ ここではボイスを利用できません。
+ </string>
+ <string name="LocationCtrlFlyTooltip">
+ 飛行は禁止されています。
+ </string>
+ <string name="LocationCtrlPushTooltip">
+ プッシュ禁止
+ </string>
+ <string name="LocationCtrlBuildTooltip">
+ オブジェクトの制作や落とす事は禁止されています。
+ </string>
+ <string name="LocationCtrlScriptsTooltip">
+ スクリプト不可
+ </string>
+ <string name="LocationCtrlDamageTooltip">
+ 体力
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Adultリージョン
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Moderateリージョン
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ Generalリージョン
+ </string>
+ <string name="LocationCtrlSeeAVsTooltip">
+ この区画内のアバターは、この区画の外にいるアバターからは見ることも聞くこともできません。
+ </string>
+ <string name="LocationCtrlPathfindingDirtyTooltip">
+ リージョン(地域)が再構築されるまで、移動するオブジェクトは正しく動作しない可能性があります。
+ </string>
+ <string name="LocationCtrlPathfindingDisabledTooltip">
+ このリージョン(地域)では、動的経路探索が有効になっていません。
+ </string>
+ <string name="UpdaterWindowTitle">
+ [APP_NAME]の更新
+ </string>
+ <string name="UpdaterNowUpdating">
+ 只今[APP_NAME]を更新中です…
+ </string>
+ <string name="UpdaterNowInstalling">
+ [APP_NAME]をインストール中です…
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ お使いの[APP_NAME]ビューアを最新バージョンに更新しています。数分かかることがありますのでしばらくお待ちください。
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ アップデートをダウンロード中です…
+ </string>
+ <string name="UpdaterProgressBarText">
+ 更新をダウンロード中…
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ 更新のダウンロードに失敗しました。
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ [APP_NAME]の更新中にエラーが発生しました。www.secondlife.com から最新バージョンをダウンロードしてください。
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ 更新のインストールに失敗しました。
+ </string>
+ <string name="UpdaterFailStartTitle">
+ ビューアの起動に失敗しました。
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]:アイテムが[FROM_NAME]から同時にたくさん読み込まれているため、自動プレビューが[TIME]秒間無効となります。
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]:アイテムが同時にたくさん読み込まれているため、自動プレビューが[TIME]秒間無効となります。
+ </string>
+ <string name="IM_logging_string">
+ -インスタントメッセージの保存開始-
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME]は入力中です…
+ </string>
+ <string name="Unnamed">
+ (名前なし)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (モデレート:デフォルトでボイスはオフ)
+ </string>
+ <string name="IM_unavailable_text_label">
+ このコールでは文字チャットが利用できません。
+ </string>
+ <string name="IM_muted_text_label">
+ グループのモデレータが、あなたの文字チャットを使用禁止にしました。
+ </string>
+ <string name="IM_default_text_label">
+ ここをクリックしてインスタントメッセージを開始。
+ </string>
+ <string name="IM_to_label">
+ 宛先
+ </string>
+ <string name="IM_moderator_label">
+ (モデレータ)
+ </string>
+ <string name="Saved_message">
+ (保存日時:[LONG_TIMESTAMP])
+ </string>
+ <string name="IM_unblock_only_groups_friends">
+ このメッセージを表示するには、「初期設定」の「プライバシー」で「フレンドとグループ以外からはコールとIMを受信しない」チェックボックスをオフにします。
+ </string>
+ <string name="OnlineStatus">
+ オンライン
+ </string>
+ <string name="OfflineStatus">
+ オフライン
+ </string>
+ <string name="not_online_msg">
+ ユーザーがオンラインでありません-メッセージは保存され、後で配信されます。
+ </string>
+ <string name="not_online_inventory">
+ ユーザーがオンラインでありません–インベントリに保存されました。
+ </string>
+ <string name="answered_call">
+ 相手がコールを受けました。
+ </string>
+ <string name="you_started_call">
+ ボイスコールを開始します。
+ </string>
+ <string name="you_joined_call">
+ ボイスコールに参加しました。
+ </string>
+ <string name="you_auto_rejected_call-im">
+ 「通知を受けない」がオンのときに、自動的にボイスコールを拒否しました。
+ </string>
+ <string name="name_started_call">
+ [NAME]はボイスコールを開始します
+ </string>
+ <string name="ringing-im">
+ ボイスコールに参加…
+ </string>
+ <string name="connected-im">
+ 接続しました。「通話終了」をクリックして切断します。
+ </string>
+ <string name="hang_up-im">
+ ボイスコールから退席しました
+ </string>
+ <string name="answering-im">
+ 接続中…
+ </string>
+ <string name="conference-title">
+ 複数人チャット
+ </string>
+ <string name="conference-title-incoming">
+ [AGENT_NAME]と会話する
+ </string>
+ <string name="inventory_item_offered-im">
+ アイテム「[ITEM_NAME]」がインベントリに送られてきました。
+ </string>
+ <string name="inventory_folder_offered-im">
+ フォルダ「[ITEM_NAME]」がインベントリに送られてきました。
+ </string>
+ <string name="share_alert">
+ インベントリからここにアイテムをドラッグします。
+ </string>
+ <string name="no_session_message">
+ (IMセッションが存在しません)
+ </string>
+ <string name="only_user_message">
+ このセッションにいるユーザーはあなただけです。
+ </string>
+ <string name="offline_message">
+ [NAME]はオフライン中です。
+ </string>
+ <string name="invite_message">
+ このボイスチャットに応答・接続する場合は、[BUTTON NAME]をクリックしてください。
+ </string>
+ <string name="muted_message">
+ この住人をブロックしています。メッセージを送ると、ブロックが自動的に解除されます。
+ </string>
+ <string name="generic">
+ リクエスト中にエラーが発生しました。お手数ですが、もう一度やり直してください。
+ </string>
+ <string name="generic_request_error">
+ 要求中にエラーが発生しました。お手数ですが、もう一度やり直してください。
+ </string>
+ <string name="insufficient_perms_error">
+ あなたには充分な権限がありません。
+ </string>
+ <string name="session_does_not_exist_error">
+ このセッションは既に切断されています。
+ </string>
+ <string name="no_ability_error">
+ あなたにはその能力がありません。
+ </string>
+ <string name="no_ability">
+ あなたにはその能力がありません。
+ </string>
+ <string name="not_a_mod_error">
+ あなたは、セッションモデレータではありません。
+ </string>
+ <string name="muted">
+ グループのモデレーターが、あなたのテキストチャットを禁止しました。
+ </string>
+ <string name="muted_error">
+ グループモデレータが、あなたのテキストチャットを無効化しました。
+ </string>
+ <string name="add_session_event">
+ [RECIPIENT]とのチャットセッションにユーザーを追加することができません。
+ </string>
+ <string name="message">
+ [RECIPIENT]とのチャットセッションに、メッセージを送信することができません。
+ </string>
+ <string name="message_session_event">
+ [RECIPIENT]とのチャットセッションにメッセージを送ることができません。
+ </string>
+ <string name="mute">
+ モデレート中にエラーが発生しました。
+ </string>
+ <string name="removed">
+ グループから脱退しました。
+ </string>
+ <string name="removed_from_group">
+ あなたは、グループから削除されました。
+ </string>
+ <string name="close_on_no_ability">
+ このチャットセッションを継続することはできません。
+ </string>
+ <string name="unread_chat_single">
+ [SOURCES]は、何か新しいことを言いました。
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES]は、何か新しいことを言いました。
+ </string>
+ <string name="session_initialization_timed_out_error">
+ セッションの初期化がタイムアウトしました。
+ </string>
+ <string name="Home position set.">
+ 家の配置の設定。
+ </string>
+ <string name="voice_morphing_url">
+ https://secondlife.com/destination/voice-island
+ </string>
+ <string name="premium_voice_morphing_url">
+ https://secondlife.com/destination/voice-morphing-premium
+ </string>
+ <string name="lindenhomes_get_home_url">
+ https://secondlife.com/land/lindenhomes/member.php?lang=ja-JP
+ </string>
+ <string name="lindenhomes_my_home_url">
+ https://land.secondlife.com/ja-JP/lindenhomes/my-home.php
+ </string>
+ <string name="membership_url">
+ https://accounts.secondlife.com/change_membership/?lang=ja-JP
+ </string>
+ <string name="paid_you_ldollars">
+ [NAME]は、[REASON]費用のL$ [AMOUNT]を支払いました。
+ </string>
+ <string name="paid_you_ldollars_gift">
+ [NAME]は、[REASON]費用のL$ [AMOUNT]支払いました。
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ [NAME]は、L$ [AMOUNT]を支払いました。
+ </string>
+ <string name="you_paid_ldollars">
+ [NAME]に[REASON]費用のL$ [AMOUNT]を支払いました。
+ </string>
+ <string name="you_paid_ldollars_gift">
+ [NAME]に[REASON]費用のL$ [AMOUNT]を支払いました。
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ L$ [AMOUNT]を支払いました。
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ [NAME]にL$ [AMOUNT]を支払いました。
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ [REASON]費用のL$ [AMOUNT]を支払いました。
+ </string>
+ <string name="you_paid_failure_ldollars">
+ [NAME]に[REASON]費用L$ [AMOUNT]を支払えませんでした。
+ </string>
+ <string name="you_paid_failure_ldollars_gift">
+ [NAME]に[REASON]費用のL$ [AMOUNT]を支払えませんでした。
+ </string>
+ <string name="you_paid_failure_ldollars_no_info">
+ L$ [AMOUNT]を支払えませんでした。
+ </string>
+ <string name="you_paid_failure_ldollars_no_reason">
+ [NAME]にL$ [AMOUNT]を支払えませんでした。
+ </string>
+ <string name="you_paid_failure_ldollars_no_name">
+ [REASON]費用L$ [AMOUNT]を支払えませんでした。
+ </string>
+ <string name="for item">
+ [ITEM]
+ </string>
+ <string name="for a parcel of land">
+ 土地区画
+ </string>
+ <string name="for a land access pass">
+ 土地への入場許可
+ </string>
+ <string name="for deeding land">
+ 土地を譲渡
+ </string>
+ <string name="to create a group">
+ グループ作成
+ </string>
+ <string name="to join a group">
+ グループ参加
+ </string>
+ <string name="to upload">
+ アップロード
+ </string>
+ <string name="to publish a classified ad">
+ クラシファイド広告掲載
+ </string>
+ <string name="uploading_costs">
+ アップロード費用はL$ [AMOUNT]です。
+ </string>
+ <string name="this_costs">
+ 費用はL$ [AMOUNT]です。
+ </string>
+ <string name="buying_selected_land">
+ 選択した土地をL$ [AMOUNT]で購入します。
+ </string>
+ <string name="this_object_costs">
+ このオブジェクトの費用は、L$ [AMOUNT]です。
+ </string>
+ <string name="giving">
+ L$ [AMOUNT]を渡します。
+ </string>
+ <string name="group_role_everyone">
+ 全員
+ </string>
+ <string name="group_role_officers">
+ オフィサー
+ </string>
+ <string name="group_role_owners">
+ 所有者
+ </string>
+ <string name="group_member_status_online">
+ オンライン
+ </string>
+ <string name="uploading_abuse_report">
+ アップロード中…
-サービスに関する既知の問題については、http://status.secondlifegrid.net をご覧ください。
-問題が引き続き発生する場合は、お使いのネットワークやファイアウォールの設定を調べてください。</string>
- <string name="dateTimeWeekdaysNames">日曜日:月曜日:火曜日:水曜日:木曜日:金曜日:土曜日</string>
- <string name="dateTimeWeekdaysShortNames">日:月:火:水:木:金:土</string>
- <string name="dateTimeMonthNames">1月:2月:3月:4月:5月:6月:7月:8月:9月:10月:11月:12月</string>
- <string name="dateTimeMonthShortNames">1月:2月:3月:4月:5月:6月:7月:8月:9月:10月:11月:12月</string>
- <string name="dateTimeDayFormat">[MDAY]</string>
- <string name="dateTimeAM">AM</string>
- <string name="dateTimePM">PM</string>
- <string name="LocalEstimateUSD">US$ [AMOUNT]</string>
- <string name="Group Ban">グループへの立入禁止</string>
- <string name="Membership">会員</string>
- <string name="Roles">役割</string>
- <string name="Group Identity">グループの識別情報</string>
- <string name="Parcel Management">区画の管理</string>
- <string name="Parcel Identity">区画の識別情報</string>
- <string name="Parcel Settings">区画の設定</string>
- <string name="Parcel Powers">区画の権限</string>
- <string name="Parcel Access">区画へのアクセス</string>
- <string name="Parcel Content">区画のコンテンツ</string>
- <string name="Object Management">オブジェクトの管理</string>
- <string name="Accounting">会計</string>
- <string name="Notices">通知</string>
- <string name="Chat" value=" チャット:">チャット</string>
- <string name="BaseMembership">ベース</string>
- <string name="PremiumMembership">プレミアム</string>
- <string name="Premium_PlusMembership">プレミアムプラス</string>
- <string name="DeleteItems">選択したアイテムを削除しますか</string>
- <string name="DeleteItem">選択したアイテムを削除しますか</string>
- <string name="EmptyOutfitText">このアウトフィットにはアイテムがありません</string>
- <string name="ExternalEditorNotSet">ExternalEditor 設定を使ってエディターを選択します。</string>
- <string name="ExternalEditorNotFound">指定された外部エディターが見つかりません。
-エディターへのパスを二重引用符で囲んでみてください。
-(例:&quot;/path to my/editor&quot; &quot;%s&quot;)</string>
- <string name="ExternalEditorCommandParseError">外部エディターのコマンドの解析中にエラーが見つかりました。</string>
- <string name="ExternalEditorFailedToRun">外部エディターを実行できませんでした。</string>
- <string name="TranslationFailed">翻訳できませんでした:[REASON]</string>
- <string name="TranslationResponseParseError">翻訳の応答にエラーが発生しました。</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">ホーム</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">追加</string>
- <string name="Subtract">減算</string>
- <string name="Multiply">乗算</string>
- <string name="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">パーティクル源ビーコン(青)を表示中</string>
- <string name="BeaconPhysical">物理的オブジェクトのビーコン(緑)を表示中</string>
- <string name="BeaconScripted">スクリプトのオブジェクトのビーコン(赤)を表示中</string>
- <string name="BeaconScriptedTouch">タッチ機能のビーコンが付いたスクリプトのオブジェクト(赤)を表示中</string>
- <string name="BeaconSound">サウンドビーコン(黄)を表示中</string>
- <string name="BeaconMedia">メディアビーコン(白)を表示中</string>
- <string name="BeaconSun">太陽の方角ビーコン(オレンジ)を表示中</string>
- <string name="BeaconMoon">月の方角ビーコン(紫)を表示中</string>
- <string name="ParticleHiding">パーティクルを非表示</string>
- <string name="Command_AboutLand_Label">土地情報</string>
- <string name="Command_Appearance_Label">容姿</string>
- <string name="Command_Avatar_Label">アバター</string>
- <string name="Command_Build_Label">制作</string>
- <string name="Command_Chat_Label">チャット</string>
- <string name="Command_Conversations_Label">会話</string>
- <string name="Command_Compass_Label">コンパス</string>
- <string name="Command_Destinations_Label">行き先</string>
- <string name="Command_Environments_Label">私の環境</string>
- <string name="Command_Facebook_Label">Facebook</string>
- <string name="Command_Flickr_Label">Flickr</string>
- <string name="Command_Gestures_Label">ジェスチャー</string>
- <string name="Command_Grid_Status_Label">グリッドステータス</string>
- <string name="Command_HowTo_Label">ハウツー</string>
- <string name="Command_Inventory_Label">インベントリ</string>
- <string name="Command_Map_Label">地図</string>
- <string name="Command_Marketplace_Label">マーケットプレイス</string>
- <string name="Command_MarketplaceListings_Label">マーケットプレイス</string>
- <string name="Command_MiniMap_Label">ミニマップ</string>
- <string name="Command_Move_Label">歩行 / 走行 / 飛行</string>
- <string name="Command_Outbox_Label">マーチャントアウトボックス</string>
- <string name="Command_People_Label">人</string>
- <string name="Command_Picks_Label">ピック</string>
- <string name="Command_Places_Label">場所</string>
- <string name="Command_Preferences_Label">環境設定</string>
- <string name="Command_Profile_Label">プロフィール</string>
- <string name="Command_Report_Abuse_Label">嫌がらせの報告</string>
- <string name="Command_Search_Label">検索</string>
- <string name="Command_Snapshot_Label">スナップショット</string>
- <string name="Command_Speak_Label">話す</string>
- <string name="Command_Twitter_Label">Twitter</string>
- <string name="Command_View_Label">カメラコントロール</string>
- <string name="Command_Voice_Label">ボイス設定</string>
- <string name="Command_AboutLand_Tooltip">訪問先に関する情報</string>
- <string name="Command_Appearance_Tooltip">アバターを変更</string>
- <string name="Command_Avatar_Tooltip">アバター一式を選択</string>
- <string name="Command_Build_Tooltip">オブジェクトの制作と地形の変形</string>
- <string name="Command_Chat_Tooltip">近くの人と文字チャットする</string>
- <string name="Command_Conversations_Tooltip">全員との会話</string>
- <string name="Command_Compass_Tooltip">コンパス</string>
- <string name="Command_Destinations_Tooltip">行ってみたい場所</string>
- <string name="Command_Environments_Tooltip">私の環境</string>
- <string name="Command_Facebook_Tooltip">Facebook へ投稿</string>
- <string name="Command_Flickr_Tooltip">Flickr にアップロード</string>
- <string name="Command_Gestures_Tooltip">アバターのジェスチャー</string>
- <string name="Command_Grid_Status_Tooltip">現在のグリッドステータスを表示</string>
- <string name="Command_HowTo_Tooltip">一般的タスクの実行方法</string>
- <string name="Command_Inventory_Tooltip">インベントリを表示・使用</string>
- <string name="Command_Map_Tooltip">世界地図</string>
- <string name="Command_Marketplace_Tooltip">ショッピングに出掛ける</string>
- <string name="Command_MarketplaceListings_Tooltip">創作アイテムを販売します</string>
- <string name="Command_MiniMap_Tooltip">近くの人を表示する</string>
- <string name="Command_Move_Tooltip">アバターの移動</string>
- <string name="Command_Outbox_Tooltip">販売用にアイテムをマーケットプレイスに転送</string>
- <string name="Command_People_Tooltip">フレンド、グループ、近くの人</string>
- <string name="Command_Picks_Tooltip">プロフィールで紹介するお気に入りの場所</string>
- <string name="Command_Places_Tooltip">保存済みの場所</string>
- <string name="Command_Preferences_Tooltip">環境設定</string>
- <string name="Command_Profile_Tooltip">プロフィールを編集・表示</string>
- <string name="Command_Report_Abuse_Tooltip">嫌がらせの報告</string>
- <string name="Command_Search_Tooltip">場所、イベント、人を検索</string>
- <string name="Command_Snapshot_Tooltip">ピクチャを撮る</string>
- <string name="Command_Speak_Tooltip">マイクを使って近くの人と話す</string>
- <string name="Command_Twitter_Tooltip">Twitter</string>
- <string name="Command_View_Tooltip">カメラの角度を変更</string>
- <string name="Command_Voice_Tooltip">インワールドでのコールや近くにいる人の音量調整</string>
- <string name="Toolbar_Bottom_Tooltip">現在、下のツールバーにあります</string>
- <string name="Toolbar_Left_Tooltip">現在、左のツールバーにあります</string>
- <string name="Toolbar_Right_Tooltip">現在、右のツールバーにあります</string>
- <string name="Retain%">維持率</string>
- <string name="Detail">詳細</string>
- <string name="Better Detail">もっと詳しく</string>
- <string name="Surface">表面</string>
- <string name="Solid">ソリッド</string>
- <string name="Wrap">ラップ</string>
- <string name="Preview">プレビュー</string>
- <string name="Normal">普通</string>
- <string name="Pathfinding_Wiki_URL">http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer</string>
- <string name="Pathfinding_Object_Attr_None">なし</string>
- <string name="Pathfinding_Object_Attr_Permanent">ナビメッシュに影響を与える</string>
- <string name="Pathfinding_Object_Attr_Character">キャラクター</string>
- <string name="Pathfinding_Object_Attr_MultiSelect">(複数)</string>
- <string name="snapshot_quality_very_low">非常に低い</string>
- <string name="snapshot_quality_low">低</string>
- <string name="snapshot_quality_medium">中</string>
- <string name="snapshot_quality_high">高</string>
- <string name="snapshot_quality_very_high">非常に高い</string>
- <string name="TeleportMaturityExceeded">住人はこの地域(リージョン)を訪問できません。</string>
- <string name="UserDictionary">[User]</string>
- <string name="experience_tools_experience">体験</string>
- <string name="ExperienceNameNull">(体験なし)</string>
- <string name="ExperienceNameUntitled">(タイトルのない体験)</string>
- <string name="Land-Scope">ランドスコープ</string>
- <string name="Grid-Scope">グリッドスコープ</string>
- <string name="Allowed_Experiences_Tab">許可</string>
- <string name="Blocked_Experiences_Tab">停止</string>
- <string name="Contrib_Experiences_Tab">貢献者</string>
- <string name="Admin_Experiences_Tab">管理</string>
- <string name="Recent_Experiences_Tab">最新</string>
- <string name="Owned_Experiences_Tab">所有</string>
- <string name="ExperiencesCounter">([EXPERIENCES], max [MAXEXPERIENCES])</string>
- <string name="ExperiencePermission1">コントロールを引き継ぐ</string>
- <string name="ExperiencePermission3">アバターでアニメーションをトリガー</string>
- <string name="ExperiencePermission4">アバターに装着</string>
- <string name="ExperiencePermission9">カメラ追従</string>
- <string name="ExperiencePermission10">カメラのコントロール</string>
- <string name="ExperiencePermission11">あなたをテレポート</string>
- <string name="ExperiencePermission12">体験の権限を自動的に承諾</string>
- <string name="ExperiencePermission16">あなたのアバターを強制的に座らせる</string>
- <string name="ExperiencePermission17">自然環境の設定を変更する</string>
- <string name="ExperiencePermissionShortUnknown">が不明な操作を実行しました: [Permission]</string>
- <string name="ExperiencePermissionShort1">コントロールする</string>
- <string name="ExperiencePermissionShort3">アニメーションをトリガー</string>
- <string name="ExperiencePermissionShort4">取り付ける</string>
- <string name="ExperiencePermissionShort9">カメラを追跡</string>
- <string name="ExperiencePermissionShort10">カメラを制御</string>
- <string name="ExperiencePermissionShort11">テレポート</string>
- <string name="ExperiencePermissionShort12">権限</string>
- <string name="ExperiencePermissionShort16">Sit</string>
- <string name="ExperiencePermissionShort17">環境</string>
- <string name="logging_calls_disabled_log_empty">会話はログに記録されていません。ログの記録を開始するには、「環境設定」&gt;「チャット」で「保存: ログのみ」または「保存: ログと会話のテキスト」を選択します。</string>
- <string name="logging_calls_disabled_log_not_empty">これ以上の会話は記録されません。ログの記録を再開するには、「環境設定」&gt;「チャット」で「保存: ログのみ」または「保存: ログと会話のテキスト」を選択します。</string>
- <string name="logging_calls_enabled_log_empty">ログイン時の会話はありません。誰かにご連絡した後、または誰かがあなたに連絡した後、ログエントリがここに表示されます。</string>
- <string name="loading_chat_logs">ロード中...</string>
- <string name="na">該当なし</string>
- <string name="preset_combo_label">-空リスト-</string>
- <string name="Default">デフォルト</string>
- <string name="none_paren_cap">(なし)</string>
- <string name="no_limit">無制限</string>
- <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES">物理形状に小さすぎる三角形が含まれています。物理モデルを簡略化してください。</string>
- <string name="Mav_Details_MAV_CONFIRMATION_DATA_MISMATCH">物理形状に不正な確認データがあります。物理モデルを修正してください。</string>
- <string name="Mav_Details_MAV_UNKNOWN_VERSION">物理形状のバージョンが正しくありません。物理モデルに正しいバージョンを設定してください。</string>
- <string name="couldnt_resolve_host">DNS がホスト名 ([HOSTNAME]) を解決できませんでした。
+嫌がらせの報告
+ </string>
+ <string name="New Shape">
+ 新しいシェイプ
+ </string>
+ <string name="New Skin">
+ 新しいスキン
+ </string>
+ <string name="New Hair">
+ 新しい髪
+ </string>
+ <string name="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">
+ 新しいアルファ
+ </string>
+ <string name="New Tattoo">
+ 新しいタトゥ
+ </string>
+ <string name="New Universal">
+ 新しいユニバーサル
+ </string>
+ <string name="New Physics">
+ 新規の物理作用
+ </string>
+ <string name="Invalid Wearable">
+ 無効な着用物
+ </string>
+ <string name="New Gesture">
+ ジェスチャー
+ </string>
+ <string name="New Script">
+ 新規スクリプト
+ </string>
+ <string name="New Note">
+ ノート
+ </string>
+ <string name="New Folder">
+ 新規フォルダ
+ </string>
+ <string name="Contents">
+ コンテンツ
+ </string>
+ <string name="Gesture">
+ ジェスチャー
+ </string>
+ <string name="Male Gestures">
+ 男性用ジェスチャー
+ </string>
+ <string name="Female Gestures">
+ 女性用ジェスチャー
+ </string>
+ <string name="Other Gestures">
+ その他のジェスチャー
+ </string>
+ <string name="Speech Gestures">
+ 会話ジェスチャー
+ </string>
+ <string name="Common Gestures">
+ 一般的ジェスチャー
+ </string>
+ <string name="Male - Excuse me">
+ 男性-すみません
+ </string>
+ <string name="Male - Get lost">
+ 男性-あっち行けよ
+ </string>
+ <string name="Male - Blow kiss">
+ 男性-投げキッス
+ </string>
+ <string name="Male - Boo">
+ 男性-ぶー
+ </string>
+ <string name="Male - Bored">
+ 男性-退屈
+ </string>
+ <string name="Male - Hey">
+ 男性-–やぁ
+ </string>
+ <string name="Male - Laugh">
+ 男性-笑う
+ </string>
+ <string name="Male - Repulsed">
+ 男性-拒絶
+ </string>
+ <string name="Male - Shrug">
+ 男性-肩をすくめる
+ </string>
+ <string name="Male - Stick tougue out">
+ 男性-舌を出す
+ </string>
+ <string name="Male - Wow">
+ 男性-わぁ
+ </string>
+ <string name="Female - Chuckle">
+ 女性-クスクス
+ </string>
+ <string name="Female - Cry">
+ 女性-泣く
+ </string>
+ <string name="Female - Embarrassed">
+ 女性-恥ずかしい
+ </string>
+ <string name="Female - Excuse me">
+ 女性-すみません
+ </string>
+ <string name="Female - Get lost">
+ 女性-あっち行ってよ
+ </string>
+ <string name="Female - Blow kiss">
+ 女性–投げキッス
+ </string>
+ <string name="Female - Boo">
+ 女性-ぶー
+ </string>
+ <string name="Female - Bored">
+ 女性-退屈
+ </string>
+ <string name="Female - Hey">
+ 女性-やぁ
+ </string>
+ <string name="Female - Hey baby">
+ 女性-ヘイ、ベィビー!
+ </string>
+ <string name="Female - Laugh">
+ 女性-笑う
+ </string>
+ <string name="Female - Looking good">
+ 女性-いい感じ
+ </string>
+ <string name="Female - Over here">
+ 女性-こっちよ
+ </string>
+ <string name="Female - Please">
+ 女性-プリーズ
+ </string>
+ <string name="Female - Repulsed">
+ 女性-拒絶
+ </string>
+ <string name="Female - Shrug">
+ 女性-肩をすくめる
+ </string>
+ <string name="Female - Stick tougue out">
+ 女性-舌を出す
+ </string>
+ <string name="Female - Wow">
+ 女性-わぁ
+ </string>
+ <string name="New Daycycle">
+ 新しいデイサイクル
+ </string>
+ <string name="New Water">
+ 新しい水面
+ </string>
+ <string name="New Sky">
+ 新しい空
+ </string>
+ <string name="/bow">
+ /おじぎする
+ </string>
+ <string name="/clap">
+ /拍手
+ </string>
+ <string name="/count">
+ /数える
+ </string>
+ <string name="/extinguish">
+ /消す
+ </string>
+ <string name="/kmb">
+ /くそくらえ
+ </string>
+ <string name="/muscle">
+ /筋肉もりもり
+ </string>
+ <string name="/no">
+ /いいえ
+ </string>
+ <string name="/no!">
+ /だめ!
+ </string>
+ <string name="/paper">
+ /パー
+ </string>
+ <string name="/pointme">
+ /自分を指差す
+ </string>
+ <string name="/pointyou">
+ /相手を指差す
+ </string>
+ <string name="/rock">
+ /グー
+ </string>
+ <string name="/scissor">
+ /チョキ
+ </string>
+ <string name="/smoke">
+ /タバコを吸う
+ </string>
+ <string name="/stretch">
+ /伸びをする
+ </string>
+ <string name="/whistle">
+ /口笛を吹く
+ </string>
+ <string name="/yes">
+ /はい
+ </string>
+ <string name="/yes!">
+ /イエス!
+ </string>
+ <string name="afk">
+ 一時退席中
+ </string>
+ <string name="dance1">
+ ダンス1
+ </string>
+ <string name="dance2">
+ ダンス2
+ </string>
+ <string name="dance3">
+ ダンス3
+ </string>
+ <string name="dance4">
+ ダンス4
+ </string>
+ <string name="dance5">
+ ダンス5
+ </string>
+ <string name="dance6">
+ ダンス6
+ </string>
+ <string name="dance7">
+ ダンス7
+ </string>
+ <string name="dance8">
+ ダンス8
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [year,datetime,slt]年[mthnum,datetime,slt]月[day,datetime,slt]日
+ </string>
+ <string name="DefaultMimeType">
+ none/none
+ </string>
+ <string name="texture_load_dimensions_error">
+ [WIDTH]✕[HEIGHT]以上の画像は読み込めません。
+ </string>
+ <string name="outfit_photo_load_dimensions_error">
+ アウトフィット画像の最大サイズは、[WIDTH]✕[HEIGHT]です。画像のサイズを調整するか、別の画像を使用してください。
+ </string>
+ <string name="outfit_photo_select_dimensions_error">
+ アウトフィット画像の最大サイズは、[WIDTH]✕[HEIGHT]です。別のテクスチャを選択してください。
+ </string>
+ <string name="outfit_photo_verify_dimensions_error">
+ 画像の寸法を確認できません。画像サイズがピッカーに表示されるまでお待ちください。
+ </string>
+ <string name="sentences_separator" value=" "/>
+ <string name="words_separator" value="、"/>
+ <string name="server_is_down">
+ 大変申し訳ございませんが、予期しない問題が発生しました。サービスに関する既知の問題については、 https://status.secondlifegrid.net/?lang=ja-JP をご覧ください。
+問題が引き続き発生する場合は、お使いのネットワークやファイヤーウォールの設定を調べてください。
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ 日曜日:月曜日:火曜日:水曜日:木曜日:金曜日:土曜日
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ 日:月:火:水:木:金:土
+ </string>
+ <string name="dateTimeMonthNames">
+ 1月:2月:3月:4月:5月:6月:7月:8月:9月:10月:11月:12月
+ </string>
+ <string name="dateTimeMonthShortNames">
+ ㋀:㋁:㋂:㋃:㋄:㋅:㋆:㋇:㋈:㋉:㋊:㋋
+ </string>
+ <string name="dateTimeDayFormat">
+ [MDAY]
+ </string>
+ <string name="dateTimeAM">
+ 午前
+ </string>
+ <string name="dateTimePM">
+ 午後
+ </string>
+ <string name="LocalEstimateUSD">
+ [AMOUNT]米ドル
+ </string>
+ <string name="Group Ban">
+ グループからバン
+ </string>
+ <string name="Membership">
+ 会員
+ </string>
+ <string name="Roles">
+ 役割
+ </string>
+ <string name="Group Identity">
+ グループの識別情報
+ </string>
+ <string name="Parcel Management">
+ 区画の管理
+ </string>
+ <string name="Parcel Identity">
+ 区画の識別情報
+ </string>
+ <string name="Parcel Settings">
+ 区画の設定
+ </string>
+ <string name="Parcel Powers">
+ 区画の権限
+ </string>
+ <string name="Parcel Access">
+ 区画へのアクセス
+ </string>
+ <string name="Parcel Content">
+ 区画のコンテンツ
+ </string>
+ <string name="Object Management">
+ オブジェクトの管理
+ </string>
+ <string name="Accounting">
+ 会計
+ </string>
+ <string name="Notices">
+ 通知
+ </string>
+ <string name="Chat" value="チャット:">
+ チャット
+ </string>
+ <string name="BaseMembership">
+ ベース
+ </string>
+ <string name="PremiumMembership">
+ プレミアム
+ </string>
+ <string name="Premium_PlusMembership">
+ プレミアムプラス
+ </string>
+ <string name="InternalMembership">
+ Internal
+ </string>
+ <string name="MembershipUpgradeText">
+ メンバーシッププランの変更…
+ </string>
+ <string name="MembershipPremiumText">
+ プレミアムメンバーシップ
+ </string>
+ <string name="DeleteItems">
+ 選択したアイテムを削除しますか?
+ </string>
+ <string name="DeleteItem">
+ 選択したアイテムを削除しますか?
+ </string>
+ <string name="EmptyOutfitText">
+ このアウトフィットにはアイテムがありません。
+ </string>
+ <string name="ExternalEditorNotSet">
+ ExternalEditor 設定を使ってエディターを選択します。
+ </string>
+ <string name="ExternalEditorNotFound">
+ 指定された外部エディターが見つかりません。
+エディターへのパスを二重引用符で囲んでみてください。(例:"/path to my/editor" "%s")
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ 外部エディターのコマンドの解析中にエラーが見つかりました。
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ 外部エディターを実行できませんでした。
+ </string>
+ <string name="TranslationFailed">
+ 翻訳できませんでした:[REASON]
+ </string>
+ <string name="TranslationResponseParseError">
+ 翻訳の応答にエラーが発生しました。
+ </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">
+ ←
+ </string>
+ <string name="Right">
+ →
+ </string>
+ <string name="Up">
+ ↑
+ </string>
+ <string name="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">
+ 追加
+ </string>
+ <string name="Subtract">
+ 減算
+ </string>
+ <string name="Multiply">
+ 乗算
+ </string>
+ <string name="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="LMB">
+ 左クリック
+ </string>
+ <string name="MMB">
+ ホイールクリック
+ </string>
+ <string name="RMB">
+ 右クリック
+ </string>
+ <string name="MB4">
+ 進むボタン
+ </string>
+ <string name="MB5">
+ 戻るボタン
+ </string>
+ <string name="Double LMB">
+ 左ダブルクリック
+ </string>
+ <string name="BeaconParticle">
+ パーティクル源ビーコン(青)を表示中
+ </string>
+ <string name="BeaconPhysical">
+ 物理的オブジェクトのビーコン(緑)を表示中
+ </string>
+ <string name="BeaconScripted">
+ スクリプトのオブジェクトのビーコン(赤)を表示中
+ </string>
+ <string name="BeaconScriptedTouch">
+ タッチ機能のビーコンが付いたスクリプトのオブジェクト(赤)を表示中
+ </string>
+ <string name="BeaconSound">
+ サウンドビーコン(黄)を表示中
+ </string>
+ <string name="BeaconMedia">
+ メディアビーコン(白)を表示中
+ </string>
+ <string name="BeaconSun">
+ 太陽の方角ビーコン(オレンジ)を表示中
+ </string>
+ <string name="BeaconMoon">
+ 月の方角ビーコン(紫)を表示中
+ </string>
+ <string name="ParticleHiding">
+ パーティクルを非表示
+ </string>
+ <string name="Command_360_Capture_Label">
+ 360度Sショット
+ </string>
+ <string name="Command_AboutLand_Label">
+ 土地情報
+ </string>
+ <string name="Command_Appearance_Label">
+ アウトフィット
+ </string>
+ <string name="Command_Avatar_Label">
+ アバター一式
+ </string>
+ <string name="Command_Build_Label">
+ 制作
+ </string>
+ <string name="Command_Chat_Label">
+ チャット
+ </string>
+ <string name="Command_Conversations_Label">
+ 会話
+ </string>
+ <string name="Command_Compass_Label">
+ コンパス
+ </string>
+ <string name="Command_Destinations_Label">
+ 行き先
+ </string>
+ <string name="Command_Environments_Label">
+ 環境
+ </string>
+ <string name="Command_Gestures_Label">
+ ジェスチャー
+ </string>
+ <string name="Command_Grid_Status_Label">
+ グリッド状況
+ </string>
+ <string name="Command_HowTo_Label">
+ ハウツー
+ </string>
+ <string name="Command_Inventory_Label">
+ インベントリ
+ </string>
+ <string name="Command_Map_Label">
+ マップ
+ </string>
+ <string name="Command_Marketplace_Label">
+ マーケットプレイス
+ </string>
+ <string name="Command_MarketplaceListings_Label">
+ マーケットプレイス
+ </string>
+ <string name="Command_MiniMap_Label">
+ ミニマップ
+ </string>
+ <string name="Command_Move_Label">
+ 歩行/走行/飛行
+ </string>
+ <string name="Command_People_Label">
+ 人物
+ </string>
+ <string name="Command_Picks_Label">
+ ピック
+ </string>
+ <string name="Command_Places_Label">
+ 場所
+ </string>
+ <string name="Command_Preferences_Label">
+ 初期設定
+ </string>
+ <string name="Command_Profile_Label">
+ プロフィール
+ </string>
+ <string name="Command_Report_Abuse_Label">
+ 嫌がらせの報告
+ </string>
+ <string name="Command_Search_Label">
+ 検索
+ </string>
+ <string name="Command_Snapshot_Label">
+ スナップショット
+ </string>
+ <string name="Command_Speak_Label">
+ ボイスチャット
+ </string>
+ <string name="Command_View_Label">
+ カメラ操作
+ </string>
+ <string name="Command_Voice_Label">
+ ボイス設定
+ </string>
+ <string name="Command_360_Capture_Tooltip">
+ 360度の正距円筒図法のスナップショット画像を撮影します。
+ </string>
+ <string name="Command_AboutLand_Tooltip">
+ 訪問先に関する情報を表示します。
+ </string>
+ <string name="Command_Appearance_Tooltip">
+ アバターの外観を変更します。
+ </string>
+ <string name="Command_Avatar_Tooltip">
+ アバター一式を選択します。
+ </string>
+ <string name="Command_Build_Tooltip">
+ オブジェクトの制作や地形の変形をします。
+ </string>
+ <string name="Command_Chat_Tooltip">
+ 近くにいる人物とテキストチャットします。
+ </string>
+ <string name="Command_Conversations_Tooltip">
+ 全員との会話を表示します。
+ </string>
+ <string name="Command_Compass_Tooltip">
+ コンパスを表示します。
+ </string>
+ <string name="Command_Destinations_Tooltip">
+ 行ってみたい場所を表示します。
+ </string>
+ <string name="Command_Environments_Tooltip">
+ 自分の環境を表示します。
+ </string>
+ <string name="Command_Gestures_Tooltip">
+ アバターのジェスチャーを表示します。
+ </string>
+ <string name="Command_Grid_Status_Tooltip">
+ 現在のグリッドステータスを表示します。
+ </string>
+ <string name="Command_HowTo_Tooltip">
+ 一般的タスクの実行方法を表示します。
+ </string>
+ <string name="Command_Inventory_Tooltip">
+ インベントリの内容を表示したり使用したりします。
+ </string>
+ <string name="Command_Map_Tooltip">
+ ワールドマップを表示します。
+ </string>
+ <string name="Command_Marketplace_Tooltip">
+ ショッピングに出掛ける
+ </string>
+ <string name="Command_MarketplaceListings_Tooltip">
+ 創作アイテムを販売します。
+ </string>
+ <string name="Command_MiniMap_Tooltip">
+ 近隣の人を表示します。
+ </string>
+ <string name="Command_Move_Tooltip">
+ アバターの移動操作をします。
+ </string>
+ <string name="Command_People_Tooltip">
+ フレンド、グループ、近隣の人物を表示します。
+ </string>
+ <string name="Command_Picks_Tooltip">
+ プロフィールで紹介しているお気に入りの場所を表示します。
+ </string>
+ <string name="Command_Places_Tooltip">
+ 保存済みの場所を表示します。
+ </string>
+ <string name="Command_Preferences_Tooltip">
+ 初期設定を表示します。
+ </string>
+ <string name="Command_Profile_Tooltip">
+ 自分のプロフィールの表示や編集を行います。
+ </string>
+ <string name="Command_Report_Abuse_Tooltip">
+ 嫌がらせを報告します。
+ </string>
+ <string name="Command_Search_Tooltip">
+ 場所、イベント、人物を検索します。
+ </string>
+ <string name="Command_Snapshot_Tooltip">
+ スナップショット画像を撮ります。
+ </string>
+ <string name="Command_Speak_Tooltip">
+ マイクを使って近くの人と話します。
+ </string>
+ <string name="Command_View_Tooltip">
+ カメラアングルの変更を表示します。
+ </string>
+ <string name="Command_Voice_Tooltip">
+ インワールドでのコールや近くにいる人物の音量調整します。
+ </string>
+ <string name="Toolbar_Bottom_Tooltip">
+ 現在、下のツールバーにあります。
+ </string>
+ <string name="Toolbar_Left_Tooltip">
+ 現在、左のツールバーにあります。
+ </string>
+ <string name="Toolbar_Right_Tooltip">
+ 現在、右のツールバーにあります。
+ </string>
+ <string name="Retain%">
+ 維持率
+ </string>
+ <string name="Detail">
+ 詳細
+ </string>
+ <string name="Better Detail">
+ より詳細
+ </string>
+ <string name="Surface">
+ 表面
+ </string>
+ <string name="Solid">
+ ソリッド
+ </string>
+ <string name="Wrap">
+ ラップ
+ </string>
+ <string name="Preview">
+ プレビュー
+ </string>
+ <string name="Normal">
+ 通常
+ </string>
+ <string name="Pathfinding_Wiki_URL">
+ https://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer
+ </string>
+ <string name="Pathfinding_Object_Attr_None">
+ なし
+ </string>
+ <string name="Pathfinding_Object_Attr_Permanent">
+ ナビメッシュに影響を与える
+ </string>
+ <string name="Pathfinding_Object_Attr_Character">
+ キャラクター
+ </string>
+ <string name="Pathfinding_Object_Attr_MultiSelect">
+ (複数)
+ </string>
+ <string name="snapshot_quality_very_low">
+ 最低
+ </string>
+ <string name="snapshot_quality_low">
+ 低
+ </string>
+ <string name="snapshot_quality_medium">
+ 中
+ </string>
+ <string name="snapshot_quality_high">
+ 高
+ </string>
+ <string name="snapshot_quality_very_high">
+ 最高
+ </string>
+ <string name="TeleportMaturityExceeded">
+ 住人はこのリージョン(地域)を訪問できません。
+ </string>
+ <string name="UserDictionary">
+ [User]
+ </string>
+ <string name="experience_tools_experience">
+ 体験
+ </string>
+ <string name="ExperienceNameNull">
+ (体験なし)
+ </string>
+ <string name="ExperienceNameUntitled">
+ (タイトルのない体験)
+ </string>
+ <string name="Land-Scope">
+ ランドスコープ
+ </string>
+ <string name="Grid-Scope">
+ グリッドスコープ
+ </string>
+ <string name="Allowed_Experiences_Tab">
+ 許可
+ </string>
+ <string name="Blocked_Experiences_Tab">
+ 停止
+ </string>
+ <string name="Contrib_Experiences_Tab">
+ 貢献者
+ </string>
+ <string name="Admin_Experiences_Tab">
+ 管理
+ </string>
+ <string name="Recent_Experiences_Tab">
+ 最新
+ </string>
+ <string name="Owned_Experiences_Tab">
+ 所有
+ </string>
+ <string name="ExperiencesCounter">
+ ([EXPERIENCES]、最大[MAXEXPERIENCES])
+ </string>
+ <string name="ExperiencePermission1">
+ コントロールを引き継ぐ
+ </string>
+ <string name="ExperiencePermission3">
+ アバターでアニメーションをトリガー
+ </string>
+ <string name="ExperiencePermission4">
+ アバターに装着
+ </string>
+ <string name="ExperiencePermission9">
+ カメラ追従
+ </string>
+ <string name="ExperiencePermission10">
+ カメラのコントロール
+ </string>
+ <string name="ExperiencePermission11">
+ あなたをテレポート
+ </string>
+ <string name="ExperiencePermission12">
+ 体験の権限を自動的に承諾
+ </string>
+ <string name="ExperiencePermission16">
+ あなたのアバターを強制的に座らせる
+ </string>
+ <string name="ExperiencePermission17">
+ 自然環境の設定を変更する
+ </string>
+ <string name="ExperiencePermissionShortUnknown">
+ が、不明な操作を実行しました:[Permission]
+ </string>
+ <string name="ExperiencePermissionShort1">
+ コントロールする
+ </string>
+ <string name="ExperiencePermissionShort3">
+ アニメーションをトリガー
+ </string>
+ <string name="ExperiencePermissionShort4">
+ 取り付ける
+ </string>
+ <string name="ExperiencePermissionShort9">
+ カメラを追跡
+ </string>
+ <string name="ExperiencePermissionShort10">
+ カメラを制御
+ </string>
+ <string name="ExperiencePermissionShort11">
+ テレポート
+ </string>
+ <string name="ExperiencePermissionShort12">
+ 権限
+ </string>
+ <string name="ExperiencePermissionShort16">
+ 座る
+ </string>
+ <string name="ExperiencePermissionShort17">
+ 環境
+ </string>
+ <string name="logging_calls_disabled_log_empty">
+ 会話はログに記録されていません。ログの記録を開始するには、「初期設定」>「チャット」で「保存:ログのみ」または「保存:ログと会話のテキスト」を選択します。
+ </string>
+ <string name="logging_calls_disabled_log_not_empty">
+ これ以上の会話は記録されません。ログの記録を再開するには、「初期設定」>「チャット」で「保存:ログのみ」または「保存:ログと会話のテキスト」を選択します。
+ </string>
+ <string name="logging_calls_enabled_log_empty">
+ ログイン時の会話はありません。誰かと話した後や、誰かがあなたに話しかけた後に、そのときのログがここに記載されます。
+ </string>
+ <string name="loading_chat_logs">
+ 読み込み中…
+ </string>
+ <string name="na">
+ 該当なし
+ </string>
+ <string name="preset_combo_label">
+ -空のリスト-
+ </string>
+ <string name="Default">
+ デフォルト
+ </string>
+ <string name="none_paren_cap">
+ (なし)
+ </string>
+ <string name="no_limit">
+ 無制限
+ </string>
+ <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES">
+ 物理形状に小さすぎる三角形が含まれています。物理モデルを簡略化してください。
+ </string>
+ <string name="Mav_Details_MAV_CONFIRMATION_DATA_MISMATCH">
+ 物理形状に不正な確認データがあります。物理モデルを修正してください。
+ </string>
+ <string name="Mav_Details_MAV_BLOCK_MISSING">
+ データがありません。高LODが存在し、有効であることを確認してください。設定されていない場合は、物理モデルを設定します。
+ </string>
+ <string name="Mav_Details_MAV_UNKNOWN_VERSION">
+ 物理形状のバージョンが正しくありません。物理モデルに正しいバージョンを設定してください。
+ </string>
+ <string name="couldnt_resolve_host">
+ DNSがホスト名 ([HOSTNAME]) を解決できませんでした。
www.secondlife.com のウェブサイトに接続できるかご確認ください。
-接続できても、このエラーが継続的に起こる場合は、
-サポートセクションから問題を報告してください。</string>
- <string name="ssl_peer_certificate">ログインサーバーが SSL 経由で確認できませんでした。
-このエラーが継続的に起こる場合は、
-Secondlife.com のサポートセクションから
-問題を報告してください。</string>
- <string name="ssl_connect_error">この問題の多くは、お使いのコンピュータの時計が正しく設定されていないために起こります。
-コントロールパネルから時刻と日付が正しく設定されているかご確認ください。
-お使いのネットワークとファイアウォールも正しく設定されているかお確かめください。
-このエラーが継続的に起こる場合は、Secondlife.com のサポートセクションから
-問題を報告してください。
-
-[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 ナレッジベース]</string>
+接続できても、このエラーが継続的に起こる場合は、サポートセクションから問題を報告してください。
+ </string>
+ <string name="ssl_peer_certificate">
+ ログインサーバーがSSL経由で確認できませんでした。
+このエラーが継続的に起こる場合は、Secondlife.com のサポートセクションから問題を報告してください。
+ </string>
+ <string name="ssl_connect_error">
+ この問題の多くは、お使いのコンピュータの時計が正しく設定されていないために起こります。
+コントロールパネルから、時刻と日付が正しく設定されている事をご確認してください。
+また、お使いのネットワークとファイアウォールが正しく設定されている事もお確かめください。
+このエラーが継続的に起こる場合は、Secondlife.com のサポートセクションから問題を報告してください。
+[https://community.secondlife.com/knowledgebase/%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B8%E3%83%99%E3%83%BC%E3%82%B9/%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%A8%E3%83%A9%E3%83%BC-r1283/ ナレッジベース]
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/ja/teleport_strings.xml b/indra/newview/skins/default/xui/ja/teleport_strings.xml
index 5316211e10..c1be98bef9 100644
--- a/indra/newview/skins/default/xui/ja/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/ja/teleport_strings.xml
@@ -1,42 +1,96 @@
-<?xml version="1.0" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<teleport_messages>
<message_set name="errors">
- <message name="invalid_tport">テレポート処理中に問題が発生しました。 ログインし直す必要があるかもしれません。
-このメッセージが何度も出る場合は、[SUPPORT_SITE] をご確認ください。</message>
- <message name="invalid_region_handoff">リージョン間の移動中に問題が発生しました。 ログインし直す必要があるかもしれません。
-このメッセージが何度も出る場合は、[SUPPORT_SITE] をご確認ください。</message>
- <message name="blocked_tport">申し訳ございませんが、テレポートは現在、ブロックされています。もう少し後でやり直してください。
-やり直してもテレポートできない場合は、いったんログアウトし、再度ログインして問題を解決してください。</message>
- <message name="nolandmark_tport">残念ながら、システムはランドマークの目的地を探せませんでした。</message>
- <message name="timeout_tport">申し訳ございませんが、システムはテレポートの接続を完了できませんでした。
-もう少し後でやり直してください。</message>
- <message name="NoHelpIslandTP">ウェルカムアイランドにテレポートで戻ることはできません。
-「Welcome Island Public」に行き再度チュートリアルを行ってください。</message>
- <message name="noaccess_tport">残念ながら、そのテレポート目的地へのアクセスがありません。</message>
- <message name="missing_attach_tport">添付物は、まだ到着していません。あと数秒間お待ちいただくか、いったんログアウトし、再度ログインしてからテレポートをやり直してださい。</message>
- <message name="too_many_uploads_tport">この地域の資産キューが現在込み合っているため、要求されたテレポートを処理することが難しい状況です。
-数分後にやり直すか、または混雑していない他の地域をお試しください。</message>
- <message name="expired_tport">申し訳ございませんが、システムは要求されたテレポートを完了できませんでした。数分後にやり直してください。</message>
- <message name="expired_region_handoff">申し訳ございませんが、システムは地域間の移動を時間どおりに完了できませんでした。
-数分後にやり直してください。</message>
- <message name="no_host">テレポートの目的地を見つけられません。目的地が一時的に利用できない状態か、またはすでに消滅している可能性があります。数分後にやり直してください。</message>
- <message name="no_inventory_host">インベントリシステムは現在利用できません。</message>
- <message name="MustGetAgeRegion">この地域(リージョン)に入るには 18 才以上である必要があります。</message>
- <message name="RegionTPSpecialUsageBlocked">リージョンに入ることができません。'[REGION_NAME]' はスキル ゲーミング リージョンであり、あなたはこのリージョンに入るための特定の基準を満たす必要があります。詳しくは、[http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life スキル ゲーミングのよくある質問] を参照してください。</message>
- <message name="preexisting_tport">ごめんなさい。システムはテレポートを始めることができません。数分後にもう一度やり直してください。</message>
+ <message name="invalid_tport">
+ テレポート処理中に問題が発生しました。ログインし直す必要があるかもしれません。
+このメッセージが何度も出る場合は、[SUPPORT_SITE]をご確認ください。
+ </message>
+ <message name="invalid_region_handoff">
+ リージョン横断の処理中に問題が発生しました。リージョン(地域)を越える前に、再度ログインする必要がある場合があります。
+このメッセージが何度も出る場合は、[SUPPORT_SITE]をご確認ください。
+ </message>
+ <message name="blocked_tport">
+ 申し訳ありませんが、テレポートは現在ブロックされています。しばらくしてから、もう一度やりなおしてください。
+やり直してもテレポートできない場合は、いったんログアウトし、再度ログインして問題を解決してください。
+ </message>
+ <message name="nolandmark_tport">
+ 残念ながら、システムはランドマークの目的地を探せませんでした。
+ </message>
+ <message name="timeout_tport">
+ 申し訳ございませんが、システムはテレポートの接続を完了できませんでした。しばらくしてから、もう一度やりなおしてください。
+ </message>
+ <message name="NoHelpIslandTP">
+ ウェルカムアイランドにテレポートで戻ることはできません。
+「Welcome Island Public」に行き再度チュートリアルを行ってください。
+ </message>
+ <message name="noaccess_tport">
+ 残念ながら、そのテレポート目的地へのアクセスがありません。
+ </message>
+ <message name="missing_attach_tport">
+ 添付物は、まだ到着していません。あと数秒間お待ちいただくか、いったんログアウトしてから再度ログインし、テレポートし直してださい。
+ </message>
+ <message name="too_many_uploads_tport">
+ このリージョン(地域)のアセットのキューが現在混み合っているため、要求されたテレポートを処理することが難しい状況です。
+数分後にやり直すか、混雑していない他のリージョンをお試しください。
+ </message>
+ <message name="expired_tport">
+ 申し訳ございませんが、システムは要求されたテレポートを完了できませんでした。お手数ですが、数分程度時間をおいてからやり直してください。
+ </message>
+ <message name="expired_region_handoff">
+ 申し訳ございませんが、システムは地域間の移動を時間どおりに完了できませんでした。
+お手数ですが、数分程度時間をおいてからやり直してください。
+ </message>
+ <message name="no_host">
+ テレポートの目的地を見つけられません。目的地が一時的に利用できない状態か、すでに消滅している可能性があります。お手数ですが、数分程度時間をおいてからやり直してください。
+ </message>
+ <message name="no_inventory_host">
+ インベントリシステムは現在利用できません。
+ </message>
+ <message name="MustGetAgeRegion">
+ このリージョン(地域)に入るには、18歳以上である必要があります。
+ </message>
+ <message name="RegionTPSpecialUsageBlocked">
+ リージョンに入ることができません。
+「[REGION_NAME]」はスキルゲーミングリージョンであり、あなたはこのリージョンに入るための特定の基準を満たす必要があります。
+詳しくは、[http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life スキルゲーミングのよくある質問]を参照してください。
+ </message>
</message_set>
<message_set name="progress">
- <message name="sending_dest">目的地に送信しています。</message>
- <message name="redirecting">別の目的地にリダイレクトしています。</message>
- <message name="relaying">目的地に中継しています。</message>
- <message name="sending_home">ホーム位置のリクエストを送信しています。</message>
- <message name="sending_landmark">ランドマーク位置のリクエストを送信しています。</message>
- <message name="completing">テレポートを完了します。</message>
- <message name="completed_from">[T_SLURL] からのテレポートが完了しました</message>
- <message name="resolving">目的地を解決しています。</message>
- <message name="contacting">新しい地域にコンタクトしています。</message>
- <message name="arriving">到着...</message>
- <message name="requesting">テレポートをリクエスト...</message>
- <message name="pending">テレポートを保留中...</message>
+ <message name="sending_dest">
+ 目的地に送信しています。
+ </message>
+ <message name="redirecting">
+ 別の目的地にリダイレクトしています。
+ </message>
+ <message name="relaying">
+ 目的地に中継しています。
+ </message>
+ <message name="sending_home">
+ ホーム位置のリクエストを送信しています。
+ </message>
+ <message name="sending_landmark">
+ ランドマーク位置のリクエストを送信しています。
+ </message>
+ <message name="completing">
+ テレポートを完了します。
+ </message>
+ <message name="completed_from">
+ [T_SLURL] からのテレポートが完了しました。
+ </message>
+ <message name="resolving">
+ 目的地を解決しています。
+ </message>
+ <message name="contacting">
+ 新しい地域にコンタクトしています。
+ </message>
+ <message name="arriving">
+ 到着中…
+ </message>
+ <message name="requesting">
+ テレポートをリクエスト…
+ </message>
+ <message name="pending">
+ テレポートを保留中…
+ </message>
</message_set>
</teleport_messages>
diff --git a/indra/newview/skins/default/xui/ja/widgets/bodyparts_list_item.xml b/indra/newview/skins/default/xui/ja/widgets/bodyparts_list_item.xml
new file mode 100644
index 0000000000..c811d94a35
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/widgets/bodyparts_list_item.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<bodyparts_list_item name="wearable_item">
+ <item_icon name="item_icon"/>
+ <item_name name="item_name" value="…"/>
+ <lock_panel name="btn_lock" tool_tip="編集権限がありません。"/>
+ <lock_icon name="btn_lock1"/>
+ <edit_panel name="btn_edit_panel"/>
+ <edit_btn name="btn_edit" tool_tip="このシェイプを編集"/>
+</bodyparts_list_item>
diff --git a/indra/newview/skins/default/xui/ja/widgets/clothing_list_item.xml b/indra/newview/skins/default/xui/ja/widgets/clothing_list_item.xml
new file mode 100644
index 0000000000..e952186632
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/widgets/clothing_list_item.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<clothing_list_item name="wearable_item">
+ <lock_icon name="item_icon"/>
+ <item_name name="item_name" value="…"/>
+ <up_btn name="btn_move_up"/>
+ <down_btn name="btn_move_down"/>
+ <lock_panel name="btn_lock" tool_tip="編集権限がありません。"/>
+ <lock_icon name="btn_lock1"/>
+ <edit_panel name="btn_edit_panel"/>
+ <edit_btn name="btn_edit" tool_tip="この衣装を編集"/>
+</clothing_list_item>
diff --git a/indra/newview/skins/default/xui/ja/widgets/deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/ja/widgets/deletable_wearable_list_item.xml
new file mode 100644
index 0000000000..741d854813
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/widgets/deletable_wearable_list_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<deletable_wearable_list_item name="deletable_wearable_item">
+ <delete_btn name="btn_delete" tool_tip="アウトフィットから削除"/>
+ <item_icon name="item_icon"/>
+ <item_name name="item_name" value="…"/>
+</deletable_wearable_list_item>
diff --git a/indra/newview/skins/default/xui/ja/widgets/density_ctrl.xml b/indra/newview/skins/default/xui/ja/widgets/density_ctrl.xml
index 485ebb3e39..6526b2be67 100644
--- a/indra/newview/skins/default/xui/ja/widgets/density_ctrl.xml
+++ b/indra/newview/skins/default/xui/ja/widgets/density_ctrl.xml
@@ -1,2 +1,28 @@
-<?xml version="1.0" ?>
-<densityctrl name="density_ctrl" label="密度"/>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<densityctrl abel="密度" name="density_ctrl">
+ <text follows="left|top" height="11" layout="topleft" left="15" top_pad="-5" width="120">
+ 指数項
+ </text>
+ <slider dname="level_exponential"/>
+ <view left_pad="15" top="15" name="preview_image" height="140" width="140" follows="left|top"/>
+ <text follows="left|top" height="11" layout="topleft" left="15" top_pad="-5" width="120">
+ 指数尺度係数
+ </text>
+ <slider dname="exponential_scale"/>
+ <text follows="left|top" height="11" layout="topleft" left="15" top_pad="-5" width="120">
+ 線形項
+ </text>
+ <slider dname="level_linear"/>
+ <text follows="left|top" height="11" layout="topleft" left="15" top_pad="-5" width="120">
+ 定数項
+ </text>
+ <slider dname="level_constant"/>
+ <text follows="left|top" height="11" layout="topleft" left="15" top_pad="15" width="80">
+ 最大高度
+ </text>
+ <slider name="max_altitude"/>
+ <text follows="left|top" height="11" layout="topleft" name="aniso_factor_label" left="15" top_pad="15" width="80">
+ 異方性係数
+ </text>
+ <slider name="aniso_factor"/>
+</densityctrl>
diff --git a/indra/newview/skins/default/xui/ja/widgets/dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/ja/widgets/dummy_clothing_list_item.xml
new file mode 100644
index 0000000000..fdf21253cf
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/widgets/dummy_clothing_list_item.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<dummy_clothing_list_item name="dummy_clothing_item">
+ <item_icon name="item_icon"/>
+ <item_name name="item_name" value="…"/>
+ <add_panel name="btn_add_panel"/>
+ <add_btn name="btn_add" tool_tip="この種類のアイテムを更に追加します。"/>
+</dummy_clothing_list_item>
diff --git a/indra/newview/skins/default/xui/ja/widgets/flat_list_view.xml b/indra/newview/skins/default/xui/ja/widgets/flat_list_view.xml
new file mode 100644
index 0000000000..b08dc59fc5
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/widgets/flat_list_view.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<flat_list_view>
+ <flat_list_view.no_items_text name="no_items_msg" value="一致するものが見つかりませんでした。"/>
+</flat_list_view>
diff --git a/indra/newview/skins/default/xui/ja/widgets/inbox_folder_view_folder.xml b/indra/newview/skins/default/xui/ja/widgets/inbox_folder_view_folder.xml
new file mode 100644
index 0000000000..1dd00355fd
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/widgets/inbox_folder_view_folder.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inbox_folder_view_folder folder_arrow_image="Folder_Arrow" folder_indentation="8" item_height="20" item_top_pad="4" selection_image="Rounded_Square" left_pad="5" icon_pad="2" icon_width="16" text_pad="1" text_pad_right="4" arrow_size="12" max_folder_item_overlap="2">
+ <new_badge label="新規" label_offset_horiz="-1" location="right" padding_horiz="12.5" padding_vert="2" location_offset_hcenter="-23" border_image="New_Tag_Border" border_color="DkGray2" image="New_Tag_Background" image_color="Black"/>
+</inbox_folder_view_folder>
diff --git a/indra/newview/skins/default/xui/ja/widgets/inbox_folder_view_item.xml b/indra/newview/skins/default/xui/ja/widgets/inbox_folder_view_item.xml
new file mode 100644
index 0000000000..ae652617ef
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/widgets/inbox_folder_view_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inbox_folder_view_item item_height="20" item_top_pad="4" selection_image="Rounded_Square">
+ <new_badge label="新規" label_offset_horiz="-1" location="right" padding_horiz="12.5" padding_vert="2" location_offset_hcenter="-23" border_image="New_Tag_Border" border_color="DkGray2" image="New_Tag_Background" image_color="Black"/>
+</inbox_folder_view_item>
diff --git a/indra/newview/skins/default/xui/ja/widgets/menu_item_separator.xml b/indra/newview/skins/default/xui/ja/widgets/menu_item_separator.xml
new file mode 100644
index 0000000000..3d51153411
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/widgets/menu_item_separator.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_item_separator name="separator" label="─────"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/widgets/menu_item_tear_off.xml b/indra/newview/skins/default/xui/ja/widgets/menu_item_tear_off.xml
new file mode 100644
index 0000000000..badf65a18d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/widgets/menu_item_tear_off.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_item_tear_off name="tear_off" label="〰〰〰〰〰"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/widgets/name_editor.xml b/indra/newview/skins/default/xui/ja/widgets/name_editor.xml
new file mode 100644
index 0000000000..98c4373050
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/widgets/name_editor.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<name_editor default_text="(取得しています)"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/ja/widgets/panel_camera_item.xml b/indra/newview/skins/default/xui/ja/widgets/panel_camera_item.xml
new file mode 100644
index 0000000000..1ec542e423
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/widgets/panel_camera_item.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel_camera_item>
+ <panel_camera_item.icon_over name="hovered_icon"/>
+ <panel_camera_item.icon_selected name="selected_icon"/>
+ <panel_camera_item.picture name="picture"/>
+ <panel_camera_item.selected_picture fname="selected_picture"/>
+ <panel_camera_item.text name="picture_name">
+ テキスト
+ </panel_camera_item.text>
+</panel_camera_item>
diff --git a/indra/newview/skins/default/xui/ja/widgets/person_view.xml b/indra/newview/skins/default/xui/ja/widgets/person_view.xml
new file mode 100644
index 0000000000..6d1040d6f6
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/widgets/person_view.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<person_view>
+ <avatar_icon/>
+ <last_interaction_time_textbox name="last_interaction_time_textbox"/>
+ <permission_edit_theirs_icon name="permission_edit_theirs_icon" tool_tip="このフレンドのオブジェクトを編集することはできません。"/>
+ <permission_edit_mine_icon name="permission_edit_mine_icon" tool_tip="このフレンドは、あなたのオブジェクトの編集や、削除、取得することができます。"/>
+ <permission_map_icon tool_tip="このフレンドは、マップ上であなたのいる場所を探すことができます。" name="permission_map_icon"/>
+ <permission_online_icon name="permission_online_icon" tool_tip="このフレンドは、あなたがオンラインになったことがわかります。"/>
+ <info_btn name="info_btn" tool_tip="詳細情報"/>
+ <profile_btn name="profile_btn" tool_tip="プロフィールを見る"/>
+ <output_monitor name="speaking_indicator"/>
+</person_view>
diff --git a/indra/newview/skins/default/xui/ja/widgets/sun_moon_trackball.xml b/indra/newview/skins/default/xui/ja/widgets/sun_moon_trackball.xml
new file mode 100644
index 0000000000..b6f27ad148
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/widgets/sun_moon_trackball.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<sun_moon_trackball name="virtualtrackball">
+ <sun_moon_trackball.border/>
+ <sun_moon_trackball.labelN name="labelN" label="北"/>
+ <sun_moon_trackball.labelS name="labelS" label="南"/>
+ <sun_moon_trackball.labelW name="labelW" label="西"/>
+ <sun_moon_trackball.labelE name="labelE" label="東"/>
+ <sun_moon_trackball.button_rotate_top name="btn_rotate_top"/>
+ <sun_moon_trackball.button_rotate_bottom name="btn_rotate_bottom"/>
+ <sun_moon_trackball.button_rotate_left name="btn_rotate_left"/>
+ <sun_moon_trackball.button_rotate_right name="btn_rotate_right"/>
+</sun_moon_trackball>
diff --git a/indra/newview/skins/default/xui/ja/widgets/wearable_outfit_list_item.xml b/indra/newview/skins/default/xui/ja/widgets/wearable_outfit_list_item.xml
new file mode 100644
index 0000000000..e75cab14c8
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/widgets/wearable_outfit_list_item.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<inventory_list_item>
+ <default_style/>
+ <worn_style/>
+ <item_icon name="item_icon"/>
+ <item_name name="item_name" value="…"/>
+ <add_btn name="add_wearable"/>
+ <remove_btn name="remove_wearable"/>
+</inventory_list_item>
diff --git a/indra/newview/skins/default/xui/ja/widgets/xy_vector.xml b/indra/newview/skins/default/xui/ja/widgets/xy_vector.xml
new file mode 100644
index 0000000000..dcb1966c92
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/widgets/xy_vector.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<xy_vector name="xyvector">
+ <xy_vector.border visible="true"/>
+ <xy_vector.x_entry name="XEntry" tab_stop="true" label="X軸:"/>
+ <xy_vector.y_entry name="YEntry" tab_stop="true" label="Y軸:"/>
+ <xy_vector.touch_area name="TouchArea"/>
+</xy_vector>
diff --git a/indra/newview/skins/default/xui/ja/xui_version.xml b/indra/newview/skins/default/xui/ja/xui_version.xml
index 0e777751d3..da435bbd04 100644
--- a/indra/newview/skins/default/xui/ja/xui_version.xml
+++ b/indra/newview/skins/default/xui/ja/xui_version.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<xui_version>
1.0
-</xui_version>
+</xui_version> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/pl/floater_about.xml b/indra/newview/skins/default/xui/pl/floater_about.xml
index b9c75e8e88..b8d75315de 100644
--- a/indra/newview/skins/default/xui/pl/floater_about.xml
+++ b/indra/newview/skins/default/xui/pl/floater_about.xml
@@ -6,8 +6,8 @@
</panel>
<panel label="Podziękowania" name="credits_panel">
<text name="linden_intro">
- Second Life zostało dla Ciebie stworzone przez Lindenów,
- z wkładem open source od:
+Second Life zostało dla Ciebie stworzone przez Lindenów,
+z wkładem open source od:
</text>
</panel>
<panel label="Licencje" name="licenses_panel" />
diff --git a/indra/newview/skins/default/xui/pl/floater_about_land.xml b/indra/newview/skins/default/xui/pl/floater_about_land.xml
index 1646db897a..9f8e110dd6 100644
--- a/indra/newview/skins/default/xui/pl/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/pl/floater_about_land.xml
@@ -1,17 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="floaterland" title="O DZIAŁCE">
+ <floater.string name="Hours">
+ [HOURS] godz.
+ </floater.string>
+ <floater.string name="Hour">
+ godz.
+ </floater.string>
<floater.string name="Minutes">
- [MINUTES] minuty
+ [MINUTES] min.
</floater.string>
<floater.string name="Minute">
- minuta
+ min.
</floater.string>
<floater.string name="Seconds">
- [SECONDS] sekund
+ [SECONDS] sek.
</floater.string>
<floater.string name="Remaining">
pozostało
</floater.string>
+ <floater.string name="Always">
+ Zawsze
+ </floater.string>
<tab_container name="landtab">
<panel label="OGÓLNE" name="land_general_panel">
<panel.string name="new users only">
@@ -65,16 +74,10 @@
<text name="Owner:">
Właściciel:
</text>
- <text name="OwnerText">
- Ładowanie...
- </text>
<button label="Profil" name="Profile..." />
<text name="Group:">
Grupa:
</text>
- <text name="GroupText">
- Ładowanie...
- </text>
<button label="Ustaw" name="Set..." />
<check_box label="Udostępnij przypisywanie na Grupę" name="check deed" tool_tip="Oficer Grupy ma prawo przepisać prawo własności działki na Grupę. Działka wspierana jest przez przydziały pochodzące od członków Grupy." />
<button label="Przypisz" name="Deed..." tool_tip="Prawo przypisania działki na Grupę może dokonać jedynie oficer Grupy." />
@@ -111,7 +114,7 @@
<text name="DwellText">
Wczytywanie...
</text>
- <button label="Kup działkę" name="Buy Land..." />
+ <button label="Kup działkę" label_selected="Kup działkę" name="Buy Land..." />
<button label="Sprzedaż przez Lindenów" name="Linden Sale..." tool_tip="Działka musi mieć Właściciela, zawartość oraz nie może być wystawiona na Aukcję." />
<button label="Skrypty" name="Scripts..."/>
<button label="Kup dla Grupy" name="Buy For Group..." />
@@ -130,7 +133,7 @@
Działka zakupiona w tym Regionie może być łączona/dzielona.
</panel.string>
<panel.string name="can_not_change">
- Działka zakupiona w tym Regionie nie może być
+ Działka zakupiona w tym Regionie nie może być
łączona/dzielona.
</panel.string>
<text name="estate_section_lbl">
@@ -151,9 +154,6 @@
<text name="covenant_timestamp_text">
Ostatnia modyfikacja Wed Dec 31 16:00:00 1969
</text>
- <text name="region_name_text">
- Wczytywanie...
- </text>
<text name="region_landtype_lbl">
Typ:
</text>
@@ -220,8 +220,8 @@
<text name="Object Owners:">
Właściciele:
</text>
- <button name="Refresh List" tool_tip="Odśwież listę obiektów" />
- <button label="Zwróć obiekty" name="Return objects..." />
+ <button label="Odśwież listę" label_selected="Odśwież listę" name="Refresh List" tool_tip="Odśwież listę obiektów" />
+ <button label="Zwróć obiekty" label_selected="Zwróć obiekty" name="Return objects..." />
<name_list name="owner list">
<name_list.columns label="Typ" name="type" />
<name_list.columns label="Nazwa" name="name" />
@@ -250,7 +250,7 @@ Jedynie większe działki mogą być umieszczone w bazie wyszukiwarki.
Twoja działka bądź treść jaką zawiera klasyfikowana jest jako Moderate.
</panel.string>
<panel.string name="mature_check_adult_tooltip">
- Twoja działka bądź treść jaką zawiera klasyfikowana jest jako Adult
+ Twoja działka bądź treść jaką zawiera klasyfikowana jest jako Adult.
</panel.string>
<panel.string name="landing_point_none">
(brak)
@@ -271,21 +271,21 @@ Jedynie większe działki mogą być umieszczone w bazie wyszukiwarki.
<text name="allow_label2">
Budowanie:
</text>
- <check_box label="Wszyscy" name="edit objects check" />
- <check_box label="Grupa" name="edit group objects check" />
+ <check_box label="Wszyscy" name="edit objects check" tool_tip="Gdy ta opcja jest włączona, to Rezydenci mogą tworzyć i rezzować obiekty na Twojej działce." />
+ <check_box label="Grupa" name="edit group objects check" tool_tip="Gdy ta opcja jest włączona, to osoby będące w grupie przypisanej do Twojej działki mogą na niej tworzyć i rezzować obiekty." />
<text name="allow_label3">
Nowe obiekty:
</text>
- <check_box label="Wszyscy" name="all object entry check" />
- <check_box label="Grupa" name="group object entry check" />
+ <check_box label="Wszyscy" name="all object entry check" tool_tip="Gdy ta opcja jest włączona, to Rezydenci mogą przenosić istniejące obiekty z innych działek na tę działkę." />
+ <check_box label="Grupa" name="group object entry check" tool_tip="Gdy ta opcja jest włączona, to osoby będące w grupie przypisanej do tej działki mogą na nią przenosić istniejące obiekty z innych działek." />
<text name="allow_label4">
Skrypty:
</text>
- <check_box label="Wszyscy" name="check other scripts" />
- <check_box label="Grupa" name="check group scripts" />
+ <check_box label="Wszyscy" name="check other scripts" tool_tip="Gdy ta opcja jest włączona, to Rezydenci mogą uruchamiać skrypty na Twojej działce, włączając w to te z dodatków." />
+ <check_box label="Grupa" name="check group scripts" tool_tip="Gdy ta opcja jest włączona, to osoby będące w grupie przypisanej do Twojej działki mogą na niej uruchamiać skrypty, włączając w to te z dodatków." />
<check_box label="Bezpieczna (brak uszkodzeń)" name="check safe" tool_tip="Wybrana - działka jest bezpieczna - uszkodzenia w walce są zablokowane. Nie jest wybrana - uszkodzenia w walce są włączone." />
<check_box label="Popychanie niedozwolone" name="PushRestrictCheck" tool_tip="Nie pozwalaj skryptom na popychanie. Wybranie tej opcji może być przydatne do ograniczenia zakłóceń spokoju na Twojej działce." />
- <check_box label="Wyświetlaj w wyszukiwarce (30L$/tyg.)" name="ShowDirectoryCheck" tool_tip="Udostępnij ukazywanie się nazwy działki w wyszukiwarce" />
+ <check_box label="Wyświetlaj w wyszukiwarce (30L$/tyg.)" name="ShowDirectoryCheck" tool_tip="Udostępnij ukazywanie się nazwy działki w wyszukiwarce"/>
<combo_box name="land category">
<combo_box.item label="Każda kategoria" name="item0" />
<combo_box.item label="Lokalizacja Lindenów" name="item1" />
@@ -301,24 +301,24 @@ Jedynie większe działki mogą być umieszczone w bazie wyszukiwarki.
<combo_box.item label="Wynajem" name="item13" />
<combo_box.item label="Inna" name="item12" />
</combo_box>
- <check_box label="Treść Moderate" name="MatureCheck" />
+ <check_box label="Treść Moderate" name="MatureCheck"/>
<text name="Snapshot:">
Zdjęcie:
</text>
<texture_picker name="snapshot_ctrl" tool_tip="Kliknij by wybrać zdjęcie" />
- <text name="allow_label5">
+ <text name="allow_see_label">
Awatary na innych działkach mogą rozmawiać/widzieć awatary na tej działce
</text>
- <check_box name="SeeAvatarsCheck" tool_tip="Pozwala Rezydentom z innych działek widzieć i rozmawiać z Rezydentami na tej działce - oraz Tobie, widzieć ich i rozmawiać z nimi." />
+ <check_box label="Widzieć awatary" name="SeeAvatarsCheck" tool_tip="Pozwala Rezydentom z innych działek widzieć i rozmawiać z Rezydentami na tej działce - oraz Tobie, widzieć ich i rozmawiać z nimi." />
<text name="landing_point">
Punkt Lądowania: [LANDING]
</text>
<button label="Ustaw" label_selected="Ustaw" name="Set" tool_tip="Ustal miejsce lądowania dla przybywających gości. Używa położenia Twojego awatara na tej działce." />
- <button label="Wyczyść" label_selected="Wyczyść" name="Clear" tool_tip="Usuń dotychczasowe miejsce lądowania" />
+ <button label="Wyczyść" label_selected="Wyczyść" name="Clear" tool_tip="Usuń dotychczasowe miejsce lądowania." />
<text name="Teleport Routing: ">
Trasa teleportacji:
</text>
- <combo_box name="landing type" tool_tip="Trasa teleportacji - ustaw w jaki sposób będzie się odbywać proces teleportacji na działce">
+ <combo_box name="landing type" tool_tip="Trasa teleportacji - ustaw w jaki sposób będzie się odbywać proces teleportacji na działce.">
<combo_box.item label="Zablokowana" name="Blocked" />
<combo_box.item label="Punkt Lądowania" name="LandingPoint" />
<combo_box.item label="Gdziekolwiek" name="Anywhere" />
@@ -345,18 +345,18 @@ Jedynie większe działki mogą być umieszczone w bazie wyszukiwarki.
Obiekty używające tej tekstury będą wyświetlały film lub stronę internetową po naciśnięciu przycisku odtwarzania. Wybierz miniaturę, jeśli chcesz zmienić teksturę.
</text>
<check_box label="Skaluj automatycznie" name="media_auto_scale" tool_tip="Wybranie tej opcji dobierze rozmiar zawartości mediów dla tej działki automatycznie. Może to mieć znaczący wpływ na jakość odtwarzanego materiału - może on być odtwarzany wolniej i w gorszej jakości, ale żadne dalsze działania nie będą potrzebne." />
- <text name="media_size" tool_tip="Rozmiar dla ładowania mediów internetowych. Zostaw 0 dla ustawień domyślnych.">
+ <text name="media_size" tool_tip="Rozmiar dla przesyłanych mediów internetowych. Zostaw 0 dla ustawień domyślnych.">
Rozmiar:
</text>
- <spinner name="media_size_width" tool_tip="Rozmiar dla ładowania mediów internetowych. Zostaw 0 dla ustawień domyślnych." />
- <spinner name="media_size_height" tool_tip="Rozmiar dla ładowania mediów internetowych. Zostaw 0 dla ustawień domyślnych." />
+ <spinner name="media_size_width" tool_tip="Rozmiar dla przesyłanych mediów internetowych. Zostaw 0 dla ustawień domyślnych." />
+ <spinner name="media_size_height" tool_tip="Rozmiar dla przesyłanych mediów internetowych. Zostaw 0 dla ustawień domyślnych." />
<text name="pixels">
pikseli
</text>
<text name="Options:">
Opcje:
</text>
- <check_box label="Odtwarzanie mediów w pętli" name="media_loop" tool_tip="Powtarzaj odtwarzanie mediów w pętli. Po wyświetleniu materiału odtwarzanie rozpocznie się od początku." />
+ <check_box label="Odtwarzaj w pętli" name="media_loop" tool_tip="Powtarzaj odtwarzanie mediów w pętli. Po wyświetleniu materiału odtwarzanie rozpocznie się od początku." />
</panel>
<panel label="DŹWIĘK" name="land_audio_panel">
<text name="MusicURL:">
@@ -377,6 +377,7 @@ Jedynie większe działki mogą być umieszczone w bazie wyszukiwarki.
<check_box label="Rozmowy włączone" name="parcel_enable_voice_channel" />
<check_box label="Rozmowy włączone (ustawione przez Majątek)" name="parcel_enable_voice_channel_is_estate_disabled" />
<check_box label="Ogranicz komunikację głosową do obszaru tej działki" name="parcel_enable_voice_channel_local" />
+ <check_box label="Ogranicz MOAP do obecnej działki" name="obscure_moap" tool_tip="Media na primach znajdujących się poza tą działką nie powinny odtwarzać się automatycznie dla rezydentów będących na niej - i odwrotnie." />
</panel>
<panel label="DOSTĘP" name="land_access_panel">
<panel.string name="access_estate_defined">
@@ -385,13 +386,10 @@ Jedynie większe działki mogą być umieszczone w bazie wyszukiwarki.
<panel.string name="estate_override">
Jedna lub więcej z tych opcji ustawiona jest z poziomu Majątku
</panel.string>
- <check_box name="public_access" label="Dostęp publiczny (brak zaznaczenia tej opcji = widoczne linie zakazu)" />
- <text name="Only Allow">
- Umożliwiaj dostęp tylko dla:
- </text>
- <check_box label="Rezydentów zarejestrowanych w systemie płatniczym Linden Lab [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Zbanuj Rezydentów niezarejestrowanych w systemie płatniczym Linden Lab. Odwiedź [SUPPORT_SITE], aby uzyskać więcej informacji." />
- <check_box label="Rezydentów, którzy mają 18+ lat [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Zbanuj Rezydetów, którzy mają mniej niż 18 lat. Odwiedź [SUPPORT_SITE], aby uzyskać więcej informacji." />
- <check_box label="Udostępnij wejście grupie [GROUP]" name="GroupCheck" tool_tip="Ustaw Grupę w głównej zakładce." />
+ <check_box label="Każdy może odwiedzać (brak zaznaczenia = widoczne linie zakazu)" name="public_access" />
+ <check_box label="Osoba musi mieć 18+ lat [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Zbanuj Rezydetów, którzy mają mniej niż 18 lat. Odwiedź [SUPPORT_SITE], aby uzyskać więcej informacji." />
+ <check_box label="Osoba musi mieć dane płatnicze w systemie Linden Lab [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Zbanuj Rezydentów niezarejestrowanych w systemie płatniczym Linden Lab. Odwiedź [SUPPORT_SITE], aby uzyskać więcej informacji." />
+ <check_box label="Umożliwiaj wejście bez ograniczeń grupie [GROUP]" name="GroupCheck" tool_tip="Ustaw Grupę w głównej zakładce." />
<check_box label="Sprzedaj przepustki:" name="PassCheck" tool_tip="Otwórz tymczasowy dostęp do tej działki" />
<combo_box name="pass_combo">
<combo_box.item label="Każdemu" name="Anyone" />
@@ -399,22 +397,32 @@ Jedynie większe działki mogą być umieszczone w bazie wyszukiwarki.
</combo_box>
<spinner label="Cena w L$:" name="PriceSpin" />
<spinner label="Godziny dostępu:" name="HoursSpin" />
- <panel name="Allowed_layout_panel">
- <text label="Zawsze Zezwalaj" name="AllowedText">
- Dozwoleni Rezydenci
- </text>
- <name_list name="AccessList" tool_tip="([LISTED] na liście, [MAX] maksimum)" />
- <button label="Dodaj" name="add_allowed" />
- <button label="Usuń" label_selected="Usuń" name="remove_allowed" />
- </panel>
- <panel name="Banned_layout_panel">
- <text label="Banuj" name="BanCheck">
- Zbanowani Rezydenci
- </text>
- <name_list name="BannedList" tool_tip="([LISTED] na liście, [MAX] maksimum)" />
- <button label="Dodaj" name="add_banned" />
- <button label="Usuń" label_selected="Usuń" name="remove_banned" />
- </panel>
+ <text name="OwnerLimited">
+ (właściciel Majątku może ograniczać te wybory)
+ </text>
+ <layout_stack name="access_stack">
+ <layout_panel name="Allowed_layout_panel">
+ <text label="Zawsze zezwalaj" name="AllowedText">
+ Zawsze zezwalaj ([COUNT]/[MAX])
+ </text>
+ <name_list name="AccessList" tool_tip="([LISTED] na liście, [MAX] maksimum)"/>
+ <button label="Dodaj" name="add_allowed"/>
+ <button label="Usuń" label_selected="Usuń" name="remove_allowed"/>
+ </layout_panel>
+ <layout_panel name="Banned_layout_panel">
+ <text label="Banuj" name="BanCheck">
+ Zbanowani ([COUNT]/[MAX])
+ </text>
+ <name_list name="BannedList" tool_tip="([LISTED] na liście, [MAX] maksimum)">
+ <columns label="Imię" name="name" />
+ <columns label="Czas" name="duration" />
+ </name_list>
+ <button label="Dodaj" name="add_banned"/>
+ <button label="Usuń" label_selected="Usuń" name="remove_banned"/>
+ </layout_panel>
+ </layout_stack>
</panel>
+ <panel label="PRZYGODY" name="land_experiences_panel"/>
+ <panel label="OTOCZENIE" name="land_environment_panel" />
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_animation_anim_preview.xml b/indra/newview/skins/default/xui/pl/floater_animation_anim_preview.xml
index ff2fee6f2f..c56f103d21 100644
--- a/indra/newview/skins/default/xui/pl/floater_animation_anim_preview.xml
+++ b/indra/newview/skins/default/xui/pl/floater_animation_anim_preview.xml
@@ -6,6 +6,6 @@
<text name="description_label">
Opis:
</text>
- <button label="Załaduj ([AMOUNT]L$)" name="ok_btn" />
+ <button label="Prześlij ([AMOUNT]L$)" name="ok_btn" />
<button label="Anuluj" label_selected="Anuluj" name="cancel_btn" />
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_animation_bvh_preview.xml b/indra/newview/skins/default/xui/pl/floater_animation_bvh_preview.xml
index 18212fad9c..63b0931b2b 100644
--- a/indra/newview/skins/default/xui/pl/floater_animation_bvh_preview.xml
+++ b/indra/newview/skins/default/xui/pl/floater_animation_bvh_preview.xml
@@ -173,6 +173,6 @@ Maksymalna długość pliku animacji wynosi [MAX_LENGTH] sekund.
Nie można wczytać pliku animacji.
Doradzamy eksport plików BVH z Poser 4.
</text>
- <button label="Załaduj ([AMOUNT]L$)" name="ok_btn" />
+ <button label="Prześlij ([AMOUNT]L$)" name="ok_btn" />
<button label="Anuluj" name="cancel_btn" />
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_associate_listing.xml b/indra/newview/skins/default/xui/pl/floater_associate_listing.xml
index b5464dd59b..7ef99457c9 100644
--- a/indra/newview/skins/default/xui/pl/floater_associate_listing.xml
+++ b/indra/newview/skins/default/xui/pl/floater_associate_listing.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="associate listing" title="PRZYPISANE PRZEDMIOTY">
- <text name="message">ID przedmiotu:</text>
+<floater name="associate listing" title="PRZYPISZ RZECZ">
+ <text name="message">ID rzeczy:</text>
<line_editor name="listing_id">Wpisz tutaj ID</line_editor>
- <button label="OK" name="OK"/>
<button label="Anuluj" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml
deleted file mode 100644
index d2844e117f..0000000000
--- a/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="item properties" title="WŁAŚCIWOŚCI OBIEKTÓW W SZAFIE">
- <floater.string name="unknown">
- (nieznany)
- </floater.string>
- <floater.string name="public">
- (publiczny)
- </floater.string>
- <floater.string name="you_can">
- Ty możesz:
- </floater.string>
- <floater.string name="owner_can">
- Właściciel może:
- </floater.string>
- <text name="LabelItemNameTitle">
- Nazwa:
- </text>
- <text name="LabelItemDescTitle">
- Opis:
- </text>
- <text name="LabelCreatorTitle">
- Twórca:
- </text>
- <button label="Profil..." name="BtnCreator" />
- <text name="LabelOwnerTitle">
- Właściciel:
- </text>
- <button label="Profil..." name="BtnOwner" />
- <text name="LabelAcquiredTitle">
- Nabyte:
- </text>
- <text name="OwnerLabel">
- Ty:
- </text>
- <check_box label="Modyfikacja" name="CheckOwnerModify" />
- <check_box label="Kopiowanie" name="CheckOwnerCopy" />
- <check_box label="Transferowanie" name="CheckOwnerTransfer" />
- <text name="AnyoneLabel">
- Każdy:
- </text>
- <check_box label="Kopiowanie" name="CheckEveryoneCopy" />
- <text name="GroupLabel">
- Grupa:
- </text>
- <check_box label="Udostępnij" name="CheckShareWithGroup" />
- <text name="NextOwnerLabel">
- Nast. właściciel:
- </text>
- <check_box label="Modyfikacja" name="CheckNextOwnerModify" />
- <check_box label="Kopiowanie" name="CheckNextOwnerCopy" />
- <check_box label="Transferowanie" name="CheckNextOwnerTransfer" />
- <check_box label="Sprzedaż" name="CheckPurchase" />
- <combo_box name="ComboBoxSaleType">
- <combo_box.item label="Kopia" name="Copy" />
- <combo_box.item label="Zawartość" name="Contents" />
- <combo_box.item label="Oryginał" name="Original" />
- </combo_box>
- <spinner name="Edit Cost" label="Cena:" />
-</floater>
diff --git a/indra/newview/skins/default/xui/pl/notifications.xml b/indra/newview/skins/default/xui/pl/notifications.xml
index 87e318be1b..e668c6cc20 100644
--- a/indra/newview/skins/default/xui/pl/notifications.xml
+++ b/indra/newview/skins/default/xui/pl/notifications.xml
@@ -1,10 +1,14 @@
<?xml version="1.0" encoding="utf-8" ?>
<notifications>
<global name="skipnexttime">
- Nie pokazuj tego następnym razem
+ Nie pokazuj tego ponownie
+ </global>
+ <global name="skipnexttimesessiononly">
+ Nie pokazuj tego ponownie
+(dla obecnej sesji)
</global>
<global name="alwayschoose">
- Zawsze wybieraj tą opcję
+ Zawsze wybieraj tę opcję
</global>
<global name="implicitclosebutton">
Zamknij
@@ -20,20 +24,25 @@ Szczegóły błędu: Błąd o nazwie &apos;[_NAME]&apos; nie został odnaleziony
[CONTROLS]
</notification>
<notification name="TutorialNotFound">
- Brak samouczka na ten temat
+ Brak samouczka na ten temat.
</notification>
<notification name="GenericAlertYesCancel">
[MESSAGE]
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Tak" />
</notification>
<notification name="BadInstallation">
- Podczas aktualizacji [APP_NAME] wystąpił błąd. Proszę [http://get.secondlife.com odwiedzić stronę] aby ściągnąć ostatnią wersję klienta.
+ Instalacja [APP_NAME] jest uszkodzona. Proszę [http://get.secondlife.com pobrać nową kopię] przeglądarki i ponownie ją zainstalować.
</notification>
<notification name="LoginFailedNoNetwork">
Nie można połączyć z [SECOND_LIFE_GRID].
&apos;[DIAGNOSTIC]&apos;
Upewnij się, że Twoje połączenie z internetem działa.
</notification>
+ <notification name="LoginFailedToParse">
+ Przeglądarka otrzymała zniekształconą odpowiedź z serwera. Upewnij się, że połączenie internetowe działa prawidłowo i spróbuj ponownie później.
+
+Jeśli uważasz, że to błąd - skontaktuj się z pomocą techniczną.
+ </notification>
<notification name="MessageTemplateNotFound">
Szablon komunikatu dla [PATH] nie został odnaleziony.
</notification>
@@ -72,11 +81,96 @@ Foldery nie zostały wysłane na Marketplace z powodu błędu sieci lub systemu.
Inicjalizacja Marketplace nieudana z powodu błędu sieci lub systemu. Spróbuj później.
</notification>
+ <notification name="StockPasteFailed">
+ Kopiowanie lub przeniesienie do folderu Magazynowego nie powiodło się:
+
+&apos;[ERROR_CODE]&apos;
+ </notification>
+ <notification name="MyOutfitsPasteFailed">
+ Jeden lub więcej przedmiotów nie może być użyty w "Strojach"
+ </notification>
+ <notification name="MerchantPasteFailed">
+ Kopiowanie lub przenoszenie przedmiotów na Marketplace nie powiodło się:
+
+&apos;[ERROR_CODE]&apos;
+ </notification>
+ <notification name="MerchantTransactionFailed">
+ Transakcja z Marketplace nie powiodła się:
+
+[ERROR_REASON][ERROR_DESCRIPTION]
+ </notification>
+ <notification name="MerchantUnprocessableEntity">
+ Wylistowanie tej rzeczy lub aktywowanie folderu z wersją nie było możliwe. Zazwyczaj jest to spowodowane brakującymi informacjami w formularzu z opisem przedmiotu, ale może to również wynikać z błędów w strukturze folderów. Zmień opis przedmiotu lub sprawdź foldery, aby znaleźć błędy.
+ </notification>
+ <notification name="MerchantListingFailed">
+ Listowanie na Marketplace nie powiodło się:
+
+ &apos;[ERROR_CODE]&apos;
+ </notification>
+ <notification name="MerchantFolderActivationFailed">
+ Aktywacja tego folderu wersji nie powiodła się:
+
+ &apos;[ERROR_CODE]&apos;
+ </notification>
+ <notification name="MerchantForceValidateListing">
+ Aby wylistowanie tej rzeczy było możliwe hierarchia w jej zawartości została automatycznie naprawiona.
+ <usetemplate ignoretext="Ostrzegaj, gdy wylistowanie rzeczy automatycznie naprawia hierarchię zawartości" name="okignore" />
+ </notification>
+ <notification name="ConfirmMerchantActiveChange">
+ Jeśli kontynuujesz, to zmieni się aktywna zawartość tej rzeczy. Czy chcesz kontynuować?
+ <usetemplate ignoretext="Potwierdź przed zmodyfikowaniem aktywnej rzeczy na Marketplace" name="okcancelignore" notext="Anuluj" />
+ </notification>
+ <notification name="ConfirmMerchantMoveInventory">
+ Przedmioty przeciągnięte do okna listowania na Marketplace są przenoszone z ich oryginalnych lokalizacji, a nie kopiowane. Czy chcesz kontynuować?
+ <usetemplate ignoretext="Potwierdź, zanim prześlę na Marketplace przedmiot z mojej Szafy" name="okcancelignore" notext="Anuluj" />
+ </notification>
+ <notification name="ConfirmListingCutOrDelete">
+ Przeniesienie lub usunięcie folderu usunie również Twój przedmiot na Marketplace. Jeśli chcesz, aby przedmiot był ciągle widoczny na Marketplace musisz przesunąć lub usunąć zawartość folderu z wersją, którą chcesz zmodyfikować. Czy chcesz kontynuować?
+ <usetemplate ignoretext="Potwierdź, zanim usunę lub przeniosę przedmiot z Marketplace" name="okcancelignore" notext="Anuluj" />
+ </notification>
+ <notification name="ConfirmCopyToMarketplace">
+ Nie masz praw do skopiowania jednego lub więcej obiektów na Marketplace. Możesz je przenieść lub pozostawić.
+ <usetemplate canceltext="Anuluj" ignoretext="Potwierdź, zanim wyślę na Marketplace przedmioty bez praw kopiowania" name="yesnocancelbuttons" notext="Nie przenoś" yestext="Przenieś"/>
+ </notification>
+ <notification name="ConfirmMerchantUnlist">
+ Jeśli kontynuujesz, to ta rzecz zostanie usunięta z listy. Czy chcesz kontynuować?
+ <usetemplate ignoretext="Potwierdź, zanim usunę z listy rzecz na Marketplace" name="okcancelignore" notext="Anuluj" />
+ </notification>
+ <notification name="ConfirmMerchantClearVersion">
+ Jeśli kontynuujesz, to folder wersji tej rzeczy zostanie zdeaktywowany. Czy chcesz kontynuować?
+ <usetemplate ignoretext="Potwierdź przed wyłączeniem folderu wersji dla rzeczy na Marketplace" name="okcancelignore" notext="Anuluj" />
+ </notification>
+ <notification name="AlertMerchantListingNotUpdated">
+ Ta rzecz nie może zostać zaktualizowana.
+[[URL] Kliknij tutaj] aby zaktualizować ją na Marketplace.
+ </notification>
+ <notification name="AlertMerchantListingCannotWear">
+ Nie możesz założyć ubrań lub części ciała, które znajdują się w folderze listy rzeczy Marketplace.
+ </notification>
+ <notification name="AlertMerchantListingInvalidID">
+ Nieprawidłowy ID rzeczy.
+ </notification>
+ <notification name="AlertMerchantListingActivateRequired">
+ Istnieje kilka, lub żadna, wersji folderu dla tej rzeczy. Będziesz musiał/a wybrać i uaktywnić jedną oddzielnie później.
+ <usetemplate ignoretext="Powiadamiaj o aktywacji folderu wersji, gdy tworzę rzecz z kilkoma folderami wersji" name="okignore" />
+ </notification>
+ <notification name="AlertMerchantStockFolderSplit">
+ Przedmioty z ograniczonymi zasobami magazynowymi różnych typów zostały rozdzielone do osobnych folderów, aby ogólna hierarchia katalogów umożliwiała ich listowanie.
+ <usetemplate ignoretext="Powiadom, gdy folder Magazynowy jest dzielony przed listowaniem" name="okignore" />
+ </notification>
+ <notification name="AlertMerchantStockFolderEmpty">
+ Twoja rzecz została usunięta z listy, ponieważ nie ma jej już w Magazynie. Musisz dodać więcej jej jednostek do folderu Magazynowego, aby można było ją ponownie wyświetlać na liście.
+ <usetemplate ignoretext="Powiadom, gdy rzecz jest zdjęta z listy, bo folder zasobów Magazynowych jest pusty" name="okignore" />
+ </notification>
+ <notification name="AlertMerchantVersionFolderEmpty">
+ Twoja rzecz została usunięta z listy, ponieważ folder wersji jest pusty. Musisz dodać więcej jej jednostek do folderu wersji, aby można było ją ponownie wyświetlać na liście.
+ <usetemplate ignoretext="Powiadom, gdy rzecz jest zdjęta z listy, bo folder wersji jest pusty" name="okignore" />
+ </notification>
<notification name="WriteAnimationFail">
Problem w zapisywaniu danych animacji. Spróbuj ponownie za kilka minut.
</notification>
<notification name="UploadAuctionSnapshotFail">
- W trakcie ładowania obrazu aukcji pojawił się problem z następującego powodu: [REASON].
+ W trakcie przesyłania obrazu aukcji pojawił się problem z następującego powodu: [REASON].
</notification>
<notification name="UnableToViewContentsMoreThanOne">
Nie można przeglądać zawartości więcej niż jednego obiektu naraz.
@@ -89,9 +183,12 @@ Wybierz pojedynczy obiekt i spróbuj jeszcze raz.
<notification name="FriendsAndGroupsOnly">
Osoby spoza listy znajomych nie będą wiedzieć, że zdecydowałeś/aś się ignorować ich rozmowy głosowe i wiadomości IM.
</notification>
- <notification name="FavoritesOnLogin">
+ <notification name="FavoritesOnLogin">
Pamiętaj: kiedy włączysz tą opcję to każdy kto używa tego komputera będzie mógł zobaczyć Twoją listę ulubionych miejsc.
</notification>
+ <notification name="AllowMultipleViewers">
+ Uruchamianie kilku przeglądarek Second Life nie podlega wsparciu. Może prowadzić do kolizji pamięci podręcznej tekstur, jej uszkodzeń, pogorszenia efektów wizualnych oraz wydajności.
+ </notification>
<notification name="GrantModifyRights">
Udzielenie praw modyfikacji innemu Rezydentowi umożliwia modyfikację, usuwanie lub wzięcie JAKIEGOKOLWIEK z Twoich obiektów. Używaj tej opcji z rozwagą!
Czy chcesz udzielić prawa do modyfikacji [NAME]?
@@ -110,6 +207,9 @@ Czy chcesz dać prawa modyfikacji wybranym osobom?
Czy chcesz odebrać prawa modyfikacji wybranym Rezydentom?
<usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak" />
</notification>
+ <notification name="GroupNameLengthWarning">
+ Nazwa grupy musi zawierać od [MIN_LEN] do [MAX_LEN] znaków.
+ </notification>
<notification name="UnableToCreateGroup">
Założenie grupy nie jest możliwe.
[MESSAGE]
@@ -171,6 +271,17 @@ Jeśli nie chcesz, aby te przywileje były dłużej przypisane do tej roli, to w
Zamierzasz wyrzucić [COUNT] osób z grupy.
<usetemplate ignoretext="Potwierdź wyrzucenie kilku osób z grupy" name="okcancelignore" notext="Anuluj" yestext="Wyrzuć" />
</notification>
+ <notification name="BanGroupMemberWarning">
+ Zamierzasz zbanować [AVATAR_NAME] z grupy.
+ <usetemplate ignoretext="Potwierdź przed zbanowaniem osoby z grupy" name="okcancelignore" notext="Anuluj" yestext="Banuj" />
+ </notification>
+ <notification name="BanGroupMembersWarning">
+ Zamierzasz zbanować [COUNT] osób z grupy.
+ <usetemplate ignoretext="Potwierdź przed zbanowaniem z grupy kilku osób na raz" name="okcancelignore" notext="Anuluj" yestext="Banuj" />
+ </notification>
+ <notification name="GroupBanUserOnBanlist">
+ Niektórzy rezydenci nie dostali zaproszenia, ponieważ są zbanowani w grupie.
+ </notification>
<notification name="AttachmentDrop">
Wybrałeś/aś opcję upuszczenia swojego dodatku.
Czy chcesz kontynuować?
@@ -182,7 +293,7 @@ Chcesz kontynuować?
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Dołącz" />
</notification>
<notification name="JoinGroupNoCost">
- Dołączasz do grupy [NAME].
+ Dołączasz do grupy &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
Czy chcesz kontynuować?
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Dołącz" />
</notification>
@@ -194,7 +305,30 @@ Masz za mało L$ żeby do niej dołączyć.
Stworzenie tej grupy kosztuje [COST]L$.
W grupie powinna być więcej niż jedna osoba, w przeciwnym razie zostanie ona na zawsze skasowana.
Zaproś kogoś w ciągu 48 godzin.
- <usetemplate canceltext="Anuluj" name="okcancelbuttons" notext="Anuluj" yestext="Stwórz grupę za 100L$" />
+ <usetemplate canceltext="Anuluj" name="okcancelbuttons" notext="Anuluj" yestext="Stwórz grupę za [COST]L$" />
+ </notification>
+ <notification name="JoinGroupInaccessible">
+ Ta grupa nie jest dla Ciebie dostępna.
+ </notification>
+ <notification name="JoinGroupError">
+ Wystąpił błąd podczas próby dołączenia do grupy.
+ </notification>
+ <notification name="JoinGroupErrorReason">
+ Nie można dołączyć do grupy: [reason]
+ </notification>
+ <notification name="JoinGroupTrialUser">
+ Przepraszamy, ale konta próbne nie mogą dołączać do grup.
+ </notification>
+ <notification name="JoinGroupMaxGroups">
+ Nie możesz dołączyć do &apos;&lt;nolink&gt;[group_name]&lt;/nolink&gt;&apos;:
+Jesteś już w [group_count] grupach, a maksymalny dozwolony limit to [max_groups]
+ </notification>
+ <notification name="JoinGroupClosedEnrollment">
+ Nie możesz dołączyć do &apos;&lt;nolink&gt;[group_name]&lt;/nolink&gt;&apos;:
+Grupa nie umożliwia już swobodnego dołączania.
+ </notification>
+ <notification name="JoinGroupInsufficientFunds">
+ Nie można przekazać wymaganej opłaty wstępu ([membership_fee] L$).
</notification>
<notification name="LandBuyPass">
Za [COST]L$ możesz odwiedzić tą działkę (&apos;[PARCEL_NAME]&apos;) na [TIME] godzin. Chcesz kupić przepustkę?
@@ -217,10 +351,9 @@ Cena wynosi [SALE_PRICE]L$, a sprzedaż będzie autoryzowana dla [NAME].
<usetemplate name="okcancelbuttons" notext="Anuluj" />
</notification>
<notification name="ReturnObjectsDeededToGroup">
- Czy na pewno chcesz zwrócić wszystkie obiekty udostępnione grupie &apos;[NAME]&apos; na tej działce do szaf ich poprzednich właścicieli?
+ Czy na pewno chcesz zwrócić wszystkie obiekty udostępnione grupie &apos;&lt;nolink&gt;[NAME]&lt;/nolink&gt;&apos; na tej działce do szaf ich poprzednich właścicieli?
-*UWAGA* Wybrana opcja spowoduje usunięcie wszystkich obiektów
-udostępnionych grupie, które nie mają praw transferu!
+*UWAGA* Wybrana opcja spowoduje usunięcie wszystkich obiektów udostępnionych grupie, które nie mają praw transferu!
Obiekty: [N]
<usetemplate name="okcancelbuttons" notext="Anuluj" />
@@ -256,7 +389,7 @@ Obiekty: [N]
<usetemplate name="okcancelbuttons" notext="Anuluj" />
</notification>
<notification name="ReturnAllTopObjects">
- Czy na pewno chcesz zwrócić wszystkie wymienione obiekty znajdujące się na tej działce do szaf ich właścicieli?
+ Czy na pewno chcesz zwrócić wszystkie wymienione obiekty znajdujące się na tej działce do szaf ich właścicieli? Spowoduje to zwrot WSZYSTKICH oskryptowanych obiektów w regionie!
<usetemplate name="okcancelbuttons" notext="Anuluj" />
</notification>
<notification name="DisableAllTopObjects">
@@ -264,7 +397,7 @@ Obiekty: [N]
<usetemplate name="okcancelbuttons" notext="Anuluj" />
</notification>
<notification name="ReturnObjectsNotOwnedByGroup">
- Zwrócić obiekty z tej działki, które NIE są udostępnione grupie [NAME] do ich właścicieli?
+ Zwrócić obiekty z tej działki, które NIE są udostępnione grupie &lt;nolink&gt;[NAME]&lt;/nolink&gt; do ich właścicieli?
Obiekty: [N]
<usetemplate name="okcancelbuttons" notext="Anuluj" />
@@ -299,14 +432,23 @@ W celu umieszczenia mediów tylko na jednej powierzchni skorzystaj z narzędzia
<notification name="ErrorEncodingSnapshot">
Błąd w kodowaniu zdjęcia.
</notification>
+ <notification name="ErrorPhotoCannotAfford">
+ Potrzebujesz [COST]L$ aby zapisać zdjęcie do swojej Szafy. Możesz zamiast tego kupić L$ lub zapisać zdjęcie na swoim komputerze.
+ </notification>
+ <notification name="ErrorCannotAffordUpload">
+ Potrzebujesz [COST]L$ aby przesłać ten element.
+ </notification>
+ <notification name="ErrorTextureCannotAfford">
+ Potrzebujesz [COST]L$ aby zapisać teksturę do swojej Szafy. Możesz zamiast tego kupić L$ lub zapisać teksturę na swoim komputerze.
+ </notification>
<notification name="ErrorUploadingPostcard">
- W trakcie ładowania zdjęcia pojawił się problem z następującego powodu: [REASON]
+ W trakcie przesyłania zdjęcia pojawił się problem z następującego powodu: [REASON]
</notification>
<notification name="ErrorUploadingReportScreenshot">
- W trakcie ładowania zdjęcia ekranu do raportu pojawił się problem z następującego powodu: [REASON]
+ W trakcie przesyłania zdjęcia ekranu do raportu pojawił się problem z następującego powodu: [REASON]
</notification>
<notification name="MustAgreeToLogIn">
- Musisz zaakceptować Warunki Umowy (Terms of Service) by kontynuować logowanie się do [SECOND_LIFE].
+ Musisz zaakceptować Regulamin (Terms and Conditions), Politykę Prywatności (Privacy Policy) i Warunki korzystania z Usług (Terms of Service) by kontynuować logowanie się do [SECOND_LIFE].
</notification>
<notification name="CouldNotPutOnOutfit">
Założenie stroju nie powiodło się.
@@ -322,6 +464,9 @@ Limit [MAX_ATTACHMENTS] dodatków został przekroczony. Proszę najpierw odłąc
<notification name="CannotWearInfoNotComplete">
Nie możesz założyć tego przedmiotu, ponieważ jeszcze się nie załadował do końca. Spróbuj ponownie za kilka minut.
</notification>
+ <notification name="MustEnterPasswordToLogIn">
+ Należy wprowadzić hasło.
+ </notification>
<notification name="MustHaveAccountToLogIn">
Należy wprowadzić nazwę użytkownika.
@@ -332,10 +477,10 @@ Potrzebujesz konta aby się zalogować do [SECOND_LIFE]. Czy chcesz utworzyć je
Należy wprowadzić nazwę użytkownika lub imię oraz nazwisko Twojego awatara w pole nazwy użytkownika, a następnie ponownie się zalogować.
</notification>
<notification name="InvalidGrid">
- '[GRID]' nie jest prawidłowym identyfikatorem siatki.
+ '[GRID]' nie jest prawidłowym identyfikatorem świata.
</notification>
<notification name="InvalidLocationSLURL">
- Twój punkt startowy nie znajduje się na prawidłowej siatce.
+ Twój punkt startowy nie znajduje się w prawidłowym świecie.
</notification>
<notification name="DeleteClassified">
Usunąć reklamę &apos;[NAME]&apos;?
@@ -354,10 +499,22 @@ Czy na pewno chcesz kontynuować?
<notification name="ClassifiedInsufficientFunds">
Nie posiadasz wystarczających środków aby dodać reklamę.
</notification>
- <notification name="DeleteAvatarPick">
+ <notification name="ProfileDeleteClassified">
+ Usunąć reklamę &lt;nolink&gt;[CLASSIFIED]&lt;/nolink&gt;?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" />
+ </notification>
+ <notification name="ProfileDeletePick">
Usunąć miejsce &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
<usetemplate name="okcancelbuttons" notext="Anuluj" />
</notification>
+ <notification name="ProfileUnpublishedClassified">
+ Masz nieopublikowane reklamy. Przepadną, jeśli zamkniesz okno.
+ <usetemplate name="okcancelbuttons" notext="Anuluj" />
+ </notification>
+ <notification name="ProfileUnsavedChanges">
+ Masz niezapisane zmiany.
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Odrzuć" yestext="Zapisz" />
+ </notification>
<notification name="DeleteOutfits">
Skasować wybrane stroje?
<usetemplate name="okcancelbuttons" notext="Anuluj" />
@@ -372,14 +529,6 @@ Czy na pewno chcesz kontynuować?
<notification name="SelectHistoryItemToView">
Wybierz obiekt z historii, który chcesz zobaczyć.
</notification>
- <notification name="ResetShowNextTimeDialogs">
- Czy chcesz aktywować ponownie wszystkie te powiadomienia, przy których wcześniej zaznaczono &apos;nie pokazuj ponownie&apos;?
- <usetemplate name="okcancelbuttons" notext="Anuluj" />
- </notification>
- <notification name="SkipShowNextTimeDialogs">
- Czy chcesz dezaktywować wszystkie powiadomienia, jakie tylko można?
- <usetemplate name="okcancelbuttons" notext="Anuluj" />
- </notification>
<notification name="CacheWillClear">
Bufor danych zostanie wyczyszczony po restarcie aplikacji [APP_NAME].
</notification>
@@ -390,6 +539,9 @@ Pamiętaj: Opcja ta wyczyszcza bufor danych.
<notification name="ChangeConnectionPort">
Ustawienia portu zostają zaktualizowane po restarcie aplikacji [APP_NAME].
</notification>
+ <notification name="ChangeDeferredDebugSetting">
+ To ustawienie debugowania zostanie zaktualizowane po restarcie aplikacji [APP_NAME].
+ </notification>
<notification name="ChangeSkin">
Nowa skórka pojawi się po restarcie aplikacji [APP_NAME].
</notification>
@@ -405,7 +557,11 @@ Pamiętaj: Opcja ta wyczyszcza bufor danych.
<usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie zapisuj" yestext="Zapisz" />
</notification>
<notification name="DeleteNotecard">
- Usunąć notkę?
+ Czy na pewno chcesz usunąć tą notkę?
+ <usetemplate ignoretext="Potwierdź usuwanie notki" name="okcancelignore" notext="Anuluj" />
+ </notification>
+ <notification name="LoadPreviousReportScreenshot">
+ Czy chcesz użyć poprzedniego zrzutu ekranu dla swojego zgłoszenia?
<usetemplate name="okcancelbuttons" notext="Anuluj" />
</notification>
<notification name="GestureSaveFailedTooManySteps">
@@ -451,6 +607,10 @@ Obiekt może znajdować się zbyt daleko albo został usunięty.
<notification name="CannotDownloadFile">
Nie można pobrać pliku
</notification>
+ <notification name="MediaFileDownloadUnsupported">
+ Zażądano pobrania pliku, jaki nie jest obsługiwany w [SECOND_LIFE].
+ <usetemplate ignoretext="Ostrzegaj o pobieraniu nieobsługiwanych typów plików" name="okignore" />
+ </notification>
<notification name="CannotWriteFile">
Nie można zapisać pliku [[FILE]]
</notification>
@@ -460,23 +620,11 @@ Obiekt może znajdować się zbyt daleko albo został usunięty.
Odwiedzić [_URL], aby uzyskać więcej informacji?
<usetemplate ignoretext="Sprzęt w moim komputerze nie jest wspierany" name="okcancelignore" notext="Nie" yestext="Tak" />
</notification>
- <notification name="IntelOldDriver">
- Prawdopodobnie istnieje nowszy sterownik dla Twojej karty graficznej. Aktualizacja sterowników graficznych może znacznie zwiększyć wydajność.
-
-Odwiedzić [_URL] aby sprawdzić, czy są nowsze sterowniki?
- <usetemplate ignoretext="Moje sterowniki grafiki są przestarzałe" name="okcancelignore" notext="Nie" yestext="Tak" />
- </notification>
- <notification name="AMDOldDriver">
- Prawdopodobnie istnieje nowszy sterownik dla Twojej karty graficznej. Aktualizacja sterowników graficznych może znacznie zwiększyć wydajność.
-
-Odwiedzić [_URL] aby sprawdzić, czy są nowsze sterowniki?
- <usetemplate ignoretext="Moje sterowniki grafiki są przestarzałe" name="okcancelignore" notext="Nie" yestext="Tak" />
- </notification>
- <notification name="NVIDIAOldDriver">
+ <notification name="OldGPUDriver">
Prawdopodobnie istnieje nowszy sterownik dla Twojej karty graficznej. Aktualizacja sterowników graficznych może znacznie zwiększyć wydajność.
-Odwiedzić [_URL] aby sprawdzić, czy są nowsze sterowniki?
- <usetemplate ignoretext="Moje sterowniki grafiki są przestarzałe" name="okcancelignore" notext="Nie" yestext="Tak" />
+Odwiedzić [URL] aby sprawdzić, czy są nowsze sterowniki?
+ <usetemplate ignoretext="Moje sterowniki grafiki są przestarzałe" name="okcancelignore" notext="Nie" yestext="Tak"/>
</notification>
<notification name="UnknownGPU">
Twój system jest wyposażony w kartę graficzną, która nie jest rozpoznana przez [APP_NAME].
@@ -500,7 +648,7 @@ Możesz podnieść jakość grafiki pod Ustawienia &gt; Grafika.
</notification>
<notification name="CannotCopyWarning">
Nie masz pozwolenia na kopiowanie następujących obiektów:
-[ITEMS]
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
i stracisz je w momencie przekazania. Czy na pewno chcesz oddać te obiekty?
<usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak" />
</notification>
@@ -547,7 +695,7 @@ Ta osoba tymczasowo nie będzie mogła się poruszać, używać czatu (IM) lub o
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Wyrzuć" />
</notification>
<notification name="EjectAvatarFromGroup">
- Wyrzuciłeś/aś [AVATAR_NAME] z grupy [GROUP_NAME]
+ Wyrzuciłeś/aś [AVATAR_NAME] z grupy &lt;nolink&gt;[GROUP_NAME]&lt;/nolink&gt;.
</notification>
<notification name="AcquireErrorTooManyObjects">
BŁĄD OTRZYMYWANIA: Zbyt wiele wybranych obiektów.
@@ -562,6 +710,9 @@ Przemieść wszystkie otrzymywane obiekty do jednego regionu.
Odwiedzić [_URL] po więcej informacji na temat zakupu L$?
<usetemplate name="okcancelbuttons" notext="Anuluj" />
</notification>
+ <notification name="MuteLimitReached">
+ Nie można dodać kolejnego wpisu do listy zablokowanych, ponieważ limit [MUTE_LIMIT] rekordów został osiągnięty.
+ </notification>
<notification name="UnableToLinkObjects">
Nie można połączyć [COUNT] obiektów.
Maksymalnie można połączyć [MAX] obiektów.
@@ -577,6 +728,9 @@ Upewnij się, że żaden z obiektów nie jest zablokowany i wszystkie należą d
<notification name="CannotLinkPermanent">
Nie możesz łączyć obiektów przez granice regionów.
</notification>
+ <notification name="CannotLinkAcrossRegions">
+ Nie możesz łączyć obiektów przez granice regionów.
+ </notification>
<notification name="CannotLinkDifferentOwners">
Nie możesz połączyć obiektów, ponieważ należą one do różnych osób.
@@ -592,7 +746,7 @@ Upewnij się, że nazwa pliku ma poprawne rozszerzenie.
Oczekiwane: [VALIDS]
</notification>
<notification name="CannotUploadSoundFile">
- Nie można otworzyć załadowanego pliku dźwiękowego:
+ Nie można otworzyć przesłanego pliku dźwiękowego:
[FILE]
</notification>
<notification name="SoundFileNotRIFF">
@@ -624,7 +778,7 @@ Oczekiwane: [VALIDS]
[FILE]
</notification>
<notification name="SoundFileInvalidTooLong">
- Plik audio jest zbyt długi (10 sekund maksimum):
+ Plik audio jest zbyt długi (maksymalnie 30 sekund):
[FILE]
</notification>
<notification name="ProblemWithFile">
@@ -655,10 +809,10 @@ To może się zdarzyć, kiedy zmieniasz ustawienia sieci. Zrestartowanie Przegl
Nie można utworzyć pliku wyjściowego: [FILE]
</notification>
<notification name="DoNotSupportBulkAnimationUpload">
- [APP_NAME] obecnie nie wspomaga ładowania grupowego plików animacji w formacie BVH.
+ [APP_NAME] obecnie nie wspomaga przesyłania grupowego plików animacji w formacie BVH.
</notification>
<notification name="CannotUploadReason">
- Ładowanie pliku [FILE] nie powiodło się z powodu: [REASON]
+ Przesyłanie pliku [FILE] nie powiodło się z powodu: [REASON]
Spróbuj jeszcze raz później.
</notification>
<notification name="LandmarkCreated">
@@ -670,6 +824,12 @@ Spróbuj jeszcze raz później.
<notification name="CannotCreateLandmarkNotOwner">
Nie możesz zapamiętać tego miejsca (LM) ponieważ właściciel działki nie pozwala na to.
</notification>
+ <notification label="Utwórz folder" name="CreateLandmarkFolder">
+ Wybierz nazwę folderu:
+ <form name="form">
+ <button name="Cancel" text="Anuluj" />
+ </form>
+ </notification>
<notification name="CannotRecompileSelectObjectsNoScripts">
&apos;Rekompilacja&apos; nie powiodła się.
@@ -719,8 +879,7 @@ Nowe zapytanie: [FINALQUERY]
[REASON]
</notification>
<notification name="invalid_tport">
- Niestety, pojawił się błąd podczas próby teleportacji. Proponujemy wylogowanie się i spróbowanie teleportacji ponownie.
-Jeżeli nadal otrzymujesz tę wiadomość proponujemy odwiedzić stronę [SUPPORT_SITE].
+ Próby teleportacji są ograniczone do 6 na minutę. Jeśli masz problemy odczekaj minutę i spróbuj ponownie się teleportować. Jeśli problem będzie się powtarzał wyloguj się i zaloguj ponownie.
</notification>
<notification name="invalid_region_handoff">
Niestety, pojawił się błąd podczas próby przedostania się na drugi region. Proponujemy wylogowanie się i spróbowanie przedostania się na drugi region ponownie.
@@ -750,6 +909,9 @@ Jeżeli nadal otrzymujesz tę wiadomość proponujemy odwiedzić stronę [SUPPOR
<notification name="expired_region_handoff">
Przepraszamy, ale nie udało się przeprowadzić zmiany regionu wystarczająco szybko. Spróbuj jeszcze raz za kilka minut.
</notification>
+ <notification name="preexisting_tport">
+ Przepraszamy, ale system nie mógł zainicjować teleportacji. Spróbuj jeszcze raz za kilka minut.
+ </notification>
<notification name="no_host">
Nie można znaleźć miejsca docelowego. To miejsce może być chwilowo nieosiągalne albo przestało istnieć. Spróbuj jeszcze raz za kilka minut.
</notification>
@@ -937,13 +1099,16 @@ Zazwyczaj jest to tymczasowy problem. Możesz kontynuować modyfikacje i zapisa
<notification name="YouHaveBeenLoggedOut">
Nastąpiło wylogowanie z [SECOND_LIFE]
[MESSAGE]
- <usetemplate name="okcancelbuttons" notext="Wyłącz" yestext="Pokaż IM/czat" />
+ <usetemplate name="okcancelbuttons" notext="Zakończ" yestext="Pokaż IM/czat" />
+ </notification>
+ <notification name="InventoryUnusable">
+ Wystąpił problem podczas ładowania szafy. Spróbuj się wylogować i zalogować ponownie. Jeśli zobaczysz ten komunikat jeszcze raz, to skontaktuj się z pomocą techniczną, aby rozwiązać problem.
</notification>
<notification name="OnlyOfficerCanBuyLand">
Nie możesz kupić działek dla grupy.
Nie masz praw kupowania działek dla Twojej aktywnej grupy.
</notification>
- <notification label="Add Friend" name="AddFriendWithMessage">
+ <notification label="Dodaj znajomego" name="AddFriendWithMessage">
Znajomi mogą pozwalać na odnajdywanie się wzajemnie na mapie i na otrzymywanie informacji o statusie online.
Zaproponować znajomość [NAME]?
@@ -1007,6 +1172,18 @@ do
<notification label="Zmień nazwę stroju" name="RenameOutfit">
Nowa nazwa stroju:
<form name="form">
+ <button name="Cancel" text="Anuluj"/>
+ </form>
+ </notification>
+ <notification label="Zmień nazwę gestu" name="RenameGesture">
+ Nowa nazwa gestu:
+ <form name="form">
+ <button name="Cancel" text="Anuluj"/>
+ </form>
+ </notification>
+ <notification label="Zmień nazwę Landmarka" name="RenameLandmark">
+ Wybierz nową nazwę dla [NAME]
+ <form name="form">
<button name="Cancel" text="Anuluj" />
</form>
</notification>
@@ -1127,7 +1304,7 @@ Wybierz mniejszy obszar i spróbuj jeszcze raz.
Po przekazaniu tej działki grupa będzie musiała mieć i utrzymywać wystarczający kredyt na używanie działki.
Cena zakupu działki nie jest zwracana właścicielowi. Jeżeli przekazana działka zostanie sprzedana, cena sprzedaży zostanie podzielona pomiędzy członków grupy.
-Przekazać tą działkę o powierzchni [AREA] m² grupie &apos;[GROUP_NAME]&apos;?
+Przekazać tą działkę o powierzchni [AREA] m² grupie &apos;&lt;nolink&gt;[GROUP_NAME]&lt;/nolink&gt;&apos;?
<usetemplate name="okcancelbuttons" notext="Anuluj" />
</notification>
<notification name="DeedLandToGroupWithContribution">
@@ -1135,7 +1312,7 @@ Przekazać tą działkę o powierzchni [AREA] m² grupie &apos;[GROUP_NAME]&apos
Przekazanie będzie zawierać równoczesne przypisanie działki do grupy od &apos;[NAME]&apos;.
Cena zakupu działki nie jest zwracana właścicielowi. Jeżeli przekazana działka zostanie sprzedana, cena sprzedaży zostanie podzielona pomiędzy członków grupy.
-Przekazać tą działkę o powierzchni [AREA] m² grupie &apos;[GROUP_NAME]&apos;?
+Przekazać tą działkę o powierzchni [AREA] m² grupie &apos;&lt;nolink&gt;[GROUP_NAME]&lt;/nolink&gt;&apos;?
<usetemplate name="okcancelbuttons" notext="Anuluj" />
</notification>
<notification name="DisplaySetToSafe">
@@ -1169,12 +1346,32 @@ Możesz normalnie używać [SECOND_LIFE], inni użytkownicy będą Cię widzieli
<ignore name="ignore" text="Ładowanie ubrań nadal trwa" />
</form>
</notification>
+ <notification name="AgentComplexityWithVisibility">
+ Twój [https://community.secondlife.com/t5/English-Knowledge-Base/Avatar-Rendering-Complexity/ta-p/2967838 stopień złożoności awatara] to [AGENT_COMPLEXITY].
+[OVERLIMIT_MSG]
+ <usetemplate ignoretext="Ostrzegaj mnie, gdy stopień złożoności mojego awatara jest zbyt wysoki" name="notifyignore" />
+ </notification>
+ <notification name="AgentComplexity">
+ Twój [https://community.secondlife.com/t5/English-Knowledge-Base/Avatar-Rendering-Complexity/ta-p/2967838 stopień złożoności awatara] to [AGENT_COMPLEXITY].
+ <usetemplate ignoretext="Ostrzegaj mnie, gdy zmienia się stopień złożoności mojego awatara" name="notifyignore"/>
+ </notification>
+ <notification name="HUDComplexityWarning">
+ [HUD_REASON]. Bardzo prawdopodobne, że wpłynie to negatywnie na Twoją wydajność.
+ <usetemplate ignoretext="Ostrzegaj mnie, gdy stopień złożoności moich dodatków HUD jest zbyt wysoki" name="notifyignore"/>
+ </notification>
<notification name="FirstRun">
Instalacja [APP_NAME] zakończona.
Jeżeli używasz [SECOND_LIFE] po raz pierwszy to musisz stworzyć konto żeby móc się zalogować.
<usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Stwórz konto..." />
</notification>
+ <notification name="LoginCantRemoveUsername">
+ Zapamiętany użytkownik może zostać zapomniany w Awatar &gt; Ustawienia &gt; Zaawansowane &gt; Zapamiętani użytkownicy.
+ </notification>
+ <notification name="LoginCantRemoveCurUsername">
+ Zapomnienie zalogowanego użytkownika wymaga jego wylogowania.
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Potwierdź i wyloguj się" />
+ </notification>
<notification name="LoginPacketNeverReceived">
Problemy z połączeniem. Problem może być spowodowany Twoim połączeniem z Internetem albo może istnieć po stronie [SECOND_LIFE_GRID].
@@ -1184,6 +1381,18 @@ Możesz sprawdzić swoje połączenie z Internetem i spróbować ponownie za kil
<button name="Teleport" text="Teleportuj" />
</form>
</notification>
+ <notification name="LoginPacketNeverReceivedNoTP">
+ Problemy z połączeniem. Problem może być spowodowany Twoim połączeniem z Internetem albo może istnieć po stronie [SECOND_LIFE_GRID].
+
+Możesz sprawdzić swoje połączenie z Internetem i spróbować ponownie za kilka minut lub połączyć się ze stroną pomocy technicznej [SUPPORT_SITE].
+ <form name="form">
+ <button name="Help" text="Pomoc"/>
+ </form>
+ </notification>
+ <notification name="LoginRemoveMultiGridUserData">
+ Usuwane Dane Lokalne są współużytkowane przez wiele światów, czy na pewno chcesz je usunąć?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Potwierdź" />
+ </notification>
<notification name="WelcomeChooseSex">
Twoja postać pojawi się za moment.
@@ -1193,7 +1402,11 @@ Wybierz awatara właściwej płci. Ten wybór będzie można później zmienić.
<usetemplate name="okcancelbuttons" notext="Kobieta" yestext="Mężczyzna" />
</notification>
<notification name="CantTeleportToGrid">
- Nie można teleportować do [SLURL], ponieważ jest na innej siatce ([GRID]) niż obecna siatka ([CURRENT_GRID]). Proszę zamknąć przeglądarkę i spróbować ponownie.
+ Nie można teleportować do [SLURL], ponieważ jest w innym świecie ([GRID]) niż obecny ([CURRENT_GRID]). Proszę zamknąć przeglądarkę i spróbować ponownie.
+ </notification>
+ <notification name="GeneralCertificateErrorShort">
+ Połączenie z serwerem nie mogło zostać nawiązane.
+[REASON]
</notification>
<notification name="GeneralCertificateError">
Połączenie z serwerem nie mogło zostać nawiązane.
@@ -1208,7 +1421,6 @@ Odcisk palca SHA1: [MD5_DIGEST]
Użycie klucza: [KEYUSAGE]
Rozszerzone użycie klucza: [EXTENDEDKEYUSAGE]
Identyfikator klucza podmiotu: [SUBJECTKEYIDENTIFIER]
-
</notification>
<notification name="TrustCertificateError">
Wydawca certyfikatu dla tego serwera nie jest znany.
@@ -1254,6 +1466,10 @@ Wybierz pojedynczy obiekt i spróbuj jeszcze raz.
Teleportować wszystkich Rezydentów z tego regionu do ich miejsc startu?
<usetemplate name="okcancelbuttons" notext="Anuluj" />
</notification>
+ <notification name="ChangeObjectBonusFactor">
+ Obniżenie limitu obiektów bonusowych po tym, gdy konstrukcje zostały już poustawiane w regionie może spowodować, że część z nich może zostać zwrócona lub usunięta. Na pewno chcesz zmienić tą wartość?
+ <usetemplate ignoretext="Potwierdź zmianę mnożnika obiektów bonusowych" name="okcancelignore" notext="Anuluj"/>
+ </notification>
<notification name="EstateObjectReturn">
Na pewno chcesz odesłać wszystkie obiekty należące do [USER_NAME]?
<usetemplate name="okcancelbuttons" notext="Anuluj" />
@@ -1262,21 +1478,25 @@ Wybierz pojedynczy obiekt i spróbuj jeszcze raz.
Nie można ustawić tekstur regionu:
Tekstura terenu [TEXTURE_NUM] ma niewłaściwą głębię koloru - [TEXTURE_BIT_DEPTH].
-Zamień teksturę [TEXTURE_NUM] na 24-bitową teksturę o wymiarze 1024x1024 lub mniejszą i ponownie kliknij na &quot;Zastosuj&quot;.
+Zamień teksturę [TEXTURE_NUM] na 24-bitową teksturę o wymiarze [MAX_SIZE]x[MAX_SIZE] lub mniejszą i ponownie kliknij na &quot;Zastosuj&quot;.
</notification>
<notification name="InvalidTerrainSize">
Nie można ustawić tekstur regionu:
Tekstura terenu [TEXTURE_NUM] jest za duża - [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y].
-Zamień teksturę [TEXTURE_NUM] na 24-bitową teksturę o wymiarze 1024x1024 lub mniejszą i ponownie kliknij na &quot;Zastosuj&quot;.
+Zamień teksturę [TEXTURE_NUM] na 24-bitową teksturę o wymiarze [MAX_SIZE]x[MAX_SIZE] lub mniejszą i ponownie kliknij na &quot;Zastosuj&quot;.
</notification>
<notification name="RawUploadStarted">
- Ładowanie rozpoczęte. Może potrwać do dwóch minut zależnie od prędkości Twojego połączenia.
+ Przesyłanie rozpoczęte. Może potrwać do dwóch minut zależnie od prędkości Twojego połączenia.
</notification>
<notification name="ConfirmBakeTerrain">
Na pewno chcesz zapisać obecne ukształtowanie terenu jako punkt odniesienia dla górnego i dolnego limitu terenu oraz jako domyślną wartość dla opcji &apos;Odtwórz&apos;?
<usetemplate name="okcancelbuttons" notext="Anuluj" />
</notification>
+ <notification name="ConfirmTextureHeights">
+ Zamierzasz użyć wartości 'niższych' większych niż 'wyższe' dla zakresów elewacji. Chcesz kontynuować?
+ <usetemplate name="yesnocancelbuttons" notext="Anuluj" canceltext="Nie pytaj" />
+ </notification>
<notification name="MaxAllowedAgentOnRegion">
Maksymalna liczba Rezydentów wynosi [MAX_AGENTS].
</notification>
@@ -1295,7 +1515,34 @@ Zamień teksturę [TEXTURE_NUM] na 24-bitową teksturę o wymiarze 1024x1024 lub
Możesz mieć maksymalnie [MAX_MANAGER] zarządców Majątku.
</notification>
<notification name="OwnerCanNotBeDenied">
- Nie możesz dodać właściciela majątku do listy &apos;Niepożądanych Rezydentów (banów)&apos; majątku.
+ Nie możesz dodać właściciela Majątku do listy &apos;Niepożądanych Rezydentów (banów)&apos; Majątku.
+ </notification>
+ <notification name="ProblemAddingEstateManagerBanned">
+ Nie możesz dodać zbanowanego rezydenta do listy zarządców Majątku.
+ </notification>
+ <notification name="ProblemBanningEstateManager">
+ Nie można dodać zarządcy Majątku [AGENT] do listy zbanowanych.
+ </notification>
+ <notification name="GroupIsAlreadyInList">
+ &lt;nolink&gt;[GROUP]&lt;/nolink&gt; już jest na liście dostępu grup.
+ </notification>
+ <notification name="AgentIsAlreadyInList">
+ [AGENT] już jest na Twojej liście: [LIST_TYPE].
+ </notification>
+ <notification name="AgentsAreAlreadyInList">
+ [AGENT] już są na Twojej liście: [LIST_TYPE].
+ </notification>
+ <notification name="AgentWasAddedToList">
+ [AGENT] został/a dodany/a do listy: [LIST_TYPE] w: [ESTATE].
+ </notification>
+ <notification name="AgentsWereAddedToList">
+ [AGENT] zostali dodani do listy: [LIST_TYPE] w: [ESTATE].
+ </notification>
+ <notification name="AgentWasRemovedFromList">
+ [AGENT] został/a usunięty/a z listy: [LIST_TYPE] w: [ESTATE].
+ </notification>
+ <notification name="AgentsWereRemovedFromList">
+ [AGENT] zostali usunięci z listy: [LIST_TYPE] w: [ESTATE].
</notification>
<notification name="CanNotChangeAppearanceUntilLoaded">
Nie możesz zmienić wyglądu podczas ładowania ubrań i kształtu.
@@ -1311,133 +1558,36 @@ Wybierz obiekt na sprzedaż i spróbuj jeszcze raz.
Plik surowego terenu pobrany do:
[DOWNLOAD_PATH].
</notification>
- <notification name="DownloadWindowsMandatory">
- Nowa wersja [APP_NAME] została opublikowana.
-[MESSAGE]
-Musisz zainstalować nową wersję żeby używać [APP_NAME].
- <usetemplate name="okcancelbuttons" notext="Wyłącz" yestext="Pobierz" />
- </notification>
- <notification name="DownloadWindows">
- Uaktualniona wersja [APP_NAME] została opublikowana.
-[MESSAGE]
-Aktualizacja nie jest wymagana, ale jest zalecana w celu poprawy wydajności i stabilności.
- <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Pobierz" />
+ <notification name="RequiredUpdate">
+ Do zalogowania się wymagana jest wersja [VERSION].
+Pobierz ją z https://secondlife.com/support/downloads/
</notification>
- <notification name="DownloadWindowsReleaseForDownload">
- Uaktualniona wersja [APP_NAME] została opublikowana.
-[MESSAGE]
-Aktualizacja nie jest wymagana, ale jest zalecana w celu poprawy wydajności i stabilności.
- <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Pobierz" />
- </notification>
- <notification name="DownloadLinuxMandatory">
- Nowa wersja [APP_NAME] jest dostępna.
-[MESSAGE]
-Musisz pobrać aktualizację aby korzystać z [APP_NAME].
- <usetemplate name="okcancelbuttons" notext="Wyłącz" yestext="Pobierz" />
- </notification>
- <notification name="DownloadLinux">
- Aktualizacja [APP_NAME] jest dostępna.
-[MESSAGE]
-Ta aktualizacja nie jest wymagana, ale zaleca się jej instalację w celu poprawienia wydajności i stabilności.
- <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Pobierz" />
- </notification>
- <notification name="DownloadLinuxReleaseForDownload">
- Uaktualniona wersja [APP_NAME]została opublikowana.
-[MESSAGE]
-Aktualizacja nie jest wymagana, ale jest zalecana w celu poprawy wydajności i stabilności.
- <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Pobierz" />
+ <notification name="PauseForUpdate">
+ Do zalogowania się wymagana jest wersja [VERSION].
+Informacje o wydaniu: [URL]
+
+Kliknij OK, aby pobrać i zainstalować.
</notification>
- <notification name="DownloadMacMandatory">
- Nowa wersja [APP_NAME] została opublikowana.
-[MESSAGE]
-Musisz zainstalować nową wersję żeby używać [APP_NAME].
+ <notification name="OptionalUpdateReady">
+ Wersja [VERSION] została pobrana i jest gotowa do zainstalowania.
+Informacje o wydaniu: [URL]
-Pobrać i zapisać w folderze Aplikacje?
- <usetemplate name="okcancelbuttons" notext="Wyłącz" yestext="Pobierz" />
+Kliknij OK, aby zainstalować.
</notification>
- <notification name="DownloadMac">
- Uaktualniona wersja [APP_NAME] została opublikowana.
-[MESSAGE]
-Aktualizacja nie jest wymagana, ale jest zalecana w celu poprawy wydajności i stabilności.
+ <notification name="PromptOptionalUpdate">
+ Wersja [VERSION] została pobrana i jest gotowa do zainstalowania.
+Informacje o wydaniu: [URL]
-Pobrać i zapisać w folderze Aplikacje?
- <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Pobierz" />
+Kontynuować?
+ <usetemplate canceltext="Nie teraz" name="yesnocancelbuttons" notext="Pomiń" yestext="Instaluj" />
</notification>
- <notification name="DownloadMacReleaseForDownload">
- Uaktualniona wersja [APP_NAME] została opublikowana.
-[MESSAGE]
-Aktualizacja nie jest wymagana, ale jest zalecana w celu poprawy wydajności i stabilności.
-
-Pobrać i zapisać w folderze Aplikacje?
- <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Pobierz" />
- </notification>
- <notification name="FailedUpdateInstall">
- Podczas aktualizacji pojawił się błąd.
-Proszę pobrać i zainstalować najnowszego klienta z
-http://secondlife.com/download
- </notification>
- <notification name="FailedRequiredUpdateInstall">
- Nie można zainstalować wymaganej aktualizacji.
-Nie będzie można zalogować się dopóki [APP_NAME] nie zostanie zaktualizowana.
-Proszę pobrać i zainstalować najnowszą wersję z
-http://secondlife.com/download
- <usetemplate name="okbutton" yestext="Wyjdź" />
- </notification>
- <notification name="UpdaterServiceNotRunning">
- Istnieje obowiązkowa aktualizacja dla Second Life.
-Możesz ją pobrać z http://www.secondlife.com/downloads
-lub zainstalować teraz.
- <usetemplate name="okcancelbuttons" notext="Opuść Second Life" yestext="Pobierz i instaluj teraz" />
- </notification>
- <notification name="DownloadBackgroundTip">
- Aktualizacja dla [APP_NAME] została pobrana.
-Wersja [VERSION] [[INFO_URL] Informacja o tej aktualizacji]
- <usetemplate name="okcancelbuttons" notext="Później..." yestext="Instaluj teraz i restartuj [APP_NAME]" />
- </notification>
- <notification name="DownloadBackgroundDialog">
- Aktualizacja [APP_NAME] została pobrana.
-Wersja [VERSION] [[INFO_URL] Informacja o aktualizacji]
- <usetemplate name="okcancelbuttons" notext="Później..." yestext="Instaluj teraz i restartuj [APP_NAME]" />
- </notification>
- <notification name="RequiredUpdateDownloadedVerboseDialog">
- Pobrano wymaganą aktualizację.
-Wersja [VERSION] [[INFO_URL] Informacje o tej aktualizacji]
-
-W celu instalacji aktualizacji [APP_NAME] musi zostać zrestartowany.
- </notification>
- <notification name="RequiredUpdateDownloadedDialog">
- W celu instalacji aktualizacji [APP_NAME] musi zostać zrestartowany.
-[[INFO_URL] Informacje o tej aktualizacji]
- </notification>
- <notification name="OtherChannelDownloadBackgroundTip">
- Została pobrana aktualizacja dla Twojej instalacji [APP_NAME].
-Wersja [VERSION]
-Ta eksperymentalna przeglądarka została zastąpiona przez wersję [NEW_CHANNEL];
-zobacz [[INFO_URL] Więcej informacji o tej aktualizacji]
- <usetemplate name="okcancelbuttons" notext="Później..." yestext="Instaluj teraz i zrestartuj [APP_NAME]" />
- </notification>
- <notification name="OtherChannelDownloadBackgroundDialog">
- Została pobrana aktualizacja dla Twojej instalacji [APP_NAME].
-Wersja [VERSION]
-Ta eksperymentalna przeglądarka została zastąpiona przez wersję [NEW_CHANNEL];
-zobacz [[INFO_URL] Więcej informacji o tej aktualizacji]
- <usetemplate name="okcancelbuttons" notext="Później..." yestext="Instaluj teraz i zrestartuj [APP_NAME]" />
- </notification>
- <notification name="OtherChannelRequiredUpdateDownloadedVerboseDialog">
- Została pobrana wymagana aktualizacja.
-Wersja [VERSION]
-Ta eksperymentalna przeglądarka została zastąpiona przez wersję [NEW_CHANNEL];
-zobacz [[INFO_URL] Więcej informacji o tej aktualizacji]
-
-W celu instalacji aktualizacji [APP_NAME] musi zostać zrestartowany.
- </notification>
- <notification name="OtherChannelRequiredUpdateDownloadedDialog">
- W celu instalacji aktualizacji [APP_NAME] musi zostać zrestartowany.
-Ta eksperymentalna przeglądarka została zastąpiona przez wersję [NEW_CHANNEL];
-zobacz [[INFO_URL] Więcej informacji o tej aktualizacji]
+ <notification name="LoginFailedUnknown">
+ Przepraszamy, ale nie udało się zalogować - powód jest nieznany.
+Jeśli ciągle widzisz tą wiadomość sprawdź [SUPPORT_SITE].
+ <usetemplate name="okbutton" yestext="Wyjdź"/>
</notification>
<notification name="DeedObjectToGroup">
- Przekazanie tego obiektu spowoduje, że grupa:
+ Przypisanie tego obiektu spowoduje, że grupa:
* Otrzyma L$ zapłacone temu obiektowi
<usetemplate ignoretext="Potwierdź decyzję przypisania obiektu do grupy" name="okcancelignore" notext="Anuluj" yestext="Przekaż" />
</notification>
@@ -1489,14 +1639,11 @@ Chcesz ją opuścić?
Nie możesz opuścić tej grupy, ponieważ jesteś ostatnim z jej właścicieli. Przydziel najpierw innemu użytkownikowi rolę właściciela.
</notification>
<notification name="GroupDepartError">
- Nie można opuścić grupy: [reason].
- </notification>
- <notification name="GroupDepart">
- Opuściłeś/aś grupę [group_name].
+ Nie możesz opuścić tej grupy.
</notification>
<notification name="ConfirmKick">
- Na pewno chcesz wyrzucić wszystkich Rezydentów z siatki?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Wyrzuć Rezydentów" />
+ Na pewno chcesz wyrzucić wszystkich Rezydentów ze świata?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Wyrzuć Rezydentów"/>
</notification>
<notification name="MuteLinden">
Przepraszamy, ale nie możesz zablokować Lindena.
@@ -1520,8 +1667,7 @@ Chcesz ją opuścić?
<notification name="DoNotDisturbModeSet">
Tryb Zajętości jest włączony. Nie będziesz powiadamiany/a o nadchodzących rozmowach.
-- Inni Rezydenci będą otrzymywać Twoją wiadomość Trybu Zajętości (Ustawienia &gt; Prywatność &gt; Autoodpowiedzi).
-- Propozycje teleportacji będą odrzucane.
+- Inni Rezydenci będą otrzymywać Twoją wiadomość Trybu Zajętości (Ustawienia &gt; Ogólne).
- Propozycje rozmów głosowych będą odrzucane.
<usetemplate ignoretext="Status zmieniony na Tryb Zajętości" name="okignore" />
</notification>
@@ -1533,6 +1679,17 @@ Chcesz ją opuścić?
<notification name="JoinedTooManyGroups">
Należysz już do maksymalnej ilości grup. Opuść proszę przynajmniej jedną grupę żeby przyjąć członkostwo w tej grupie, albo odmów.
</notification>
+ <notification name="GroupLimitInfo">
+ Rezydenci z członkostwem podstawowym mogą dołączyć do [MAX_BASIC] grup.
+Członkostwo premium pozwala na [MAX_PREMIUM]. [https://secondlife.com/my/account/membership.php? Dowiedz się więcej]
+ <usetemplate name="okbutton" yestext="Zamknij" />
+ </notification>
+ <notification name="GroupLimitInfoPlus">
+ Rezydenci z członkostwem podstawowym mogą dołączyć do [MAX_BASIC] grup.
+Członkostwo premium pozwala na [MAX_PREMIUM]. Członkostwo
+Premium Plus pozwala na [MAX_PREMIUM_PLUS]. [https://secondlife.com/my/account/membership.php? Dowiedz się więcej]
+ <usetemplate name="okbutton" yestext="Zamknij" />
+ </notification>
<notification name="KickUser">
Wyrzuć tego Rezydenta, wysyłając następujący komunikat.
<form name="form">
@@ -1543,7 +1700,7 @@ Chcesz ją opuścić?
</form>
</notification>
<notification name="KickAllUsers">
- Z jakim komunikatem wyrzucić wszystkich użytkowników z regionu?
+ Z jakim komunikatem wyrzucić wszystkich użytkowników ze świata?
<form name="form">
<input name="message">
Administrator wylogował Cię.
@@ -1644,7 +1801,7 @@ co przekracza limit [LIMIT].
<notification name="TeleportViaSLAPP">
Na pewno chcesz się teleportować do &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
<usetemplate ignoretext="Potwierdź próbę teleportacji przez SLAPP" name="okcancelignore" notext="Anuluj" yestext="Teleportuj" />
- </notification>
+ </notification>
<notification name="TeleportToPick">
Teleportować do [PICK]?
<usetemplate ignoretext="Potwierdź, że chcesz teleportować się do miejsca w Ulubionych" name="okcancelignore" notext="Anuluj" yestext="Teleportuj" />
@@ -1674,7 +1831,7 @@ Kontynuować?
<notification label="Zmiana dostępu do Majątku Lindenów" name="ChangeLindenAccess">
Dokonujesz zmiany w liście dostępu Regionu głównego należącego do Lindenów (Regiony Główne, Teen Grid, Orientacja).
-Żądana operacja jest wyjątkowo niebezpieczna dla wszystkich Rezydentów przebywających w regionie i powinna być używana wyłącznie w celu zablokowania opcji pozwalającej na przeniesienie obiektów/L$ do/z sieci.
+Żądana operacja jest wyjątkowo niebezpieczna dla wszystkich Rezydentów przebywających w regionie i powinna być używana wyłącznie w celu zablokowania opcji pozwalającej na przeniesienie obiektów/L$ do/ze świata.
Dodatkowo, zmiany dokonane w Regionie Głównym mogą spowodować problemy przestrzeni serwerowej innych regionów.
Kontynuować?
@@ -1712,6 +1869,30 @@ Kontynuować?
Usunąć zarządcę majątku tylko z tego majątku czy z [ALL_ESTATES]?
<usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek" />
</notification>
+ <notification label="Wybierz Majątek" name="EstateAllowedExperienceAdd">
+ Dodać do listy dostępu tylko do tego majątku czy do [ALL_ESTATES]?
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/>
+ </notification>
+ <notification label="Wybierz Majątek" name="EstateAllowedExperienceRemove">
+ Usunąć z listy dostępu tylko z tego majątku czy do [ALL_ESTATES]?
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/>
+ </notification>
+ <notification label="Wybierz Majątek" name="EstateBlockedExperienceAdd">
+ Zablokować dostęp tylko dla tego majątku czy dla [ALL_ESTATES]?
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/>
+ </notification>
+ <notification label="Wybierz Majątek" name="EstateBlockedExperienceRemove">
+ Odblokować dostęp tylko dla tego majątku czy dla [ALL_ESTATES]?
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/>
+ </notification>
+ <notification label="Wybierz Majątek" name="EstateTrustedExperienceAdd">
+ Dodać do listy kluczy tylko dla tego majątku czy dla [ALL_ESTATES]?
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/>
+ </notification>
+ <notification label="Wybierz Majątek" name="EstateTrustedExperienceRemove">
+ Usunąć z listy kluczy tylko dla tego majątku czy dla [ALL_ESTATES]?
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wszystkie majątki" yestext="Ten majątek"/>
+ </notification>
<notification label="Potwierdź Wyrzucenie" name="EstateKickUser">
Wyrzucić [EVIL_USER] z tego majątku?
<usetemplate name="okcancelbuttons" notext="Anuluj" />
@@ -1720,8 +1901,18 @@ Kontynuować?
Na pewno chcesz zmienić treść umowy dla tego majątku?
<usetemplate name="okcancelbuttons" notext="Anuluj" />
</notification>
+ <notification name="EstateParcelAccessOverride">
+ Odznaczenie tej opcji może usunąć ograniczenia nadane przez właścicieli działek w celu zapobiegania dokuczaniu, zachowaniu prywatności lub aby chronić nieletnich przed materiałami dla dorosłych. Porozmawiaj z właścicielami działek, jeśli to konieczne.
+ </notification>
+ <notification name="EstateParcelEnvironmentOverride">
+ (Zmiana w całym majątku: [ESTATENAME]) Odznaczenie tej opcji spowoduje usunięcie wszelkich niestandardowych otoczeń, które zostały dodane do działek przez ich właścicieli. Przedyskutuj zmianę z właścicielami działek w razie potrzeby.
+Czy chcesz kontynuować?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" />
+ </notification>
<notification name="RegionEntryAccessBlocked">
- Region, który próbujesz odwiedzić zawiera treści przekraczające Twoje bieżące preferencje. Możesz je zmienić używając Ja &gt; Ustawienia &gt; Ogólne.
+ Region, który próbujesz odwiedzić, ma klasyfikację treści przekraczającą Twoje maksymalne preferencje. Możesz je zmienić używając Ja &gt; Ustawienia &gt; Ogólne.
+
+Pełne informacje na temat klasyfikacji treści można znaleźć [https://community.secondlife.com/knowledgebase/english/maturity-ratings-r52/ tutaj].
</notification>
<notification name="RegionEntryAccessBlocked_AdultsOnlyContent">
Region, który próbujesz odwiedzić zawiera treści [REGIONMATURITY], które są dostępne tylko dla dorosłych.
@@ -1745,7 +1936,9 @@ Kontynuować?
Mamy trudności techniczne z Twoim wejściem w region, ponieważ Twoje preferencje są rozsynchronizowane z serwerem.
</notification>
<notification name="TeleportEntryAccessBlocked">
- Region, który próbujesz odwiedzić zawiera treści przekraczające Twoje bieżące preferencje. Możesz je zmienić używając Ja &gt; Ustawienia &gt; Ogólne.
+ Region, który próbujesz odwiedzić, ma klasyfikację treści przekraczającą Twoje maksymalne preferencje. Możesz je zmienić używając Ja &gt; Ustawienia &gt; Ogólne.
+
+Pełne informacje na temat klasyfikacji treści można znaleźć [https://community.secondlife.com/knowledgebase/english/maturity-ratings-r52/ tutaj].
</notification>
<notification name="TeleportEntryAccessBlocked_AdultsOnlyContent">
Region, który próbujesz odwiedzić zawiera treści [REGIONMATURITY], które są dostępne tylko dla dorosłych.
@@ -1777,7 +1970,7 @@ Kontynuować?
Mamy trudności techniczne z Twoim teleportem, ponieważ Twoje preferencje są rozsynchronizowane z serwerem.
</notification>
<notification name="RegionTPSpecialUsageBlocked">
- Nie można wejść do tego regionu. '[REGION_NAME]' jest miejscem z grami (Skill Gaming Region) - musisz spełnić określone wymagania, jeśli chcesz go odwiedzić. Aby dowiedzieć się więcej zapoznaj się z [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Skill_Gaming_in_Second_Life Skill Gaming FAQ].
+ Nie można wejść do tego regionu. '[REGION_NAME]' jest miejscem z grami (Skill Gaming Region) - musisz spełnić określone wymagania, jeśli chcesz go odwiedzić. Aby dowiedzieć się więcej zapoznaj się z [http://wiki.secondlife.com/wiki/Linden_Lab_Official:Second_Life_Skill_Gaming_FAQ Skill Gaming FAQ].
</notification>
<notification name="PreferredMaturityChanged">
Nie będziesz już otrzymywać żadnych powiadomień związanych z odwiedzaniem regionów z treściami [RATING]. Możesz zmienić swoją preferencję treści w przyszłości używając Ja &gt; Ustawienia &gt; Ogólne w pasku menu.
@@ -1787,6 +1980,8 @@ Kontynuować?
</notification>
<notification name="LandClaimAccessBlocked">
Ziemia, którą próbujesz odzyskać ma klasyfikację treści przekraczającą Twoje obecne preferencje treści. Możesz je zmienić używając Ja &gt; Ustawienia &gt; Ogólne w pasku menu.
+
+Pełne informacje na temat klasyfikacji treści można znaleźć [https://community.secondlife.com/knowledgebase/english/maturity-ratings-r52/ tutaj].
</notification>
<notification name="LandClaimAccessBlocked_AdultsOnlyContent">
Tylko dorośli mogą odzyskać tą ziemię.
@@ -1808,6 +2003,8 @@ Kontynuować?
</notification>
<notification name="LandBuyAccessBlocked">
Ziemia, którą próbujesz kupić ma klasyfikację treści przekraczającą Twoje obecne preferencje treści. Możesz je zmienić używając Ja &gt; Ustawienia &gt; Ogólne w pasku menu.
+
+Pełne informacje na temat klasyfikacji treści można znaleźć [https://community.secondlife.com/knowledgebase/english/maturity-ratings-r52/ tutaj].
</notification>
<notification name="LandBuyAccessBlocked_AdultsOnlyContent">
Tylko dorośli mogą kupić tą ziemię.
@@ -1830,6 +2027,9 @@ Kontynuować?
<notification name="TooManyPrimsSelected">
Zbyt wiele wybranych obiektów. Wybierz [MAX_PRIM_COUNT] lub mniej i spróbuj ponownie
</notification>
+ <notification name="TooManyScriptsSelected">
+ Zbyt wiele skryptów w wybranych obiektach. Wybierz mniej obiektów i spróbuj ponownie
+ </notification>
<notification name="ProblemImportingEstateCovenant">
Problem z importem umowy majątku.
</notification>
@@ -1956,7 +2156,6 @@ Wpisz hasło ponownie i kliknij na OK.
<notification name="SetPickLocation">
Uwaga:
Lokalizacja tego miejsca została zaktualizowana, ale pozostałe szczegóły zachowają oryginalne wartości.
-
</notification>
<notification name="MoveInventoryFromObject">
Wybrane obiekty Szafy nie mają praw kopiowania.
@@ -1986,6 +2185,9 @@ Przenieść obiekty szafy?
<notification name="PayObjectFailed">
Płatność nie powiodła się: nie można znaleźć obiektu.
</notification>
+ <notification name="PaymentBlockedButtonMismatch">
+ Płatność nie powiodła się: zapłacona suma nie pasuje do żadnego z przycisków płatności dla tego obiektu.
+ </notification>
<notification name="OpenObjectCannotCopy">
W tym obiekcie nie ma elementów które możesz skopiować.
</notification>
@@ -1998,8 +2200,8 @@ Przenieść obiekty szafy?
<usetemplate ignoretext="Potwierdź dodanie uczestników rozmowy" name="okcancelignore" notext="Anuluj" />
</notification>
<notification name="ConfirmQuit">
- Na pewno chcesz zakończyć?
- <usetemplate ignoretext="Na pewno chcesz zakończyć?" name="okcancelignore" notext="Nie kończ" yestext="Wyłącz" />
+ Na pewno chcesz zakończyć sesję i wyłączyć przeglądarkę?
+ <usetemplate ignoretext="Na pewno chcesz zakończyć sesję?" name="okcancelignore" notext="Anuluj" yestext="Zakończ"/>
</notification>
<notification name="ConfirmRestoreToybox">
Ta akcja przywróci domyślny układ przycisków i pasków.
@@ -2015,12 +2217,24 @@ Nie możesz tego cofnąć.
</notification>
<notification name="DeleteItems">
[QUESTION]
- <usetemplate ignoretext="Potwierdź, że na pewno chcesz skasować obiekty" name="okcancelignore" notext="Anuluj" />
+ <form name="form">
+ <ignore name="ignore" text="Potwierdź przed kasowaniem obiektów" />
+ <button name="No" text="Anuluj" />
+ </form>
</notification>
- <notification name="HelpReportAbuseEmailLL">
- Używaj tej opcji do zgłaszania nadużyć [http://secondlife.com/corporate/tos.php Warunków Umowy (Terms of Service)] i [http://secondlife.com/corporate/cs.php Standardów Społeczeństwa (Community Standards)].
+ <notification name="DeleteFilteredItems">
+ Twoja Szafa jest obecnie filtrowana i nie wszystkie obiekty jakie masz zamiar usunąć są teraz widoczne.
-Wszystkie zgłoszone nadużycia są badane i rozwiązywane.
+Czy na pewno chcesz je skasować?
+ <usetemplate ignoretext="Potwierdź przed kasowaniem filtrowanych obiektów" name="okcancelignore" notext="Anuluj" />
+ </notification>
+ <notification name="ConfirmUnlink">
+ To duże zaznaczenie z wieloma zestawami obiektów. Jeśli rozłączysz, to ponowne połączenie może nie być możliwe. Możesz chcieć na wszelki wypadek wziąć kopie zestawów obiektów do swojej szafy.
+ <usetemplate ignoretext="Potwierdź podczas rozłączania zestawu obiektów" name="okcancelignore" notext="Anuluj" yestext="Rozłącz" />
+ </notification>
+ <notification name="HelpReportAbuseConfirm">
+ Dziękujemy za poświęcenie czasu na poinformowanie nas o tym problemie.
+Przejrzymy Twoje zgłoszenie pod kątem ewentualnych nadużyć i podejmiemy odpowiednią akcję.
</notification>
<notification name="HelpReportAbuseSelectCategory">
Wybierz kategorię dla tego raportu o nadużyciu.
@@ -2048,7 +2262,7 @@ Dokładne dane pomogą nam w klasyfikacji i przetwarzaniu raportu.
Jeżeli składasz raport dotyczący naruszenia praw autorskich proszę się upewnić, że robisz to poprawnie:
-(1) Przypadek Nadużycia. Możesz złożyć raport jeżeli sądzisz, że Rezydent narusza system przywilejów [SECOND_LIFE], na przykład używając CopyBot lub podobnych narzędzi robiących kopie, naruszając prawa autorskie. Komisja Nadużyć bada wykroczenia i stosuje akcje dyscyplinarne za zachowania sprzeczne z zasadami [http://secondlife.com/corporate/tos.php Warunków Umowy] i [http://secondlife.com/corporate/cs.php Standardów Społeczeństwa] w [SECOND_LIFE]. Komisja Nadużyć nie zajmuje się i nie odpowiada na żądania usunięcia treści ze środowiska [SECOND_LIFE].
+(1) Przypadek Nadużycia. Możesz złożyć raport jeżeli sądzisz, że Rezydent narusza system przywilejów [SECOND_LIFE], na przykład używając CopyBot lub podobnych narzędzi robiących kopie, naruszając prawa autorskie. Komisja Nadużyć bada wykroczenia i stosuje akcje dyscyplinarne za zachowania sprzeczne z zasadami Warunków Umowy [http://secondlife.com/corporate/tos.php Warunków Umowy] i [http://secondlife.com/corporate/cs.php Standardów Społeczeństwa] w [SECOND_LIFE]. Komisja Nadużyć nie zajmuje się i nie odpowiada na żądania usunięcia treści ze środowiska [SECOND_LIFE].
(2) Przypadek DMCA lub Usuwanie Treści. Aby wystąpić z żądaniem o usunięcie treści ze środowiska [SECOND_LIFE] MUSISZ przedłożyć ważne zawiadomienie o nadużyciu zgodne z naszą polityką DMCA [http://secondlife.com/corporate/dmca.php DMCA Policy].
@@ -2084,13 +2298,31 @@ Chcesz wyłączyć Tryb Zajętości przed zakończeniem tej transakcji?
<button ignore="Nigdy nie wyłączaj trybu Zajętości" name="No" text="Anuluj" />
</form>
</notification>
+ <notification label="Działka odtwarza media" name="ParcelPlayingMedia">
+ Ta lokalizacja odtwarza media:
+[URL]
+Czy chcesz je odtworzyć?
+ <form name="form">
+ <ignore name="ignore" text="Zawsze wybieraj tę opcję dla tej ziemi."/>
+ <button ignore="Odtwarzaj media" name="Yes" text="Odtwarzaj"/>
+ <button ignore="Ignoruj media" name="No" text="Nie odtwarzaj"/>
+ </form>
+ </notification>
<notification name="ConfirmDeleteProtectedCategory">
Ten folder &apos;[FOLDERNAME]&apos; to folder systemowy. Usunięcie folderu systemowego spowoduje niestabilność. Czy na pewno chcesz go skasować?
<usetemplate ignoretext="Potwierdź zanim folder systemu zostanie skasowany" name="okcancelignore" notext="Anuluj" />
</notification>
+ <notification name="PurgeSelectedItems">
+ [COUNT] przedmiotów zostanie usuniętych. Na pewno chcesz permanentnie usunąć zaznaczoną zawartość Kosza?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" />
+ </notification>
<notification name="ConfirmEmptyTrash">
- Na pewno chcesz permanentnie usunąć zawartość Kosza?
- <usetemplate ignoretext="Potwierdź przed usunięciem zawartości Kosza" name="okcancelignore" notext="Anuluj" />
+ [COUNT] przedmiotów i folderów zostanie usuniętych. Na pewno chcesz permanentnie usunąć zawartość Kosza?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" />
+ </notification>
+ <notification name="TrashIsFull">
+ Twój kosz się przepełnia. Może to sprawić, że będziesz mieć problemy z zalogowaniem się.
+ <usetemplate name="okcancelbuttons" notext="Wyczyszczę kosz ręcznie później" yestext="Sprawdź kosz teraz" />
</notification>
<notification name="ConfirmClearBrowserCache">
Na pewno chcesz wyczyścić bufory przeglądarki internetowej, wyszukiwania i podróży?
@@ -2112,6 +2344,12 @@ Chcesz wyłączyć Tryb Zajętości przed zakończeniem tej transakcji?
Na pewno chcesz permanentnie usunąć zawartość Twojego folderu Zagubione i odnalezione?
<usetemplate ignoretext="Potwierdź przed usunięciem zawartości foldera Zagubione i odnalezione" name="okcancelignore" notext="Nie" yestext="Tak" />
</notification>
+ <notification name="ConfirmReplaceLink">
+ Zamierzasz zastąpić link do części ciała o typie '[TYPE]' elementem, który nie pasuje do tego typu.
+
+Na pewno chcesz kontynuować?
+ <usetemplate ignoretext="Potwierdź przed zamianą linku" name="okcancelignore" notext="Nie" yestext="Tak" />
+ </notification>
<notification name="CopySLURL">
Następujący link SLurl został skopiowany do schowka:
[SLURL]
@@ -2132,7 +2370,15 @@ Zamieść go na stronie internetowej żeby umożliwić innym łatwy dostęp do t
Ten plik cyklu dziennego używa brakującego pliku nieba: [SKY].
</notification>
<notification name="WLRegionApplyFail">
- Ustawienia nie mogą zostać zastosowane w regionie. Opuszczenie regionu, a następnie powrócenie do niego może naprawić problem. Powód: [FAIL_REASON]
+ Ustawienia nie mogą zostać zastosowane w regionie. Powód: [FAIL_REASON]
+ </notification>
+ <notification name="WLLocalTextureDayBlock">
+ Lokalna tekstura jest używana na ścieżce [TRACK], klatce #[FRAMENO] ([FRAME]%) w polu [FIELD].
+Otoczenia nie mogą zostać zapisane gdy lokalne tekstury są w użyciu.
+ </notification>
+ <notification name="WLLocalTextureFixedBlock">
+ Lokalna tekstura jest używana w polu [FIELD].
+Otoczenia nie mogą zostać zapisane gdy lokalne tekstury są w użyciu.
</notification>
<notification name="EnvCannotDeleteLastDayCycleKey">
Nie można usunąć ostatniego klucza w cyklu dnia, bo nie może on być pusty. Zmodyfikuj ten klucz zamiast go usuwać, a potem dodaj nowy.
@@ -2182,13 +2428,10 @@ Zamieść go na stronie internetowej żeby umożliwić innym łatwy dostęp do t
Ciąg [STRING_NAME] nie został znaleziony w strings.xml
</notification>
<notification name="Cancelled">
- Anulowane
- </notification>
- <notification name="CancelledSit">
- Siadanie anulowane
+ Anulowane.
</notification>
<notification name="CancelledAttach">
- Dołączanie anulowane
+ Dołączanie anulowane.
</notification>
<notification name="ReplacedMissingWearable">
Brakujące ubranie/części ciała zastąpiono domyślnymi obiektami.
@@ -2197,23 +2440,26 @@ Zamieść go na stronie internetowej żeby umożliwić innym łatwy dostęp do t
Temat: [SUBJECT], Treść: [MESSAGE]
</notification>
<notification name="FriendOnlineOffline">
- &lt;nolink&gt;[NAME]&lt;/nolink&gt; jest [STATUS]
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; jest [STATUS].
</notification>
<notification name="AddSelfFriend">
Niewątpliwie znasz siebie najlepiej, ale nie możesz dodać swojej własnej osoby do listy znajomych.
</notification>
+ <notification name="AddSelfRenderExceptions">
+ Nie możesz dodać siebie do listy wyjątków renderowania.
+ </notification>
<notification name="UploadingAuctionSnapshot">
- Ładowanie obrazów z Internetu...
+ Przesyłanie obrazów...
(Zajmuje około 5 minut.)
</notification>
<notification name="UploadPayment">
- Ładowanie kosztowało [AMOUNT]L$.
+ Przesyłanie kosztowało [AMOUNT]L$.
</notification>
<notification name="UploadWebSnapshotDone">
- Ładowanie obrazu z Internetu zakończone pomyślnie.
+ Przesyłanie obrazu do sieci zakończone pomyślnie.
</notification>
<notification name="UploadSnapshotDone">
- Ładowanie zdjęcia zakończone pomyślnie.
+ Przesyłanie zdjęcia zakończone pomyślnie.
</notification>
<notification name="TerrainDownloaded">
Plik terrain.raw ściągnięty.
@@ -2377,7 +2623,7 @@ Zainstaluj wtyczki ponownie lub skontaktuj się z dostawcą, jeśli problem nada
Obiekty z działki należącej do Rezydenta [NAME] zostały zwrócone do jego Szafy.
</notification>
<notification name="GroupObjectsReturned">
- Obiekty z wybranej działki przypisane do grupy [GROUPNAME] zostały zwrócone do szaf ich właścicieli.
+ Obiekty z wybranej działki przypisane do grupy &lt;nolink&gt;[GROUPNAME]&lt;/nolink&gt; zostały zwrócone do szaf ich właścicieli.
Przekazywalne obiekty przekazane grupie zostały zwrócone do ich poprzednich właścicieli.
Nieprzekazywalne obiekty przekazane grupie zostały usunięte.
</notification>
@@ -2400,7 +2646,7 @@ Nie możesz tutaj latać.
Popychanie niedozwolone. Nie możesz tutaj popychać innych chyba, że jesteś właścicielem tej działki.
</notification>
<notification name="NoVoice">
- Ta działka nie pozwala na rozmowy głosowe.
+ Ta działka nie pozwala na rozmowy głosowe. Nie będziesz słyszeć, jak ktoś rozmawia.
</notification>
<notification name="NoBuild">
Ta działka nie pozwala na budowanie. Nie możesz tworzyć tutaj obiektów.
@@ -2408,6 +2654,10 @@ Nie możesz tutaj latać.
<notification name="PathfindingDirty">
W tym regionie są oczekujące zmiany w odnajdywaniu ścieżek. Jeśli posiadasz prawa budowania możesz odświeżyć region klikając na przycisk “Odśwież region”.
</notification>
+ <notification name="PathfindingDirtyRebake">
+ W tym regionie są oczekujące zmiany w odnajdywaniu ścieżek. Jeśli posiadasz prawa budowania możesz odświeżyć region klikając na przycisk “Odśwież region”.
+ <usetemplate name="okbutton" yestext="Odśwież" />
+ </notification>
<notification name="DynamicPathfindingDisabled">
Dynamiczne odnajdywanie ścieżek nie jest włączone w tym regionie. Oskryptowane obiekty używające odwołań LSL wykorzystujących odnajdywanie ścieżek mogą nie działać zgodnie z oczekiwaniami.
</notification>
@@ -2432,13 +2682,15 @@ Nie możesz tutaj latać.
Tylko publiczne działki w tym regionie, co Ty, mogą być przejęte.
</notification>
<notification name="RegionTPAccessBlocked">
- Region, który próbujesz odwiedzić ma klasyfikację treści przekraczającą Twoje obecne preferencje treści. Możesz je zmienić używając Ja &gt; Ustawienia &gt; Ogólne w pasku menu.
+ Region, który próbujesz odwiedzić, ma klasyfikację treści przekraczającą Twoje maksymalne preferencje. Możesz je zmienić używając Ja &gt; Ustawienia &gt; Ogólne.
+
+Pełne informacje na temat klasyfikacji treści można znaleźć [https://community.secondlife.com/knowledgebase/english/maturity-ratings-r52/ tutaj].
</notification>
<notification name="RegionAboutToShutdown">
Region, do którego próbujesz się dostać, właśnie się wyłącza.
</notification>
<notification name="URBannedFromRegion">
- Zostałeś zbanowany w regionie.
+ Zostałeś/aś zbanowany/a w regionie.
</notification>
<notification name="NoTeenGridAccess">
Twoje konto nie może zostać połączone z podanym regionem Teen Grid.
@@ -2529,7 +2781,7 @@ Spróbuj ponownie za kilka minut.
[ITEM_SLURL]
<form name="form">
<button name="Show" text="Pokaż" />
- <button name="Discard" text="Wyrzuć" />
+ <button name="Discard" text="Odrzuć" />
<button name="Mute" text="Zablokuj" />
</form>
</notification>
@@ -2673,22 +2925,80 @@ Czy się zgadzasz?
<button name="Mute" text="Zablokuj" />
</form>
</notification>
- <notification name="ScriptQuestionCaution">
- Obiekt &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos; chciałby uzyskać zgodę na pobieranie Linden Dolarów (L$) z Twojego konta. Jeśli zezwolisz, to będzie on mógł brać z niego wszystkie lub część środków, w dowolnej chwili, bez dodatkowych ostrzeżeń.
+ <notification name="ExperienceAcquireFailed">
+ Nie można uzyskać nowej przygody:
+[ERROR_MESSAGE]
+ </notification>
+ <notification name="NotInGroupExperienceProfileMessage">
+ Zmiana do grupy przygody została zignorowana, ponieważ właściciel nie jest członkiem wybranej grupy.
+ </notification>
+ <notification name="UneditableExperienceProfileMessage">
+ Niemodyfikowalne pole '[field]' zostało zignorowane podczas aktualizacji profilu przygody.
+ </notification>
+ <notification name="RestrictedToOwnerExperienceProfileMessage">
+ Zignorowano zmiany dla pola '[field]', ponieważ może ono być zmieniane tylko przez właściciela przygody.
+ </notification>
+ <notification name="MaturityRatingExceedsOwnerExperienceProfileMessage">
+ Nie możesz ustawić poziomu treści dla przygody większego, niż ten właściciela.
+ </notification>
+ <notification name="RestrictedTermExperienceProfileMessage">
+ Następujące rzeczy uniemożliwiły zaktualizowanie nazwy/opisu profilu przygody: [extra_info]
+ </notification>
+ <notification name="TeleportedHomeExperienceRemoved">
+ Zostałeś/aś wyteleportowany/a z regionu [region_name] za usunięcie przygody secondlife:///app/experience/[public_id]/profile i wobec tego nie możesz tam dłużej przebywać.
+ <form name="form">
+ <ignore name="ignore" text="Wyteleportowanie z regionu za usunięcie przygody"/>
+ </form>
+ </notification>
+ <notification name="TrustedExperienceEntry">
+ Dostałeś/aś przyzwolenie na przebywanie w regionie [region_name], ponieważ zgodziłeś/aś się uczestniczyć w przygodzie secondlife:///app/experience/[public_id]/profile - usunięcie jej może spowodować, że zostaniesz usunięty/a z regionu.
+ <form name="form">
+ <ignore name="ignore" text="Przyzwolenie na przebywanie w regionie po akceptacji przygody"/>
+ </form>
+ </notification>
+ <notification name="TrustedExperiencesAvailable">
+ Nie masz dostępu do tego miejsca. Może będziesz go mieć, jeśli zaakceptujesz następującą przygodę:
-Zanim zezwolisz na dostęp upewnij się, że wiesz jaki to obiekt i dlaczego pyta o zgodę - oraz że ufasz jego twórcy. Jeśli nie masz pewności kliknij na Odmów.
+[EXPERIENCE_LIST]
+
+Inne przygody również mogą stać się dostępne.
+ </notification>
+ <notification name="ExperienceEvent">
+ Obiekt dostał zezwolenie: [EventType] - poprzez przygodę: secondlife:///app/experience/[public_id]/profile
+Właściciel: secondlife:///app/agent/[OwnerID]/inspect
+Nazwa obiektu: [ObjectName]
+Nazwa działki: [ParcelName]
+ </notification>
+ <notification name="ExperienceEventAttachment">
+ Dodatek na Tobie dostał zezwolenie: [EventType] - poprzez przygodę: secondlife:///app/experience/[public_id]/profile
+Właściciel: secondlife:///app/agent/[OwnerID]/inspect
+ </notification>
+ <notification name="ScriptQuestionExperience">
+ Obiekt &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos; którego właścicielem jest &apos;[NAME]&apos; prosi Cię o udział w przygodzie ([GRID_WIDE]):
+
+[EXPERIENCE]
+
+Gdy zezwolenie zostanie zatwierdzone nie zobaczysz tej wiadomości ponownie, dla tej przygody - chyba, że zostanie ono cofnięte w profilu przygody.
+
+Skrypty powiązane z tą przygodą będą mogły robić następujące rzeczy w regionach, gdzie przygoda jest aktywna:
+
+[QUESTIONS]
+
+Czy wyrażasz na to zgodę?
<form name="form">
- <button name="Grant" text="Zezwól na dostęp" />
- <button name="Deny" text="Odmów" />
+ <button name="BlockExperience" text="Zablokuj przygodę"/>
+ <button name="Mute" text="Zablokuj obiekt"/>
+ <button name="Yes" text="Tak"/>
+ <button name="No" text="Nie"/>
</form>
</notification>
- <notification name="UnknownScriptQuestion">
- Zezwolenia, o jakie prosi skrypt z &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, którego właścicielem jest &apos;[NAME]&apos;, nie są rozpoznawane przez przeglądarkę i nie mogą zostać udzielone.
+ <notification name="ScriptQuestionCaution">
+ Obiekt &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos; chciałby uzyskać zgodę na pobieranie Linden Dolarów (L$) z Twojego konta. Jeśli zezwolisz, to będzie on mógł brać z niego wszystkie lub część środków, w dowolnej chwili, bez dodatkowych ostrzeżeń.
-Aby ich udzielić prosimy zaktualizować przeglądarkę do najnowszej wersji z [DOWNLOADURL].
+Zanim zezwolisz na dostęp upewnij się, że wiesz jaki to obiekt i dlaczego pyta o zgodę - oraz że ufasz jego twórcy. Jeśli nie masz pewności kliknij na Odmów.
<form name="form">
- <button name="Deny" text="Ok, odmów jednorazowo" />
- <button name="Mute" text="Zablokuj/Wycisz" />
+ <button name="Grant" text="Zezwól na dostęp"/>
+ <button name="Deny" text="Odmów"/>
</form>
</notification>
<notification name="ScriptDialog">
@@ -2700,21 +3010,13 @@ Aby ich udzielić prosimy zaktualizować przeglądarkę do najnowszej wersji z [
</form>
</notification>
<notification name="ScriptDialogGroup">
- &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; - [GROUPNAME]
+ &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; - &lt;nolink&gt;[GROUPNAME]&lt;/nolink&gt;
[MESSAGE]
<form name="form">
<button name="Client_Side_Mute" text="Blokuj" />
<button name="Client_Side_Ignore" text="Zignoruj" />
</form>
</notification>
- <notification name="FirstBalanceIncrease">
- Właśnie otrzymałeś/aś [AMOUNT] L$.
-Twój stan L$ jest widoczny w prawym górnym narożniku ekranu.
- </notification>
- <notification name="FirstBalanceDecrease">
- Właśnie wydałeś/aś [AMOUNT] L$.
-Twój stan L$ jest widoczny w prawym górnym narożniku ekranu.
- </notification>
<notification name="BuyLindenDollarSuccess">
Dziękujemy za wpłatę!
@@ -2756,7 +3058,7 @@ Wybierz Zablokuj żeby wyciszyć wszystkie wiadomości od tej osoby.
Zaoferowano [NAME] obiekty i ta osoba została automatycznie odblokowana.
</notification>
<notification name="VoiceInviteGroup">
- [NAME] zaczyna rozmowę głosową z grupą [GROUP].
+ [NAME] zaczyna rozmowę głosową z grupą &lt;nolink&gt;[GROUP]&lt;/nolink&gt;.
Wybierz Zaakceptuj żeby rozmawiać albo Odmów żeby nie przyjąć zaproszenia.
Wybierz Zablokuj żeby wyciszyć dzwoniącą osobę.
<form name="form">
@@ -2792,31 +3094,34 @@ Wybierz Zablokuj żeby wyciszyć tą osobę.
Przepraszamy. Limit rozmów został przekroczony w tym obszarze. Spróbuj w innym miejscu.
</notification>
<notification name="VoiceChannelDisconnected">
- [VOICE_CHANNEL_NAME] odłączył się. Przełączanie do rozmowy w czacie lokalnym.
+ [VOICE_CHANNEL_NAME] odłączył się. Przełączanie do rozmowy w czacie w pobliżu.
</notification>
<notification name="VoiceChannelDisconnectedP2P">
- [VOICE_CHANNEL_NAME] skończył rozmowę. Przełączanie do rozmowy w czacie lokalnym.
+ [VOICE_CHANNEL_NAME] skończył rozmowę. Przełączanie do rozmowy w czacie w pobliżu.
</notification>
<notification name="P2PCallDeclined">
- [VOICE_CHANNEL_NAME] odmówił połączenia. Przełączanie do rozmowy w czacie lokalnym.
+ [VOICE_CHANNEL_NAME] odmówił połączenia. Przełączanie do rozmowy w czacie w pobliżu.
</notification>
<notification name="P2PCallNoAnswer">
- [VOICE_CHANNEL_NAME] nie odpowiada. Przełączanie do rozmowy w czacie lokalnym.
+ [VOICE_CHANNEL_NAME] nie odpowiada. Przełączanie do rozmowy w czacie w pobliżu.
</notification>
<notification name="VoiceChannelJoinFailed">
- Brak połączenia z [VOICE_CHANNEL_NAME], spróbuj później. Przełączanie do rozmowy w czacie lokalnym.
+ Brak połączenia z [VOICE_CHANNEL_NAME], spróbuj później. Przełączanie do rozmowy w czacie w pobliżu.
</notification>
<notification name="VoiceEffectsExpired">
Subskrypcja jednego lub więcej Przekształceń Głosu wygasła.
[[URL] Kliknij tutaj] oby odnowić subskrypcję.
+Jeśli jesteś użytkownikiem premium, to [[PREMIUM_URL] kliknij tutaj] aby otrzymać swój perk Przekształceń Głosu.
</notification>
<notification name="VoiceEffectsExpiredInUse">
Czas aktywności Przekształcenia Głosu wygasł, normalne ustawienia Twojego głosu zostały zastosowane.
[[URL] Kliknij tutaj] aby odnowić subskrypcję.
+Jeśli jesteś użytkownikiem premium, to [[PREMIUM_URL] kliknij tutaj] aby otrzymać swój perk Przekształceń Głosu.
</notification>
<notification name="VoiceEffectsWillExpire">
Jedno lub więcej z Twoich Przekształceń Głosu wygaśnie za mniej niż [INTERVAL] dni.
[[URL] Kliknij tutaj] aby odnowić subskrypcję.
+Jeśli jesteś użytkownikiem premium, to [[PREMIUM_URL] kliknij tutaj] aby otrzymać swój perk Przekształceń Głosu.
</notification>
<notification name="VoiceEffectsNew">
Nowe Przekształcenia Głosu są dostępne!
@@ -2859,6 +3164,31 @@ Zostaną zablokowane na kilka sekund dla bezpieczeństwa.
<notification name="AttachmentSaved">
Załącznik został zapisany.
</notification>
+ <notification name="AppearanceToXMLSaved">
+ Wygląd został zapisany do XML, w [PATH]
+ </notification>
+ <notification name="AppearanceToXMLFailed">
+ Nie udało się zapisać wyglądu do XML.
+ </notification>
+ <notification name="SnapshotToComputerFailed">
+ Nie można zapisać zrzutu ekranu do [PATH]: Dysk jest pełny. Potrzeba [NEED_MEMORY]KB, ale wolnego jest [FREE_MEMORY]KB.
+ </notification>
+ <notification name="SnapshotToLocalDirNotExist">
+ Nie można zapisać zrzutu ekranu do [PATH]: Katalog nie istnieje.
+ </notification>
+ <notification name="PresetNotSaved">
+ Błąd podczas zapisywania ustawienia [NAME].
+ </notification>
+ <notification name="DefaultPresetNotSaved">
+ Nie można zastąpić domyślnego ustawienia.
+ </notification>
+ <notification name="PresetAlreadyExists">
+ &apos;[NAME]&apos; jest w użyciu. Możesz zastąpić
+to ustawienie lub wybrać inną nazwę.
+ </notification>
+ <notification name="PresetNotDeleted">
+ Błąd podczas usuwania ustawienia [NAME].
+ </notification>
<notification name="UnableToFindHelpTopic">
Nie można znaleźć tematu pomocy dla tego elementu.
</notification>
@@ -2872,12 +3202,25 @@ Zostaną zablokowane na kilka sekund dla bezpieczeństwa.
<notification name="VoiceIsMutedByModerator">
Twoja rozmowa głosowa została wyciszona przez moderatora.
</notification>
+ <notification name="FailedToGetBenefits">
+ Niestety nie udało nam się uzyskać informacji o korzyściach dla tej sesji. Nie powinno się to zdarzyć w normalnym środowisku produkcyjnym. Skontaktuj się z pomocą techniczną. Ta sesja nie będzie działać normalnie i zalecamy restart.
+ </notification>
+ <notification name="BulkUploadCostConfirmation">
+ Spowoduje to przesłanie [COUNT] elementów o łącznym koszcie [COST]L$. Czy chcesz kontynuować przesyłanie?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Prześlij"/>
+ </notification>
+ <notification name="BulkUploadNoCompatibleFiles">
+ Wybranych plików nie można przesłać zbiorczo.
+ </notification>
+ <notification name="BulkUploadIncompatibleFiles">
+ Niektórych z wybranych plików nie można przesłać zbiorczo.
+ </notification>
<notification name="UploadCostConfirmation">
- Załadowanie tego na serwer będzie kosztować [PRICE]L$, chcesz kontynuować?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Załaduj" />
+ Przesłanie tego na serwer będzie kosztować [PRICE]L$, chcesz kontynuować?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Prześlij"/>
</notification>
<notification name="ConfirmClearTeleportHistory">
- Czy na pewno chcesz usunąć historię teleportacji?
+ Spowoduje to usunięcie całej listy odwiedzonych przez Ciebie miejsc i nie będzie można tego cofnąć. Kontynuować?
<usetemplate name="okcancelbuttons" notext="Anuluj" />
</notification>
<notification name="BottomTrayButtonCanNotBeShown">
@@ -2887,13 +3230,16 @@ Przycisk zostanie wyświetlony w przypadku dostatecznej ilości przestrzeni.
<notification name="ShareNotification">
Zaznacz Rezydentów, z którymi chcesz się podzielić.
</notification>
+ <notification name="MeshUploadErrorDetails">
+ Nie można przesłać [LABEL]: [MESSAGE]
+[DETAILS] Zobacz SecondLife.log, aby dowiedzieć się więcej.
+ </notification>
<notification name="MeshUploadError">
- Nie można załadować [LABEL]: [MESSAGE] [IDENTIFIER]
-
-Zobacz log, aby dowiedzieć się więcej.
+ Nie można przesłać [LABEL]: [MESSAGE]
+Zobacz SecondLife.log, aby dowiedzieć się więcej.
</notification>
<notification name="MeshUploadPermError">
- Wystąpił błąd podczas pobierania uprawnień ładowania meszy.
+ Wystąpił błąd podczas pobierania uprawnień przesyłania meszy.
</notification>
<notification name="RegionCapabilityRequestError">
Nie udało się uzyskać zdolności regionu: &apos;[CAPABILITY]&apos;.
@@ -2973,14 +3319,26 @@ Awatar &apos;[NAME]&apos; rozpoczął edycję wyglądu.
Awatar &apos;[NAME]&apos; opuścił edycję wyglądu.
</notification>
<notification name="NoConnect">
- Występuje problem z połączeniem [PROTOCOL] [HOSTID].
+ Występuje problem z połączeniem [PROTOCOL] &lt;nolink&gt;[HOSTID]&lt;/nolink&gt;.
Proszę sprawdź swoją sieć i ustawienia firewall.
</notification>
<notification name="NoVoiceConnect">
- Występuje problem z Twoim połączeniem głosowym:
+ Nie możemy połączyć się z serwerem głosowym:
[HOSTID]
+Porty, które muszą być otwarte dla połączeń głosowych, to:
+:TCP: 80, 443
+:UDP: 3478, 3479, 5060, 5062, 6250, 12000-32000
+
+Proszę sprawdź swoją sieć i ustawienia firewall.
+Wyłącz wszelkie funkcjonalności SIP ALG (Application Layer Gateway) w swoim routerze.
+
+Komunikacja głosowa nie będzie dostępna.
+ </notification>
+ <notification name="NoVoiceConnect-GIAB">
+ Występuje problem z Twoim połączeniem głosowym.
+
Komunikacja głosowa nie będzie dostępna.
Proszę sprawdź swoją sieć i ustawienia firewall.
</notification>
@@ -2990,20 +3348,27 @@ Awatar &apos;[NAME]&apos; pozostał w pełni załadowany.
</notification>
<notification name="AvatarRezSelfBakedTextureUploadNotification">
( [EXISTENCE] sekund w Second Life )
-Wstępnie przetworzone tekstury [RESOLUTION] dla &apos;[BODYREGION]&apos; zostały załadowane po [TIME] sekundach.
+Wstępnie przetworzone tekstury [RESOLUTION] dla &apos;[BODYREGION]&apos; zostały przesłane po [TIME] sekundach.
</notification>
<notification name="AvatarRezSelfBakedTextureUpdateNotification">
( [EXISTENCE] sekund w Second Life )
Wstępnie przetworzone tekstury [RESOLUTION] zostały lokalnie zaktualizowane dla &apos;[BODYREGION]&apos; po [TIME] sekundach.
</notification>
<notification name="CannotUploadTexture">
- Nie można załadować tekstury.
-[REASON]
- </notification>
+ Nie można przesłać tekstury.
+[REASON]
+ </notification>
<notification name="LivePreviewUnavailable">
Nie można wyświetlić podglądu tej tekstury - jest niekopiowalna lub/oraz nietransferowalna.
<usetemplate ignoretext="Ostrzegaj, gdy podgląd na żywo nie może wyświetlić niekopiowalnych/nietransferowalnych tekstur" name="okignore" />
</notification>
+ <notification name="FacePasteFailed">
+ Wklejanie nie powiodło się. [REASON]
+ </notification>
+ <notification name="FacePasteTexturePermissions">
+ Zastosowano teksturę z ograniczonymi uprawnieniami, obiekt odziedziczy więc te uprawnienia.
+ <usetemplate ignoretext="Wklejanie: zastosowano teksturę z ograniczonymi uprawnieniami" name="notifyignore" />
+ </notification>
<notification name="ConfirmLeaveCall">
Czy jesteś pewien/pewna, że chcesz zakończyć rozmowę?
<usetemplate ignoretext="Potwierdź zanim rozmowa głosowa zostanie zakończona" name="okcancelignore" notext="Nie" yestext="Tak" />
@@ -3063,13 +3428,6 @@ Kliknij i przeciągnij gdziekolwiek aby obrócić widok.
<notification name="ForceQuitDueToLowMemory">
SL zostanie wyłączone za 30 sekund, brak pamięci.
</notification>
- <notification name="PopupAttempt">
- Wyskakujące okienko zostało zablokowane.
- <form name="form">
- <ignore name="ignore" text="Zezwól na wyskakujące okienka" />
- <button name="open" text="Otwórz wyskakujące okno" />
- </form>
- </notification>
<notification name="SOCKS_NOT_PERMITTED">
Serwer proxy SOCKS 5 "[HOST]:[PORT]" odmawia połączenia, brak dostępu na podstawie zestawu reguł.
</notification>
@@ -3161,7 +3519,7 @@ Kliknij i przeciągnij gdziekolwiek aby obrócić widok.
</notification>
<notification name="ConfirmHideUI">
Ta akcja ukryje wszystkie menu i przyciski. Aby je pokazać użyj skrótu [SHORTCUT] ponownie.
- <usetemplate name="okcancelignore" notext="Anuluj" ignoretext="Potwierdź przed ukryciem interfejsu" />
+ <usetemplate name="okcancelignore" notext="Anuluj" ignoretext="Potwierdź przed ukryciem interfejsu" />
</notification>
<notification name="PathfindingLinksets_WarnOnPhantom">
Niektórym z zaznaczonych zbiorów części zostanie przełączony status Widmowy.
@@ -3219,10 +3577,10 @@ Czy chcesz kontynuować?
Wybrany obiekt ma wpływ na Navmesh. Dodanie elastyczności spowoduje usunięcie go z Navmesha.
<usetemplate ignoretext="Wybrany obiekt ma wpływ na Navmesh. Dodanie elastyczności spowoduje usunięcie go z Navmesha." name="okcancelignore" notext="Anuluj" />
</notification>
- <global name="UnsupportedGLRequirements">
- Wygląda na to, że Twój system nie spełnia wymagań sprzętowych [APP_NAME]. [APP_NAME] wymaga karty graficznej kompatybilnej z OpenGL z multiteksturami. Jeżeli masz taką kartę zainstaluj najnowsze sterowniki do niej i uaktualnienia systemu operacyjnego.
+ <global name="UnsupportedIntelDriver">
+ Zainstalowany sterownik graficzny Intela dla [GPUNAME], wersja [VERSION], jest przestarzały i jest znany z powodowania awarii. Zdecydowanie zaleca się aktualizację do aktualnego sterownika Intel.
-Jeżeli wciąż masz problemy sprawdź: [SUPPORT_SITE].
+Czy chcesz sprawdzić witrynę sterowników firmy Intel?
</global>
<global name="UnsupportedGPU">
- Twoja karta graficzna nie spełnia minimalnych wymagań.
@@ -3230,9 +3588,12 @@ Jeżeli wciąż masz problemy sprawdź: [SUPPORT_SITE].
<global name="UnsupportedRAM">
- Pamięć Twojego systemu nie spełnia minimalnych wymagań.
</global>
+ <global name="LLLeapUpdaterFailure">
+ Nie udało się uruchomić usługi aktualizatora [UPDATER_APP]. Sprawdź, czy przeglądarka jest poprawnie zainstalowana i czy ma niezbędne uprawnienia do uruchomienia. Jeśli nadal będziesz mieć problemy, odwiedź [SUPPORT_SITE].
+ </global>
<global name="You can only set your 'Home Location' 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;.
+ Jeśli jesteś właścicielem działki, to możesz ustawić na niej miejsce startu.
+W innym przypadku możesz poszukać na mapie miejsc oznaczonych jako &quot;Infohub&quot;.
</global>
<global name="You died and have been teleported to your home location">
Nastąpiła śmierć i teleportacja do Miejsca Startu.
@@ -3309,13 +3670,13 @@ Anulowano.
Nie możesz tworzyć drzew i trawy na ziemi, która nie należy do Ciebie.
</notification>
<notification name="NoCopyPermsNoObject">
- Kopiowanie nie powiodło się, ponieważ nie masz zezwoleń na kopiowanie obiektu '[OBJ_NAME]'.
+ Kopiowanie nie powiodło się, ponieważ nie masz zezwoleń na kopiowanie obiektu &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt;.
</notification>
<notification name="NoTransPermsNoObject">
- Kopiowanie nie powiodło się, ponieważ obiekt '[OBJ_NAME]' nie może zostać przetransferowany do Ciebie.
+ Kopiowanie nie powiodło się, ponieważ obiekt &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; nie może zostać przetransferowany do Ciebie.
</notification>
<notification name="AddToNavMeshNoCopy">
- Kopiowanie nie powiodło się, ponieważ obiekt '[OBJ_NAME]' ma wpływ na Navmesh.
+ Kopiowanie nie powiodło się, ponieważ obiekt &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; ma wpływ na Navmesh.
</notification>
<notification name="DupeWithNoRootsSelected">
Wybrano duplikat bez obiektów głównych.
@@ -3362,34 +3723,37 @@ Spróbuj ponownie za minutę.
Zabieranie z powrotem do Szafy zostało wyłączone.
</notification>
<notification name="NoExistNoSaveToContents">
- Nie można zapisać '[OBJ_NAME]' do zawartości obiektu, ponieważ obiekt z którego został zrezzowany już nie istnieje.
+ Nie można zapisać &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; do zawartości obiektu, ponieważ obiekt z którego został zrezzowany już nie istnieje.
</notification>
<notification name="NoModNoSaveToContents">
- Nie można zapisać '[OBJ_NAME]' do zawartości obiektu, ponieważ nie masz praw do modyfikacji obiektu '[DEST_NAME]'.
+ Nie można zapisać &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; do zawartości obiektu, ponieważ nie masz praw do modyfikacji obiektu &lt;nolink&gt;'[DEST_NAME]'&lt;/nolink&gt;.
</notification>
<notification name="NoSaveBackToInvDisabled">
- Nie można zabrać '[OBJ_NAME]' z powrotem do Szafy -- ta operacja została wyłączona.
+ Nie można zabrać &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; z powrotem do Szafy -- ta operacja została wyłączona.
</notification>
<notification name="NoCopyNoSelCopy">
- Nie możesz skopiować tego, co jest zaznaczone, ponieważ nie masz prawa do skopiowania obiektu '[OBJ_NAME]'.
+ Nie możesz skopiować tego, co jest zaznaczone, ponieważ nie masz prawa do skopiowania obiektu &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt;.
</notification>
<notification name="NoTransNoSelCopy">
- Nie możesz skopiować tego, co jest zaznaczone, ponieważ obiektu '[OBJ_NAME]' nie można transferować.
+ Nie możesz skopiować tego, co jest zaznaczone, ponieważ obiektu &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; nie można transferować.
</notification>
<notification name="NoTransNoCopy">
- Nie możesz skopiować tego, co jest zaznaczone, ponieważ obiektu '[OBJ_NAME]' nie można transferować.
+ Nie możesz skopiować tego, co jest zaznaczone, ponieważ obiektu &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; nie można transferować.
</notification>
<notification name="NoPermsNoRemoval">
- Usunięcie obiektu '[OBJ_NAME]' z symulatora zostało wzbronione przez system zezwoleń.
+ Usunięcie obiektu &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; z symulatora zostało wzbronione przez system zezwoleń.
</notification>
<notification name="NoModNoSaveSelection">
- Nie możesz zapisać tego, co jest zaznaczone, ponieważ nie masz prawa do modyfikacji obiektu '[OBJ_NAME]'.
+ Nie możesz zapisać tego, co jest zaznaczone, ponieważ nie masz prawa do modyfikacji obiektu &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt;.
+ </notification>
+ <notification name="NoTransNoSaveToContents">
+ Nie można zapisać &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; do zawartości obiektu, ponieważ nie masz uprawnień do przeniesienia praw własności obiektu.
</notification>
<notification name="NoCopyNoSaveSelection">
- Nie możesz zapisać tego, co jest zaznaczone, ponieważ obiektu '[OBJ_NAME]' nie można kopiować.
+ Nie możesz zapisać tego, co jest zaznaczone, ponieważ obiektu &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt; nie można kopiować.
</notification>
<notification name="NoModNoTaking">
- Nie możesz zabrać tego, co jest zaznaczone, ponieważ nie masz prawa do modyfikacji obiektu '[OBJ_NAME]'.
+ Nie możesz zabrać tego, co jest zaznaczone, ponieważ nie masz prawa do modyfikacji obiektu &lt;nolink&gt;'[OBJ_NAME]'&lt;/nolink&gt;.
</notification>
<notification name="RezDestInternalError">
Błąd wewnętrzny: Nieznany typ lokalizacji docelowej.
@@ -3415,33 +3779,39 @@ Spróbuj ponownie za minutę.
<notification name="AvatarEjectFailed">
Wyrzucenie nie powiodło się, ponieważ nie masz uprawnień administratora na tej działce.
</notification>
- <notification name="CantMoveObjectParcelFull">
- Nie można przesunąć obiektu '[OBJECT_NAME]' do
-[OBJ_POSITION] w regionie [REGION_NAME], ponieważ działka jest zbyt pełna.
+ <notification name="CMOParcelFull">
+ Nie można przesunąć obiektu '[O]' do
+[P] w regionie [R], ponieważ działka jest zbyt pełna.
+ </notification>
+ <notification name="CMOParcelPerms">
+ Nie można przesunąć obiektu '[O]' do
+[P] w regionie [R], ponieważ Twoje obiekty nie są dozwolone na tej działce.
</notification>
- <notification name="CantMoveObjectParcelPerms">
- Nie można przesunąć obiektu '[OBJECT_NAME]' do
-[OBJ_POSITION] w regionie [REGION_NAME], ponieważ Twoje obiekty nie są dozwolone na tej działce.
+ <notification name="CMOParcelResources">
+ Nie można przesunąć obiektu '[O]' do
+[P] w regionie [R], ponieważ nie ma wystarczającej ilości zasobów na tej działce.
</notification>
- <notification name="CantMoveObjectParcelResources">
- Nie można przesunąć obiektu '[OBJECT_NAME]' do
-[OBJ_POSITION] w regionie [REGION_NAME], ponieważ nie ma wystarczającej ilości zasobów na tej działce.
+ <notification name="NoParcelPermsNoObject">
+ Kopiowanie nie powiodło się, ponieważ nie masz dostępu do tej działki.
</notification>
- <notification name="CantMoveObjectRegionVersion">
- Nie można przesunąć obiektu '[OBJECT_NAME]' do
-[OBJ_POSITION] w regionie [REGION_NAME], ponieważ the region działa na starszej wersji symulatora, która nie obsługuje otrzymywania obiektów przez granice działek.
+ <notification name="CMORegionVersion">
+ Nie można przesunąć obiektu '[O]' do
+[P] w regionie [R], ponieważ the region działa na starszej wersji symulatora, która nie obsługuje otrzymywania obiektów przez granice działek.
</notification>
- <notification name="CantMoveObjectNavMesh">
- Nie można przesunąć obiektu '[OBJECT_NAME]' do
-[OBJ_POSITION] w regionie [REGION_NAME], ponieważ nie możesz modyfikować Navmesha przez granice regionów.
+ <notification name="CMONavMesh">
+ Nie można przesunąć obiektu '[O]' do
+[P] w regionie [R], ponieważ nie możesz modyfikować Navmesha przez granice regionów.
</notification>
- <notification name="CantMoveObjectWTF">
- Nie można przesunąć obiektu '[OBJECT_NAME]' do
-[OBJ_POSITION] w regionie [REGION_NAME] ze względu na nieznany powód. ([FAILURE_TYPE])
+ <notification name="CMOWTF">
+ Nie można przesunąć obiektu '[O]' do
+[P] w regionie [R] ze względu na nieznany powód. ([F])
</notification>
<notification name="NoPermModifyObject">
Nie masz uprawnień do modyfikowania tego obiektu
</notification>
+ <notification name="TooMuchObjectInventorySelected">
+ Zbyt wiele obiektów z dużą zawartością zostało zaznaczonych. Zaznacz mniej obiektów i spróbuj ponownie.
+ </notification>
<notification name="CantEnablePhysObjContributesToNav">
Nie można włączyć fizyki dla obiektu, który ma wpływ na Navmesh.
</notification>
@@ -3478,6 +3848,12 @@ Spróbuj ponownie za minutę.
<notification name="CantSaveModifyAttachment">
Nie można zapisać do zawartości obiektu: To zmodyfikowałoby prawa dodatku.
</notification>
+ <notification name="AttachmentHasTooMuchInventory">
+ Twoje dodatki zawierają w sobie zbyt dużo obiektów, aby dodać więcej.
+ </notification>
+ <notification name="IllegalAttachment">
+ Dodatek chciał się doczepić do punktu, jaki nie istnieje na awatarze. Został on zamiast tego dołączony do klatki piersiowej.
+ </notification>
<notification name="TooManyScripts">
Za dużo skryptów.
</notification>
@@ -3485,7 +3861,7 @@ Spróbuj ponownie za minutę.
Nie można dodać skryptu!
</notification>
<notification name="AssetServerTimeoutObjReturn">
- Czas odpowiedzi z serwera zasobów danych przekroczył dozwolony limit. Obiekt został zwrócony do sima.
+ Czas odpowiedzi z serwera zasobów danych przekroczył dozwolony limit. Obiekt został zwrócony do regionu.
</notification>
<notification name="RegionDisablePhysicsShapes">
Ten region nie ma włączonych kształtów fizycznych.
@@ -3518,7 +3894,7 @@ Spróbuj ponownie za minutę.
Nie możesz zmieniać kształtu obiektu meszowego.
</notification>
<notification name="FullRegionCantEnter">
- Nie możesz wejść do tego regionu, \nponieważ jest pełny.
+ Nie możesz wejść do tego regionu, ponieważ jest pełny.
</notification>
<notification name="LinkFailedOwnersDiffer">
Scalanie nie powiodło się -- właściciele są różni
@@ -3570,9 +3946,18 @@ Spróbuj ponownie za minutę.
<notification name="TeleportedByObjectUnknownUser">
Zostałeś/aś teleportowany/a przez obiekt '[OBJECT_NAME]' należący do nieznanej osoby.
</notification>
+ <notification name="StandDeniedByObject">
+ '[OBJECT_NAME]' nie pozwala Ci w tej chwili stać.
+ </notification>
+ <notification name="ResitDeniedByObject">
+ '[OBJECT_NAME]' nie pozwala Ci w tej chwili zmieniać siedzeń.
+ </notification>
<notification name="CantCreateObjectRegionFull">
Nie można utworzyć żądanego obiektu. Region jest pełny.
</notification>
+ <notification name="CantCreateAnimatedObjectTooLarge">
+ Nie można utworzyć żądanego obiektu animowanego, ponieważ przekracza on limit trójkątów riggowania.
+ </notification>
<notification name="CantAttackMultipleObjOneSpot">
Nie możesz podłączyć wielu obiektów do jednego punktu.
</notification>
@@ -3621,6 +4006,21 @@ Spróbuj ponownie za minutę.
<notification name="CantChangeShape">
Nie masz pozwolenia na zmianę tego kształtu.
</notification>
+ <notification name="NoPermsTooManyAttachedAnimatedObjects">
+ Operacja spowodowałaby przekroczenie limitu liczby dołączonych animowanych obiektów.
+ </notification>
+ <notification name="NoPermsLinkAnimatedObjectTooLarge">
+ Nie można połączyć tych obiektów, ponieważ powstały animowany obiekt przekroczyłby limit trójkątów riggowania.
+ </notification>
+ <notification name="NoPermsSetFlagAnimatedObjectTooLarge">
+ Nie można przekształcić tego obiektu w animowany obiekt, ponieważ przekroczyłby limit trójkątów riggowania.
+ </notification>
+ <notification name="CantChangeAnimatedObjectStateInsufficientLand">
+ Nie można zmienić stanu animowanego obiektu dla tej rzeczy, ponieważ spowodowałoby to przekroczenie limitu działki.
+ </notification>
+ <notification name="ErrorNoMeshData">
+ Błąd serwera: nie można ukończyć tej operacji, ponieważ dane meszu nie zostały załadowane.
+ </notification>
<notification name="NoAccessToClaimObjects">
Twoje uprawnienia nie pozwalają Ci na żądanie obiektów w tym miejscu.
</notification>
@@ -3679,7 +4079,7 @@ Spróbuj ponownie za minutę.
Sprecyzuj proszę swoje parametry usuwania.
</notification>
<notification name="UnableToUploadAsset">
- Nie można załadować zasobu danych (assetu).
+ Nie można przesłać zasobu danych (assetu).
</notification>
<notification name="CantTeleportCouldNotFindUser">
Nie można znaleźć użytkownika, aby teleportować do domu
@@ -3691,7 +4091,7 @@ Spróbuj ponownie za minutę.
żądanie ogólne nie powiodło się
</notification>
<notification name="CantUploadPostcard">
- Nie można załadować pocztówki. Spróbuj ponownie później.
+ Nie można przesłać pocztówki. Spróbuj ponownie później.
</notification>
<notification name="CantFetchInventoryForGroupNotice">
Nie można pobrać szczegółów dołączonego przedmiotu dla ogłoszenia grupy.
@@ -3706,7 +4106,7 @@ Spróbuj ponownie za minutę.
Nie można zanalizować przedmiotu z ogłoszenia.
</notification>
<notification name="TerrainUploadFailed">
- Ładowanie podłoża na serwer nie powiodło się.
+ Przesyłanie podłoża na serwer nie powiodło się.
</notification>
<notification name="TerrainFileWritten">
Plik podłoża zapisany.
@@ -3799,7 +4199,7 @@ Spróbuj zaznaczyć mniejszy obszar ziemi.
Nie można w tej chwili kupić przepustki. Spróbuj ponownie później.
</notification>
<notification name="CantCreateObjectParcelFull">
- Nie można utworzyć obiektu, \n ponieważ działka jest pełna.
+ Nie można utworzyć obiektu, ponieważ działka jest pełna.
</notification>
<notification name="FailedPlacingObject">
Nie udało się umieścić obiektu w żądanej lokalizacji. Spróbuj ponownie.
@@ -3870,6 +4270,9 @@ Spróbuj zaznaczyć mniejszy obszar ziemi.
<notification name="CantTransfterMoneyRegionDisabled">
Transfery pieniędzy do obiektów są obecnie wyłączone w tym regionie.
</notification>
+ <notification name="DroppedMoneyTransferRequest">
+ Nie udało się dokonać płatności ze względu na obciążenie systemu.
+ </notification>
<notification name="CantPayNoAgent">
Nie udało się ustalić, komu zapłacić.
</notification>
@@ -3883,12 +4286,16 @@ Spróbuj zaznaczyć mniejszy obszar ziemi.
Błąd wewnętrzny uniemożliwił poprawną aktualizację danych przeglądarki. Stan konta L$ lub posiadane działki wyświetlane w przeglądarce mogą nie odzwierciedlać faktycznego stanu posiadania na serwerach.
</notification>
<notification name="LargePrimAgentIntersect">
- Nie można utworzyć wielkich prim, które nachodzą na innych rezydentów. Spróbuj jeszcze raz, gdy przesuną się oni.
+ Nie można tworzyć wielkich prim, które nachodzą na innych rezydentów. Spróbuj jeszcze raz, gdy się oni przesuną.
</notification>
<notification name="PreferenceChatClearLog">
Ta opcja usunie dzienniki poprzednich rozmów i wszelkie kopie zapasowe tego pliku.
<usetemplate ignoretext="Potwierdź, zanim usunę dzienniki poprzednich rozmów." name="okcancelignore" notext="Anuluj" />
</notification>
+ <notification name="PreferenceControlsDefaults">
+ Czy chcesz przywrócić domyślne ustawienia klawiszy sterowania?
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Obecny tryb" yestext="Wszystkie tryby" />
+ </notification>
<notification name="PreferenceChatDeleteTranscripts">
Ta opcja usunie logi wszystkich poprzednich rozmów. Nie będzie to miało wpływu na listę rozmów odbytych w przeszłości. Wszystkie pliki z przyrostkami .txt oraz txt.backup w folderze [FOLDER] zostaną usunięte.
<usetemplate ignoretext="Potwierdź, zanim usunę logi rozmów." name="okcancelignore" notext="Anuluj" />
@@ -3903,4 +4310,113 @@ Spróbuj zaznaczyć mniejszy obszar ziemi.
<notification name="ChatHistoryIsBusyAlert">
Plik historii czatu jest w tej chwili przetwarzany przez poprzednią operację. Spróbuj ponownie za kilka minut lub wybierz czat innej osoby.
</notification>
+ <notification name="AddPaymentMethod">
+ Na następnej stronie wybierz kwotę L$
+i kliknij przycisk składania zamówienia.
+Będziesz mógł/a dodać metodę płatności w kasie.
+ <form name="form">
+ <button name="Continue" text="Kontynuuj" />
+ <button name="Cancel" text="Anuluj" />
+ </form>
+ </notification>
+ <notification name="FailedToFindSettings">
+ Nie można załadować ustawień dla [NAME] z bazy danych.
+ </notification>
+ <notification name="FailedToLoadSettingsApply">
+ Nie można zastosować tych ustawień do otoczenia.
+ </notification>
+ <notification name="FailedToBuildSettingsDay">
+ Nie można zastosować tych ustawień do otoczenia.
+ </notification>
+ <notification name="NoEnvironmentSettings">
+ Ten region nie obsługuje ustawień otoczenia.
+ </notification>
+ <notification label="Zapisz otoczenie" name="SaveSettingAs">
+ Zapisz bieżące ustawienia otoczenia jako:
+ <form name="form">
+ <input name="message">
+ [DESC] (nowe)
+ </input>
+ <button name="Cancel" text="Anuluj" />
+ </form>
+ </notification>
+ <notification name="WLImportFail">
+ Nie można zaimportować starszych ustawień Windlight [NAME] z
+[FILE].
+
+[REASONS]
+ </notification>
+ <notification name="WLParcelApplyFail">
+ Nie można ustawić otoczenia dla tej działki.
+Odwiedź lub wybierz działkę, którą masz prawo zmodyfikować.
+ </notification>
+ <notification name="SettingsUnsuported">
+ Otoczenia nie są obsługiwane w tym regionie.
+Przejdź do regionu z włączonymi otoczeniami i spróbuj ponownie.
+ </notification>
+ <notification name="SettingsConfirmLoss">
+ Za chwilę stracisz zmiany wprowadzone dla [TYPE] o nazwie "[NAME]".
+Czy na pewno chcesz kontynuować?
+ <usetemplate ignoretext="Czy na pewno chcesz stracić zmiany?" name="okcancelignore" notext="Nie" yestext="Tak" />
+ </notification>
+ <notification name="SettingsConfirmReset">
+ Za chwilę usuniesz wszystkie zastosowane otoczenia.
+Czy na pewno chcesz kontynuować?
+ <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak" />
+ </notification>
+ <notification name="PersonalSettingsConfirmReset">
+ Za chwilę usuniesz wszystkie zastosowane ustawienia własnego oświetlenia.
+Czy na pewno chcesz kontynuować?
+ <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak" />
+ </notification>
+ <notification name="SettingsMakeNoTrans">
+ Zamierzasz zaimportować nietransferowalne otoczenia do tego cyklu dnia. Kontynuowanie spowoduje, że edytowane otoczenia również staną się nietransferowalne.
+
+Tej zmiany nie można cofnąć.
+
+Czy na pewno chcesz kontynuować?
+ <usetemplate ignoretext="Czy na pewno chcesz, aby otoczenia były nietransferowalne?" name="okcancelignore" notext="Nie" yestext="Tak" />
+ </notification>
+ <notification name="NoEditFromLibrary">
+ Nie możesz edytować otoczeń bezpośrednio w bibliotece.
+Skopiuj do własnej szafy i spróbuj ponownie.
+ </notification>
+ <notification name="EnvironmentApplyFailed">
+ Napotkaliśmy problem z tymi ustawieniami otoczenia. Nie można ich teraz zapisać ani zastosować.
+ </notification>
+ <notification name="TrackLoadFailed">
+ Nie można załadować ścieżki do [TRACK].
+ </notification>
+ <notification name="TrackLoadMismatch">
+ Nie można załadować ścieżki z [TRACK1] do [TRACK2].
+ </notification>
+ <notification name="CompressionTestResults">
+Wynik testu kompresji pliku dla gzip na poziomie 6 z [FILE] o rozmiarze [SIZE] KB:
+Pakowanie: [PACK_TIME]s [PSIZE]KB
+Rozpakowywanie: [UNPACK_TIME]s [USIZE]KB
+ </notification>
+ <notification label="Monituj o token usługi MFA" name="PromptMFAToken">
+ [MESSAGE]
+ <form name="form">
+ <button name="continue" text="Kontynuuj" />
+ <button name="cancel" text="Anuluj" />
+ </form>
+ </notification>
+ <notification label="Utwórz podfolder" name="CreateSubfolder">
+ Nazwij nowy folder:
+ <form name="form">
+ <button name="Cancel" text="Anuluj" />
+ </form>
+ </notification>
+ <notification name="SameFolderRequired">
+ Wybrane elementy muszą znajdować się w tym samym folderze.
+ </notification>
+ <notification name="RiggedMeshAttachedToHUD">
+ Dodatek o nazwie "[NAME]" dołączony do HUD "[POINT]" zawiera riggowany mesz.
+
+Riggowane mesze są przeznaczone do dodawania do samego awatara. Ani ty, ani nikt inny nie zobaczy tego obiektu.
+
+Jeśli chcesz zobaczyć ten obiekt, to usuń go i ponownie dołącz do punktu doczepienia na awatarze.
+ <usetemplate ignoretext="Ostrzegaj, gdy dodatek z riggowanym meszem jest dołączany do punktu HUD" name="okignore" />
+ </notification>
</notifications>
diff --git a/indra/newview/skins/default/xui/pl/panel_main_inventory.xml b/indra/newview/skins/default/xui/pl/panel_main_inventory.xml
index dc254e246f..1011c38378 100644
--- a/indra/newview/skins/default/xui/pl/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/pl/panel_main_inventory.xml
@@ -6,6 +6,7 @@
<panel.string name="ItemcountCompleted">
[ITEM_COUNT] obiekty [FILTER]
</panel.string>
+ <panel.string name="inventory_title">MOJA SZAFA</panel.string>
<text name="ItemcountText">
Obiekty:
</text>
diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml
index 90d2d86c02..26ec6cc9dc 100644
--- a/indra/newview/skins/default/xui/pl/strings.xml
+++ b/indra/newview/skins/default/xui/pl/strings.xml
@@ -18,8 +18,11 @@
<string name="StartupRequireDriverUpdate">
Nie można zainicjować grafiki. Zaktualizuj sterowniki!
</string>
+ <string name="BuildConfig">
+ Konfiguracja budowania: [BUILD_CONFIG]
+ </string>
<string name="AboutPosition">
-Położenie [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] w [REGION] zlokalizowanym w &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
+Położenie [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] w [REGION] zlokalizowanym w &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt;
SLURL: &lt;nolink&gt;[SLURL]&lt;/nolink&gt;
(koordynaty globalne [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1])
[SERVER_VERSION]
@@ -28,28 +31,53 @@ SLURL: &lt;nolink&gt;[SLURL]&lt;/nolink&gt;
<string name="AboutSystem">
Procesor (CPU): [CPU]
Pamięć (Memory): [MEMORY_MB] MB
-Wersja OS (OS Version): [OS_VERSION]
-Sprzedawca karty graficznej (Graphics Card Vendor): [GRAPHICS_CARD_VENDOR]
+System operacyjny (OS Version): [OS_VERSION]
+Dostawca karty graficznej (Graphics Card Vendor): [GRAPHICS_CARD_VENDOR]
Karta graficzna (Graphics Card): [GRAPHICS_CARD]
</string>
<string name="AboutDriver">
- Sterownik karty graficznej Windows (Driver Version): [GRAPHICS_DRIVER_VERSION]
+ Sterownik karty graficznej (Driver Version): [GRAPHICS_DRIVER_VERSION]
+ </string>
+ <string name="AboutOGL">
+ Wersja OpenGL: [OPENGL_VERSION]
+ </string>
+ <string name="AboutSettings">
+Rozmiar okna (Window size): [WINDOW_WIDTH]x[WINDOW_HEIGHT]
+Dostrojenie rozmiaru czcionki: [FONT_SIZE_ADJUSTMENT]pt
+Skalowanie interfejsu (UI Scaling): [UI_SCALE]
+Pole widzenia (Draw Distance): [DRAW_DISTANCE]m
+Przepustowość (Bandwidth): [NET_BANDWITH]kbit/s
+Mnożnik poziomu detali (LOD Factor): [LOD_FACTOR]
+Jakość wyświetlania (Render quality): [RENDER_QUALITY]
+Zaawansowane oświetlenie (Advanced Lighting Model): [GPU_SHADERS]
+Pamięć tekstur (Texture memory): [TEXTURE_MEMORY]MB
+Pamięć podręczna dysku (Disk cache): [DISK_CACHE_INFO]
+ </string>
+ <string name="AboutOSXHiDPI">
+ Tryb obrazu HiDPI: [HIDPI]
</string>
<string name="AboutLibs">
-Wersja OpenGL: [OPENGL_VERSION]
-
Wersja dekodera J2C: [J2C_VERSION]
Wersja sterownika dźwięku (Audio Driver): [AUDIO_DRIVER_VERSION]
-Wersja CEF: [LIBCEF_VERSION]
+[LIBCEF_VERSION]
Wersja LibVLC: [LIBVLC_VERSION]
Wersja serwera głosu (Voice Server): [VOICE_VERSION]
</string>
<string name="AboutTraffic">
Pakiety utracone: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</string>
+ <string name="AboutTime">
+ [day, datetime, slt] [month, datetime, slt] [year, datetime, slt], [hour24, datetime, slt]:[min, datetime, slt]:[second, datetime, slt] SLT
+ </string>
+ <string name="LocalTime">
+ [day, datetime, local] [month, datetime, local] [year, datetime, local], [hour24, datetime, local]:[min, datetime, local]:[second, datetime, local]
+ </string>
<string name="ErrorFetchingServerReleaseNotesURL">
Błąd podczas pobierania informacji o wydaniu.
</string>
+ <string name="BuildConfiguration">
+ Konfiguracja budowania
+ </string>
<string name="ProgressRestoring">
Przywracanie...
</string>
@@ -123,22 +151,28 @@ Wersja serwera głosu (Voice Server): [VOICE_VERSION]
Pobieranie ubrania...
</string>
<string name="InvalidCertificate">
- Serwer zwrócił nieważny lub zniekształcony certyfikat. Proszę skontaktuj się z administratorem siatki.
+ Serwer zwrócił nieważny lub zniekształcony certyfikat. Proszę skontaktuj się z administratorem świata.
</string>
<string name="CertInvalidHostname">
- Nazwa hosta jest nieważna, proszę sprawdź SLURL lub nazwę hosta siatki.
+ Nazwa hosta jest nieważna, proszę sprawdź SLURL lub nazwę hosta świata.
</string>
<string name="CertExpired">
- Termin ważności certyfikatu zwróconego przez siatkę minął. Proszę sprawdzić swój zegar systemowy lub skontaktować się z administratorem siatki.
+ Termin ważności certyfikatu zwróconego przez świat minął. Proszę sprawdzić swój zegar systemowy lub skontaktować się z administratorem świata.
</string>
<string name="CertKeyUsage">
- Certyfikat zwrócony przez serwer nie może być użyty dla SSL. Proszę skontaktuj się z administratorem siatki.
+ Certyfikat zwrócony przez serwer nie może być użyty dla SSL. Proszę skontaktuj się z administratorem świata.
</string>
<string name="CertBasicConstraints">
- Zbyt wiele certyfikatów w łańcuchu certyfikatów serwera. Proszę skontaktować się z administratorem siatki.
+ Zbyt wiele certyfikatów w łańcuchu certyfikatów serwera. Proszę skontaktować się z administratorem świata.
+ </string>
+ <string name="CertInvalid">
+ Nie udało się załadować certyfikatu. Skontaktuj się ze swoim administratorem świata.
</string>
<string name="CertInvalidSignature">
- Podpis certyfikatu zwrócony przez siatkę nie mógł zostać zweryfikowany. Proszę skontaktować się z administratorem siatki.
+ Podpis certyfikatu zwrócony przez świat nie mógł zostać zweryfikowany. Proszę skontaktować się z administratorem świata.
+ </string>
+ <string name="CertAllocationFailure">
+ Nie udało się przydzielić pamięci openssl dla certyfikatu.
</string>
<string name="LoginFailedNoNetwork">
Błąd sieci: Brak połączenia z siecią, sprawdź status swojego połączenia internetowego.
@@ -149,6 +183,12 @@ Wersja serwera głosu (Voice Server): [VOICE_VERSION]
<string name="Quit">
Wyłącz
</string>
+ <string name="AgniGridLabel">
+ Second Life: świat główny (Agni)
+ </string>
+ <string name="AditiGridLabel">
+ Second Life Beta: świat testowy (Aditi)
+ </string>
<string name="LoginFailedViewerNotPermitted">
Przeglądarka używana przez Ciebie nie ma już dostępu do Second Life. Proszę przejść na poniższą stronę i pobrać nową:
http://secondlife.com/download
@@ -156,6 +196,10 @@ http://secondlife.com/download
Więcej informacji w naszym FAQ:
http://secondlife.com/viewer-access-faq
</string>
+ <string name="LoginFailed">
+ Logowanie nieudane.
+Jeśli uważasz, że to błąd, skontaktuj się z support@secondlife.com.
+ </string>
<string name="LoginIntermediateOptionalUpdateAvailable">
Opcjonalna aktualizacja jest dostępna: [VERSION].
</string>
@@ -170,6 +214,7 @@ http://secondlife.com/viewer-access-faq
Upewnij się, że wpisano poprawnie:
* Login (np. bobsmith12 czy steller.sunshine)
* Hasło
+ * Token weryfikacji dwuetapowej (gdy włączona)
Sprawdź też, czy klawisz Caps Lock nie jest wciśnięty.
</string>
<string name="LoginFailedPasswordChanged">
@@ -199,14 +244,17 @@ Osoby posiadające darmowe konta nie mogą się teraz zalogować, aby ludzie pos
Jeśli myślisz, że to błąd skontaktuj się z
support@secondlife.com
</string>
+ <string name="PacificTime">
+ czas pacyficzny
+ </string>
<string name="LoginFailedAcountSuspended">
Twoje konto jest niedostępne do
-[TIME] czasu pacyficznego.
+[TIME].
+Jeśli myślisz, że to błąd skontaktuj się z support@secondlife.com
</string>
<string name="LoginFailedAccountDisabled">
Nie jesteśmy w stanie na tą chwilę wykonać Twojego żądania.
-Aby uzyskać pomoc skontaktuj się ze wsparciem: http://secondlife.com/support
-Jeśli nie możesz zmienić swojego hasła zadzwoń pod numer (866) 476-9763.
+Aby uzyskać pomoc skontaktuj się ze wsparciem: http://support.secondlife.com
</string>
<string name="LoginFailedTransformError">
Podczas logowania wykryto niespójność danych.
@@ -215,7 +263,7 @@ Skontaktuj się z nami: support@secondlife.com
<string name="LoginFailedAccountMaintenance">
Twoje konto jest w trakcie drobnych konserwacji.
Nie będzie ono dostępne do
-[TIME] czasu pacyficznego.
+[TIME].
Jeśli myślisz, że to błąd skontaktuj się z support@secondlife.com
</string>
<string name="LoginFailedPendingLogoutFault">
@@ -223,8 +271,7 @@ Jeśli myślisz, że to błąd skontaktuj się z support@secondlife.com
</string>
<string name="LoginFailedPendingLogout">
System w tej chwili Cię wylogowywuje.
-Twoje konto będzie niedostępne do
-[TIME] czasu pacyficznego.
+Poczekaj chwilę, zanim spróbujesz zalogować się ponownie.
</string>
<string name="LoginFailedUnableToCreateSession">
Nie można utworzyć poprawnej sesji.
@@ -282,6 +329,10 @@ Spróbuj zalogować się ponownie za minutę.
System rozpoczął wylogowywanie Twojej ostatniej sesji.
Spróbuj zalogować się ponownie za minutę.
</string>
+ <string name="LoginFailedAuthenticationMFARequired">
+ Wprowadź nowy token z aplikacji do uwierzytelniania wieloskładnikowego.
+Jeśli myślisz, że to błąd skontaktuj się z support@secondlife.com
+ </string>
<string name="AgentLostConnection">
Ten region może mieć problemy. Sprawdź podłączenie do Internetu.
</string>
@@ -303,60 +354,6 @@ Spróbuj zalogować się ponownie za minutę.
<string name="TestingDisconnect">
Testowanie rozłączenia klienta
</string>
- <string name="SocialFacebookConnecting">
- Łączenie z Facebookiem...
- </string>
- <string name="SocialFacebookPosting">
- Wysyłanie...
- </string>
- <string name="SocialFacebookDisconnecting">
- Rozłączanie z Facebookiem...
- </string>
- <string name="SocialFacebookErrorConnecting">
- Problem z łączeniem z Facebookiem
- </string>
- <string name="SocialFacebookErrorPosting">
- Problem z wysyłaniem na Facebooka
- </string>
- <string name="SocialFacebookErrorDisconnecting">
- Problem z rozłączaniem z Facebookiem
- </string>
- <string name="SocialFlickrConnecting">
- Łączenie z Flickr...
- </string>
- <string name="SocialFlickrPosting">
- Wysyłanie...
- </string>
- <string name="SocialFlickrDisconnecting">
- Rozłączanie z Flickr...
- </string>
- <string name="SocialFlickrErrorConnecting">
- Problem z łączeniem z Flickr
- </string>
- <string name="SocialFlickrErrorPosting">
- Problem z wysyłaniem na Flickr
- </string>
- <string name="SocialFlickrErrorDisconnecting">
- Problem z rozłączaniem z Flickr
- </string>
- <string name="SocialTwitterConnecting">
- Łączenie z Twitterem...
- </string>
- <string name="SocialTwitterPosting">
- Wysyłanie...
- </string>
- <string name="SocialTwitterDisconnecting">
- Rozłączanie z Twitterem...
- </string>
- <string name="SocialTwitterErrorConnecting">
- Problem z łączeniem z Twitterem
- </string>
- <string name="SocialTwitterErrorPosting">
- Problem z wysyłaniem na Twittera
- </string>
- <string name="SocialTwitterErrorDisconnecting">
- Problem z rozłączaniem z Twittera
- </string>
<string name="BlackAndWhite">
Czerń i biel
</string>
@@ -436,29 +433,56 @@ Spróbuj zalogować się ponownie za minutę.
Nie możesz założyć folderu, który zawiera więcej niż [AMOUNT] przedmiotów. Możesz zmienić ten limit w Zaawansowane &gt; Pokaż ustawienia debugowania &gt; WearFolderLimit.
</string>
<string name="TooltipPrice" value="[AMOUNT]L$: "/>
+ <string name="TooltipSLIcon">
+ Link do strony znajdującej się w oficjalnej domenie SecondLife.com lub LindenLab.com.
+ </string>
<string name="TooltipOutboxDragToWorld">
- Nie możesz rezzować obiektów w skrzynce nadawczej kupca
+ Nie możesz rezzować obiektów z folderu rzeczy na Marketplace
+ </string>
+ <string name="TooltipOutboxWorn">
+ Nie możesz umieszczać na Marketplace przedmiotów, które masz na sobie założone
+ </string>
+ <string name="TooltipOutboxFolderLevels">
+ Głębokość zagnieżdżonych folderów przekracza [AMOUNT]. Zmniejsz ilość zagdzieżdżeń; Spakuj przedmioty w pudełka, jeśli to pomoże.
+ </string>
+ <string name="TooltipOutboxTooManyFolders">
+ Ilość podfolderów przekracza [AMOUNT]. Zmniejsz ilość folderów; Spakuj przedmioty w pudełka, jeśli to pomoże.
+ </string>
+ <string name="TooltipOutboxTooManyObjects">
+ Ilość rzeczy przekracza [AMOUNT]. Jeśli chcesz sprzedać więcej, niż [AMOUNT] rzeczy jako jedną pozycję, to musisz je spakować w pudełka.
+ </string>
+ <string name="TooltipOutboxTooManyStockItems">
+ Ilość przedmiotów w folderze Magazynowym przekracza [AMOUNT].
+ </string>
+ <string name="TooltipOutboxCannotDropOnRoot">
+ Możesz przenosić foldery lub przedmioty wyłącznie do kart WSZYSTKO lub NIEPRZYPISANE. Wybierz teraz jedną z tych kart i spróbuj ponownie.
</string>
<string name="TooltipOutboxNoTransfer">
- Jeden lub kilka z tych obiektów nie może zostać sprzedany / przetransferowany.
+ Jeden lub kilka z tych obiektów nie może zostać sprzedany / przetransferowany
</string>
<string name="TooltipOutboxNotInInventory">
- Twoja skrzynka nadawcza kupca akceptuje tylko przedmioty bezpośrednio z Twojej Szafy.
+ Marketplace akceptuje tylko przedmioty bezpośrednio z Twojej Szafy.
</string>
- <string name="TooltipOutboxWorn">
- Nie możesz umieszczać w skrzynce nadawczej kupca przedmiotów, które masz na sobie założone
+ <string name="TooltipOutboxLinked">
+ Nie możesz sprzedać zlinkowanych folderów lub przedmiotów na Marketplace
</string>
<string name="TooltipOutboxCallingCard">
- Nie możesz umieszczać wizytówek w skrzynce nadawczej kupca
+ Nie możesz umieszczać wizytówek na Marketplace
</string>
- <string name="TooltipOutboxFolderLevels">
- Głębokość zagnieżdżonych folderów przekracza 3
+ <string name="TooltipOutboxDragActive">
+ Nie można przenieść wylistowanej rzeczy
</string>
- <string name="TooltipOutboxTooManyFolders">
- Ilość podfolderów w folderze najwyższego poziomu przekracza 20
+ <string name="TooltipOutboxCannotMoveRoot">
+ Nie możesz przenieść folderu głównego rzeczy na Marketplace
</string>
- <string name="TooltipOutboxTooManyObjects">
- Ilość pozycji w folderze najwyższego poziomu przekracza 200
+ <string name="TooltipOutboxMixedStock">
+ Wszystkie rzeczy w folderze Magazynowym muszą mieć ten sam typ i zezwolenia
+ </string>
+ <string name="TooltipOutfitNotInInventory">
+ W "Strojach" możesz umieszczać tylko przedmioty lub stroje z własnej Szafy
+ </string>
+ <string name="TooltipCantCreateOutfit">
+ Jeden lub więcej przedmiotów nie może być użyty w "Strojach"
</string>
<string name="TooltipDragOntoOwnChild">
Nie możesz przenieść folderu do jego obiektu podrzędnego
@@ -521,6 +545,9 @@ Spróbuj zalogować się ponownie za minutę.
Kliknij aby uruchomić komendę secondlife://
</string>
<string name="CurrentURL" value=" Obecny URL: [CurrentURL]"/>
+ <string name="TooltipEmail">
+ Kliknij aby utworzyć wiadomość e-mail
+ </string>
<string name="SLurlLabelTeleport">
Teleportuj do
</string>
@@ -569,6 +596,15 @@ Spróbuj zalogować się ponownie za minutę.
<string name="BUTTON_HELP">
Pokaż Pomoc
</string>
+ <string name="TooltipNotecardNotAllowedTypeDrop">
+Przedmioty tego typu nie mogą być dołączane
+do notek z tego regionu.
+ </string>
+ <string name="TooltipNotecardOwnerRestrictedDrop">
+Tylko przedmioty z nieograniczonymi
+uprawnieniami 'następnego właściciela'
+mogą być dołączane do notek.
+ </string>
<string name="Searching">
Wyszukiwanie...
</string>
@@ -588,7 +624,7 @@ Spróbuj zalogować się ponownie za minutę.
(brak danych)
</string>
<string name="AvatarNameWaiting">
- (ładowanie)
+ (Wczytywanie...)
</string>
<string name="AvatarNameMultiple">
(kilka)
@@ -629,6 +665,31 @@ Spróbuj zalogować się ponownie za minutę.
<string name="AssetErrorUnknownStatus">
Status nieznany
</string>
+ <string name="AssetUploadServerUnreacheble">
+ Usługa niedostępna.
+ </string>
+ <string name="AssetUploadServerDifficulties">
+ Serwer doświadcza nieoczekiwanych trudności.
+ </string>
+ <string name="AssetUploadServerUnavaliable">
+ Usługa niedostępna lub osiągnięto limit czasu.
+ </string>
+ <string name="AssetUploadRequestInvalid">
+ Błąd podczas przesyłania. Odwiedź
+http://secondlife.com/support aby uzyskać pomoc.
+ </string>
+ <string name="SettingValidationError">
+ Walidacja nie powiodła się - importowanie ustawień [NAME]
+ </string>
+ <string name="SettingImportFileError">
+ Nie można otworzyć pliku [FILE]
+ </string>
+ <string name="SettingParseFileError">
+ Nie można otworzyć pliku [FILE]
+ </string>
+ <string name="SettingTranslateError">
+ Nie można przetłumaczyć windlight [NAME]
+ </string>
<string name="texture">
tekstury
</string>
@@ -698,15 +759,18 @@ Spróbuj zalogować się ponownie za minutę.
<string name="favorite">
ulubione
</string>
+ <string name="symbolic link">
+ link
+ </string>
<string name="symbolic folder link">
link folderu
</string>
+ <string name="settings blob">
+ otoczenie
+ </string>
<string name="mesh">
mesz
</string>
- <string name="settings">
- ustawień
- </string>
<string name="AvatarEditingAppearance">
(Edycja wyglądu)
</string>
@@ -714,7 +778,7 @@ Spróbuj zalogować się ponownie za minutę.
Śpi
</string>
<string name="AvatarDoNotDisturb">
- Zajęty
+ Zajęty/a
</string>
<string name="AvatarMuted">
Wyciszony
@@ -957,10 +1021,10 @@ Spróbuj zalogować się ponownie za minutę.
Nie można znaleźć Podstawy lub Stawu.
</string>
<string name="NearbyChatTitle">
- Czat lokalny
+ Czat w pobliżu
</string>
<string name="NearbyChatLabel">
- (Czat lokalny)
+ (Czat w pobliżu)
</string>
<string name="whisper">
szepcze:
@@ -1034,15 +1098,18 @@ Spróbuj zalogować się ponownie za minutę.
<string name="ChangeYourDefaultAnimations">
Zmieniać Twoje domyślne animacje
</string>
+ <string name="ForceSitAvatar">
+ Zmuszać Twojego awatara do siadania
+ </string>
+ <string name="ChangeEnvSettings">
+ Zmieniać Twoje ustawienia otoczenia
+ </string>
<string name="NotConnected">
Brak połączenia
</string>
<string name="AgentNameSubst">
(Ty)
</string>
- <string name="JoinAnExperience">
- Rozpocznij przygodę
- </string>
<string name="SilentlyManageEstateAccess">
Wyciszyć powiadomienia o zmianach zezwoleń Majątku
</string>
@@ -1172,6 +1239,9 @@ Spróbuj zalogować się ponownie za minutę.
<string name="tattoo">
Tatuaż
</string>
+ <string name="universal">
+ Warstwa uniwersalna
+ </string>
<string name="physics">
Fizyka
</string>
@@ -1214,6 +1284,9 @@ Spróbuj zalogować się ponownie za minutę.
<string name="tattoo_not_worn">
Tatuaż nie jest założony
</string>
+ <string name="universal_not_worn">
+ Warstwa uniwersalna nie jest założona
+ </string>
<string name="physics_not_worn">
Fizyka nie jest założona
</string>
@@ -1260,13 +1333,16 @@ Spróbuj zalogować się ponownie za minutę.
Nowa spódnica
</string>
<string name="create_new_alpha">
- Nowe alpha
+ Nowa warstwa alpha
</string>
<string name="create_new_tattoo">
Nowy tatuaż
</string>
+ <string name="create_new_universal">
+ Nowa warstwa uniwersalna
+ </string>
<string name="create_new_physics">
- Nową fizyka
+ Nowa fizyka
</string>
<string name="create_new_invalid">
nieprawidłowy
@@ -1284,7 +1360,7 @@ Spróbuj zalogować się ponownie za minutę.
Ogłoszenia grupowe
</string>
<string name="GroupNotifySentBy">
- Wysłane przez
+ Wysłał/a
</string>
<string name="GroupNotifyAttached">
Załączone:
@@ -1325,6 +1401,9 @@ Spróbuj zalogować się ponownie za minutę.
<string name="BodyPartsRightLeg">
Prawa noga
</string>
+ <string name="BodyPartsEnhancedSkeleton">
+ Rozszerzony szkielet
+ </string>
<string name="GraphicsQualityLow">
Niska
</string>
@@ -1340,11 +1419,20 @@ Spróbuj zalogować się ponownie za minutę.
<string name="InventoryNoMatchingItems">
Nie udało Ci się znaleźć tego, czego szukasz? Spróbuj [secondlife:///app/search/all/[SEARCH_TERM] Wyszukiwarki].
</string>
+ <string name="InventoryNoMatchingRecentItems">
+ Nie udało Ci się znaleźć tego, czego szukasz? Spróbuj [secondlife:///app/inventory/filters Filtrowania].
+ </string>
<string name="PlacesNoMatchingItems">
- Nie udało Ci się znaleźć tego, czego szukasz? Spróbuj [secondlife:///app/search/places/[SEARCH_TERM] Wyszukiwarki].
+ Aby dodać miejsce do ulubionych, kliknij gwiazdkę po prawej stronie nazwy lokalizacji.
</string>
<string name="FavoritesNoMatchingItems">
- Przeciągnij landmark tutaj aby dodać go do swoich ulubionych.
+ Aby dodać miejsce do ulubionych, kliknij gwiazdkę po prawej stronie nazwy lokalizacji, a następnie zapisz landmark na pasku "Ulubione".
+ </string>
+ <string name="MarketplaceNoListing">
+ Nie masz jeszcze żadnych przedmiotów na Marketplace.
+ </string>
+ <string name="MarketplaceNoMatchingItems">
+ Niczego nie znaleziono. Sprawdź pisownię i spróbuj ponownie.
</string>
<string name="InventoryNoTexture">
Nie posiadasz kopii tej tekstury w swojej Szafie.
@@ -1352,6 +1440,15 @@ Spróbuj zalogować się ponownie za minutę.
<string name="InventoryInboxNoItems">
Przedmioty zakupione na Marketplace pojawią się tutaj. Możesz następnie przeciągnąć je do głównej części Szafy.
</string>
+ <string name="InventoryPlayAnimationTooltip">
+ Otwórz okno z opcjami odtwarzania.
+ </string>
+ <string name="InventoryPlayGestureTooltip">
+ Odtwarzaj wybrany gest w świecie.
+ </string>
+ <string name="InventoryPlaySoundTooltip">
+ Otwórz okno z opcjami odtwarzania.
+ </string>
<string name="InventoryOutboxNotMerchantTitle">
Każdy może sprzedawać przedmioty na Marketplace.
</string>
@@ -1376,29 +1473,110 @@ Spróbuj zalogować się ponownie za minutę.
<string name="InventoryOutboxError">
[[MARKETPLACE_CREATE_STORE_URL] Sklep na Marketplace] zwraca błędy.
</string>
+ <string name="InventoryMarketplaceError">
+ Wystapił błąd podczas otwierania listy rzeczy z Marketplace.
+Jeśli ciągle otrzymujesz tą wiadomość, to skontaktuj się z pomocą techniczną Second Life: http://support.secondlife.com
+ </string>
+ <string name="InventoryMarketplaceConnectionError">
+ Wystapił błąd podczas łączenia z Marketplace.
+Jeśli ciągle otrzymujesz tą wiadomość, to skontaktuj się z pomocą techniczną Second Life: http://support.secondlife.com
+ </string>
+ <string name="InventoryMarketplaceConnectionErrorReason">
+ Wystapił błąd podczas łączenia z Marketplace. Powód: [REASON]
+Jeśli ciągle otrzymujesz tą wiadomość, to skontaktuj się z pomocą techniczną Second Life: http://support.secondlife.com
+ </string>
+ <string name="InventoryMarketplaceListingsNoItemsTitle">
+ Twój folder rzeczy na Marketplace jest pusty.
+ </string>
+ <string name="InventoryMarketplaceListingsNoItems">
+ Przeciągnij foldery do tego obszaru, aby dodać je na listę sprzedaży w [[MARKETPLACE_DASHBOARD_URL] Marketplace].
+ </string>
+ <string name="InventoryItemsCount">
+ ( [ITEMS_COUNT] elementów )
+ </string>
+ <string name="Marketplace Validation Warning Stock">
+ folder Magazynowy musi być zawarty w folderze wersji
+ </string>
+ <string name="Marketplace Validation Error Mixed Stock">
+ : Błąd: wszystkie przedmioty w folderze Magazynowym muszą mieć ten sam typ i być niekopiowalne
+ </string>
+ <string name="Marketplace Validation Error Subfolder In Stock">
+ : Błąd: folder Magazynowy nie może zawierać podfolderów
+ </string>
+ <string name="Marketplace Validation Warning Empty">
+ : Uwaga: folder jest pusty
+ </string>
+ <string name="Marketplace Validation Warning Create Stock">
+ : Uwaga: tworzę folder Magazynowy
+ </string>
+ <string name="Marketplace Validation Warning Create Version">
+ : Uwaga: tworzę folder wersji
+ </string>
+ <string name="Marketplace Validation Warning Move">
+ : Uwaga: przenoszę przedmioty
+ </string>
+ <string name="Marketplace Validation Warning Delete">
+ : Uwaga: zawartość folderu przeniesiona do folderu Magazynowego, usuwam pusty katalog
+ </string>
+ <string name="Marketplace Validation Error Stock Item">
+ : Błąd: przedmioty bez praw kopiowania muszą się znajdować w folderze Magazynowym
+ </string>
+ <string name="Marketplace Validation Warning Unwrapped Item">
+ : Uwaga: przedmioty muszą się znajdować w folderze wersji
+ </string>
+ <string name="Marketplace Validation Error">
+ : Błąd:
+ </string>
+ <string name="Marketplace Validation Warning">
+ : Uwaga:
+ </string>
+ <string name="Marketplace Validation Error Empty Version">
+ : Uwaga: folder wersji musi zawierać przynajmniej jedną pozycję
+ </string>
+ <string name="Marketplace Validation Error Empty Stock">
+ : Uwaga: folder Magazynowy musi zawierać przynajmniej jedną pozycję
+ </string>
+ <string name="Marketplace Validation No Error">
+ Brak błędów lub ostrzeżeń
+ </string>
<string name="Marketplace Error None">
Brak błędów
</string>
+ <string name="Marketplace Error Prefix">
+ Błąd:
+ </string>
<string name="Marketplace Error Not Merchant">
- Błąd: Przed wysłaniem przedmiotów na Marketplace musisz zostać kupcem (darmowe).
+ Przed wysłaniem przedmiotów na Marketplace musisz zostać kupcem (darmowe).
</string>
- <string name="Marketplace Error Empty Folder">
- Błąd: Ten folder nie ma zawartości.
+ <string name="Marketplace Error Not Accepted">
+ Nie można przenieść tego przedmiotu.
</string>
- <string name="Marketplace Error Unassociated Products">
- Błąd: Ta pozycja nie może zostać załadowana, ponieważ Twoje konto kupca ma zbyt wiele nieprzypisanych przedmiotów. Aby naprawić ten błąd zaloguj się na stronę Marketplace i zmniejsz ilość nieprzypisanych (unassociated) przedmiotów.
+ <string name="Marketplace Error Unsellable Item">
+ Ta pozycja nie może być sprzedana na Marketplace.
</string>
- <string name="Marketplace Error Object Limit">
- Błąd: Ta pozycja zawiera zbyt wiele elementów. Umieść przedmioty razem w pudełkach, aby zmniejszyć ich całkowitą liczbę do mniej niż 200.
+ <string name="MarketplaceNoID">
+ Brak Mkt ID
</string>
- <string name="Marketplace Error Folder Depth">
- Błąd: Ta pozycja zawiera zbyt wiele zagnieżdżonych folderów. Zreorganizuj wszystko tak, aby były obecne maksymalnie 3 poziomy zagnieżdżonych folderów.
+ <string name="MarketplaceLive">
+ na liście
</string>
- <string name="Marketplace Error Unsellable Item">
- Błąd: Ta pozycja nie może być sprzedana na Marketplace.
+ <string name="MarketplaceActive">
+ aktywne
+ </string>
+ <string name="MarketplaceMax">
+ maks
+ </string>
+ <string name="MarketplaceStock">
+ magazyn
</string>
- <string name="Marketplace Error Internal Import">
- Błąd: Wystąpił problem z tą pozycją. Spróbuj ponownie później.
+ <string name="MarketplaceNoStock">
+ brak w Magazynie
+ </string>
+ <string name="MarketplaceUpdating">
+ aktualizacja...
+ </string>
+ <string name="UploadFeeInfo">
+ Opłata zależy od Twojego poziomu członkostwa. Wyższe poziomy to niższe opłaty. [https://secondlife.com/my/account/membership.php? Więcej]
</string>
<string name="Open landmarks">
Otwórz landmarki
@@ -1445,6 +1623,7 @@ Spróbuj zalogować się ponownie za minutę.
<string name="Scripts" value=" Skrypty,"/>
<string name="Sounds" value=" Dźwięki,"/>
<string name="Textures" value=" Tekstury,"/>
+ <string name="Settings" value=" Otoczenia," />
<string name="Snapshots" value=" Zdjęcia,"/>
<string name="No Filters" value="Nie "/>
<string name="Since Logoff" value=" - od wylogowania"/>
@@ -1614,7 +1793,7 @@ Spróbuj zalogować się ponownie za minutę.
Usta
</string>
<string name="Chin">
- Szczęka
+ Podbródek
</string>
<string name="Left Ear">
Lewe ucho
@@ -1676,6 +1855,51 @@ Spróbuj zalogować się ponownie za minutę.
<string name="Avatar Center">
Środek awatara
</string>
+ <string name="Left Ring Finger">
+ Lewy palec serdeczny
+ </string>
+ <string name="Right Ring Finger">
+ Prawy palec serdeczny
+ </string>
+ <string name="Tail Base">
+ Podstawa ogona
+ </string>
+ <string name="Tail Tip">
+ Koniec ogona
+ </string>
+ <string name="Left Wing">
+ Lewe skrzydło
+ </string>
+ <string name="Right Wing">
+ Prawe skrzydło
+ </string>
+ <string name="Jaw">
+ Szczęka
+ </string>
+ <string name="Alt Left Ear">
+ Lewe ucho 2
+ </string>
+ <string name="Alt Right Ear">
+ Prawe ucho 2
+ </string>
+ <string name="Alt Left Eye">
+ Lewe oko 2
+ </string>
+ <string name="Alt Right Eye">
+ Prawe oko 2
+ </string>
+ <string name="Tongue">
+ Język
+ </string>
+ <string name="Groin">
+ Krocze
+ </string>
+ <string name="Left Hind Foot">
+ Lewa tylna stopa
+ </string>
+ <string name="Right Hind Foot">
+ Prawa tylna stopa
+ </string>
<string name="Invalid Attachment">
Nieprawidłowy punkt dodatku
</string>
@@ -1706,6 +1930,42 @@ Spróbuj zalogować się ponownie za minutę.
<string name="TodayOld">
Dołączył dzisiaj
</string>
+ <string name="av_render_everyone_now">
+ Wszyscy mogą Cię obecnie widzieć.
+ </string>
+ <string name="av_render_not_everyone">
+ Możesz nie być widziany/a przez niektóre osoby wokół Ciebie.
+ </string>
+ <string name="av_render_over_half">
+ Możesz nie być widziany/a przez ponad połowę osób wokół Ciebie.
+ </string>
+ <string name="av_render_most_of">
+ Możesz nie być widziany/a przez większość osób wokół Ciebie.
+ </string>
+ <string name="av_render_anyone">
+ Wszystkie osoby znajdujące się wokół Ciebie nie mogą Cię widzieć.
+ </string>
+ <string name="hud_description_total">
+ Twój HUD
+ </string>
+ <string name="hud_name_with_joint">
+ [OBJ_NAME] (założone na [JNT_NAME])
+ </string>
+ <string name="hud_render_memory_warning">
+ [HUD_DETAILS] używa dużo pamięci tekstur
+ </string>
+ <string name="hud_render_cost_warning">
+ [HUD_DETAILS] zawiera dużo obiektów i tekstur, jakie są ciężkie w renderowaniu
+ </string>
+ <string name="hud_render_heavy_textures_warning">
+ [HUD_DETAILS] zawiera dużo tekstur w wielkich rozmiarach
+ </string>
+ <string name="hud_render_cramped_warning">
+ [HUD_DETAILS] zawiera zbyt dużo obiektów
+ </string>
+ <string name="hud_render_textures_warning">
+ [HUD_DETAILS] zawiera zbyt dużo tekstur
+ </string>
<string name="AgeYearsA">
[COUNT] rok
</string>
@@ -1764,10 +2024,10 @@ Spróbuj zalogować się ponownie za minutę.
Pracownik Linden Lab
</string>
<string name="PaymentInfoUsed">
- Płatności: Dane użyte
+ Płatności: Dane w użyciu
</string>
<string name="PaymentInfoOnFile">
- Płatności: Dane znane
+ Płatności: Dane przypisane
</string>
<string name="NoPaymentInfoOnFile">
Płatności: Dane nieznane
@@ -1823,6 +2083,9 @@ Spróbuj zalogować się ponownie za minutę.
<string name="CompileQueueUnknownFailure">
Nieznany błąd podczas pobierania
</string>
+ <string name="CompileNoExperiencePerm">
+ Pomijanie skryptu [SCRIPT] z Przygodą [EXPERIENCE].
+ </string>
<string name="CompileQueueTitle">
Postęp rekompilacji
</string>
@@ -1857,11 +2120,14 @@ Spróbuj zalogować się ponownie za minutę.
Zapisywanie zakończone.
</string>
<string name="UploadFailed">
- Ładowanie nieudane:
+ Przesyłanie nieudane:
</string>
<string name="ObjectOutOfRange">
Skrypt (obiekt poza zasięgiem)
</string>
+ <string name="ScriptWasDeleted">
+ Skrypt (usunięty z zawartości obiektu)
+ </string>
<string name="GodToolsObjectOwnedBy">
Obiekt [OBJECT] należący do [OWNER]
</string>
@@ -1894,6 +2160,9 @@ Spróbuj zalogować się ponownie za minutę.
<string name="NoGroupDataFound">
Brak informacji na temat grupy
</string>
+ <string name="AlreadyInGroup">
+ Jesteś już w tej grupie
+ </string>
<string name="IMParentEstate">
majątek rodziców
</string>
@@ -1916,22 +2185,34 @@ Spróbuj zalogować się ponownie za minutę.
wszystkie majątki, które nadzorujesz dla [OWNER]
</string>
<string name="RegionInfoAllowedResidents">
- Dozwoleni Rezydenci: ([ALLOWEDAGENTS], maks. [MAXACCESS])
+ Zawsze dozwoleni: ([ALLOWEDAGENTS], maks. [MAXACCESS])
</string>
<string name="RegionInfoAllowedGroups">
- Dozwolone Grupy: ([ALLOWEDGROUPS], maks. [MAXACCESS])
+ Zawsze dozwolone grupy: ([ALLOWEDGROUPS], maks. [MAXACCESS])
</string>
<string name="RegionInfoEstateManagers">
Zarządcy Majątku: ([ESTATEMANAGERS], maks. [MAXMANAGERS])
</string>
<string name="RegionInfoBannedResidents">
- Zbanowani Rezydenci: ([BANNEDAGENTS], maks. [MAXBANNED])
+ Zawsze zbanowani: ([BANNEDAGENTS], maks. [MAXBANNED])
</string>
<string name="RegionInfoListTypeAllowedAgents">
- Dozwoleni Rezydenci
+ zawsze dozwoleni rezydenci
</string>
<string name="RegionInfoListTypeBannedAgents">
- Zbanowani Rezydenci
+ zawsze zbanowani rezydenci
+ </string>
+ <string name="RegionInfoAllEstates">
+ wszystkie majątki
+ </string>
+ <string name="RegionInfoManagedEstates">
+ zarządzane majątki
+ </string>
+ <string name="RegionInfoThisEstate">
+ ten majątek
+ </string>
+ <string name="AndNMore">
+ i [EXTRA_COUNT] więcej
</string>
<string name="ScriptLimitsParcelScriptMemory">
Pamięć skryptów działki
@@ -1976,7 +2257,7 @@ Spróbuj zalogować się ponownie za minutę.
Klatka piersiowa
</string>
<string name="ATTACH_HEAD">
- Głowa
+ Czaszka
</string>
<string name="ATTACH_LSHOULDER">
Lewe ramię
@@ -1997,7 +2278,7 @@ Spróbuj zalogować się ponownie za minutę.
Prawa stopa
</string>
<string name="ATTACH_BACK">
- Plecy
+ Kręgosłup
</string>
<string name="ATTACH_PELVIS">
Miednica
@@ -2027,13 +2308,13 @@ Spróbuj zalogować się ponownie za minutę.
Prawe górne ramię
</string>
<string name="ATTACH_RLARM">
- Prawe dolne ramię
+ Prawe przedramię
</string>
<string name="ATTACH_LUARM">
Lewe górne ramię
</string>
<string name="ATTACH_LLARM">
- Lewe dolne ramię
+ Lewe przedramię
</string>
<string name="ATTACH_RHIP">
Biodro prawe
@@ -2056,12 +2337,12 @@ Spróbuj zalogować się ponownie za minutę.
<string name="ATTACH_BELLY">
Brzuch
</string>
- <string name="ATTACH_RPEC">
- Prawa pierś
- </string>
- <string name="ATTACH_LPEC">
+ <string name="ATTACH_LEFT_PEC">
Lewa pierś
</string>
+ <string name="ATTACH_RIGHT_PEC">
+ Prawa pierś
+ </string>
<string name="ATTACH_HUD_CENTER_2">
HUD środek 2
</string>
@@ -2092,6 +2373,51 @@ Spróbuj zalogować się ponownie za minutę.
<string name="ATTACH_AVATAR_CENTER">
Środek awatara
</string>
+ <string name="ATTACH_LHAND_RING1">
+ Lewy palec serdeczny
+ </string>
+ <string name="ATTACH_RHAND_RING1">
+ Prawy palec serdeczny
+ </string>
+ <string name="ATTACH_TAIL_BASE">
+ Podstawa ogona
+ </string>
+ <string name="ATTACH_TAIL_TIP">
+ Koniec ogona
+ </string>
+ <string name="ATTACH_LWING">
+ Lewe skrzydło
+ </string>
+ <string name="ATTACH_RWING">
+ Prawe skrzydło
+ </string>
+ <string name="ATTACH_FACE_JAW">
+ Szczęka
+ </string>
+ <string name="ATTACH_FACE_LEAR">
+ Lewe ucho 2
+ </string>
+ <string name="ATTACH_FACE_REAR">
+ Prawe ucho 2
+ </string>
+ <string name="ATTACH_FACE_LEYE">
+ Lewe oko 2
+ </string>
+ <string name="ATTACH_FACE_REYE">
+ Prawe oko 2
+ </string>
+ <string name="ATTACH_FACE_TONGUE">
+ Język
+ </string>
+ <string name="ATTACH_GROIN">
+ Krocze
+ </string>
+ <string name="ATTACH_HIND_LFOOT">
+ Lewa tylna stopa
+ </string>
+ <string name="ATTACH_HIND_RFOOT">
+ Prawa tylna stopa
+ </string>
<string name="CursorPos">
Linia [LINE], Kolumna [COLUMN]
</string>
@@ -2129,7 +2455,7 @@ Spróbuj zalogować się ponownie za minutę.
Brak umowy dla tego majątku.
</string>
<string name="RegionNoCovenantOtherOwner">
- Brak umowy dla tego majątku. Działka w tym majątku została sprzedana przez właściciela majątku, a nie przez Linden Lab. Skontaktuj się z właścicielem majątku w celu uzyskania szczegółów sprzedaży.
+ Brak umowy dla tego majątku. Działka w tym majątku została sprzedana przez właściciela majątku. Skontaktuj się z właścicielem majątku w celu uzyskania szczegółów sprzedaży.
</string>
<string name="covenant_last_modified" value="Ostatnia modyfikacja: "/>
<string name="none_text" value=" (brak) "/>
@@ -2146,6 +2472,27 @@ Spróbuj zalogować się ponownie za minutę.
<string name="RegionSettings">
Ustawienia regionu
</string>
+ <string name="NoEnvironmentSettings">
+ Ten region nie obsługuje ustawień otoczenia.
+ </string>
+ <string name="EnvironmentSun">
+ Słońce
+ </string>
+ <string name="EnvironmentMoon">
+ Księżyc
+ </string>
+ <string name="EnvironmentBloom">
+ Blask
+ </string>
+ <string name="EnvironmentCloudNoise">
+ Szum chmur
+ </string>
+ <string name="EnvironmentNormalMap">
+ Mapa normalnych
+ </string>
+ <string name="EnvironmentTransparent">
+ Przezroczyste
+ </string>
<string name="ClassifiedClicksTxt">
Kliknij: [TELEPORT] teleportuj, [MAP] mapa, [PROFILE] profil
</string>
@@ -2153,11 +2500,23 @@ Spróbuj zalogować się ponownie za minutę.
(zostanie zaktualizowane po publikacji)
</string>
<string name="NoPicksClassifiedsText">
- Nie dodałeś/aś nic do Ulubionych i Reklam. Kliknij na przycisk + poniżej, aby dodać miejsce do Ulubionych lub Reklam.
+ Nie dodano nic do Miejsc i Reklam. Kliknij na przycisk Nowe, aby utworzyć Miejsce lub Reklamę.
+ </string>
+ <string name="NoPicksText">
+ Nie dodano żadnych Miejsc. Kliknij na przycisk Nowe, aby utworzyć Miejsce.
+ </string>
+ <string name="NoClassifiedsText">
+ Nie dodano żadnych reklam. Kliknij na przycisk Nowa, aby utworzyć reklamę.
</string>
<string name="NoAvatarPicksClassifiedsText">
Brak ulubionych miejsc/reklam
</string>
+ <string name="NoAvatarPicksText">
+ Brak ulubionych miejsc
+ </string>
+ <string name="NoAvatarClassifiedsText">
+ Brak reklam
+ </string>
<string name="PicksClassifiedsLoadingText">
Ładowanie...
</string>
@@ -2228,14 +2587,11 @@ Spróbuj zalogować się ponownie za minutę.
Anuluj
</string>
<string name="UploadingCosts">
- Załadowanie [NAME] kosztuje [AMOUNT]L$
- </string>
- <string name="BuyingCosts">
- Cena zakupu tego wynosi [AMOUNT]L$
+ Przesyłanie [NAME] kosztuje [AMOUNT]L$
</string>
<string name="UnknownFileExtension">
Nieznane rozszerzenie pliku .%s
-Oczekiwane .wav, .tga, .bmp, .jpg, .jpeg, lub .bvh
+Oczekiwane .wav, .tga, .bmp, .jpg, .jpeg, lub .anim
</string>
<string name="MuteObject2">
Zablokuj
@@ -2327,6 +2683,9 @@ Oczekiwane .wav, .tga, .bmp, .jpg, .jpeg, lub .bvh
<string name="Linden Location">
Lokalizacja Lindenów
</string>
+ <string name="Adult">
+ Dla dorosłych
+ </string>
<string name="Arts&amp;Culture">
Sztuka i Kultura
</string>
@@ -2383,7 +2742,7 @@ Błąd:
<string name="MBUnableToAccessFile">
Aplikacja [APP_NAME] nie odnalazła poszukiwanego pliku.
-Może być to spowodowane aktywnością kilku kopii oprogramowania w tej samej chwili lub Twój system błędnie odczytuje proces zakończenia dla uruchomionych aplikacji.
+Może być to spowodowane aktywnością kilku kopii oprogramowania w tej samej chwili lub Twój system błędnie uważa, że plik jest otwarty / zablokowany.
Jeżeli nadal otrzymujesz ten komunikat, uruchom swój komputer ponownie.
Jeżeli problem nadal występuje, proponujemy całkowite odinstalowanie aplikacji [APP_NAME] oraz ponowną jej instalację.
</string>
@@ -2448,7 +2807,7 @@ Uruchomione w oknie.
Ustaw tryb koloru swojego wyświetlacza na 32-bity.
</string>
<string name="MBAlpha">
- Aplikacja [APP_NAME] nie może zostać uruchomiona, ponieważ nie jest możliwe dostanie się na kanał 8 bitowy alpha. Najczęściej jest to spowodowane błędami sterowników karty video.
+ Aplikacja [APP_NAME] nie może zostać uruchomiona, ponieważ nie może uzyskać dostępu do 8 bitowego kanału alpha. Najczęściej jest to spowodowane błędami sterowników karty video.
Upewnij się, że posiadasz najnowsze aktualizacje sterowników karty video.
Dodatkowo, sprawdź czy Twój monitor posiada poprawną konfigurację koloru (32-bity) w Panel Sterowania &gt; Ekran &gt; Ustawienia.
Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
@@ -2467,7 +2826,7 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
</string>
- <string name="5 O&apos;Clock Shadow">
+ <string name="5 O'Clock Shadow">
Cień na godzinie 5
</string>
<string name="All White">
@@ -3997,9 +4356,6 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
<string name="IM_to_label">
Do
</string>
- <string name="IM_moderator_label">
- (Moderator)
- </string>
<string name="Saved_message">
(Zapisano [LONG_TIMESTAMP])
</string>
@@ -4012,6 +4368,12 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
<string name="OfflineStatus">
niedostępny/a
</string>
+ <string name="not_online_msg">
+ Ta osoba jest niedostępna - wiadomość zostanie zapisana i dostarczona później.
+ </string>
+ <string name="not_online_inventory">
+ Ta osoba jest niedostępna - przedmiot został zapisany.
+ </string>
<string name="answered_call">
Twoja rozmowa głosowa została odebrana
</string>
@@ -4046,20 +4408,14 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Konferencja z [AGENT_NAME]
</string>
<string name="inventory_item_offered-im">
- Zaoferowano przedmiot
+ Zaoferowano przedmiot: '[ITEM_NAME]'
+ </string>
+ <string name="inventory_folder_offered-im">
+ Zaoferowano folder: '[ITEM_NAME]'
</string>
<string name="share_alert">
Przeciągaj tutaj rzeczy z Szafy
</string>
- <string name="facebook_post_success">
- Wysłałeś/aś post na Facebooka.
- </string>
- <string name="flickr_post_success">
- Wysłałeś/aś post na Flickr.
- </string>
- <string name="twitter_post_success">
- Wysłałeś/aś post na Twittera.
- </string>
<string name="no_session_message">
(Sesja IM wygasła)
</string>
@@ -4076,10 +4432,10 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Zablokowałeś/aś tego Rezydenta. Wysłanie wiadomości odblokuje go automatycznie.
</string>
<string name="generic">
- Błąd zapytania, proszę spróbować później
+ Zamknij i ponownie otwórz rozmowę - lub przeloguj się i spróbuj ponownie.
</string>
<string name="generic_request_error">
- Błąd. Spróbuj ponownie za kilka minut.
+ Zamknij i ponownie otwórz rozmowę - lub przeloguj się i spróbuj ponownie.
</string>
<string name="insufficient_perms_error">
Nie masz wystarczających uprawnień.
@@ -4131,6 +4487,9 @@ Jeśli nie pojawi się w ciągu kilku minut może to oznaczać, że została pom
<string name="unread_chat_multiple">
[SOURCES] powiedział/a coś nowego
</string>
+ <string name="teleport_preamble_compact_chat">
+ Jesteś teraz w
+ </string>
<string name="session_initialization_timed_out_error">
Inicjalizacja sesji wygasła
</string>
@@ -4140,12 +4499,18 @@ Jeśli nie pojawi się w ciągu kilku minut może to oznaczać, że została pom
<string name="paid_you_ldollars">
[NAME] zapłacił/a Tobie [AMOUNT]L$ [REASON].
</string>
+ <string name="paid_you_ldollars_gift">
+ [NAME] zapłacił/a Tobie [AMOUNT]L$: [REASON]
+ </string>
<string name="paid_you_ldollars_no_reason">
[NAME] zapłacił/a Tobie [AMOUNT]L$.
</string>
<string name="you_paid_ldollars">
Zapłacono [NAME] [AMOUNT]L$ [REASON].
</string>
+ <string name="you_paid_ldollars_gift">
+ Zapłacono [NAME] [AMOUNT]L$: [REASON]
+ </string>
<string name="you_paid_ldollars_no_info">
Zapłacono [AMOUNT]L$.
</string>
@@ -4158,6 +4523,9 @@ Jeśli nie pojawi się w ciągu kilku minut może to oznaczać, że została pom
<string name="you_paid_failure_ldollars">
Nie udało się zapłacić [NAME] [AMOUNT]L$ [REASON].
</string>
+ <string name="you_paid_failure_ldollars_gift">
+ Nie udało się zapłacić [NAME] [AMOUNT]L$: [REASON]
+ </string>
<string name="you_paid_failure_ldollars_no_info">
Nie udało się zapłacić [AMOUNT]L$.
</string>
@@ -4186,25 +4554,25 @@ Jeśli nie pojawi się w ciągu kilku minut może to oznaczać, że została pom
aby dołączyć do grupy
</string>
<string name="to upload">
- aby załadować
+ aby przesłać
</string>
<string name="to publish a classified ad">
publikacja reklamy
</string>
- <string name="giving">
- Dajesz [AMOUNT]L$
- </string>
<string name="uploading_costs">
- Ładowanie kosztuje [AMOUNT]L$
+ Przesyłanie kosztuje [AMOUNT]L$
</string>
<string name="this_costs">
To kosztuje [AMOUNT]L$
</string>
<string name="buying_selected_land">
- Kupno wybranej działki za [AMOUNT]L$
+ Działka kosztuje
</string>
<string name="this_object_costs">
- Ten obiekt kosztuje [AMOUNT]L$
+ Obiekt kosztuje
+ </string>
+ <string name="giving">
+ Chcesz dać
</string>
<string name="group_role_everyone">
Każdy
@@ -4219,7 +4587,7 @@ Jeśli nie pojawi się w ciągu kilku minut może to oznaczać, że została pom
Obecnie w SL
</string>
<string name="uploading_abuse_report">
- Ładowanie...
+ Przesyłanie...
Raport o Nadużyciu
</string>
@@ -4268,6 +4636,9 @@ Raport o Nadużyciu
<string name="New Tattoo">
Nowy tatuaż
</string>
+ <string name="New Universal">
+ Nowa warstwa uniwersalna
+ </string>
<string name="New Physics">
Nowa fizyka
</string>
@@ -4394,6 +4765,15 @@ Raport o Nadużyciu
<string name="Female - Wow">
Kobieta - Wow
</string>
+ <string name="New Day">
+ Nowy cykl dnia
+ </string>
+ <string name="New Water">
+ Nowa woda
+ </string>
+ <string name="New Sky">
+ Nowe niebo
+ </string>
<string name="AvatarBirthDateFormat">
[day,datetime,slt].[mthnum,datetime,slt].[year,datetime,slt]
</string>
@@ -4403,10 +4783,19 @@ Raport o Nadużyciu
<string name="texture_load_dimensions_error">
Nie można załadować obrazów większych niż [WIDTH]*[HEIGHT]
</string>
+ <string name="outfit_photo_load_dimensions_error">
+ Maks. rozmiar zdjęcia stroju to [WIDTH]*[HEIGHT]. Przeskaluj lub użyj innego.
+ </string>
+ <string name="outfit_photo_select_dimensions_error">
+ Maks. rozmiar zdjęcia stroju to [WIDTH]*[HEIGHT]. Użyj innej tekstury.
+ </string>
+ <string name="outfit_photo_verify_dimensions_error">
+ Nie można sprawdzić wymiarów zdjęcia. Poczekaj, aż pojawi się na podglądzie.
+ </string>
<string name="server_is_down">
Pomimo naszych najlepszych starań wystąpił niespodziewany problem.
-Proszę sprawdzić czy na stronie status.secondlifegrid.net nie zostały umieszczone informacje o rozpoznanych problemach serwera.
+Proszę sprawdzić czy na https://status.secondlifegrid.net nie zostały umieszczone informacje o rozpoznanych problemach serwera.
Jeśli problemy będą występowały nadal, proszę sprawdź sieć i ustawienia firewall.
</string>
<string name="dateTimeWeekdaysNames">
@@ -4466,6 +4855,18 @@ Jeśli problemy będą występowały nadal, proszę sprawdź sieć i ustawienia
<string name="Chat">
Czat
</string>
+ <string name="BaseMembership">
+ Podstawowe
+ </string>
+ <string name="InternalMembership">
+ Wewnętrzne
+ </string>
+ <string name="MembershipUpgradeText">
+ Zmień plan członkostwa
+ </string>
+ <string name="MembershipPremiumText">
+ Moje członkostwo Premium
+ </string>
<string name="DeleteItems">
Usunąć zaznaczone obiekty?
</string>
@@ -4476,7 +4877,7 @@ Jeśli problemy będą występowały nadal, proszę sprawdź sieć i ustawienia
W tym stroju nie ma elementów
</string>
<string name="ExternalEditorNotSet">
- Wybierz edytor używając ustawień ExternalEditor.
+ Wybierz edytor poprzez ustawienie zmiennej środowiska LL_SCRIPT_EDITOR lub ustawienie ExternalEditor.
</string>
<string name="ExternalEditorNotFound">
Nie odnaleziono zewnętrznego edytora wskazanego przez Ciebie.
@@ -4507,6 +4908,24 @@ Spróbuj załączyć ścieżkę do edytora w cytowaniu.
<string name="Divide">
Podziel
</string>
+ <string name="LMB">
+ LPM
+ </string>
+ <string name="MMB">
+ ŚPM
+ </string>
+ <string name="RMB">
+ PPM
+ </string>
+ <string name="MB4">
+ Mysz4
+ </string>
+ <string name="MB5">
+ Mysz5
+ </string>
+ <string name="Double LMB">
+ Podwójny LPM
+ </string>
<string name="BeaconParticle">
Emitery cząsteczek (niebieski)
</string>
@@ -4525,9 +4944,18 @@ Spróbuj załączyć ścieżkę do edytora w cytowaniu.
<string name="BeaconMedia">
Emitery mediów (biały)
</string>
+ <string name="BeaconSun">
+ Emiter kierunku Słońca (pomarańczowy)
+ </string>
+ <string name="BeaconMoon">
+ Emiter kierunku Księżyca (purpurowy)
+ </string>
<string name="ParticleHiding">
Ukryj cząsteczki
</string>
+ <string name="Command_360_Capture_Label">
+ Zdjęcie 360°
+ </string>
<string name="Command_AboutLand_Label">
O działce
</string>
@@ -4535,7 +4963,7 @@ Spróbuj załączyć ścieżkę do edytora w cytowaniu.
Wygląd
</string>
<string name="Command_Avatar_Label">
- Awatar
+ Biblioteka awatarów
</string>
<string name="Command_Build_Label">
Buduj
@@ -4552,9 +4980,15 @@ Spróbuj załączyć ścieżkę do edytora w cytowaniu.
<string name="Command_Destinations_Label">
Cele podróży
</string>
+ <string name="Command_Environments_Label">
+ Otoczenia
+ </string>
<string name="Command_Gestures_Label">
Gesty
</string>
+ <string name="Command_Grid_Status_Label">
+ Status świata
+ </string>
<string name="Command_HowTo_Label">
Samouczek
</string>
@@ -4564,18 +4998,12 @@ Spróbuj załączyć ścieżkę do edytora w cytowaniu.
<string name="Command_Map_Label">
Mapa
</string>
- <string name="Command_Marketplace_Label">
- Marketplace
- </string>
<string name="Command_MiniMap_Label">
Minimapa
</string>
<string name="Command_Move_Label">
Ruch
</string>
- <string name="Command_Outbox_Label">
- Skrzynka nadawcza kupca
- </string>
<string name="Command_People_Label">
Ludzie
</string>
@@ -4591,6 +5019,9 @@ Spróbuj załączyć ścieżkę do edytora w cytowaniu.
<string name="Command_Profile_Label">
Profil
</string>
+ <string name="Command_Report_Abuse_Label">
+ Zgłoś nadużycie
+ </string>
<string name="Command_Search_Label">
Szukaj
</string>
@@ -4606,6 +5037,9 @@ Spróbuj załączyć ścieżkę do edytora w cytowaniu.
<string name="Command_Voice_Label">
Pobliski głos
</string>
+ <string name="Command_360_Capture_Tooltip">
+ Uchwyć równoprostokątny obraz 360°
+ </string>
<string name="Command_AboutLand_Tooltip">
Informacje o miejscu, które odwiedzasz
</string>
@@ -4630,15 +5064,15 @@ Spróbuj załączyć ścieżkę do edytora w cytowaniu.
<string name="Command_Destinations_Tooltip">
Punkty, jakie mogą być interesujące
</string>
- <string name="Command_Facebook_Tooltip">
- Wyślij na Facebooka
- </string>
- <string name="Command_Flickr_Tooltip">
- Wyślij na Flickr
+ <string name="Command_Environments_Tooltip">
+ Otoczenia
</string>
<string name="Command_Gestures_Tooltip">
Gesty Twojego awatara
</string>
+ <string name="Command_Grid_Status_Tooltip">
+ Pokaż obecny status świata
+ </string>
<string name="Command_HowTo_Tooltip">
Jak wykonywać zwyczajne rzeczy
</string>
@@ -4651,15 +5085,15 @@ Spróbuj załączyć ścieżkę do edytora w cytowaniu.
<string name="Command_Marketplace_Tooltip">
Idź na zakupy
</string>
+ <string name="Command_MarketplaceListings_Tooltip">
+ Sprzedawaj owoce swojej kreatywności
+ </string>
<string name="Command_MiniMap_Tooltip">
Pokaż ludzi w pobliżu
</string>
<string name="Command_Move_Tooltip">
Poruszanie Twoim awatarem
</string>
- <string name="Command_Outbox_Tooltip">
- Przenieś przedmioty na Marketplace, aby je sprzedać
- </string>
<string name="Command_People_Tooltip">
Znajomi, grupy i ludzie w pobliżu
</string>
@@ -4675,6 +5109,9 @@ Spróbuj załączyć ścieżkę do edytora w cytowaniu.
<string name="Command_Profile_Tooltip">
Edytuj lub zobacz swój profil
</string>
+ <string name="Command_Report_Abuse_Tooltip">
+ Zgłoś nadużycie
+ </string>
<string name="Command_Search_Tooltip">
Znajdź miejsca, wydarzenia i ludzi
</string>
@@ -4756,6 +5193,99 @@ Spróbuj załączyć ścieżkę do edytora w cytowaniu.
<string name="UserDictionary">
[Użytkownika]
</string>
+ <string name="experience_tools_experience">
+ Przygoda
+ </string>
+ <string name="ExperienceNameNull">
+ (bez przygody)
+ </string>
+ <string name="ExperienceNameUntitled">
+ (przygoda bez nazwy)
+ </string>
+ <string name="Land-Scope">
+ Zakres: Ziemia
+ </string>
+ <string name="Grid-Scope">
+ Zakres: Cały świat
+ </string>
+ <string name="Allowed_Experiences_Tab">
+ ZEZWALAM
+ </string>
+ <string name="Blocked_Experiences_Tab">
+ BLOKUJĘ
+ </string>
+ <string name="Contrib_Experiences_Tab">
+ TWORZĘ
+ </string>
+ <string name="Admin_Experiences_Tab">
+ ZARZĄDZAM
+ </string>
+ <string name="Recent_Experiences_Tab">
+ OSTATNIE
+ </string>
+ <string name="Owned_Experiences_Tab">
+ MOJE
+ </string>
+ <string name="ExperiencesCounter">
+ ([EXPERIENCES], maks. [MAXEXPERIENCES])
+ </string>
+ <string name="ExperiencePermission1">
+ kontrolować klawisze
+ </string>
+ <string name="ExperiencePermission3">
+ animować Twojego awatara
+ </string>
+ <string name="ExperiencePermission4">
+ dołączać do Twojego awatara
+ </string>
+ <string name="ExperiencePermission9">
+ śledzić Twoją kamerę
+ </string>
+ <string name="ExperiencePermission10">
+ kontrolować Twoją kamerę
+ </string>
+ <string name="ExperiencePermission11">
+ teleportować Cię
+ </string>
+ <string name="ExperiencePermission12">
+ automatycznie akceptować uprawnienia przygody
+ </string>
+ <string name="ExperiencePermission16">
+ zmuszać Twojego awatara do siadania
+ </string>
+ <string name="ExperiencePermission17">
+ zmieniać Twoje ustawienia otoczenia
+ </string>
+ <string name="ExperiencePermissionShortUnknown">
+ wykonać nieznaną operację: [Permission]
+ </string>
+ <string name="ExperiencePermissionShort1">
+ Kontrola klawiszy
+ </string>
+ <string name="ExperiencePermissionShort3">
+ Rozpoczynanie animacji
+ </string>
+ <string name="ExperiencePermissionShort4">
+ Dołączanie
+ </string>
+ <string name="ExperiencePermissionShort9">
+ Śledzenie kamery
+ </string>
+ <string name="ExperiencePermissionShort10">
+ Kontrola kamery
+ </string>
+ <string name="ExperiencePermissionShort11">
+ Teleportacja
+ </string>
+ <string name="ExperiencePermissionShort12">
+ Uprawnienia
+ </string>
+ <string name="ExperiencePermissionShort16">
+ Siadanie
+ </string>
+ <string name="ExperiencePermissionShort17">
+ Otoczenie
+ </string>
<string name="logging_calls_disabled_log_empty">
Rozmowy nie są zapisywane do dziennika. Jeśli chcesz zacząć je logować wybierz "Zapisywanie: tylko dziennik" lub "Zapisywanie: dziennik i logi rozmów" w Preferencje > Czat.
</string>
@@ -4768,4 +5298,52 @@ Spróbuj załączyć ścieżkę do edytora w cytowaniu.
<string name="loading_chat_logs">
Wczytywanie...
</string>
+ <string name="na">
+ n/d
+ </string>
+ <string name="preset_combo_label">
+ -Lista jest pusta-
+ </string>
+ <string name="Default">
+ Domyślne
+ </string>
+ <string name="none_paren_cap">
+ (Brak)
+ </string>
+ <string name="no_limit">
+ Bez limitu
+ </string>
+ <string name="Mav_Details_MAV_FOUND_DEGENERATE_TRIANGLES">
+ Kształt fizyczny zawiera trójkąty, które są zbyt małe. Spróbuj uprościć model fizyczny.
+ </string>
+ <string name="Mav_Details_MAV_CONFIRMATION_DATA_MISMATCH">
+ Kształt fizyczny zawiera uszkodzone dane. Spróbuj poprawić model fizyczny.
+ </string>
+ <string name="Mav_Details_MAV_BLOCK_MISSING">
+ Brakujące dane. Upewnij się, że wysoki LOD jest obecny i prawidłowy. Ustaw model fizyczny, jeśli nie jest obecny.
+ </string>
+ <string name="Mav_Details_MAV_UNKNOWN_VERSION">
+ Kształt fizyczny zawiera niepoprawną wersję. Ustaw poprawną wersję dla modelu fizycznego.
+ </string>
+ <string name="couldnt_resolve_host">
+ DNS nie mógł znaleźć nazwy hosta ([HOSTNAME]).
+Sprawdź, czy możesz połączyć się z www.secondlife.com
+Jeśli możesz, ale nadal otrzymujesz ten błąd, to przejdź
+do sekcji pomocy technicznej i zgłoś ten problem.
+ </string>
+ <string name="ssl_peer_certificate">
+ Serwer logowania nie mógł zweryfikować się poprzez SSL.
+Jeśli nadal będziesz otrzymywać ten błąd, to przejdź
+do sekcji wsparcia witryny SecondLife.com i zgłoś problem.
+ </string>
+ <string name="ssl_connect_error">
+ Często oznacza to, że zegar komputera jest ustawiony nieprawidłowo.
+Przejdź do Panelu Sterowania i upewnij się, że godzina i data
+są ustawione prawidłowo.
+Sprawdź również, czy twoja sieć i zapora są poprawnie skonfigurowane.
+Jeśli nadal będziesz otrzymywać ten błąd, to przejdź
+do sekcji wsparcia witryny SecondLife.com i zgłoś problem.
+
+[https://community.secondlife.com/knowledgebase/english/error-messages-r520/#Section__3 Knowledge Base]
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/pt/floater_chat_bar.xml b/indra/newview/skins/default/xui/pt/floater_chat_bar.xml
deleted file mode 100644
index 2eb2c94940..0000000000
--- a/indra/newview/skins/default/xui/pt/floater_chat_bar.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="nearby_chat" title="BATE-PAPO LOCAL">
- <panel name="bottom_panel">
- <line_editor label="Clique aqui para bater papo." name="chat_box" tool_tip="Tecle Enter para falar, Ctrl+Enter para gritar"/>
- <button name="show_nearby_chat" tool_tip="Mostra/oculta o histórico do bate-papo local"/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml
deleted file mode 100644
index 5f04c08531..0000000000
--- a/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="item properties" title="PROPRIEDADES DE ITEM NO INVENTÁRIO">
- <floater.string name="unknown">(desconhecido)</floater.string>
- <floater.string name="public">(público)</floater.string>
- <floater.string name="you_can">Você pode:</floater.string>
- <floater.string name="owner_can">Proprietário pode :</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">Nome:</text>
- <text name="LabelItemDescTitle">Descrição:</text>
- <text name="LabelCreatorTitle">Criador:</text>
- <button label="Perfil..." label_selected="" name="BtnCreator"/>
- <text name="LabelOwnerTitle">Dono:</text>
- <button label="Perfil..." label_selected="" name="BtnOwner"/>
- <text name="LabelAcquiredTitle">Adquirido:</text>
- <text name="LabelAcquiredDate">Qua Mai 24 12:50:46 2006</text>
- <text name="OwnerLabel">Você:</text>
- <check_box label="Editar" name="CheckOwnerModify"/>
- <check_box label="Copiar" name="CheckOwnerCopy"/>
- <check_box label="Revender" name="CheckOwnerTransfer"/>
- <text name="AnyoneLabel">Todos:</text>
- <check_box label="Cortar" name="CheckEveryoneCopy"/>
- <text name="GroupLabel">Grupo:</text>
- <check_box label="Compartilhar" name="CheckShareWithGroup"/>
- <text name="NextOwnerLabel" width="230">Próximo proprietário:</text>
- <check_box label="Editar" name="CheckNextOwnerModify"/>
- <check_box label="Copiar" name="CheckNextOwnerCopy"/>
- <check_box label="Revender" name="CheckNextOwnerTransfer"/>
- <check_box label="À venda" name="CheckPurchase"/>
- <combo_box name="ComboBoxSaleType">
- <combo_box.item label="Cortar" name="Copy"/>
- <combo_box.item label="Conteúdo" name="Contents"/>
- <combo_box.item label="Original" name="Original"/>
- </combo_box>
- <spinner label="Preço:" name="Edit Cost"/>
- <text name="CurrencySymbol">L$</text>
-</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_perm_prefs.xml b/indra/newview/skins/default/xui/pt/floater_perm_prefs.xml
deleted file mode 100644
index 33a0d6a456..0000000000
--- a/indra/newview/skins/default/xui/pt/floater_perm_prefs.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="perm prefs" title="PERMISSÕES PADRÃO DE UPLOAD">
- <panel label="Permissões" name="permissions">
- <button label="?" label_selected="?" name="help"/>
- <check_box label="Compartilhar com o grupo" name="share_with_group"/>
- <check_box label="Permitir que qualquer um copie" name="everyone_copy"/>
- <text name="NextOwnerLabel">
- O próximo dono pode:
- </text>
- <check_box label="Modificar" name="next_owner_modify"/>
- <check_box label="Copiar" name="next_owner_copy"/>
- <check_box label="Revender/Dar" name="next_owner_transfer"/>
- </panel>
- <button label="OK" label_selected="OK" name="ok"/>
- <button label="Cancelar" label_selected="Cancelar" name="cancel"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_voice_controls.xml b/indra/newview/skins/default/xui/pt/floater_voice_controls.xml
deleted file mode 100644
index 745a7d0e00..0000000000
--- a/indra/newview/skins/default/xui/pt/floater_voice_controls.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_voice_controls" title="CONTROLES DE VOZ">
- <string name="title_nearby">
- CONFIGURAÇÕES DE VOZ
- </string>
- <string name="title_group">
- LIGAÇÃO DE GRUPO COM [GROUP]
- </string>
- <string name="title_adhoc">
- TELECONFERÊNCIA
- </string>
- <string name="title_peer_2_peer">
- LIGAÇÃO PARA [NAME]
- </string>
- <string name="no_one_near">
- Ninguém por perto ativou a voz
- </string>
- <layout_stack name="my_call_stack">
- <layout_panel name="my_panel">
- <text name="user_text" value="Meu 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="Desligar" name="leave_call_btn"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml
deleted file mode 100644
index 2b5aa7508b..0000000000
--- a/indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="Ver perfil" name="view_profile"/>
- <menu_item_call label="Adicionar amigo..." name="add_friend"/>
- <menu_item_call label="MI" name="im"/>
- <menu_item_call label="Ligar" name="call"/>
- <menu_item_call label="Teletransportar" name="teleport"/>
- <menu_item_call label="Convidar para entrar no grupo" name="invite_to_group"/>
- <menu_item_call label="Bloquear" name="block"/>
- <menu_item_call label="Desbloquear" name="unblock"/>
- <menu_item_call label="Denunciar" name="report"/>
- <menu_item_call label="Congelar" name="freeze"/>
- <menu_item_call label="Ejetar" name="eject"/>
- <menu_item_call label="Chutar" name="kick"/>
- <menu_item_call label="CSR" name="csr"/>
- <menu_item_call label="Depurar texturas" name="debug"/>
- <menu_item_call label="Localizar no mapa" name="find_on_map"/>
- <menu_item_call label="Mais zoom" name="zoom_in"/>
- <menu_item_call label="Pagar" name="pay"/>
- <menu_item_call label="Compartilhar" name="share"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml
deleted file mode 100644
index e8fafa58a9..0000000000
--- a/indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="Sentar" name="Sit Down Here"/>
- <menu_item_call label="Ficar de pé" name="Stand Up"/>
- <context_menu label="Tirar" name="Take Off &gt;">
- <context_menu label="Roupa" name="Clothes &gt;">
- <menu_item_call label="Camisa" name="Shirt"/>
- <menu_item_call label="Calças" name="Pants"/>
- <menu_item_call label="Saia" name="Skirt"/>
- <menu_item_call label="Sapatos" name="Shoes"/>
- <menu_item_call label="Meias" name="Socks"/>
- <menu_item_call label="Jaqueta" name="Jacket"/>
- <menu_item_call label="Luvas" name="Gloves"/>
- <menu_item_call label="Camiseta" name="Self Undershirt"/>
- <menu_item_call label="Roupa de baixo" name="Self Underpants"/>
- <menu_item_call label="Tatuagem" name="Self Tattoo"/>
- <menu_item_call label="Alpha" name="Self Alpha"/>
- <menu_item_call label="Todas as roupas" name="All Clothes"/>
- </context_menu>
- <context_menu label="HUD" name="Object Detach HUD"/>
- <context_menu label="Separar" name="Object Detach"/>
- <menu_item_call label="Separar tudo" name="Detach All"/>
- </context_menu>
- <menu_item_call label="Trocar de look" name="Chenge Outfit"/>
- <menu_item_call label="Editar meu look" name="Edit Outfit"/>
- <menu_item_call label="Editar meu corpo" name="Edit My Shape"/>
- <menu_item_call label="Meus amigos" name="Friends..."/>
- <menu_item_call label="Meus grupos" name="Groups..."/>
- <menu_item_call label="Meu perfil" name="Profile..."/>
- <menu_item_call label="Depurar texturas" name="Debug..."/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_name_field.xml b/indra/newview/skins/default/xui/pt/menu_name_field.xml
deleted file mode 100644
index 2157de9813..0000000000
--- a/indra/newview/skins/default/xui/pt/menu_name_field.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="CopyMenu">
- <menu_item_call label="Exibir Cópia do Nome" name="copy_display"/>
- <menu_item_call label="Copiar Nome do Agente" name="copy_name"/>
- <menu_item_call label="Copiar Id do Agente" name="copy_id"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/pt/menu_people_friends_view_sort.xml
deleted file mode 100644
index e7c325010f..0000000000
--- a/indra/newview/skins/default/xui/pt/menu_people_friends_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Ordenar por nome" name="sort_name"/>
- <menu_item_check label="Ordenar por status" name="sort_status"/>
- <menu_item_check label="Ver ícones de pessoas" name="view_icons"/>
- <menu_item_check label="Autorizações de visualização dadas" name="view_permissions"/>
- <menu_item_call label="Ver residentes e objetos bloqueados" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/pt/menu_people_groups_view_sort.xml
deleted file mode 100644
index 86a9d2263f..0000000000
--- a/indra/newview/skins/default/xui/pt/menu_people_groups_view_sort.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Mostrar ícones de grupos" name="Display Group Icons"/>
- <menu_item_call label="Sair do grupo selecionado" name="Leave Selected Group"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/pt/menu_people_nearby_view_sort.xml
deleted file mode 100644
index 0d32d58de4..0000000000
--- a/indra/newview/skins/default/xui/pt/menu_people_nearby_view_sort.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_group_plus">
- <menu_item_check label="Ordenar por conversas mais recentes" name="sort_by_recent_speakers"/>
- <menu_item_check label="Ordenar por nome" name="sort_name"/>
- <menu_item_check label="Ordenar por distância" name="sort_distance"/>
- <menu_item_check label="Ver ícones de pessoas" name="view_icons"/>
- <menu_item_check label="Ver Mapa" name="view_map"/>
- <menu_item_call label="Ver residentes e objetos bloqueados" name="show_blocked_list"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/pt/menu_people_recent_view_sort.xml
deleted file mode 100644
index f3b89e01cd..0000000000
--- a/indra/newview/skins/default/xui/pt/menu_people_recent_view_sort.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_group_plus">
- <menu_item_check label="Ordenar por mais recente" name="sort_most"/>
- <menu_item_check label="Ordenar por nome" name="sort_name"/>
- <menu_item_check label="Ver ícones de pessoas" name="view_icons"/>
- <menu_item_call label="Ver residentes e objetos bloqueados" name="show_blocked_list"/>
-</menu>
diff --git a/indra/newview/skins/default/xui/pt/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/pt/panel_adhoc_control_panel.xml
deleted file mode 100644
index bd50d4953d..0000000000
--- a/indra/newview/skins/default/xui/pt/panel_adhoc_control_panel.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?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="Ligar" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Desligar" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Controles de voz" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_hair.xml b/indra/newview/skins/default/xui/pt/panel_edit_hair.xml
index 13f1f892f9..e9750a1c2e 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_hair.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_hair.xml
@@ -7,7 +7,7 @@
<accordion name="wearable_accordion">
<accordion_tab name="hair_color_tab" title="Cor"/>
<accordion_tab name="hair_style_tab" title="Estilo"/>
- <accordion_tab name="hair_eyebrows_tab" title="Sombrancelhas"/>
+ <accordion_tab name="hair_eyebrows_tab" title="Sobrancelhas"/>
<accordion_tab name="hair_facial_tab" title="Faciais"/>
</accordion>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_facebook_account.xml b/indra/newview/skins/default/xui/pt/panel_facebook_account.xml
deleted file mode 100644
index b449e7959d..0000000000
--- a/indra/newview/skins/default/xui/pt/panel_facebook_account.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<panel name="panel_facebook_account">
- <string name="facebook_connected" value="Você está conectado ao Facebook como:"/>
- <string name="facebook_disconnected" value="Não conectado ao Facebook"/>
- <text name="account_caption_label">
- Não conectado ao Facebook.
- </text>
- <panel name="panel_buttons">
- <button label="Conectar..." name="connect_btn"/>
- <button label="Desconectar" name="disconnect_btn"/>
- <text name="account_learn_more_label">
- [http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Share-Facebook/ta-p/2149711 Aprenda a publicar no Facebook]
- </text>
- </panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_group_control_panel.xml b/indra/newview/skins/default/xui/pt/panel_group_control_panel.xml
deleted file mode 100644
index 502dae8d67..0000000000
--- a/indra/newview/skins/default/xui/pt/panel_group_control_panel.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?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="Perfil do grupo" name="group_info_btn"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="Ligar para o grupo" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Desligar" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Abrir controles de voz" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_im_control_panel.xml b/indra/newview/skins/default/xui/pt/panel_im_control_panel.xml
deleted file mode 100644
index 91b7d1b7cd..0000000000
--- a/indra/newview/skins/default/xui/pt/panel_im_control_panel.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?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="Perfil" name="view_profile_btn"/>
- </layout_panel>
- <layout_panel name="add_friend_btn_panel">
- <button label="Adicionar amigo" name="add_friend_btn"/>
- </layout_panel>
- <layout_panel name="teleport_btn_panel">
- <button label="Teletransportar" name="teleport_btn" tool_tip="Oferecer teletransporte"/>
- </layout_panel>
- <layout_panel name="share_btn_panel">
- <button label="Compartilhar" name="share_btn"/>
- </layout_panel>
- <layout_panel name="pay_btn_panel">
- <button label="Pagar" name="pay_btn"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="Ligar" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Encerrar ligação" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Controles de voz" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_main_inventory.xml b/indra/newview/skins/default/xui/pt/panel_main_inventory.xml
index 009b5b3193..e0cf528468 100644
--- a/indra/newview/skins/default/xui/pt/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/pt/panel_main_inventory.xml
@@ -9,6 +9,7 @@
<panel.string name="ItemcountUnknown">
Itens [ITEM_COUNT] e Pastas [CATEGORY_COUNT] Reunidos [FILTER]
</panel.string>
+ <panel.string name="inventory_title">INVENTÁRIO</panel.string>
<text name="ItemcountText">
Itens:
</text>
diff --git a/indra/newview/skins/default/xui/pt/panel_profile_interests.xml b/indra/newview/skins/default/xui/pt/panel_profile_interests.xml
deleted file mode 100644
index edf74115f2..0000000000
--- a/indra/newview/skins/default/xui/pt/panel_profile_interests.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Interesses" name="panel_profile_interests">
- <text name="I Want To:">
- Quero:
- </text>
- <check_box label="Crie" name="chk0"/>
- <check_box label="Explore" name="chk1"/>
- <check_box label="Encontrar" name="chk2"/>
- <check_box label="Seja contratado" name="chk6"/>
- <check_box label="Grupo" name="chk3"/>
- <check_box label="Comprar" name="chk4"/>
- <check_box label="Venda" name="chk5"/>
- <check_box label="Contratar" name="chk7"/>
- <line_editor name="want_to_edit">
- (carregando...)
- </line_editor>
- <text name="Skills:">
- Habilidades:
- </text>
- <check_box label="Texturas" name="schk0"/>
- <check_box label="Arquitetura" name="schk1"/>
- <check_box label="Modelo" name="schk3"/>
- <check_box label="Planejamento de evento" name="schk2"/>
- <check_box label="Scripts" name="schk4"/>
- <check_box label="Personagens personalizados" name="schk5"/>
- <line_editor name="skills_edit">
- (carregando...)
- </line_editor>
- <text name="Languages:">
- Idiomas:
- </text>
- <line_editor name="languages_edit">
- (carregando...)
- </line_editor>
-</panel>
diff --git a/indra/newview/skins/default/xui/ru/floater_chat_bar.xml b/indra/newview/skins/default/xui/ru/floater_chat_bar.xml
deleted file mode 100644
index f6b2fc81e1..0000000000
--- a/indra/newview/skins/default/xui/ru/floater_chat_bar.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="nearby_chat" title="ЛОКАЛЬНЫЙ ЧАТ">
- <panel name="bottom_panel">
- <line_editor label="Щелкните здесь для общения." name="chat_box" tool_tip="Нажмите Enter, чтобы сказать, Ctrl+Enter, чтобы прокричать"/>
- <button name="show_nearby_chat" tool_tip="Показать/скрыть лог локального чата"/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/ru/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/ru/floater_inventory_item_properties.xml
deleted file mode 100644
index c988825756..0000000000
--- a/indra/newview/skins/default/xui/ru/floater_inventory_item_properties.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="item properties" title="СВОЙСТВА ПРЕДМЕТА">
- <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], [day,datetime,local] [mth,datetime,local] [year,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]</floater.string>
- <text name="LabelItemNameTitle">Название:</text>
- <text name="LabelItemDescTitle">Описание:</text>
- <text name="LabelCreatorTitle">Создатель:</text>
- <button label="Профиль…" name="BtnCreator"/>
- <text name="LabelOwnerTitle">Владелец:</text>
- <button label="Профиль…" name="BtnOwner"/>
- <text name="LabelAcquiredTitle">Приобретено:</text>
- <text name="LabelAcquiredDate">Ср 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">Группа:</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="ComboBoxSaleType">
- <combo_box.item label="Копировать" name="Copy"/>
- <combo_box.item label="Содержимое" name="Contents"/>
- <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/ru/floater_perm_prefs.xml b/indra/newview/skins/default/xui/ru/floater_perm_prefs.xml
deleted file mode 100644
index 626f3c9321..0000000000
--- a/indra/newview/skins/default/xui/ru/floater_perm_prefs.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?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/ru/floater_voice_controls.xml b/indra/newview/skins/default/xui/ru/floater_voice_controls.xml
deleted file mode 100644
index 2b23086062..0000000000
--- a/indra/newview/skins/default/xui/ru/floater_voice_controls.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_voice_controls" title="УПРАВЛЕНИЕ ГОЛОСОМ">
- <string name="title_nearby">
- НАСТРОЙКИ ГОЛОСА
- </string>
- <string name="title_group">
- ЗВОНОК ГРУППЕ [GROUP]
- </string>
- <string name="title_adhoc">
- КОНФЕРЕНЦИЯ
- </string>
- <string name="title_peer_2_peer">
- ЗВОНОК ПОЛЬЗОВАТЕЛЮ [NAME]
- </string>
- <string name="no_one_near">
- Нет никого с включенным голосом
- </string>
- <layout_stack name="my_call_stack">
- <layout_panel name="my_panel">
- <text name="user_text" value="Мой аватар:"/>
- </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="Прервать звонок" name="leave_call_btn"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/ru/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/ru/menu_inspect_avatar_gear.xml
deleted file mode 100644
index 957609a7a3..0000000000
--- a/indra/newview/skins/default/xui/ru/menu_inspect_avatar_gear.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="Смотреть профиль" name="view_profile"/>
- <menu_item_call label="В друзья" name="add_friend"/>
- <menu_item_call label="IM" name="im"/>
- <menu_item_call label="Звонок" name="call"/>
- <menu_item_call label="Телепорт" name="teleport"/>
- <menu_item_call label="Пригласить в группу" name="invite_to_group"/>
- <menu_item_call label="Заблокировать" name="block"/>
- <menu_item_call label="Разблокировать" name="unblock"/>
- <menu_item_call label="Пожаловаться" name="report"/>
- <menu_item_call label="Заморозить" name="freeze"/>
- <menu_item_call label="Выкинуть" name="eject"/>
- <menu_item_call label="Выкинуть" name="kick"/>
- <menu_item_call label="Поддержка" name="csr"/>
- <menu_item_call label="Отладка текстур" name="debug"/>
- <menu_item_call label="Найти на карте" name="find_on_map"/>
- <menu_item_call label="Приблизить" name="zoom_in"/>
- <menu_item_call label="Заплатить" name="pay"/>
- <menu_item_call label="Поделиться" name="share"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/ru/menu_inspect_self_gear.xml
deleted file mode 100644
index 901bb615e0..0000000000
--- a/indra/newview/skins/default/xui/ru/menu_inspect_self_gear.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?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="одежду" 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="альфа-маску" name="Self Alpha"/>
- <menu_item_call label="всю одежду" name="All Clothes"/>
- </context_menu>
- <context_menu label="данные в игре" name="Object Detach HUD"/>
- <context_menu label="Отсоединить" name="Object Detach"/>
- <menu_item_call label="Отсоединить все" name="Detach All"/>
- </context_menu>
- <menu_item_call label="Сменить костюм" name="Chenge Outfit"/>
- <menu_item_call label="Изменить костюм" name="Edit Outfit"/>
- <menu_item_call label="Изменить фигуру" name="Edit My Shape"/>
- <menu_item_call label="Мои друзья" name="Friends..."/>
- <menu_item_call label="Мои группы" name="Groups..."/>
- <menu_item_call label="Мой профиль" name="Profile..."/>
- <menu_item_call label="Отладка текстур" name="Debug..."/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_name_field.xml b/indra/newview/skins/default/xui/ru/menu_name_field.xml
deleted file mode 100644
index 889f3c37ab..0000000000
--- a/indra/newview/skins/default/xui/ru/menu_name_field.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="CopyMenu">
- <menu_item_call label="Копировать отображаемое имя" name="copy_display"/>
- <menu_item_call label="Копировать имя агента" name="copy_name"/>
- <menu_item_call label="Копировать Id агента" name="copy_id"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/ru/menu_people_friends_view_sort.xml
deleted file mode 100644
index 0fa252aa99..0000000000
--- a/indra/newview/skins/default/xui/ru/menu_people_friends_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?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="Показывать значки" name="view_icons"/>
- <menu_item_check label="Показывать разрешенные действия" name="view_permissions"/>
- <menu_item_call label="Показать черный список" name="show_blocked_list"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/ru/menu_people_groups_view_sort.xml
deleted file mode 100644
index 0358068db9..0000000000
--- a/indra/newview/skins/default/xui/ru/menu_people_groups_view_sort.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_group_plus">
- <menu_item_check label="Показывать значки группы" name="Display Group Icons"/>
- <menu_item_call label="Покинуть выбранную группу" name="Leave Selected Group"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/ru/menu_people_nearby_view_sort.xml
deleted file mode 100644
index 4589815f6b..0000000000
--- a/indra/newview/skins/default/xui/ru/menu_people_nearby_view_sort.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_group_plus">
- <menu_item_check label="Сортировать по недавно говорившим" name="sort_by_recent_speakers"/>
- <menu_item_check label="Сортировать по имени" name="sort_name"/>
- <menu_item_check label="Сортировать по расстоянию" name="sort_distance"/>
- <menu_item_check label="Показывать значки участников" name="view_icons"/>
- <menu_item_check label="Смотреть карту" name="view_map"/>
- <menu_item_call label="Показать черный список жителей и объектов" name="show_blocked_list"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/ru/menu_people_recent_view_sort.xml
deleted file mode 100644
index 2ac83ffe52..0000000000
--- a/indra/newview/skins/default/xui/ru/menu_people_recent_view_sort.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?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="Показывать значки людей" name="view_icons"/>
- <menu_item_call label="Показать черный список" name="show_blocked_list"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ru/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/ru/panel_adhoc_control_panel.xml
deleted file mode 100644
index ae2240593d..0000000000
--- a/indra/newview/skins/default/xui/ru/panel_adhoc_control_panel.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?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="Звонок" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Прервать звонок" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Управление голосом" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_facebook_account.xml b/indra/newview/skins/default/xui/ru/panel_facebook_account.xml
deleted file mode 100644
index 22b4e46897..0000000000
--- a/indra/newview/skins/default/xui/ru/panel_facebook_account.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<panel name="panel_facebook_account">
- <string name="facebook_connected" value="Вы подключились к Facebook как:"/>
- <string name="facebook_disconnected" value="Не подключено к Facebook"/>
- <text name="account_caption_label">
- Не подключено к Facebook.
- </text>
- <panel name="panel_buttons">
- <button label="Подключение..." name="connect_btn"/>
- <button label="Отключить" name="disconnect_btn"/>
- <text name="account_learn_more_label">
- [http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Share-Facebook/ta-p/2149711 О публикации в Facebook]
- </text>
- </panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_group_control_panel.xml b/indra/newview/skins/default/xui/ru/panel_group_control_panel.xml
deleted file mode 100644
index 2e6f3502b6..0000000000
--- a/indra/newview/skins/default/xui/ru/panel_group_control_panel.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?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="Профиль группы" name="group_info_btn"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="Звонок группе" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Прервать звонок" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Открыть голосовое управление" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_im_control_panel.xml b/indra/newview/skins/default/xui/ru/panel_im_control_panel.xml
deleted file mode 100644
index 2a23cdb800..0000000000
--- a/indra/newview/skins/default/xui/ru/panel_im_control_panel.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?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="Профиль" 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="Телепортация" name="teleport_btn" tool_tip="Предложить телепортацию этому жителю"/>
- </layout_panel>
- <layout_panel name="share_btn_panel">
- <button label="Поделиться" name="share_btn"/>
- </layout_panel>
- <layout_panel name="pay_btn_panel">
- <button label="Заплатить" name="pay_btn"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="Звонок" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Завершить звонок" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Управление голосом" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_main_inventory.xml b/indra/newview/skins/default/xui/ru/panel_main_inventory.xml
index f2502bf6d3..b473fb8f98 100644
--- a/indra/newview/skins/default/xui/ru/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/ru/panel_main_inventory.xml
@@ -9,6 +9,7 @@
<panel.string name="ItemcountUnknown">
Выборка [ITEM_COUNT] предметов и [CATEGORY_COUNT] папок [FILTER]
</panel.string>
+ <panel.string name="inventory_title">ИНВЕНТАРЬ</panel.string>
<text name="ItemcountText">
Вещи:
</text>
diff --git a/indra/newview/skins/default/xui/ru/panel_profile_interests.xml b/indra/newview/skins/default/xui/ru/panel_profile_interests.xml
deleted file mode 100644
index ba1c3d0357..0000000000
--- a/indra/newview/skins/default/xui/ru/panel_profile_interests.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Круг интересов" name="panel_profile_interests">
- <text name="I Want To:">
- Я собираюсь:
- </text>
- <check_box label="Построить" name="chk0"/>
- <check_box label="Просмотреть" name="chk1"/>
- <check_box label="Встретить" name="chk2"/>
- <check_box label="Получить работу" name="chk6"/>
- <check_box label="Группа" name="chk3"/>
- <check_box label="Купить" name="chk4"/>
- <check_box label="Продать" name="chk5"/>
- <check_box label="Нанять" name="chk7"/>
- <line_editor name="want_to_edit">
- (загрузка…)
- </line_editor>
- <text name="Skills:">
- Навыки:
- </text>
- <check_box label="Текстуры" name="schk0"/>
- <check_box label="Архитектура" name="schk1"/>
- <check_box label="Моделирование" name="schk3"/>
- <check_box label="Планирование мероприятия" name="schk2"/>
- <check_box label="Создавать сценарии" name="schk4"/>
- <check_box label="Пользовательские символы" name="schk5"/>
- <line_editor name="skills_edit">
- (загрузка…)
- </line_editor>
- <text name="Languages:">
- Языки:
- </text>
- <line_editor name="languages_edit">
- (загрузка…)
- </line_editor>
-</panel>
diff --git a/indra/newview/skins/default/xui/tr/floater_chat_bar.xml b/indra/newview/skins/default/xui/tr/floater_chat_bar.xml
deleted file mode 100644
index cd999b4b7a..0000000000
--- a/indra/newview/skins/default/xui/tr/floater_chat_bar.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="nearby_chat" title="YAKINDAKİ SOHBET">
- <panel name="bottom_panel">
- <line_editor label="Sohbet etmek için buraya tıklayın." name="chat_box" tool_tip="Söylemek için Enter, bağırmak için Ctrl+Enter yapın"/>
- <button name="show_nearby_chat" tool_tip="Yakın sohbet günlüğünü gösterir/gizler"/>
- </panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/tr/floater_inventory_item_properties.xml
deleted file mode 100644
index c6a5515c6e..0000000000
--- a/indra/newview/skins/default/xui/tr/floater_inventory_item_properties.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="item properties" title="ENVANTER ÖGESİ ÖZELLİKLERİ">
- <floater.string name="unknown">(bilinmiyor)</floater.string>
- <floater.string name="public">(kamuya açık)</floater.string>
- <floater.string name="you_can">Şunu yapabilirsiniz:</floater.string>
- <floater.string name="owner_can">Sahip şunu yapabilir:</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">Ad:</text>
- <text name="LabelItemDescTitle">Açıklama:</text>
- <text name="LabelCreatorTitle">Oluşturan:</text>
- <button label="Profil..." name="BtnCreator"/>
- <text name="LabelOwnerTitle">Sahip:</text>
- <button label="Profil..." name="BtnOwner"/>
- <text name="LabelAcquiredTitle">Alınan:</text>
- <text name="LabelAcquiredDate">24 Mayıs Çarş 12:50:46 2006</text>
- <text name="OwnerLabel">Siz:</text>
- <check_box label="Düzenle" name="CheckOwnerModify"/>
- <check_box label="Kopyala" name="CheckOwnerCopy"/>
- <check_box label="Tekrar Sat" name="CheckOwnerTransfer"/>
- <text name="AnyoneLabel">Herkes:</text>
- <check_box label="Kopyala" name="CheckEveryoneCopy"/>
- <text name="GroupLabel">Grup:</text>
- <check_box label="Paylaş" name="CheckShareWithGroup"/>
- <text name="NextOwnerLabel">Sonraki sahip:</text>
- <check_box label="Düzenle" name="CheckNextOwnerModify"/>
- <check_box label="Kopyala" name="CheckNextOwnerCopy"/>
- <check_box label="Tekrar Sat" name="CheckNextOwnerTransfer"/>
- <check_box label="Satılık" name="CheckPurchase"/>
- <combo_box name="ComboBoxSaleType">
- <combo_box.item label="Kopyala" name="Copy"/>
- <combo_box.item label="İçerik" name="Contents"/>
- <combo_box.item label="Orijinal" name="Original"/>
- </combo_box>
- <spinner label="Fiyat:" name="Edit Cost"/>
- <text name="CurrencySymbol">L$</text>
-</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_perm_prefs.xml b/indra/newview/skins/default/xui/tr/floater_perm_prefs.xml
deleted file mode 100644
index 669b833c26..0000000000
--- a/indra/newview/skins/default/xui/tr/floater_perm_prefs.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="perm prefs" title="VARSAYILAN KARŞIYA YÜKLEME İZİNLERİ">
- <panel label="İzinler" name="permissions">
- <check_box label="Grupla paylaş" name="share_with_group"/>
- <check_box label="Herkese kopyalama izni ver" name="everyone_copy"/>
- <text name="NextOwnerLabel">
- Sonraki sahip şunu yapabilir:
- </text>
- <check_box label="Değiştir" name="next_owner_modify"/>
- <check_box label="Kopyala" name="next_owner_copy"/>
- <check_box initial_value="true" label="Tekrar sat/Ver" name="next_owner_transfer"/>
- </panel>
- <button label="Tamam" label_selected="Tamam" name="ok"/>
- <button label="İptal" label_selected="İptal" name="cancel"/>
-</floater>
diff --git a/indra/newview/skins/default/xui/tr/floater_voice_controls.xml b/indra/newview/skins/default/xui/tr/floater_voice_controls.xml
deleted file mode 100644
index 5ff0804f17..0000000000
--- a/indra/newview/skins/default/xui/tr/floater_voice_controls.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_voice_controls" title="SES DENETİMLERİ">
- <string name="title_nearby">
- SES AYARLARI
- </string>
- <string name="title_group">
- [GROUP] İLE GRUP ARAMASI
- </string>
- <string name="title_adhoc">
- KONFERANS ARAMASI
- </string>
- <string name="title_peer_2_peer">
- [NAME] İLE ARAMA
- </string>
- <string name="no_one_near">
- Yakındaki kimsede ses etkin değil
- </string>
- <layout_stack name="my_call_stack">
- <layout_panel name="my_panel">
- <text name="user_text" value="Avatarım:"/>
- </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="Aramadan Ayrıl" name="leave_call_btn"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</floater>
diff --git a/indra/newview/skins/default/xui/tr/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/tr/menu_inspect_avatar_gear.xml
deleted file mode 100644
index 69432e967b..0000000000
--- a/indra/newview/skins/default/xui/tr/menu_inspect_avatar_gear.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="Profili Göster" name="view_profile"/>
- <menu_item_call label="Arkadaş Ekle" name="add_friend"/>
- <menu_item_call label="Aİ" name="im"/>
- <menu_item_call label="Ara" name="call"/>
- <menu_item_call label="Işınla" name="teleport"/>
- <menu_item_call label="Gruba Davet Et" name="invite_to_group"/>
- <menu_item_call label="Engelle" name="block"/>
- <menu_item_call label="Engellemeyi Kaldır" name="unblock"/>
- <menu_item_call label="Raporla" name="report"/>
- <menu_item_call label="Dondur" name="freeze"/>
- <menu_item_call label="Çıkar" name="eject"/>
- <menu_item_call label="Çıkar" name="kick"/>
- <menu_item_call label="CSR" name="csr"/>
- <menu_item_call label="Dokularda Hata Ayıkla" name="debug"/>
- <menu_item_call label="Haritada Bul" name="find_on_map"/>
- <menu_item_call label="Yakınlaştır" name="zoom_in"/>
- <menu_item_call label="Öde" name="pay"/>
- <menu_item_call label="Paylaş" name="share"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/tr/menu_inspect_self_gear.xml
deleted file mode 100644
index 0655db8196..0000000000
--- a/indra/newview/skins/default/xui/tr/menu_inspect_self_gear.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="Self Pie">
- <menu_item_call label="Otur" name="Sit Down Here"/>
- <menu_item_call label="Kalk" name="Stand Up"/>
- <context_menu label="Çıkar" name="Take Off &gt;">
- <context_menu label="Giysiler" name="Clothes &gt;">
- <menu_item_call label="Gömlek" name="Shirt"/>
- <menu_item_call label="Pantolon" name="Pants"/>
- <menu_item_call label="Etek" name="Skirt"/>
- <menu_item_call label="Ayakkabılar" name="Shoes"/>
- <menu_item_call label="Çoraplar" name="Socks"/>
- <menu_item_call label="Ceket" name="Jacket"/>
- <menu_item_call label="Eldivenler" name="Gloves"/>
- <menu_item_call label="Fanila" name="Self Undershirt"/>
- <menu_item_call label="Külot" name="Self Underpants"/>
- <menu_item_call label="Dövme" name="Self Tattoo"/>
- <menu_item_call label="Alfa" name="Self Alpha"/>
- <menu_item_call label="Tüm Giysiler" name="All Clothes"/>
- </context_menu>
- <context_menu label="BÜG" name="Object Detach HUD"/>
- <context_menu label="Ayır" name="Object Detach"/>
- <menu_item_call label="Tümünü Ayır" name="Detach All"/>
- </context_menu>
- <menu_item_call label="Dış Görünümü Değiştir" name="Chenge Outfit"/>
- <menu_item_call label="Dış Görünümümü Düzenle" name="Edit Outfit"/>
- <menu_item_call label="Şeklimi Düzenle" name="Edit My Shape"/>
- <menu_item_call label="Arkadaşlarım" name="Friends..."/>
- <menu_item_call label="Gruplarım" name="Groups..."/>
- <menu_item_call label="Profilim" name="Profile..."/>
- <menu_item_call label="Dokularda Hata Ayıkla" name="Debug..."/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_name_field.xml b/indra/newview/skins/default/xui/tr/menu_name_field.xml
deleted file mode 100644
index b1afd737c3..0000000000
--- a/indra/newview/skins/default/xui/tr/menu_name_field.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="CopyMenu">
- <menu_item_call label="Görünen Adı Kopyala" name="copy_display"/>
- <menu_item_call label="Aracı Adını Kopyala" name="copy_name"/>
- <menu_item_call label="Aracı Kimliğini Kopyala" name="copy_id"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/tr/menu_people_friends_view_sort.xml
deleted file mode 100644
index 404fab17e6..0000000000
--- a/indra/newview/skins/default/xui/tr/menu_people_friends_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_group_plus">
- <menu_item_check label="Ada Göre Sırala" name="sort_name"/>
- <menu_item_check label="Duruma Göre Sırala" name="sort_status"/>
- <menu_item_check label="Kişi Simgelerini Göster" name="view_icons"/>
- <menu_item_check label="Verilen İzinleri Göster" name="view_permissions"/>
- <menu_item_call label="Engellenmiş Sakinleri ve Nesneleri Göster" name="show_blocked_list"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/tr/menu_people_groups_view_sort.xml
deleted file mode 100644
index a1e5ad9a50..0000000000
--- a/indra/newview/skins/default/xui/tr/menu_people_groups_view_sort.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_group_plus">
- <menu_item_check label="Grup Simgelerini Göster" name="Display Group Icons"/>
- <menu_item_call label="Seçilen Gruptan Ayrıl" name="Leave Selected Group"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/tr/menu_people_nearby_view_sort.xml
deleted file mode 100644
index 0ff2111e9e..0000000000
--- a/indra/newview/skins/default/xui/tr/menu_people_nearby_view_sort.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_group_plus">
- <menu_item_check label="Son Konuşanlara Göre Sırala" name="sort_by_recent_speakers"/>
- <menu_item_check label="Ada Göre Sırala" name="sort_name"/>
- <menu_item_check label="Mesafeye Göre Sırala" name="sort_distance"/>
- <menu_item_check label="Kişi Simgelerini Göster" name="view_icons"/>
- <menu_item_check label="Haritayı Göster" name="view_map"/>
- <menu_item_call label="Engellenmiş Sakinleri ve Nesneleri Göster" name="show_blocked_list"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/tr/menu_people_recent_view_sort.xml
deleted file mode 100644
index adfba50138..0000000000
--- a/indra/newview/skins/default/xui/tr/menu_people_recent_view_sort.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_group_plus">
- <menu_item_check label="En Sonunculara Göre Sırala" name="sort_most"/>
- <menu_item_check label="Ada Göre Sırala" name="sort_name"/>
- <menu_item_check label="Kişi Simgelerini Göster" name="view_icons"/>
- <menu_item_call label="Engellenmiş Sakinleri ve Nesneleri Göster" name="show_blocked_list"/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/tr/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/tr/panel_adhoc_control_panel.xml
deleted file mode 100644
index 602818de94..0000000000
--- a/indra/newview/skins/default/xui/tr/panel_adhoc_control_panel.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?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="Ara" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Aramadan Ayrıl" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Ses Denetimleri" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_facebook_account.xml b/indra/newview/skins/default/xui/tr/panel_facebook_account.xml
deleted file mode 100644
index e2d2b193a6..0000000000
--- a/indra/newview/skins/default/xui/tr/panel_facebook_account.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<panel name="panel_facebook_account">
- <string name="facebook_connected" value="Facebook&apos;a şu kimlikle bağlandınız:"/>
- <string name="facebook_disconnected" value="Facebook&apos;a bağlanılmadı"/>
- <text name="account_caption_label">
- Facebook&apos;a bağlanılmadı.
- </text>
- <panel name="panel_buttons">
- <button label="Bağlan..." name="connect_btn"/>
- <button label="Bağlantıyı kes" name="disconnect_btn"/>
- <text name="account_learn_more_label">
- [http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Share-Facebook/ta-p/2149711 Facebook&apos;ta içerik yayınlama hakkında bilgi edinin]
- </text>
- </panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_group_control_panel.xml b/indra/newview/skins/default/xui/tr/panel_group_control_panel.xml
deleted file mode 100644
index 58bb68a5c3..0000000000
--- a/indra/newview/skins/default/xui/tr/panel_group_control_panel.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?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="Grup Profili" name="group_info_btn"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="Grubu Ara" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Aramadan Ayrıl" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Ses Denetimlerini Aç" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_im_control_panel.xml b/indra/newview/skins/default/xui/tr/panel_im_control_panel.xml
deleted file mode 100644
index aebdc6b48d..0000000000
--- a/indra/newview/skins/default/xui/tr/panel_im_control_panel.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?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="Profil" name="view_profile_btn"/>
- </layout_panel>
- <layout_panel name="add_friend_btn_panel">
- <button label="Arkadaş Ekle" name="add_friend_btn"/>
- </layout_panel>
- <layout_panel name="teleport_btn_panel">
- <button label="Işınla" name="teleport_btn" tool_tip="Bu kişiyi ışınlamayı teklif et"/>
- </layout_panel>
- <layout_panel name="share_btn_panel">
- <button label="Paylaş" name="share_btn"/>
- </layout_panel>
- <layout_panel name="pay_btn_panel">
- <button label="Öde" name="pay_btn"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="Ara" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="Aramayı Bitir" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="Ses Denetimleri" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_main_inventory.xml b/indra/newview/skins/default/xui/tr/panel_main_inventory.xml
index a11fd98b9a..7e98078635 100644
--- a/indra/newview/skins/default/xui/tr/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/tr/panel_main_inventory.xml
@@ -9,6 +9,7 @@
<panel.string name="ItemcountUnknown">
[ITEM_COUNT] Öğe ve [CATEGORY_COUNT] Klasör Alındı [FILTER]
</panel.string>
+ <panel.string name="inventory_title">ENVANTER</panel.string>
<text name="ItemcountText">
Ögeler:
</text>
diff --git a/indra/newview/skins/default/xui/tr/panel_profile_interests.xml b/indra/newview/skins/default/xui/tr/panel_profile_interests.xml
deleted file mode 100644
index b068aa3dad..0000000000
--- a/indra/newview/skins/default/xui/tr/panel_profile_interests.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="İlgi alanları" name="panel_profile_interests">
- <text name="I Want To:">
- Şunu Yapmak İstiyorum:
- </text>
- <check_box label="İnşa Et" name="chk0"/>
- <check_box label="Keşfet" name="chk1"/>
- <check_box label="Tanış" name="chk2"/>
- <check_box label="İşe Gir" name="chk6"/>
- <check_box label="Gruplandır" name="chk3"/>
- <check_box label="Satın Al" name="chk4"/>
- <check_box label="Sat" name="chk5"/>
- <check_box label="İşe Al" name="chk7"/>
- <line_editor name="want_to_edit">
- (yükleniyor...)
- </line_editor>
- <text name="Skills:">
- Beceriler:
- </text>
- <check_box label="Dokular" name="schk0"/>
- <check_box label="Mimari" name="schk1"/>
- <check_box label="Modelleme" name="schk3"/>
- <check_box label="Etkinlik Planlama" name="schk2"/>
- <check_box label="Kodlama" name="schk4"/>
- <check_box label="Özel Karakterler" name="schk5"/>
- <line_editor name="skills_edit">
- (yükleniyor...)
- </line_editor>
- <text name="Languages:">
- Diller:
- </text>
- <line_editor name="languages_edit">
- (yükleniyor...)
- </line_editor>
-</panel>
diff --git a/indra/newview/skins/default/xui/zh/floater_chat_bar.xml b/indra/newview/skins/default/xui/zh/floater_chat_bar.xml
deleted file mode 100644
index f1a69a7688..0000000000
--- a/indra/newview/skins/default/xui/zh/floater_chat_bar.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="chat_bar" title="附近的聊天">
- <panel name="bottom_panel">
- <line_editor label="點按此處開始聊天。" name="chat_box" tool_tip="按下 Enter 鍵來說或按下 Ctrl+Enter 來喊叫"/>
- <button name="show_nearby_chat" tool_tip="顯示 / 隱藏 附近的聊天紀錄"/>
- </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
deleted file mode 100644
index 4f17b96579..0000000000
--- a/indra/newview/skins/default/xui/zh/floater_inventory_item_properties.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="item properties" title="收納區物品屬性">
- <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="檔案..." name="BtnCreator"/>
- <text name="LabelOwnerTitle">所有人:</text>
- <button label="檔案..." name="BtnOwner"/>
- <text name="LabelAcquiredTitle">取得於:</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">群組:</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="ComboBoxSaleType">
- <combo_box.item label="複製" name="Copy"/>
- <combo_box.item label="內容" name="Contents"/>
- <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_perm_prefs.xml b/indra/newview/skins/default/xui/zh/floater_perm_prefs.xml
deleted file mode 100644
index b38db59ff3..0000000000
--- a/indra/newview/skins/default/xui/zh/floater_perm_prefs.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?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_voice_controls.xml b/indra/newview/skins/default/xui/zh/floater_voice_controls.xml
deleted file mode 100644
index a3a7679957..0000000000
--- a/indra/newview/skins/default/xui/zh/floater_voice_controls.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_voice_controls" title="語音控制">
- <string name="title_nearby">
- 語音設定
- </string>
- <string name="title_group">
- 與 [GROUP] 進行群組通話
- </string>
- <string name="title_adhoc">
- 多方通話
- </string>
- <string name="title_peer_2_peer">
- 和 [NAME] 通話
- </string>
- <string name="no_one_near">
- 附近沒有一人開啟語音
- </string>
- <layout_stack name="my_call_stack">
- <layout_panel name="my_panel">
- <text name="user_text" value="我的化身:"/>
- </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="離開通話" name="leave_call_btn"/>
- </layout_panel>
- </layout_stack>
- </layout_panel>
- </layout_stack>
-</floater>
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
deleted file mode 100644
index f4e886ff67..0000000000
--- a/indra/newview/skins/default/xui/zh/menu_inspect_avatar_gear.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<toggleable_menu name="Gear Menu">
- <menu_item_call label="察看檔案" name="view_profile"/>
- <menu_item_call label="加為朋友" name="add_friend"/>
- <menu_item_call label="IM" name="im"/>
- <menu_item_call label="通話" name="call"/>
- <menu_item_call label="瞬間傳送" name="teleport"/>
- <menu_item_call label="邀請加入群組" name="invite_to_group"/>
- <menu_item_call label="封鎖" name="block"/>
- <menu_item_call label="解除封鎖" name="unblock"/>
- <menu_item_call label="回報" name="report"/>
- <menu_item_call label="凍結" name="freeze"/>
- <menu_item_call label="踢出" name="eject"/>
- <menu_item_call label="踢出" name="kick"/>
- <menu_item_call label="客服" name="csr"/>
- <menu_item_call label="材質除錯" name="debug"/>
- <menu_item_call label="在地圖上尋找" name="find_on_map"/>
- <menu_item_call label="放大" name="zoom_in"/>
- <menu_item_call label="支付" name="pay"/>
- <menu_item_call label="分享" name="share"/>
-</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
deleted file mode 100644
index c48ee0c9be..0000000000
--- a/indra/newview/skins/default/xui/zh/menu_inspect_self_gear.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?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="衣服" 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="半透明" name="Self Alpha"/>
- <menu_item_call label="全部衣服" name="All Clothes"/>
- </context_menu>
- <context_menu label="擡頭顯示" name="Object Detach HUD"/>
- <context_menu label="卸下" name="Object Detach"/>
- <menu_item_call label="全部卸下" name="Detach All"/>
- </context_menu>
- <menu_item_call label="變更裝扮" name="Chenge Outfit"/>
- <menu_item_call label="編輯我的裝扮" name="Edit Outfit"/>
- <menu_item_call label="編輯我的體形" name="Edit My Shape"/>
- <menu_item_call label="我的朋友" name="Friends..."/>
- <menu_item_call label="我的群組" name="Groups..."/>
- <menu_item_call label="我的個人檔案" name="Profile..."/>
- <menu_item_call label="材質除錯" name="Debug..."/>
-</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/zh/menu_name_field.xml b/indra/newview/skins/default/xui/zh/menu_name_field.xml
deleted file mode 100644
index 5eaf3461cd..0000000000
--- a/indra/newview/skins/default/xui/zh/menu_name_field.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="CopyMenu">
- <menu_item_call label="複製顯示名稱" name="copy_display"/>
- <menu_item_call label="複製代理名稱" name="copy_name"/>
- <menu_item_call label="複製代理ID" name="copy_id"/>
-</toggleable_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
deleted file mode 100644
index 59854faeec..0000000000
--- a/indra/newview/skins/default/xui/zh/menu_people_friends_view_sort.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?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="察看人群圖示" name="view_icons"/>
- <menu_item_check label="察看許可權限" name="view_permissions"/>
- <menu_item_call label="顯示被封鎖的居民與物件" name="show_blocked_list"/>
-</toggleable_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
deleted file mode 100644
index 1be5c69b94..0000000000
--- a/indra/newview/skins/default/xui/zh/menu_people_groups_view_sort.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_group_plus">
- <menu_item_check label="顯示群組圖示" name="Display Group Icons"/>
- <menu_item_call label="脫離所選擇的群組" name="Leave Selected Group"/>
-</toggleable_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
deleted file mode 100644
index 6cb0ac3c89..0000000000
--- a/indra/newview/skins/default/xui/zh/menu_people_nearby_view_sort.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<toggleable_menu name="menu_group_plus">
- <menu_item_check label="依最近說話者排序" name="sort_by_recent_speakers"/>
- <menu_item_check label="依名稱排序" name="sort_name"/>
- <menu_item_check label="依距離排序" name="sort_distance"/>
- <menu_item_check label="察看人群圖示" name="view_icons"/>
- <menu_item_check label="察看地圖" name="view_map"/>
- <menu_item_call label="顯示被封鎖的居民與物件" 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
deleted file mode 100644
index 5b6e7335d6..0000000000
--- a/indra/newview/skins/default/xui/zh/menu_people_recent_view_sort.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?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="察看人群圖示" name="view_icons"/>
- <menu_item_call label="顯示被封鎖的居民與物件" name="show_blocked_list"/>
-</toggleable_menu>
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
deleted file mode 100644
index 7d16ac4129..0000000000
--- a/indra/newview/skins/default/xui/zh/panel_adhoc_control_panel.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?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="通話" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="離開通話" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="語音控制" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_facebook_account.xml b/indra/newview/skins/default/xui/zh/panel_facebook_account.xml
deleted file mode 100644
index e8c31c69c5..0000000000
--- a/indra/newview/skins/default/xui/zh/panel_facebook_account.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<panel name="panel_facebook_account">
- <string name="facebook_connected" value="已成功連通臉書,身分為:"/>
- <string name="facebook_disconnected" value="未連通臉書"/>
- <text name="account_caption_label">
- 未連通臉書。
- </text>
- <panel name="panel_buttons">
- <button label="連通…" name="connect_btn"/>
- <button label="中斷" name="disconnect_btn"/>
- <text name="account_learn_more_label">
- [http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Share-Facebook/ta-p/2149711 如何發佈到臉書]
- </text>
- </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
deleted file mode 100644
index f468aba514..0000000000
--- a/indra/newview/skins/default/xui/zh/panel_group_control_panel.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?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="群組檔案" name="group_info_btn"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="群組通話" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="離開通話" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="開啟語音控制" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</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
deleted file mode 100644
index e937368a2b..0000000000
--- a/indra/newview/skins/default/xui/zh/panel_im_control_panel.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?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="檔案" 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="瞬間傳送" name="teleport_btn" tool_tip="發出瞬間傳送邀請給此人"/>
- </layout_panel>
- <layout_panel name="share_btn_panel">
- <button label="分享" name="share_btn"/>
- </layout_panel>
- <layout_panel name="pay_btn_panel">
- <button label="支付" name="pay_btn"/>
- </layout_panel>
- <layout_panel name="call_btn_panel">
- <button label="通話" name="call_btn"/>
- </layout_panel>
- <layout_panel name="end_call_btn_panel">
- <button label="結束通話" name="end_call_btn"/>
- </layout_panel>
- <layout_panel name="voice_ctrls_btn_panel">
- <button label="語音控制" name="voice_ctrls_btn"/>
- </layout_panel>
- </layout_stack>
-</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_main_inventory.xml b/indra/newview/skins/default/xui/zh/panel_main_inventory.xml
index 1a28f4c3b5..9ffa9323cc 100644
--- a/indra/newview/skins/default/xui/zh/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/zh/panel_main_inventory.xml
@@ -9,6 +9,7 @@
<panel.string name="ItemcountUnknown">
擷取了[ITEM_COUNT]個物項及[CATEGORY_COUNT]個資料夾[FILTER]
</panel.string>
+ <panel.string name="inventory_title">收納區</panel.string>
<text name="ItemcountText">
物品:
</text>
diff --git a/indra/newview/skins/default/xui/zh/panel_navmesh_rebake.xml b/indra/newview/skins/default/xui/zh/panel_navmesh_rebake.xml
deleted file mode 100644
index bb52c13a11..0000000000
--- a/indra/newview/skins/default/xui/zh/panel_navmesh_rebake.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_navmesh_rebake">
- <button label="重新產出地區" name="navmesh_btn" tool_tip="點按即可重新產出該地區的導航網面。"/>
- <button label="正在請求重新產出" name="navmesh_btn_sending" tool_tip="正向伺服器發送重新產出請求。"/>
- <button label="地區正在重新產出" name="navmesh_btn_baking" tool_tip="地區正在重新產出。 完成後,這個按鈕將會消失。"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/zh/panel_profile_interests.xml b/indra/newview/skins/default/xui/zh/panel_profile_interests.xml
deleted file mode 100644
index 150f3cca4f..0000000000
--- a/indra/newview/skins/default/xui/zh/panel_profile_interests.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="興趣" name="panel_profile_interests">
- <text name="I Want To:">
- 我想要:
- </text>
- <check_box label="建造" name="chk0"/>
- <check_box label="探索" name="chk1"/>
- <check_box label="見面" name="chk2"/>
- <check_box label="受雇" name="chk6"/>
- <check_box label="群組" name="chk3"/>
- <check_box label="購買" name="chk4"/>
- <check_box label="出售" name="chk5"/>
- <check_box label="招人" name="chk7"/>
- <line_editor name="want_to_edit">
- (載入中...)
- </line_editor>
- <text name="Skills:">
- 技能:
- </text>
- <check_box label="材質" name="schk0"/>
- <check_box label="架構" name="schk1"/>
- <check_box label="建模" name="schk3"/>
- <check_box label="計畫活動" name="schk2"/>
- <check_box label="建腳本" name="schk4"/>
- <check_box label="定製角色" name="schk5"/>
- <line_editor name="skills_edit">
- (載入中...)
- </line_editor>
- <text name="Languages:">
- 語言:
- </text>
- <line_editor name="languages_edit">
- (載入中...)
- </line_editor>
-</panel>
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index c312c1d248..3a7c7d7f46 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -49,7 +49,7 @@ viewer_dir = os.path.dirname(__file__)
# indra.util.llmanifest under their system Python!
sys.path.insert(0, os.path.join(viewer_dir, os.pardir, "lib", "python"))
from indra.util.llmanifest import LLManifest, main, path_ancestors, CHANNEL_VENDOR_BASE, RELEASE_CHANNEL, ManifestError, MissingError
-from llbase import llsd
+import llsd
class ViewerManifest(LLManifest):
def is_packaging_viewer(self):
diff --git a/scripts/messages/message_template.msg b/scripts/messages/message_template.msg
index a3ddc6d336..c019a76793 100755
--- a/scripts/messages/message_template.msg
+++ b/scripts/messages/message_template.msg
@@ -5790,6 +5790,25 @@ version 2.0
}
}
+// GenericStreamingMessage
+// Optimized generic message for streaming arbitrary data to viewer
+// Avoid payloads over 7KB (8KB ceiling)
+// Method -- magic number indicating method to use to decode payload:
+// 0x4175 - GLTF material override data
+// Payload -- data to be decoded
+{
+ GenericStreamingMessage High 31 Trusted Unencoded
+ {
+ MethodData Single
+ { Method U16 }
+ }
+
+ {
+ DataBlock Single
+ { Data Variable 2 }
+ }
+}
+
// LargeGenericMessage
// Similar to the above messages, but can handle larger payloads and serialized
// LLSD. Uses HTTP transport
diff --git a/scripts/messages/message_template.msg.sha1 b/scripts/messages/message_template.msg.sha1
index 4712a03e8d..5ad85458e9 100755
--- a/scripts/messages/message_template.msg.sha1
+++ b/scripts/messages/message_template.msg.sha1
@@ -1 +1 @@
-dddb11f7e45f1779ff536819f36a20e63d572ba8 \ No newline at end of file
+e3bd0529a647d938ab6d48f26d21dd52c07ebc6e \ No newline at end of file
diff --git a/scripts/metrics/slp_conv.py b/scripts/metrics/slp_conv.py
index 27f922b74a..25f9a8c060 100644
--- a/scripts/metrics/slp_conv.py
+++ b/scripts/metrics/slp_conv.py
@@ -29,7 +29,7 @@ Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
$/LicenseInfo$
"""
-from llbase import llsd
+import llsd
import argparse
parser = argparse.ArgumentParser(
diff --git a/scripts/metrics/viewer_asset_logs.py b/scripts/metrics/viewer_asset_logs.py
index 0365936188..bd996dff79 100644
--- a/scripts/metrics/viewer_asset_logs.py
+++ b/scripts/metrics/viewer_asset_logs.py
@@ -28,7 +28,7 @@ $/LicenseInfo$
import argparse
from lxml import etree
-from llbase import llsd
+import llsd
def get_metrics_record(infiles):
for filename in args.infiles:
diff --git a/scripts/metrics/viewerstats.py b/scripts/metrics/viewerstats.py
index 7e19539e15..e64343329c 100755
--- a/scripts/metrics/viewerstats.py
+++ b/scripts/metrics/viewerstats.py
@@ -31,7 +31,7 @@ import numpy as np
import pandas as pd
import json
from collections import Counter, defaultdict
-from llbase import llsd
+import llsd
import io
import re
import os