summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/CMakeLists.txt4
-rw-r--r--indra/newview/app_settings/settings.xml24
-rw-r--r--indra/newview/llaccountingquotamanager.cpp562
-rw-r--r--[-rwxr-xr-x]indra/newview/llaccountingquotamanager.h39
-rw-r--r--indra/newview/llagent.cpp87
-rw-r--r--indra/newview/llagent.h16
-rw-r--r--indra/newview/llagentlistener.cpp439
-rw-r--r--indra/newview/llagentlistener.h27
-rw-r--r--indra/newview/llappviewer.cpp99
-rw-r--r--indra/newview/llappviewerwin32.cpp39
-rwxr-xr-x[-rw-r--r--]indra/newview/llavataractions.cpp0
-rw-r--r--indra/newview/llbottomtray.cpp3
-rw-r--r--indra/newview/llbottomtray.h4
-rw-r--r--indra/newview/llchatbar.cpp6
-rwxr-xr-x[-rw-r--r--]indra/newview/llcommandhandler.cpp0
-rw-r--r--indra/newview/lldrawpoolbump.cpp8
-rw-r--r--indra/newview/llfeaturemanager.cpp1614
-rwxr-xr-x[-rw-r--r--]indra/newview/llfloaterpreference.cpp32
-rw-r--r--indra/newview/llfloaterpreference.h5
-rw-r--r--indra/newview/llfloatersounddevices.cpp3
-rw-r--r--indra/newview/llfloatertools.cpp5
-rwxr-xr-x[-rw-r--r--]indra/newview/llfloaterworldmap.cpp0
-rw-r--r--indra/newview/llgesturelistener.cpp159
-rw-r--r--indra/newview/llgesturelistener.h52
-rw-r--r--indra/newview/llgesturemgr.cpp2
-rw-r--r--indra/newview/llgesturemgr.h10
-rw-r--r--indra/newview/llmanipscale.cpp1
-rw-r--r--[-rwxr-xr-x]indra/newview/llmeshrepository.cpp7914
-rw-r--r--indra/newview/llnearbychatbar.cpp8
-rw-r--r--indra/newview/llnearbychatbarlistener.cpp100
-rw-r--r--indra/newview/llnearbychatbarlistener.h50
-rw-r--r--indra/newview/llnearbychathandler.cpp49
-rw-r--r--indra/newview/llnearbychathandler.h4
-rw-r--r--indra/newview/llnotificationmanager.h2
-rwxr-xr-x[-rw-r--r--]indra/newview/llpanelpicks.cpp0
-rwxr-xr-x[-rw-r--r--]indra/newview/llpanelpicks.h0
-rwxr-xr-x[-rw-r--r--]indra/newview/llpanelprofile.cpp0
-rwxr-xr-x[-rw-r--r--]indra/newview/llpanelprofile.h0
-rw-r--r--indra/newview/llpanelvoicedevicesettings.cpp17
-rw-r--r--indra/newview/llpanelvolume.cpp3
-rw-r--r--indra/newview/llspatialpartition.cpp25
-rw-r--r--indra/newview/llstartup.cpp1
-rw-r--r--indra/newview/lltexturecache.cpp8
-rw-r--r--indra/newview/lltoolgrab.cpp99
-rw-r--r--indra/newview/lltoolgrab.h7
-rw-r--r--indra/newview/llviewerchat.cpp8
-rw-r--r--indra/newview/llviewermedia.cpp63
-rw-r--r--indra/newview/llviewermedia.h5
-rw-r--r--indra/newview/llviewermenu.cpp50
-rw-r--r--indra/newview/llviewermessage.cpp12
-rw-r--r--indra/newview/llviewerregion.cpp4
-rw-r--r--indra/newview/llviewertexturelist.cpp6
-rw-r--r--indra/newview/llviewerwindow.cpp1
-rw-r--r--indra/newview/llvoavatar.cpp79
-rw-r--r--indra/newview/llvoavatar.h8
-rw-r--r--indra/newview/llvocache.cpp8
-rw-r--r--indra/newview/llvovolume.cpp3
-rw-r--r--indra/newview/skins/default/colors.xml5
-rw-r--r--indra/newview/skins/default/xui/da/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/de/floater_postcard.xml72
-rw-r--r--indra/newview/skins/default/xui/de/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_hardware_settings.xml2
-rw-r--r--indra/newview/skins/default/xui/en/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/en/menu_login.xml6
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml26
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_advanced.xml106
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_colors.xml31
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_setup.xml92
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml9
-rw-r--r--indra/newview/skins/default/xui/es/floater_camera.xml4
-rw-r--r--indra/newview/skins/default/xui/es/floater_help_browser.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_tools.xml4
-rw-r--r--indra/newview/skins/default/xui/es/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/es/menu_viewer.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_im_control_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_login.xml1
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_sound.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_postcard.xml72
-rw-r--r--indra/newview/skins/default/xui/fr/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/it/floater_about_land.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_animation_preview.xml16
-rw-r--r--indra/newview/skins/default/xui/it/floater_avatar_picker.xml9
-rw-r--r--indra/newview/skins/default/xui/it/floater_beacons.xml1
-rw-r--r--indra/newview/skins/default/xui/it/floater_bumps.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_buy_object.xml37
-rw-r--r--indra/newview/skins/default/xui/it/floater_display_name.xml18
-rw-r--r--indra/newview/skins/default/xui/it/floater_event.xml45
-rw-r--r--indra/newview/skins/default/xui/it/floater_hardware_settings.xml3
-rw-r--r--indra/newview/skins/default/xui/it/floater_incoming_call.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_map.xml3
-rw-r--r--indra/newview/skins/default/xui/it/floater_pay.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_preferences.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_region_debug_console.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_tools.xml10
-rw-r--r--indra/newview/skins/default/xui/it/floater_voice_controls.xml6
-rw-r--r--indra/newview/skins/default/xui/it/floater_web_content.xml14
-rw-r--r--indra/newview/skins/default/xui/it/inspect_avatar.xml5
-rw-r--r--indra/newview/skins/default/xui/it/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/it/menu_attachment_self.xml2
-rw-r--r--indra/newview/skins/default/xui/it/menu_avatar_self.xml3
-rw-r--r--indra/newview/skins/default/xui/it/menu_bottomtray.xml2
-rw-r--r--indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml39
-rw-r--r--indra/newview/skins/default/xui/it/menu_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/it/menu_inventory_add.xml1
-rw-r--r--indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml10
-rw-r--r--indra/newview/skins/default/xui/it/menu_login.xml3
-rw-r--r--indra/newview/skins/default/xui/it/menu_media_ctrl.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_mini_map.xml1
-rw-r--r--indra/newview/skins/default/xui/it/menu_object.xml4
-rw-r--r--indra/newview/skins/default/xui/it/menu_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_places_gear_folder.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_viewer.xml41
-rw-r--r--indra/newview/skins/default/xui/it/notifications.xml279
-rw-r--r--indra/newview/skins/default/xui/it/panel_avatar_list_item.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_alpha.xml16
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_gloves.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_jacket.xml4
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_pants.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_physics.xml14
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_profile.xml10
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_shirt.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_shoes.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_skirt.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_socks.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_underpants.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_undershirt.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_wearable.xml6
-rw-r--r--indra/newview/skins/default/xui/it/panel_group_land_money.xml1
-rw-r--r--indra/newview/skins/default/xui/it/panel_login.xml11
-rw-r--r--indra/newview/skins/default/xui/it/panel_my_profile.xml29
-rw-r--r--indra/newview/skins/default/xui/it/panel_nearby_media.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_notify_textbox.xml11
-rw-r--r--indra/newview/skins/default/xui/it/panel_people.xml12
-rw-r--r--indra/newview/skins/default/xui/it/panel_place_profile.xml3
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_advanced.xml29
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_chat.xml49
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_colors.xml41
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_general.xml18
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml7
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_move.xml24
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_privacy.xml14
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_setup.xml24
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_sound.xml12
-rw-r--r--indra/newview/skins/default/xui/it/panel_profile.xml8
-rw-r--r--indra/newview/skins/default/xui/it/panel_profile_view.xml7
-rw-r--r--indra/newview/skins/default/xui/it/panel_script_ed.xml14
-rw-r--r--indra/newview/skins/default/xui/it/panel_scrolling_param_base.xml4
-rw-r--r--indra/newview/skins/default/xui/it/panel_status_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/it/role_actions.xml87
-rw-r--r--indra/newview/skins/default/xui/it/strings.xml507
-rw-r--r--indra/newview/skins/default/xui/ja/floater_about_land.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_avatar_picker.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_beacons.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/floater_bumps.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_object.xml37
-rw-r--r--indra/newview/skins/default/xui/ja/floater_display_name.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/floater_event.xml45
-rw-r--r--indra/newview/skins/default/xui/ja/floater_hardware_settings.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/floater_incoming_call.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_map.xml27
-rw-r--r--indra/newview/skins/default/xui/ja/floater_pay.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preferences.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_region_debug_console.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_tools.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_voice_controls.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_web_content.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/inspect_avatar.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/menu_attachment_self.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_avatar_self.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/menu_bottomtray.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml39
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inventory.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inventory_add.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/menu_login.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/menu_media_ctrl.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/menu_mini_map.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/menu_object.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_outfit_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_viewer.xml35
-rw-r--r--indra/newview/skins/default/xui/ja/notifications.xml285
-rw-r--r--indra/newview/skins/default/xui/ja/panel_avatar_list_item.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_alpha.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_gloves.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_jacket.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_pants.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_physics.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_profile.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_shirt.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_shoes.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_skirt.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_socks.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_underpants.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_wearable.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_land_money.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/panel_login.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/panel_my_profile.xml33
-rw-r--r--indra/newview/skins/default/xui/ja/panel_nearby_media.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_notify_textbox.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/panel_people.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/panel_place_profile.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml29
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_chat.xml49
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_colors.xml41
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_general.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_move.xml24
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_setup.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_sound.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/panel_profile.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_profile_view.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/panel_script_ed.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/panel_scrolling_param_base.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_status_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/role_actions.xml15
-rw-r--r--indra/newview/skins/default/xui/ja/strings.xml511
-rw-r--r--indra/newview/skins/default/xui/nl/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/pl/language_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_gesture.xml148
-rw-r--r--indra/newview/skins/default/xui/pt/language_settings.xml1
-rw-r--r--indra/newview/skins/minimal/xui/it/floater_camera.xml65
-rw-r--r--indra/newview/skins/minimal/xui/it/floater_help_browser.xml9
-rw-r--r--indra/newview/skins/minimal/xui/it/floater_media_browser.xml31
-rw-r--r--indra/newview/skins/minimal/xui/it/floater_nearby_chat.xml4
-rw-r--r--indra/newview/skins/minimal/xui/it/floater_web_content.xml14
-rw-r--r--indra/newview/skins/minimal/xui/it/inspect_avatar.xml26
-rw-r--r--indra/newview/skins/minimal/xui/it/inspect_object.xml41
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_add_wearable_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_attachment_self.xml16
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_avatar_self.xml32
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_bottomtray.xml17
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_cof_clothing.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_edit.xml12
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_favorites.xml10
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_gesture_gear.xml10
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_hide_navbar.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_inspect_avatar_gear.xml21
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_inspect_object_gear.xml18
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_inspect_self_gear.xml31
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_inventory.xml87
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_inventory_add.xml34
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_inventory_gear_default.xml17
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_land.xml9
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_landmark.xml7
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_login.xml24
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_mini_map.xml11
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_navbar.xml11
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_object.xml29
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_outfit_gear.xml28
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_participant_list.xml21
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_people_nearby.xml13
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_people_nearby_multiselect.xml10
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_picks.xml8
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_place.xml7
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_places_gear_folder.xml16
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_places_gear_landmark.xml19
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_profile_overflow.xml12
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_slurl.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_topinfobar.xml7
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_url_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_url_http.xml7
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_url_map.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_viewer.xml14
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_wearable_list_item.xml14
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/it/menu_wearing_tab.xml6
-rw-r--r--indra/newview/skins/minimal/xui/it/notifications.xml2951
-rw-r--r--indra/newview/skins/minimal/xui/it/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/minimal/xui/it/panel_bottomtray.xml39
-rw-r--r--indra/newview/skins/minimal/xui/it/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/minimal/xui/it/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/minimal/xui/it/panel_login.xml48
-rw-r--r--indra/newview/skins/minimal/xui/it/panel_navigation_bar.xml18
-rw-r--r--indra/newview/skins/minimal/xui/it/panel_people.xml94
-rw-r--r--indra/newview/skins/minimal/xui/it/panel_side_tray_tab_caption.xml7
-rw-r--r--indra/newview/skins/minimal/xui/it/panel_status_bar.xml33
-rw-r--r--indra/newview/skins/minimal/xui/ja/floater_camera.xml65
-rw-r--r--indra/newview/skins/minimal/xui/ja/floater_help_browser.xml9
-rw-r--r--indra/newview/skins/minimal/xui/ja/floater_media_browser.xml30
-rw-r--r--indra/newview/skins/minimal/xui/ja/floater_nearby_chat.xml4
-rw-r--r--indra/newview/skins/minimal/xui/ja/floater_web_content.xml14
-rw-r--r--indra/newview/skins/minimal/xui/ja/inspect_avatar.xml27
-rw-r--r--indra/newview/skins/minimal/xui/ja/inspect_object.xml48
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_add_wearable_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_attachment_self.xml16
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_avatar_self.xml32
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_bottomtray.xml17
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_cof_clothing.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_edit.xml12
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_favorites.xml10
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_gesture_gear.xml10
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_hide_navbar.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_inspect_avatar_gear.xml21
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_inspect_object_gear.xml18
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_inspect_self_gear.xml31
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_inventory.xml87
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_inventory_add.xml34
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_inventory_gear_default.xml17
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_land.xml9
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_landmark.xml7
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_login.xml25
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_mini_map.xml11
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_navbar.xml11
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_object.xml29
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_outfit_gear.xml28
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_participant_list.xml21
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_people_nearby.xml13
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_people_nearby_multiselect.xml10
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_picks.xml8
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_place.xml7
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_places_gear_folder.xml16
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_places_gear_landmark.xml19
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_profile_overflow.xml12
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_slurl.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_topinfobar.xml7
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_url_group.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_url_http.xml7
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_url_map.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_viewer.xml14
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_wearable_list_item.xml14
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_wearing_gear.xml5
-rw-r--r--indra/newview/skins/minimal/xui/ja/menu_wearing_tab.xml6
-rw-r--r--indra/newview/skins/minimal/xui/ja/notifications.xml2995
-rw-r--r--indra/newview/skins/minimal/xui/ja/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/minimal/xui/ja/panel_bottomtray.xml39
-rw-r--r--indra/newview/skins/minimal/xui/ja/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/minimal/xui/ja/panel_im_control_panel.xml30
-rw-r--r--indra/newview/skins/minimal/xui/ja/panel_login.xml48
-rw-r--r--indra/newview/skins/minimal/xui/ja/panel_navigation_bar.xml18
-rw-r--r--indra/newview/skins/minimal/xui/ja/panel_people.xml94
-rw-r--r--indra/newview/skins/minimal/xui/ja/panel_side_tray_tab_caption.xml7
-rw-r--r--indra/newview/skins/minimal/xui/ja/panel_status_bar.xml33
413 files changed, 17800 insertions, 6308 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 769dcf8457..523ea8a394 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -244,6 +244,7 @@ set(viewer_SOURCE_FILES
llfolderviewitem.cpp
llfollowcam.cpp
llfriendcard.cpp
+ llgesturelistener.cpp
llgesturemgr.cpp
llgiveinventory.cpp
llglsandbox.cpp
@@ -321,6 +322,7 @@ set(viewer_SOURCE_FILES
llnearbychat.cpp
llnearbychatbar.cpp
llnearbychathandler.cpp
+ llnearbychatbarlistener.cpp
llnetmap.cpp
llnotificationalerthandler.cpp
llnotificationgrouphandler.cpp
@@ -797,6 +799,7 @@ set(viewer_HEADER_FILES
llfolderviewitem.h
llfollowcam.h
llfriendcard.h
+ llgesturelistener.h
llgesturemgr.h
llgiveinventory.h
llgroupactions.h
@@ -873,6 +876,7 @@ set(viewer_HEADER_FILES
llnearbychat.h
llnearbychatbar.h
llnearbychathandler.h
+ llnearbychatbarlistener.h
llnetmap.h
llnotificationhandler.h
llnotificationmanager.h
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index b7ba9e3607..e323287084 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -708,6 +708,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>BrowserEnableJSObject</key>
+ <map>
+ <key>Comment</key>
+ <string>(WARNING: Advanced feature. Use if you are aware of the implications). Enable or disable the viewer to Javascript bridge object.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>BlockAvatarAppearanceMessages</key>
<map>
<key>Comment</key>
@@ -3980,7 +3991,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://search.secondlife.com/viewer/[CATEGORY]/?q=[QUERY]&amp;p=[AUTH_TOKEN]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;g=[GODLIKE]&amp;sid=[SESSION_ID]&amp;rid=[REGION_ID]&amp;pid=[PARCEL_ID]&amp;channel=[CHANNEL]&amp;version=[VERSION]&amp;major=[VERSION_MAJOR]&amp;minor=[VERSION_MINOR]&amp;patch=[VERSION_PATCH]&amp;build=[VERSION_BUILD]</string>
+ <string>http://search-beta.secondlife.com/viewer/[CATEGORY]/?q=[QUERY]&amp;p=[AUTH_TOKEN]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;g=[GODLIKE]&amp;sid=[SESSION_ID]&amp;rid=[REGION_ID]&amp;pid=[PARCEL_ID]&amp;channel=[CHANNEL]&amp;version=[VERSION]&amp;major=[VERSION_MAJOR]&amp;minor=[VERSION_MINOR]&amp;patch=[VERSION_PATCH]&amp;build=[VERSION_BUILD]</string>
</map>
<key>WebProfileURL</key>
<map>
@@ -12823,6 +12834,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>SLURLPassToOtherInstance</key>
+ <map>
+ <key>Comment</key>
+ <string>Pass execution to prevoius viewer instances if there is a given slurl</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>soundsbeacon</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/llaccountingquotamanager.cpp b/indra/newview/llaccountingquotamanager.cpp
index 9b77ada8b7..a4f5de5632 100644
--- a/indra/newview/llaccountingquotamanager.cpp
+++ b/indra/newview/llaccountingquotamanager.cpp
@@ -1,284 +1,278 @@
-/**
- * @file LLAccountingQuotaManager.cpp
- * @ Handles the setting and accessing for costs associated with mesh
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- *
- * Copyright (c) 2001-2010, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-#include "llaccountingquotamanager.h"
-#include "llagent.h"
-#include "llviewerregion.h"
-#include "llviewerobject.h"
-#include "llviewerobjectlist.h"
-#include "llviewerparcelmgr.h"
-#include "llparcel.h"
-
-//===============================================================================
-LLAccountingQuotaManager::LLAccountingQuotaManager()
-{
-}
-//===============================================================================
-class LLAccountingQuotaResponder : public LLCurl::Responder
-{
-public:
- LLAccountingQuotaResponder( const LLSD& objectIDs )
- : mObjectIDs( objectIDs )
- {
- }
-
- void clearPendingRequests ( void )
- {
- for ( LLSD::array_iterator iter = mObjectIDs.beginArray(); iter != mObjectIDs.endArray(); ++iter )
- {
- LLAccountingQuotaManager::getInstance()->removePendingObjectQuota( iter->asUUID() );
- }
- }
-
- void error( U32 statusNum, const std::string& reason )
- {
- llwarns << "Transport error "<<reason<<llendl;
- //prep#do we really want to remove all because of one failure - verify
- clearPendingRequests();
- }
-
- void result( const LLSD& content )
- {
- if ( !content.isMap() || content.has("error") )
- {
- llwarns << "Error on fetched data"<< llendl;
- //prep#do we really want to remove all because of one failure - verify
- clearPendingRequests();
- return;
- }
-
- //Differentiate what the incoming caps could be from the data
- bool containsParcel = content.has("parcel");
- bool containsSelection = content.has("selected");
-
- //Loop over the stored object ids checking against the incoming data
- for ( LLSD::array_iterator iter = mObjectIDs.beginArray(); iter != mObjectIDs.endArray(); ++iter )
- {
- LLUUID objectID = iter->asUUID();
-
- LLAccountingQuotaManager::getInstance()->removePendingObjectQuota( objectID );
-
- if ( containsParcel )
- {
- //Typically should be one
- S32 dataCount = content["parcel"].size();
- for(S32 i = 0; i < dataCount; i++)
- {
- //prep#todo verify that this is safe, otherwise just add a bool
- LLUUID parcelId;
- //S32 parcelOwner = 0;
- if ( content["parcel"][i].has("parcel_id") )
- {
- parcelId = content["parcel"][i]["parcel_id"].asUUID();
- }
-
- //if ( content["parcel"][i].has("parcel_owner") )
- //{
- // parcelOwner = content["parcel"][i]["parcel_owner"].asInteger();
- //}
-
- F32 ownerRenderCost = 0;
- F32 ownerPhysicsCost = 0;
- F32 ownerNetworkCost = 0;
- F32 ownerSimulationCost = 0;
-
- F32 groupRenderCost = 0;
- F32 groupPhysicsCost = 0;
- F32 groupNetworkCost = 0;
- F32 groupSimulationCost = 0;
-
- F32 otherRenderCost = 0;
- F32 otherPhysicsCost = 0;
- F32 otherNetworkCost = 0;
- F32 otherSimulationCost = 0;
-
- F32 tempRenderCost = 0;
- F32 tempPhysicsCost = 0;
- F32 tempNetworkCost = 0;
- F32 tempSimulationCost = 0;
-
- F32 selectedRenderCost = 0;
- F32 selectedPhysicsCost = 0;
- F32 selectedNetworkCost = 0;
- F32 selectedSimulationCost = 0;
-
- F32 parcelCapacity = 0;
-
- if ( content["parcel"][i].has("capacity") )
- {
- parcelCapacity = content["parcel"][i].has("capacity");
- }
-
- if ( content["parcel"][i].has("owner") )
- {
- ownerRenderCost = content["parcel"][i]["owner"]["rendering"].asReal();
- ownerPhysicsCost = content["parcel"][i]["owner"]["physics"].asReal();
- ownerNetworkCost = content["parcel"][i]["owner"]["streaming"].asReal();
- ownerSimulationCost = content["parcel"][i]["owner"]["simulation"].asReal();
- }
-
- if ( content["parcel"][i].has("group") )
- {
- groupRenderCost = content["parcel"][i]["group"]["rendering"].asReal();
- groupPhysicsCost = content["parcel"][i]["group"]["physics"].asReal();
- groupNetworkCost = content["parcel"][i]["group"]["streaming"].asReal();
- groupSimulationCost = content["parcel"][i]["group"]["simulation"].asReal();
-
- }
- if ( content["parcel"][i].has("other") )
- {
- otherRenderCost = content["parcel"][i]["other"]["rendering"].asReal();
- otherPhysicsCost = content["parcel"][i]["other"]["physics"].asReal();
- otherNetworkCost = content["parcel"][i]["other"]["streaming"].asReal();
- otherSimulationCost = content["parcel"][i]["other"]["simulation"].asReal();
- }
-
- if ( content["parcel"][i].has("temp") )
- {
- tempRenderCost = content["parcel"][i]["total"]["rendering"].asReal();
- tempPhysicsCost = content["parcel"][i]["total"]["physics"].asReal();
- tempNetworkCost = content["parcel"][i]["total"]["streaming"].asReal();
- tempSimulationCost = content["parcel"][i]["total"]["simulation"].asReal();
- }
-
- if ( content["parcel"][i].has("selected") )
- {
- selectedRenderCost = content["parcel"][i]["total"]["rendering"].asReal();
- selectedPhysicsCost = content["parcel"][i]["total"]["physics"].asReal();
- selectedNetworkCost = content["parcel"][i]["total"]["streaming"].asReal();
- selectedSimulationCost = content["parcel"][i]["total"]["simulation"].asReal();
- }
-
- ParcelQuota parcelQuota( ownerRenderCost, ownerPhysicsCost, ownerNetworkCost, ownerSimulationCost,
- groupRenderCost, groupPhysicsCost, groupNetworkCost, groupSimulationCost,
- otherRenderCost, otherPhysicsCost, otherNetworkCost, otherSimulationCost,
- tempRenderCost, tempPhysicsCost, tempNetworkCost, tempSimulationCost,
- selectedRenderCost, selectedPhysicsCost, selectedNetworkCost, selectedSimulationCost,
- parcelCapacity );
- //Update the Parcel
- LLParcel* pParcel = LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel();
- if ( pParcel )
- {
- pParcel->updateQuota( objectID, parcelQuota );
- }
- }
- }
- else
- if ( containsSelection )
- {
- S32 dataCount = content["selected"].size();
- for(S32 i = 0; i < dataCount; i++)
- {
-
- F32 renderCost = 0;
- F32 physicsCost = 0;
- F32 networkCost = 0;
- F32 simulationCost = 0;
-
- LLUUID objectId;
-
- objectId = content["selected"][i]["local_id"].asUUID();
- renderCost = content["selected"][i]["rendering"].asReal();
- physicsCost = content["selected"][i]["physics"].asReal();
- networkCost = content["selected"][i]["streaming"].asReal();
- simulationCost = content["selected"][i]["simulation"].asReal();
-
- SelectionQuota selectionQuota( objectId, renderCost, physicsCost, networkCost, simulationCost );
-
- //Update the objects
- gObjectList.updateQuota( objectId, selectionQuota );
-
- }
- }
- else
- {
- //Nothing in string
- LLAccountingQuotaManager::getInstance()->removePendingObjectQuota( objectID );
- }
- }
- }
-
-private:
- //List of posted objects
- LLSD mObjectIDs;
-};
-//===============================================================================
-void LLAccountingQuotaManager::fetchQuotas( const std::string& url )
-{
- // Invoking system must have already determined capability availability
- if ( !url.empty() )
- {
- LLSD objectList;
- U32 objectIndex = 0;
- IDIt IDIter = mUpdateObjectQuota.begin();
- IDIt IDIterEnd = mUpdateObjectQuota.end();
-
- for ( ; IDIter != IDIterEnd; ++IDIter )
- {
- // Check to see if a request for this object has already been made.
- if ( mPendingObjectQuota.find( *IDIter ) == mPendingObjectQuota.end() )
- {
- mPendingObjectQuota.insert( *IDIter );
- objectList[objectIndex++] = *IDIter;
- }
- }
-
- mUpdateObjectQuota.clear();
-
- //Post results
- if ( objectList.size() > 0 )
- {
- LLSD dataToPost = LLSD::emptyMap();
- dataToPost["object_ids"] = objectList;
- LLHTTPClient::post( url, dataToPost, new LLAccountingQuotaResponder( objectList ));
- }
- }
- else
- {
- //url was empty - warn & continue
- llwarns<<"Supplied url is empty "<<llendl;
- mUpdateObjectQuota.clear();
- mPendingObjectQuota.clear();
- }
-}
-//===============================================================================
-void LLAccountingQuotaManager::updateObjectCost( const LLUUID& objectID )
-{
- mUpdateObjectQuota.insert( objectID );
-}
-//===============================================================================
-void LLAccountingQuotaManager::removePendingObjectQuota( const LLUUID& objectID )
-{
- mPendingObjectQuota.erase( objectID );
-}
-//===============================================================================
+/**
+ * @file LLAccountingQuotaManager.cpp
+ * @ Handles the setting and accessing for costs associated with mesh
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llaccountingquotamanager.h"
+#include "llagent.h"
+#include "llviewerregion.h"
+#include "llviewerobject.h"
+#include "llviewerobjectlist.h"
+#include "llviewerparcelmgr.h"
+#include "llparcel.h"
+
+//===============================================================================
+LLAccountingQuotaManager::LLAccountingQuotaManager()
+{
+}
+//===============================================================================
+class LLAccountingQuotaResponder : public LLCurl::Responder
+{
+public:
+ LLAccountingQuotaResponder( const LLSD& objectIDs )
+ : mObjectIDs( objectIDs )
+ {
+ }
+
+ void clearPendingRequests ( void )
+ {
+ for ( LLSD::array_iterator iter = mObjectIDs.beginArray(); iter != mObjectIDs.endArray(); ++iter )
+ {
+ LLAccountingQuotaManager::getInstance()->removePendingObjectQuota( iter->asUUID() );
+ }
+ }
+
+ void error( U32 statusNum, const std::string& reason )
+ {
+ llwarns << "Transport error "<<reason<<llendl;
+ //prep#do we really want to remove all because of one failure - verify
+ clearPendingRequests();
+ }
+
+ void result( const LLSD& content )
+ {
+ if ( !content.isMap() || content.has("error") )
+ {
+ llwarns << "Error on fetched data"<< llendl;
+ //prep#do we really want to remove all because of one failure - verify
+ clearPendingRequests();
+ return;
+ }
+
+ //Differentiate what the incoming caps could be from the data
+ bool containsParcel = content.has("parcel");
+ bool containsSelection = content.has("selected");
+
+ //Loop over the stored object ids checking against the incoming data
+ for ( LLSD::array_iterator iter = mObjectIDs.beginArray(); iter != mObjectIDs.endArray(); ++iter )
+ {
+ LLUUID objectID = iter->asUUID();
+
+ LLAccountingQuotaManager::getInstance()->removePendingObjectQuota( objectID );
+
+ if ( containsParcel )
+ {
+ //Typically should be one
+ S32 dataCount = content["parcel"].size();
+ for(S32 i = 0; i < dataCount; i++)
+ {
+ //prep#todo verify that this is safe, otherwise just add a bool
+ LLUUID parcelId;
+ //S32 parcelOwner = 0;
+ if ( content["parcel"][i].has("parcel_id") )
+ {
+ parcelId = content["parcel"][i]["parcel_id"].asUUID();
+ }
+
+ //if ( content["parcel"][i].has("parcel_owner") )
+ //{
+ // parcelOwner = content["parcel"][i]["parcel_owner"].asInteger();
+ //}
+
+ F32 ownerRenderCost = 0;
+ F32 ownerPhysicsCost = 0;
+ F32 ownerNetworkCost = 0;
+ F32 ownerSimulationCost = 0;
+
+ F32 groupRenderCost = 0;
+ F32 groupPhysicsCost = 0;
+ F32 groupNetworkCost = 0;
+ F32 groupSimulationCost = 0;
+
+ F32 otherRenderCost = 0;
+ F32 otherPhysicsCost = 0;
+ F32 otherNetworkCost = 0;
+ F32 otherSimulationCost = 0;
+
+ F32 tempRenderCost = 0;
+ F32 tempPhysicsCost = 0;
+ F32 tempNetworkCost = 0;
+ F32 tempSimulationCost = 0;
+
+ F32 selectedRenderCost = 0;
+ F32 selectedPhysicsCost = 0;
+ F32 selectedNetworkCost = 0;
+ F32 selectedSimulationCost = 0;
+
+ F32 parcelCapacity = 0;
+
+ if ( content["parcel"][i].has("capacity") )
+ {
+ parcelCapacity = content["parcel"][i].has("capacity");
+ }
+
+ if ( content["parcel"][i].has("owner") )
+ {
+ ownerRenderCost = content["parcel"][i]["owner"]["rendering"].asReal();
+ ownerPhysicsCost = content["parcel"][i]["owner"]["physics"].asReal();
+ ownerNetworkCost = content["parcel"][i]["owner"]["streaming"].asReal();
+ ownerSimulationCost = content["parcel"][i]["owner"]["simulation"].asReal();
+ }
+
+ if ( content["parcel"][i].has("group") )
+ {
+ groupRenderCost = content["parcel"][i]["group"]["rendering"].asReal();
+ groupPhysicsCost = content["parcel"][i]["group"]["physics"].asReal();
+ groupNetworkCost = content["parcel"][i]["group"]["streaming"].asReal();
+ groupSimulationCost = content["parcel"][i]["group"]["simulation"].asReal();
+
+ }
+ if ( content["parcel"][i].has("other") )
+ {
+ otherRenderCost = content["parcel"][i]["other"]["rendering"].asReal();
+ otherPhysicsCost = content["parcel"][i]["other"]["physics"].asReal();
+ otherNetworkCost = content["parcel"][i]["other"]["streaming"].asReal();
+ otherSimulationCost = content["parcel"][i]["other"]["simulation"].asReal();
+ }
+
+ if ( content["parcel"][i].has("temp") )
+ {
+ tempRenderCost = content["parcel"][i]["total"]["rendering"].asReal();
+ tempPhysicsCost = content["parcel"][i]["total"]["physics"].asReal();
+ tempNetworkCost = content["parcel"][i]["total"]["streaming"].asReal();
+ tempSimulationCost = content["parcel"][i]["total"]["simulation"].asReal();
+ }
+
+ if ( content["parcel"][i].has("selected") )
+ {
+ selectedRenderCost = content["parcel"][i]["total"]["rendering"].asReal();
+ selectedPhysicsCost = content["parcel"][i]["total"]["physics"].asReal();
+ selectedNetworkCost = content["parcel"][i]["total"]["streaming"].asReal();
+ selectedSimulationCost = content["parcel"][i]["total"]["simulation"].asReal();
+ }
+
+ ParcelQuota parcelQuota( ownerRenderCost, ownerPhysicsCost, ownerNetworkCost, ownerSimulationCost,
+ groupRenderCost, groupPhysicsCost, groupNetworkCost, groupSimulationCost,
+ otherRenderCost, otherPhysicsCost, otherNetworkCost, otherSimulationCost,
+ tempRenderCost, tempPhysicsCost, tempNetworkCost, tempSimulationCost,
+ selectedRenderCost, selectedPhysicsCost, selectedNetworkCost, selectedSimulationCost,
+ parcelCapacity );
+ //Update the Parcel
+ LLParcel* pParcel = LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel();
+ if ( pParcel )
+ {
+ pParcel->updateQuota( objectID, parcelQuota );
+ }
+ }
+ }
+ else
+ if ( containsSelection )
+ {
+ S32 dataCount = content["selected"].size();
+ for(S32 i = 0; i < dataCount; i++)
+ {
+
+ F32 renderCost = 0;
+ F32 physicsCost = 0;
+ F32 networkCost = 0;
+ F32 simulationCost = 0;
+
+ LLUUID objectId;
+
+ objectId = content["selected"][i]["local_id"].asUUID();
+ renderCost = content["selected"][i]["rendering"].asReal();
+ physicsCost = content["selected"][i]["physics"].asReal();
+ networkCost = content["selected"][i]["streaming"].asReal();
+ simulationCost = content["selected"][i]["simulation"].asReal();
+
+ SelectionQuota selectionQuota( objectId, renderCost, physicsCost, networkCost, simulationCost );
+
+ //Update the objects
+ gObjectList.updateQuota( objectId, selectionQuota );
+
+ }
+ }
+ else
+ {
+ //Nothing in string
+ LLAccountingQuotaManager::getInstance()->removePendingObjectQuota( objectID );
+ }
+ }
+ }
+
+private:
+ //List of posted objects
+ LLSD mObjectIDs;
+};
+//===============================================================================
+void LLAccountingQuotaManager::fetchQuotas( const std::string& url )
+{
+ // Invoking system must have already determined capability availability
+ if ( !url.empty() )
+ {
+ LLSD objectList;
+ U32 objectIndex = 0;
+ IDIt IDIter = mUpdateObjectQuota.begin();
+ IDIt IDIterEnd = mUpdateObjectQuota.end();
+
+ for ( ; IDIter != IDIterEnd; ++IDIter )
+ {
+ // Check to see if a request for this object has already been made.
+ if ( mPendingObjectQuota.find( *IDIter ) == mPendingObjectQuota.end() )
+ {
+ mPendingObjectQuota.insert( *IDIter );
+ objectList[objectIndex++] = *IDIter;
+ }
+ }
+
+ mUpdateObjectQuota.clear();
+
+ //Post results
+ if ( objectList.size() > 0 )
+ {
+ LLSD dataToPost = LLSD::emptyMap();
+ dataToPost["object_ids"] = objectList;
+ LLHTTPClient::post( url, dataToPost, new LLAccountingQuotaResponder( objectList ));
+ }
+ }
+ else
+ {
+ //url was empty - warn & continue
+ llwarns<<"Supplied url is empty "<<llendl;
+ mUpdateObjectQuota.clear();
+ mPendingObjectQuota.clear();
+ }
+}
+//===============================================================================
+void LLAccountingQuotaManager::updateObjectCost( const LLUUID& objectID )
+{
+ mUpdateObjectQuota.insert( objectID );
+}
+//===============================================================================
+void LLAccountingQuotaManager::removePendingObjectQuota( const LLUUID& objectID )
+{
+ mPendingObjectQuota.erase( objectID );
+}
+//===============================================================================
diff --git a/indra/newview/llaccountingquotamanager.h b/indra/newview/llaccountingquotamanager.h
index f605d1e6b2..9251ef9351 100755..100644
--- a/indra/newview/llaccountingquotamanager.h
+++ b/indra/newview/llaccountingquotamanager.h
@@ -2,31 +2,25 @@
* @file lllAccountingQuotaManager.h
* @
*
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- *
- * Copyright (c) 2001-2009, Linden Research, Inc.
- *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * Copyright (C) 2011, Linden Research, Inc.
*
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 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.
*
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
+ * 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.
*
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
+ * 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$
*/
@@ -57,4 +51,5 @@ private:
};
//===============================================================================
-#endif
+#endif // LLACCOUNTINGQUOTAMANAGER
+
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 08d71fc8fc..446ded8096 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -206,6 +206,7 @@ LLAgent::LLAgent() :
mAutoPilot(FALSE),
mAutoPilotFlyOnStop(FALSE),
+ mAutoPilotAllowFlying(TRUE),
mAutoPilotTargetGlobal(),
mAutoPilotStopDistance(1.f),
mAutoPilotUseRotation(FALSE),
@@ -1230,17 +1231,26 @@ void LLAgent::startAutoPilotGlobal(
const LLQuaternion *target_rotation,
void (*finish_callback)(BOOL, void *),
void *callback_data,
- F32 stop_distance, F32 rot_threshold)
+ F32 stop_distance,
+ F32 rot_threshold,
+ BOOL allow_flying)
{
if (!isAgentAvatarValid())
{
return;
}
+ // Are there any pending callbacks from previous auto pilot requests?
+ if (mAutoPilotFinishedCallback)
+ {
+ mAutoPilotFinishedCallback(dist_vec(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal) < mAutoPilotStopDistance, mAutoPilotCallbackData);
+ }
+
mAutoPilotFinishedCallback = finish_callback;
mAutoPilotCallbackData = callback_data;
mAutoPilotRotationThreshold = rot_threshold;
mAutoPilotBehaviorName = behavior_name;
+ mAutoPilotAllowFlying = allow_flying;
LLVector3d delta_pos( target_global );
delta_pos -= getPositionGlobal();
@@ -1268,14 +1278,23 @@ void LLAgent::startAutoPilotGlobal(
}
}
- mAutoPilotFlyOnStop = getFlying();
+ if (mAutoPilotAllowFlying)
+ {
+ mAutoPilotFlyOnStop = getFlying();
+ }
+ else
+ {
+ mAutoPilotFlyOnStop = FALSE;
+ }
- if (distance > 30.0)
+ if (distance > 30.0 && mAutoPilotAllowFlying)
{
setFlying(TRUE);
}
- if ( distance > 1.f && heightDelta > (sqrtf(mAutoPilotStopDistance) + 1.f))
+ if ( distance > 1.f &&
+ mAutoPilotAllowFlying &&
+ heightDelta > (sqrtf(mAutoPilotStopDistance) + 1.f))
{
setFlying(TRUE);
// Do not force flying for "Sit" behavior to prevent flying after pressing "Stand"
@@ -1285,22 +1304,8 @@ void LLAgent::startAutoPilotGlobal(
}
mAutoPilot = TRUE;
- mAutoPilotTargetGlobal = target_global;
-
- // trace ray down to find height of destination from ground
- LLVector3d traceEndPt = target_global;
- traceEndPt.mdV[VZ] -= 20.f;
+ setAutoPilotTargetGlobal(target_global);
- LLVector3d targetOnGround;
- LLVector3 groundNorm;
- LLViewerObject *obj;
-
- LLWorld::getInstance()->resolveStepHeightGlobal(NULL, target_global, traceEndPt, targetOnGround, groundNorm, &obj);
- F64 target_height = llmax((F64)gAgentAvatarp->getPelvisToFoot(), target_global.mdV[VZ] - targetOnGround.mdV[VZ]);
-
- // clamp z value of target to minimum height above ground
- mAutoPilotTargetGlobal.mdV[VZ] = targetOnGround.mdV[VZ] + target_height;
- mAutoPilotTargetDist = (F32)dist_vec(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal);
if (target_rotation)
{
mAutoPilotUseRotation = TRUE;
@@ -1318,12 +1323,36 @@ void LLAgent::startAutoPilotGlobal(
//-----------------------------------------------------------------------------
-// startFollowPilot()
+// setAutoPilotTargetGlobal
//-----------------------------------------------------------------------------
-void LLAgent::startFollowPilot(const LLUUID &leader_id)
+void LLAgent::setAutoPilotTargetGlobal(const LLVector3d &target_global)
{
- if (!mAutoPilot) return;
+ if (mAutoPilot)
+ {
+ mAutoPilotTargetGlobal = target_global;
+
+ // trace ray down to find height of destination from ground
+ LLVector3d traceEndPt = target_global;
+ traceEndPt.mdV[VZ] -= 20.f;
+
+ LLVector3d targetOnGround;
+ LLVector3 groundNorm;
+ LLViewerObject *obj;
+
+ LLWorld::getInstance()->resolveStepHeightGlobal(NULL, target_global, traceEndPt, targetOnGround, groundNorm, &obj);
+ F64 target_height = llmax((F64)gAgentAvatarp->getPelvisToFoot(), target_global.mdV[VZ] - targetOnGround.mdV[VZ]);
+
+ // clamp z value of target to minimum height above ground
+ mAutoPilotTargetGlobal.mdV[VZ] = targetOnGround.mdV[VZ] + target_height;
+ mAutoPilotTargetDist = (F32)dist_vec(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal);
+ }
+}
+//-----------------------------------------------------------------------------
+// startFollowPilot()
+//-----------------------------------------------------------------------------
+void LLAgent::startFollowPilot(const LLUUID &leader_id, BOOL allow_flying, F32 stop_distance)
+{
mLeaderID = leader_id;
if ( mLeaderID.isNull() ) return;
@@ -1334,7 +1363,14 @@ void LLAgent::startFollowPilot(const LLUUID &leader_id)
return;
}
- startAutoPilotGlobal(object->getPositionGlobal());
+ startAutoPilotGlobal(object->getPositionGlobal(),
+ std::string(), // behavior_name
+ NULL, // target_rotation
+ NULL, // finish_callback
+ NULL, // callback_data
+ stop_distance,
+ 0.03f, // rotation_threshold
+ allow_flying);
}
@@ -1360,7 +1396,8 @@ void LLAgent::stopAutoPilot(BOOL user_cancel)
//NB: auto pilot can terminate for a reason other than reaching the destination
if (mAutoPilotFinishedCallback)
{
- mAutoPilotFinishedCallback(!user_cancel && dist_vec_squared(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal) < (mAutoPilotStopDistance * mAutoPilotStopDistance), mAutoPilotCallbackData);
+ mAutoPilotFinishedCallback(!user_cancel && dist_vec(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal) < mAutoPilotStopDistance, mAutoPilotCallbackData);
+ mAutoPilotFinishedCallback = NULL;
}
mLeaderID = LLUUID::null;
@@ -1400,7 +1437,7 @@ void LLAgent::autoPilot(F32 *delta_yaw)
if (!isAgentAvatarValid()) return;
- if (gAgentAvatarp->mInAir)
+ if (gAgentAvatarp->mInAir && mAutoPilotAllowFlying)
{
setFlying(TRUE);
}
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index 54c5649f97..67ed1923c0 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -469,19 +469,29 @@ public:
public:
BOOL getAutoPilot() const { return mAutoPilot; }
LLVector3d getAutoPilotTargetGlobal() const { return mAutoPilotTargetGlobal; }
+ LLUUID getAutoPilotLeaderID() const { return mLeaderID; }
+ F32 getAutoPilotStopDistance() const { return mAutoPilotStopDistance; }
+ F32 getAutoPilotTargetDist() const { return mAutoPilotTargetDist; }
+ BOOL getAutoPilotUseRotation() const { return mAutoPilotUseRotation; }
+ LLVector3 getAutoPilotTargetFacing() const { return mAutoPilotTargetFacing; }
+ F32 getAutoPilotRotationThreshold() const { return mAutoPilotRotationThreshold; }
+ std::string getAutoPilotBehaviorName() const { return mAutoPilotBehaviorName; }
+
void startAutoPilotGlobal(const LLVector3d &pos_global,
const std::string& behavior_name = std::string(),
const LLQuaternion *target_rotation = NULL,
void (*finish_callback)(BOOL, void *) = NULL, void *callback_data = NULL,
- F32 stop_distance = 0.f, F32 rotation_threshold = 0.03f);
- void startFollowPilot(const LLUUID &leader_id);
+ F32 stop_distance = 0.f, F32 rotation_threshold = 0.03f,
+ BOOL allow_flying = TRUE);
+ void startFollowPilot(const LLUUID &leader_id, BOOL allow_flying = TRUE, F32 stop_distance = 0.5f);
void stopAutoPilot(BOOL user_cancel = FALSE);
- void setAutoPilotGlobal(const LLVector3d &pos_global);
+ void setAutoPilotTargetGlobal(const LLVector3d &target_global);
void autoPilot(F32 *delta_yaw); // Autopilot walking action, angles in radians
void renderAutoPilotTarget();
private:
BOOL mAutoPilot;
BOOL mAutoPilotFlyOnStop;
+ BOOL mAutoPilotAllowFlying;
LLVector3d mAutoPilotTargetGlobal;
F32 mAutoPilotStopDistance;
BOOL mAutoPilotUseRotation;
diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp
index 9cea33c7c6..a8d2222c03 100644
--- a/indra/newview/llagentlistener.cpp
+++ b/indra/newview/llagentlistener.cpp
@@ -31,6 +31,7 @@
#include "llagentlistener.h"
#include "llagent.h"
+#include "llvoavatar.h"
#include "llcommandhandler.h"
#include "llslurl.h"
#include "llurldispatcher.h"
@@ -39,93 +40,242 @@
#include "llviewerregion.h"
#include "llsdutil.h"
#include "llsdutil_math.h"
+#include "lltoolgrab.h"
+#include "llhudeffectlookat.h"
+#include "llagentcamera.h"
LLAgentListener::LLAgentListener(LLAgent &agent)
: LLEventAPI("LLAgent",
"LLAgent listener to (e.g.) teleport, sit, stand, etc."),
mAgent(agent)
{
- add("requestTeleport",
+ add("requestTeleport",
"Teleport: [\"regionname\"], [\"x\"], [\"y\"], [\"z\"]\n"
"If [\"skip_confirmation\"] is true, use LLURLDispatcher rather than LLCommandDispatcher.",
&LLAgentListener::requestTeleport);
- add("requestSit",
- "Ask to sit on the object specified in [\"obj_uuid\"]",
+ add("requestSit",
+ "[\"obj_uuid\"]: id of object to sit on, use this or [\"position\"] to indicate the sit target"
+ "[\"position\"]: region position {x, y, z} where to find closest object to sit on",
&LLAgentListener::requestSit);
- add("requestStand",
+ add("requestStand",
"Ask to stand up",
&LLAgentListener::requestStand);
+ add("requestTouch",
+ "[\"obj_uuid\"]: id of object to touch, use this or [\"position\"] to indicate the object to touch"
+ "[\"position\"]: region position {x, y, z} where to find closest object to touch"
+ "[\"face\"]: optional object face number to touch[Default: 0]",
+ &LLAgentListener::requestTouch);
add("resetAxes",
"Set the agent to a fixed orientation (optionally specify [\"lookat\"] = array of [x, y, z])",
&LLAgentListener::resetAxes);
add("getAxes",
+ "Obsolete - use getPosition instead\n"
"Send information about the agent's orientation on [\"reply\"]:\n"
"[\"euler\"]: map of {roll, pitch, yaw}\n"
"[\"quat\"]: array of [x, y, z, w] quaternion values",
&LLAgentListener::getAxes,
LLSDMap("reply", LLSD()));
- add("getGroups",
- "Send on [\"reply\"], in [\"groups\"], an array describing agent's groups:\n"
- "[\"id\"]: UUID of group\n"
- "[\"name\"]: name of group",
- &LLAgentListener::getGroups,
+ add("getPosition",
+ "Send information about the agent's position and orientation on [\"reply\"]:\n"
+ "[\"region\"]: array of region {x, y, z} position\n"
+ "[\"global\"]: array of global {x, y, z} position\n"
+ "[\"euler\"]: map of {roll, pitch, yaw}\n"
+ "[\"quat\"]: array of [x, y, z, w] quaternion values",
+ &LLAgentListener::getPosition,
LLSDMap("reply", LLSD()));
+ add("startAutoPilot",
+ "Start the autopilot system using the following parameters:\n"
+ "[\"target_global\"]: array of target global {x, y, z} position\n"
+ "[\"stop_distance\"]: target maxiumum distance from target [default: autopilot guess]\n"
+ "[\"target_rotation\"]: array of [x, y, z, w] quaternion values [default: no target]\n"
+ "[\"rotation_threshold\"]: target maximum angle from target facing rotation [default: 0.03 radians]\n"
+ "[\"behavior_name\"]: name of the autopilot behavior [default: \"\"]"
+ "[\"allow_flying\"]: allow flying during autopilot [default: True]",
+ //"[\"callback_pump\"]: pump to send success/failure and callback data to [default: none]\n"
+ //"[\"callback_data\"]: data to send back during a callback [default: none]",
+ &LLAgentListener::startAutoPilot);
+ add("getAutoPilot",
+ "Send information about current state of the autopilot system to [\"reply\"]:\n"
+ "[\"enabled\"]: boolean indicating whether or not autopilot is enabled\n"
+ "[\"target_global\"]: array of target global {x, y, z} position\n"
+ "[\"leader_id\"]: uuid of target autopilot is following\n"
+ "[\"stop_distance\"]: target maximum distance from target\n"
+ "[\"target_distance\"]: last known distance from target\n"
+ "[\"use_rotation\"]: boolean indicating if autopilot has a target facing rotation\n"
+ "[\"target_facing\"]: array of {x, y} target direction to face\n"
+ "[\"rotation_threshold\"]: target maximum angle from target facing rotation\n"
+ "[\"behavior_name\"]: name of the autopilot behavior",
+ &LLAgentListener::getAutoPilot,
+ LLSDMap("reply", LLSD()));
+ add("startFollowPilot",
+ "[\"leader_id\"]: uuid of target to follow using the autopilot system (optional with avatar_name)\n"
+ "[\"avatar_name\"]: avatar name to follow using the autopilot system (optional with leader_id)\n"
+ "[\"allow_flying\"]: allow flying during autopilot [default: True]\n"
+ "[\"stop_distance\"]: target maxiumum distance from target [default: autopilot guess]",
+ &LLAgentListener::startFollowPilot);
+ add("setAutoPilotTarget",
+ "Update target for currently running autopilot:\n"
+ "[\"target_global\"]: array of target global {x, y, z} position",
+ &LLAgentListener::setAutoPilotTarget);
+ add("stopAutoPilot",
+ "Stop the autopilot system:\n"
+ "[\"user_cancel\"] indicates whether or not to act as though user canceled autopilot [default: false]",
+ &LLAgentListener::stopAutoPilot);
+ add("lookAt",
+ "[\"type\"]: number to indicate the lookAt type, 0 to clear\n"
+ "[\"obj_uuid\"]: id of object to look at, use this or [\"position\"] to indicate the target\n"
+ "[\"position\"]: region position {x, y, z} where to find closest object or avatar to look at",
+ &LLAgentListener::lookAt);
}
void LLAgentListener::requestTeleport(LLSD const & event_data) const
{
- if(event_data["skip_confirmation"].asBoolean())
+ if(event_data["skip_confirmation"].asBoolean())
+ {
+ LLSD params(LLSD::emptyArray());
+ params.append(event_data["regionname"]);
+ params.append(event_data["x"]);
+ params.append(event_data["y"]);
+ params.append(event_data["z"]);
+ LLCommandDispatcher::dispatch("teleport", params, LLSD(), NULL, "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?
+ }
+ else
+ {
+ std::string url = LLSLURL(event_data["regionname"],
+ LLVector3(event_data["x"].asReal(),
+ event_data["y"].asReal(),
+ event_data["z"].asReal())).getSLURLString();
+ LLURLDispatcher::dispatch(url, "clicked", NULL, false);
+ }
+}
+
+void LLAgentListener::requestSit(LLSD const & event_data) const
+{
+ //mAgent.getAvatarObject()->sitOnObject();
+ // shamelessly ripped from llviewermenu.cpp:handle_sit_or_stand()
+ // *TODO - find a permanent place to share this code properly.
+
+ LLViewerObject *object = NULL;
+ if (event_data.has("obj_uuid"))
+ {
+ object = gObjectList.findObject(event_data["obj_uuid"]);
+ }
+ else if (event_data.has("position"))
{
- LLSD params(LLSD::emptyArray());
- params.append(event_data["regionname"]);
- params.append(event_data["x"]);
- params.append(event_data["y"]);
- params.append(event_data["z"]);
- LLCommandDispatcher::dispatch("teleport", params, LLSD(), NULL, "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?
+ LLVector3 target_position = ll_vector3_from_sd(event_data["position"]);
+ object = findObjectClosestTo(target_position);
}
+
+ if (object && object->getPCode() == LL_PCODE_VOLUME)
+ {
+ gMessageSystem->newMessageFast(_PREHASH_AgentRequestSit);
+ gMessageSystem->nextBlockFast(_PREHASH_AgentData);
+ gMessageSystem->addUUIDFast(_PREHASH_AgentID, mAgent.getID());
+ gMessageSystem->addUUIDFast(_PREHASH_SessionID, mAgent.getSessionID());
+ gMessageSystem->nextBlockFast(_PREHASH_TargetObject);
+ gMessageSystem->addUUIDFast(_PREHASH_TargetID, object->mID);
+ gMessageSystem->addVector3Fast(_PREHASH_Offset, LLVector3(0,0,0));
+
+ object->getRegion()->sendReliableMessage();
+ }
else
{
- std::string url = LLSLURL(event_data["regionname"],
- LLVector3(event_data["x"].asReal(),
- event_data["y"].asReal(),
- event_data["z"].asReal())).getSLURLString();
- LLURLDispatcher::dispatch(url, "clicked", NULL, false);
+ llwarns << "LLAgent requestSit could not find the sit target: "
+ << event_data << llendl;
}
}
-void LLAgentListener::requestSit(LLSD const & event_data) const
+void LLAgentListener::requestStand(LLSD const & event_data) const
+{
+ mAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
+}
+
+
+LLViewerObject * LLAgentListener::findObjectClosestTo( const LLVector3 & position ) const
{
- //mAgent.getAvatarObject()->sitOnObject();
- // shamelessly ripped from llviewermenu.cpp:handle_sit_or_stand()
- // *TODO - find a permanent place to share this code properly.
- LLViewerObject *object = gObjectList.findObject(event_data["obj_uuid"]);
+ LLViewerObject *object = NULL;
- if (object && object->getPCode() == LL_PCODE_VOLUME)
+ // Find the object closest to that position
+ F32 min_distance = 10000.0f; // Start big
+ S32 num_objects = gObjectList.getNumObjects();
+ S32 cur_index = 0;
+ while (cur_index < num_objects)
{
- gMessageSystem->newMessageFast(_PREHASH_AgentRequestSit);
- gMessageSystem->nextBlockFast(_PREHASH_AgentData);
- gMessageSystem->addUUIDFast(_PREHASH_AgentID, mAgent.getID());
- gMessageSystem->addUUIDFast(_PREHASH_SessionID, mAgent.getSessionID());
- gMessageSystem->nextBlockFast(_PREHASH_TargetObject);
- gMessageSystem->addUUIDFast(_PREHASH_TargetID, object->mID);
- gMessageSystem->addVector3Fast(_PREHASH_Offset, LLVector3(0,0,0));
-
- object->getRegion()->sendReliableMessage();
+ LLViewerObject * cur_object = gObjectList.getObject(cur_index++);
+ if (cur_object)
+ { // Calculate distance from the target position
+ LLVector3 target_diff = cur_object->getPositionRegion() - position;
+ F32 distance_to_target = target_diff.length();
+ if (distance_to_target < min_distance)
+ { // Found an object closer
+ min_distance = distance_to_target;
+ object = cur_object;
+ }
+ }
}
+
+ return object;
}
-void LLAgentListener::requestStand(LLSD const & event_data) const
+
+void LLAgentListener::requestTouch(LLSD const & event_data) const
{
- mAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
+ LLViewerObject *object = NULL;
+
+ if (event_data.has("obj_uuid"))
+ {
+ object = gObjectList.findObject(event_data["obj_uuid"]);
+ }
+ else if (event_data.has("position"))
+ {
+ LLVector3 target_position = ll_vector3_from_sd(event_data["position"]);
+ object = findObjectClosestTo(target_position);
+ }
+
+ S32 face = 0;
+ if (event_data.has("face"))
+ {
+ face = event_data["face"].asInteger();
+ }
+
+ if (object && object->getPCode() == LL_PCODE_VOLUME)
+ {
+ // Fake enough pick info to get it to (hopefully) work
+ LLPickInfo pick;
+ pick.mObjectFace = face;
+
+ /*
+ These values are sent to the simulator, but face seems to be easiest to use
+
+ pick.mUVCoords "UVCoord"
+ pick.mSTCoords "STCoord"
+ pick.mObjectFace "FaceIndex"
+ pick.mIntersection "Position"
+ pick.mNormal "Normal"
+ pick.mBinormal "Binormal"
+ */
+
+ // A touch is a sketchy message sequence ... send a grab, immediately
+ // followed by un-grabbing, crossing fingers and hoping packets arrive in
+ // the correct order
+ send_ObjectGrab_message(object, pick, LLVector3::zero);
+ send_ObjectDeGrab_message(object, pick);
+ }
+ else
+ {
+ llwarns << "LLAgent requestTouch could not find the touch target "
+ << event_data["obj_uuid"].asUUID() << llendl;
+ }
}
-void LLAgentListener::resetAxes(const LLSD& event) const
+
+void LLAgentListener::resetAxes(const LLSD& event_data) const
{
- if (event.has("lookat"))
+ if (event_data.has("lookat"))
{
- mAgent.resetAxes(ll_vector3_from_sd(event["lookat"]));
+ mAgent.resetAxes(ll_vector3_from_sd(event_data["lookat"]));
}
else
{
@@ -134,17 +284,210 @@ void LLAgentListener::resetAxes(const LLSD& event) const
}
}
-void LLAgentListener::getAxes(const LLSD& event) const
+void LLAgentListener::getAxes(const LLSD& event_data) const
{
LLQuaternion quat(mAgent.getQuat());
F32 roll, pitch, yaw;
quat.getEulerAngles(&roll, &pitch, &yaw);
// The official query API for LLQuaternion's [x, y, z, w] values is its
// public member mQ...
- sendReply(LLSDMap
- ("quat", llsd_copy_array(boost::begin(quat.mQ), boost::end(quat.mQ)))
- ("euler", LLSDMap("roll", roll)("pitch", pitch)("yaw", yaw)),
- event);
+ LLSD reply = LLSD::emptyMap();
+ reply["quat"] = llsd_copy_array(boost::begin(quat.mQ), boost::end(quat.mQ));
+ reply["euler"] = LLSD::emptyMap();
+ reply["euler"]["roll"] = roll;
+ reply["euler"]["pitch"] = pitch;
+ reply["euler"]["yaw"] = yaw;
+ sendReply(reply, event_data);
+}
+
+void LLAgentListener::getPosition(const LLSD& event_data) const
+{
+ F32 roll, pitch, yaw;
+ LLQuaternion quat(mAgent.getQuat());
+ quat.getEulerAngles(&roll, &pitch, &yaw);
+
+ LLSD reply = LLSD::emptyMap();
+ reply["quat"] = llsd_copy_array(boost::begin(quat.mQ), boost::end(quat.mQ));
+ reply["euler"] = LLSD::emptyMap();
+ reply["euler"]["roll"] = roll;
+ reply["euler"]["pitch"] = pitch;
+ reply["euler"]["yaw"] = yaw;
+ reply["region"] = ll_sd_from_vector3(mAgent.getPositionAgent());
+ reply["global"] = ll_sd_from_vector3d(mAgent.getPositionGlobal());
+
+ sendReply(reply, event_data);
+}
+
+
+void LLAgentListener::startAutoPilot(LLSD const & event_data)
+{
+ LLQuaternion target_rotation_value;
+ LLQuaternion* target_rotation = NULL;
+ if (event_data.has("target_rotation"))
+ {
+ target_rotation_value = ll_quaternion_from_sd(event_data["target_rotation"]);
+ target_rotation = &target_rotation_value;
+ }
+ // *TODO: Use callback_pump and callback_data
+ F32 rotation_threshold = 0.03f;
+ if (event_data.has("rotation_threshold"))
+ {
+ rotation_threshold = event_data["rotation_threshold"].asReal();
+ }
+
+ BOOL allow_flying = TRUE;
+ if (event_data.has("allow_flying"))
+ {
+ allow_flying = (BOOL) event_data["allow_flying"].asBoolean();
+ mAgent.setFlying(allow_flying);
+ }
+
+ F32 stop_distance = 0.f;
+ if (event_data.has("stop_distance"))
+ {
+ stop_distance = event_data["stop_distance"].asReal();
+ }
+
+ // Clear follow target, this is doing a path
+ mFollowTarget.setNull();
+
+ mAgent.startAutoPilotGlobal(ll_vector3d_from_sd(event_data["target_global"]),
+ event_data["behavior_name"],
+ target_rotation,
+ NULL, NULL,
+ stop_distance,
+ rotation_threshold,
+ allow_flying);
+}
+
+void LLAgentListener::getAutoPilot(const LLSD& event_data) const
+{
+ LLSD reply = LLSD::emptyMap();
+
+ LLSD::Boolean enabled = mAgent.getAutoPilot();
+ reply["enabled"] = enabled;
+
+ reply["target_global"] = ll_sd_from_vector3d(mAgent.getAutoPilotTargetGlobal());
+
+ reply["leader_id"] = mAgent.getAutoPilotLeaderID();
+
+ reply["stop_distance"] = mAgent.getAutoPilotStopDistance();
+
+ reply["target_distance"] = mAgent.getAutoPilotTargetDist();
+ if (!enabled &&
+ mFollowTarget.notNull())
+ { // Get an actual distance from the target object we were following
+ LLViewerObject * target = gObjectList.findObject(mFollowTarget);
+ if (target)
+ { // Found the target AV, return the actual distance to them as well as their ID
+ LLVector3 difference = target->getPositionRegion() - mAgent.getPositionAgent();
+ reply["target_distance"] = difference.length();
+ reply["leader_id"] = mFollowTarget;
+ }
+ }
+
+ reply["use_rotation"] = (LLSD::Boolean) mAgent.getAutoPilotUseRotation();
+ reply["target_facing"] = ll_sd_from_vector3(mAgent.getAutoPilotTargetFacing());
+ reply["rotation_threshold"] = mAgent.getAutoPilotRotationThreshold();
+ reply["behavior_name"] = mAgent.getAutoPilotBehaviorName();
+ reply["fly"] = (LLSD::Boolean) mAgent.getFlying();
+
+ sendReply(reply, event_data);
+}
+
+void LLAgentListener::startFollowPilot(LLSD const & event_data)
+{
+ LLUUID target_id;
+
+ BOOL allow_flying = TRUE;
+ if (event_data.has("allow_flying"))
+ {
+ allow_flying = (BOOL) event_data["allow_flying"].asBoolean();
+ }
+
+ if (event_data.has("leader_id"))
+ {
+ target_id = event_data["leader_id"];
+ }
+ else if (event_data.has("avatar_name"))
+ { // Find the avatar with matching name
+ std::string target_name = event_data["avatar_name"].asString();
+
+ if (target_name.length() > 0)
+ {
+ S32 num_objects = gObjectList.getNumObjects();
+ S32 cur_index = 0;
+ while (cur_index < num_objects)
+ {
+ LLViewerObject * cur_object = gObjectList.getObject(cur_index++);
+ if (cur_object &&
+ cur_object->asAvatar() &&
+ cur_object->asAvatar()->getFullname() == target_name)
+ { // Found avatar with matching name, extract id and break out of loop
+ target_id = cur_object->getID();
+ break;
+ }
+ }
+ }
+ }
+
+ F32 stop_distance = 0.f;
+ if (event_data.has("stop_distance"))
+ {
+ stop_distance = event_data["stop_distance"].asReal();
+ }
+
+ if (target_id.notNull())
+ {
+ mAgent.setFlying(allow_flying);
+ mFollowTarget = target_id; // Save follow target so we can report distance later
+
+ mAgent.startFollowPilot(target_id, allow_flying, stop_distance);
+ }
+}
+
+void LLAgentListener::setAutoPilotTarget(LLSD const & event_data) const
+{
+ if (event_data.has("target_global"))
+ {
+ LLVector3d target_global(ll_vector3d_from_sd(event_data["target_global"]));
+ mAgent.setAutoPilotTargetGlobal(target_global);
+ }
+}
+
+void LLAgentListener::stopAutoPilot(LLSD const & event_data) const
+{
+ BOOL user_cancel = FALSE;
+ if (event_data.has("user_cancel"))
+ {
+ user_cancel = event_data["user_cancel"].asBoolean();
+ }
+ mAgent.stopAutoPilot(user_cancel);
+}
+
+void LLAgentListener::lookAt(LLSD const & event_data) const
+{
+ LLViewerObject *object = NULL;
+ if (event_data.has("obj_uuid"))
+ {
+ object = gObjectList.findObject(event_data["obj_uuid"]);
+ }
+ else if (event_data.has("position"))
+ {
+ LLVector3 target_position = ll_vector3_from_sd(event_data["position"]);
+ object = findObjectClosestTo(target_position);
+ }
+
+ S32 look_at_type = (S32) LOOKAT_TARGET_NONE;
+ if (event_data.has("type"))
+ {
+ look_at_type = event_data["type"].asInteger();
+ }
+ if (look_at_type >= (S32) LOOKAT_TARGET_NONE &&
+ look_at_type < (S32) LOOKAT_NUM_TARGETS)
+ {
+ gAgentCamera.setLookAt((ELookAtType) look_at_type, object);
+ }
}
void LLAgentListener::getGroups(const LLSD& event) const
diff --git a/indra/newview/llagentlistener.h b/indra/newview/llagentlistener.h
index 5a89a99f6a..9a9c4073fe 100644
--- a/indra/newview/llagentlistener.h
+++ b/indra/newview/llagentlistener.h
@@ -34,22 +34,35 @@
class LLAgent;
class LLSD;
+class LLViewerObject;
+class LLVector3d;
class LLAgentListener : public LLEventAPI
{
public:
- LLAgentListener(LLAgent &agent);
+ LLAgentListener(LLAgent &agent);
private:
- void requestTeleport(LLSD const & event_data) const;
- void requestSit(LLSD const & event_data) const;
- void requestStand(LLSD const & event_data) const;
- void resetAxes(const LLSD& event) const;
- void getAxes(const LLSD& event) const;
+ void requestTeleport(LLSD const & event_data) const;
+ void requestSit(LLSD const & event_data) const;
+ void requestStand(LLSD const & event_data) const;
+ void requestTouch(LLSD const & event_data) const;
+ void resetAxes(const LLSD& event_data) const;
+ void getAxes(const LLSD& event_data) const;
void getGroups(const LLSD& event) const;
+ void getPosition(const LLSD& event_data) const;
+ void startAutoPilot(const LLSD& event_data);
+ void getAutoPilot(const LLSD& event_data) const;
+ void startFollowPilot(const LLSD& event_data);
+ void setAutoPilotTarget(const LLSD& event_data) const;
+ void stopAutoPilot(const LLSD& event_data) const;
+ void lookAt(LLSD const & event_data) const;
+
+ LLViewerObject * findObjectClosestTo( const LLVector3 & position ) const;
private:
- LLAgent & mAgent;
+ LLAgent & mAgent;
+ LLUUID mFollowTarget;
};
#endif // LL_LLAGENTLISTENER_H
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 75b6c18c57..90f46316e8 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -695,6 +695,8 @@ bool LLAppViewer::init()
if (!initConfiguration())
return false;
+ LL_INFOS("InitInfo") << "Configuration initialized." << LL_ENDL ;
+
// write Google Breakpad minidump files to our log directory
std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "");
logdir += gDirUtilp->getDirDelimiter();
@@ -721,6 +723,8 @@ bool LLAppViewer::init()
// *NOTE:Mani - LLCurl::initClass is not thread safe.
// Called before threads are created.
LLCurl::initClass();
+ LL_INFOS("InitInfo") << "LLCurl initialized." << LL_ENDL ;
+
LLMachineID::init();
{
@@ -739,6 +743,8 @@ bool LLAppViewer::init()
}
initThreads();
+ LL_INFOS("InitInfo") << "Threads initialized." << LL_ENDL ;
+
writeSystemInfo();
// Initialize updater service (now that we have an io pump)
@@ -773,6 +779,7 @@ bool LLAppViewer::init()
gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, CRASH_BEHAVIOR_ALWAYS_SEND);
gCrashSettings.saveToFile(crash_settings_filename, FALSE);
}
+ LL_INFOS("InitInfo") << "Crash settings done." << LL_ENDL ;
/////////////////////////////////////////////////
// OS-specific login dialogs
@@ -821,6 +828,8 @@ bool LLAppViewer::init()
// Let code in llui access the viewer help floater
LLUI::sHelpImpl = LLViewerHelp::getInstance();
+ LL_INFOS("InitInfo") << "UI initialization is done." << LL_ENDL ;
+
// Load translations for tooltips
LLFloater::initClass();
@@ -870,6 +879,7 @@ bool LLAppViewer::init()
// Early out from user choice.
return false;
}
+ LL_INFOS("InitInfo") << "Hardware test initialization done." << LL_ENDL ;
// Prepare for out-of-memory situations, during which we will crash on
// purpose and save a dump.
@@ -890,7 +900,8 @@ bool LLAppViewer::init()
OSMessageBox(msg.str(),LLStringUtil::null,OSMB_OK);
return 1;
}
-
+ LL_INFOS("InitInfo") << "Cache initialization is done." << LL_ENDL ;
+
// Initialize the repeater service.
LLMainLoopRepeater::instance().start();
@@ -899,6 +910,7 @@ bool LLAppViewer::init()
//
gGLActive = TRUE;
initWindow();
+ LL_INFOS("InitInfo") << "Window is initialized." << LL_ENDL ;
// initWindow also initializes the Feature List, so now we can initialize this global.
LLCubeMap::sUseCubeMaps = LLFeatureManager::getInstance()->isFeatureAvailable("RenderCubeMap");
@@ -1036,6 +1048,8 @@ bool LLAppViewer::init()
}
LLViewerMedia::initClass();
+ LL_INFOS("InitInfo") << "Viewer media initialized." << LL_ENDL ;
+
LLTextUtil::TextHelpers::iconCallbackCreationFunction = create_text_segment_icon_from_url_match;
//EXT-7013 - On windows for some locale (Japanese) standard
@@ -1179,11 +1193,11 @@ bool LLAppViewer::mainLoop()
// Scan keyboard for movement keys. Command keys and typing
// are handled by windows callbacks. Don't do this until we're
// done initializing. JC
- if (gViewerWindow->mWindow->getVisible()
+ if ((gHeadlessClient || gViewerWindow->mWindow->getVisible())
&& gViewerWindow->getActive()
&& !gViewerWindow->mWindow->getMinimized()
&& LLStartUp::getStartupState() == STATE_STARTED
- && !gViewerWindow->getShowProgress()
+ && (gHeadlessClient || !gViewerWindow->getShowProgress())
&& !gFocusMgr.focusLocked())
{
LLMemType mjk(LLMemType::MTYPE_JOY_KEY);
@@ -2502,7 +2516,8 @@ bool LLAppViewer::initConfiguration()
// it relies on checking a marker file which will not work when running
// out of different directories
- if (LLStartUp::getStartSLURL().isValid())
+ if (LLStartUp::getStartSLURL().isValid() &&
+ (gSavedSettings.getBOOL("SLURLPassToOtherInstance")))
{
if (sendURLToOtherInstance(LLStartUp::getStartSLURL().getSLURLString()))
{
@@ -2812,6 +2827,8 @@ bool LLAppViewer::initWindow()
gSavedSettings.getS32("WindowWidth"), gSavedSettings.getS32("WindowHeight"),
gSavedSettings.getBOOL("WindowFullScreen"), ignorePixelDepth);
+ LL_INFOS("AppInit") << "gViewerwindow created." << LL_ENDL;
+
// Need to load feature table before cheking to start watchdog.
const S32 NEVER_SUBMIT_REPORT = 2;
bool use_watchdog = false;
@@ -2831,6 +2848,7 @@ bool LLAppViewer::initWindow()
{
LLWatchdog::getInstance()->init(watchdog_killer_callback);
}
+ LL_INFOS("AppInit") << "watchdog setting is done." << LL_ENDL;
LLNotificationsUI::LLNotificationManager::getInstance();
@@ -2853,7 +2871,8 @@ bool LLAppViewer::initWindow()
gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
gPipeline.init();
-
+ LL_INFOS("AppInit") << "gPipeline Initialized" << LL_ENDL;
+
stop_glerror();
gViewerWindow->initGLDefaults();
@@ -2892,7 +2911,7 @@ bool LLAppViewer::initWindow()
// show viewer window
//gViewerWindow->mWindow->show();
-
+ LL_INFOS("AppInit") << "Window initialization done." << LL_ENDL;
return true;
}
@@ -3634,11 +3653,25 @@ bool LLAppViewer::initCache()
// Init the texture cache
// Allocate 80% of the cache size for textures
- const S32 MB = 1024*1024;
+ const S32 MB = 1024 * 1024;
+ const S64 MIN_CACHE_SIZE = 64 * MB;
+ const S64 MAX_CACHE_SIZE = 9984ll * MB;
+ const S64 MAX_VFS_SIZE = 1024 * MB; // 1 GB
+
S64 cache_size = (S64)(gSavedSettings.getU32("CacheSize")) * MB;
- const S64 MAX_CACHE_SIZE = 1024*MB;
- cache_size = llmin(cache_size, MAX_CACHE_SIZE);
- S64 texture_cache_size = ((cache_size * 8)/10);
+ cache_size = llclamp(cache_size, MIN_CACHE_SIZE, MAX_CACHE_SIZE);
+
+ S64 texture_cache_size = ((cache_size * 8) / 10);
+ S64 vfs_size = cache_size - texture_cache_size;
+
+ if (vfs_size > MAX_VFS_SIZE)
+ {
+ // Give the texture cache more space, since the VFS can't be bigger than 1GB.
+ // This happens when the user's CacheSize setting is greater than 5GB.
+ vfs_size = MAX_VFS_SIZE;
+ texture_cache_size = cache_size - MAX_VFS_SIZE;
+ }
+
S64 extra = LLAppViewer::getTextureCache()->initCache(LL_PATH_CACHE, texture_cache_size, texture_cache_mismatch);
texture_cache_size -= extra;
@@ -3647,21 +3680,19 @@ bool LLAppViewer::initCache()
LLSplashScreen::update(LLTrans::getString("StartupInitializingVFS"));
// Init the VFS
- S64 vfs_size = cache_size - texture_cache_size;
- const S64 MAX_VFS_SIZE = 1024 * MB; // 1 GB
- vfs_size = llmin(vfs_size, MAX_VFS_SIZE);
+ vfs_size = llmin(vfs_size + extra, MAX_VFS_SIZE);
vfs_size = (vfs_size / MB) * MB; // make sure it is MB aligned
U32 vfs_size_u32 = (U32)vfs_size;
U32 old_vfs_size = gSavedSettings.getU32("VFSOldSize") * MB;
bool resize_vfs = (vfs_size_u32 != old_vfs_size);
if (resize_vfs)
{
- gSavedSettings.setU32("VFSOldSize", vfs_size_u32/MB);
+ gSavedSettings.setU32("VFSOldSize", vfs_size_u32 / MB);
}
- LL_INFOS("AppCache") << "VFS CACHE SIZE: " << vfs_size/(1024*1024) << " MB" << LL_ENDL;
+ LL_INFOS("AppCache") << "VFS CACHE SIZE: " << vfs_size / (1024*1024) << " MB" << LL_ENDL;
// This has to happen BEFORE starting the vfs
- //time_t ltime;
+ // time_t ltime;
srand(time(NULL)); // Flawfinder: ignore
U32 old_salt = gSavedSettings.getU32("VFSSalt");
U32 new_salt;
@@ -3682,10 +3713,10 @@ bool LLAppViewer::initCache()
do
{
new_salt = rand();
- } while( new_salt == old_salt );
+ } while(new_salt == old_salt);
}
- old_vfs_data_file = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,VFS_DATA_FILE_BASE) + llformat("%u",old_salt);
+ old_vfs_data_file = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, VFS_DATA_FILE_BASE) + llformat("%u", old_salt);
// make sure this file exists
llstat s;
@@ -3699,7 +3730,7 @@ bool LLAppViewer::initCache()
mask += "*";
std::string dir;
- dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"");
+ dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "");
std::string found_file;
LLDirIterator iter(dir, mask);
@@ -3716,7 +3747,7 @@ bool LLAppViewer::initCache()
}
}
- old_vfs_index_file = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,VFS_INDEX_FILE_BASE) + llformat("%u",old_salt);
+ old_vfs_index_file = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, VFS_INDEX_FILE_BASE) + llformat("%u", old_salt);
stat_result = LLFile::stat(old_vfs_index_file, &s);
if (stat_result)
@@ -3729,27 +3760,25 @@ bool LLAppViewer::initCache()
// Just in case, nuke any other old cache files in the directory.
std::string dir;
- dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"");
+ dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "");
std::string mask;
- mask = gDirUtilp->getDirDelimiter();
- mask += VFS_DATA_FILE_BASE;
+ mask = VFS_DATA_FILE_BASE;
mask += "*";
gDirUtilp->deleteFilesInDir(dir, mask);
- mask = gDirUtilp->getDirDelimiter();
- mask += VFS_INDEX_FILE_BASE;
+ mask = VFS_INDEX_FILE_BASE;
mask += "*";
gDirUtilp->deleteFilesInDir(dir, mask);
}
- new_vfs_data_file = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,VFS_DATA_FILE_BASE) + llformat("%u",new_salt);
- new_vfs_index_file = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, VFS_INDEX_FILE_BASE) + llformat("%u",new_salt);
+ new_vfs_data_file = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, VFS_DATA_FILE_BASE) + llformat("%u", new_salt);
+ new_vfs_index_file = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, VFS_INDEX_FILE_BASE) + llformat("%u", new_salt);
- static_vfs_data_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"static_data.db2");
- static_vfs_index_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"static_index.db2");
+ static_vfs_data_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "static_data.db2");
+ static_vfs_index_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "static_index.db2");
if (resize_vfs)
{
@@ -3772,19 +3801,19 @@ bool LLAppViewer::initCache()
// Don't remove VFS after viewer crashes. If user has corrupt data, they can reinstall. JC
gVFS = LLVFS::createLLVFS(new_vfs_index_file, new_vfs_data_file, false, vfs_size_u32, false);
- if( !gVFS )
+ if (!gVFS)
{
return false;
}
gStaticVFS = LLVFS::createLLVFS(static_vfs_index_file, static_vfs_data_file, true, 0, false);
- if( !gStaticVFS )
+ if (!gStaticVFS)
{
return false;
}
BOOL success = gVFS->isValid() && gStaticVFS->isValid();
- if( !success )
+ if (!success)
{
return false;
}
@@ -3805,11 +3834,11 @@ bool LLAppViewer::initCache()
void LLAppViewer::purgeCache()
{
- LL_INFOS("AppCache") << "Purging Cache and Texture Cache..." << llendl;
+ LL_INFOS("AppCache") << "Purging Cache and Texture Cache..." << LL_ENDL;
LLAppViewer::getTextureCache()->purgeCache(LL_PATH_CACHE);
LLVOCache::getInstance()->removeCache(LL_PATH_CACHE);
- std::string mask = gDirUtilp->getDirDelimiter() + "*.*";
- gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""),mask);
+ std::string mask = "*.*";
+ gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ""), mask);
}
std::string LLAppViewer::getSecondLifeTitle() const
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index 6396ca91ff..445bd208ef 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -295,23 +295,44 @@ void create_console()
// redirect unbuffered STDOUT to the console
l_std_handle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT);
- fp = _fdopen( h_con_handle, "w" );
- *stdout = *fp;
- setvbuf( stdout, NULL, _IONBF, 0 );
+ if (h_con_handle == -1)
+ {
+ llwarns << "create_console() failed to open stdout handle" << llendl;
+ }
+ else
+ {
+ fp = _fdopen( h_con_handle, "w" );
+ *stdout = *fp;
+ setvbuf( stdout, NULL, _IONBF, 0 );
+ }
// redirect unbuffered STDIN to the console
l_std_handle = (long)GetStdHandle(STD_INPUT_HANDLE);
h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT);
- fp = _fdopen( h_con_handle, "r" );
- *stdin = *fp;
- setvbuf( stdin, NULL, _IONBF, 0 );
+ if (h_con_handle == -1)
+ {
+ llwarns << "create_console() failed to open stdin handle" << llendl;
+ }
+ else
+ {
+ fp = _fdopen( h_con_handle, "r" );
+ *stdin = *fp;
+ setvbuf( stdin, NULL, _IONBF, 0 );
+ }
// redirect unbuffered STDERR to the console
l_std_handle = (long)GetStdHandle(STD_ERROR_HANDLE);
h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT);
- fp = _fdopen( h_con_handle, "w" );
- *stderr = *fp;
- setvbuf( stderr, NULL, _IONBF, 0 );
+ if (h_con_handle == -1)
+ {
+ llwarns << "create_console() failed to open stderr handle" << llendl;
+ }
+ else
+ {
+ fp = _fdopen( h_con_handle, "w" );
+ *stderr = *fp;
+ setvbuf( stderr, NULL, _IONBF, 0 );
+ }
}
LLAppViewerWin32::LLAppViewerWin32(const char* cmd_line) :
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index cbbdcb2983..cbbdcb2983 100644..100755
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index f51552aae5..01d19c5ba0 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -46,6 +46,7 @@
#include "llhints.h"
#include "llimfloater.h" // for LLIMFloater
#include "llnearbychatbar.h"
+#include "llnearbychatbarlistener.h"
#include "llsidetray.h"
#include "llspeakbutton.h"
#include "llsplitbutton.h"
@@ -537,6 +538,8 @@ BOOL LLBottomTray::postBuild()
mNearbyChatBar = findChild<LLNearbyChatBar>("chat_bar");
LLHints::registerHintTarget("chat_bar", mNearbyChatBar->LLView::getHandle());
+ mListener.reset(new LLNearbyChatBarListener(*mNearbyChatBar));
+
mChatBarContainer = getChild<LLLayoutPanel>("chat_bar_layout_panel");
mNearbyCharResizeHandlePanel = getChild<LLPanel>("chat_bar_resize_handle_panel");
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index d9c95d82e5..62718531ef 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -39,6 +39,7 @@ class LLIMChiclet;
class LLBottomTrayLite;
class LLLayoutPanel;
class LLMenuGL;
+class LLNearbyChatBarListener;
// Build time optimization, generate once in .cpp file
#ifndef LLBOTTOMTRAY_CPP
@@ -555,6 +556,9 @@ protected:
* Image used to show position where dragged button will be dropped.
*/
LLUIImage* mImageDragIndication;
+
+ // We want only one LLNearbyChatBarListener object, so it's tied to this singleton
+ boost::shared_ptr<LLNearbyChatBarListener> mListener;
};
#endif // LL_LLBOTTOMPANEL_H
diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp
index 6e58be8174..cf0374075a 100644
--- a/indra/newview/llchatbar.cpp
+++ b/indra/newview/llchatbar.cpp
@@ -671,6 +671,9 @@ void LLChatBar::onCommitGesture(LLUICtrl* ctrl)
}
}
+
+/* Cruft - global gChatHandler declared below has been commented out,
+ so this class is never used. See similar code in llnearbychatbar.cpp
class LLChatHandler : public LLCommandHandler
{
public:
@@ -691,7 +694,7 @@ public:
{
S32 channel = tokens[0].asInteger();
// VWR-19499 Restrict function to chat channels greater than 0.
- if ((channel > 0) && (channel < 2147483647))
+ if ((channel > 0) && (channel < CHAT_CHANNEL_DEBUG))
{
retval = true;
// Say mesg on channel
@@ -710,3 +713,4 @@ public:
// Creating the object registers with the dispatcher.
//LLChatHandler gChatHandler;
+cruft */
diff --git a/indra/newview/llcommandhandler.cpp b/indra/newview/llcommandhandler.cpp
index 19dba3f917..19dba3f917 100644..100755
--- a/indra/newview/llcommandhandler.cpp
+++ b/indra/newview/llcommandhandler.cpp
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index 4ac4b89ab4..8985d3680e 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -94,6 +94,13 @@ void LLStandardBumpmap::restoreGL()
// static
void LLStandardBumpmap::addstandard()
{
+ if(!gTextureList.isInitialized())
+ {
+ //Note: loading pre-configuration sometimes triggers this call.
+ //But it is safe to return here because bump images will be reloaded during initialization later.
+ return ;
+ }
+
// can't assert; we destroyGL and restoreGL a lot during *first* startup, which populates this list already, THEN we explicitly init the list as part of *normal* startup. Sigh. So clear the list every time before we (re-)add the standard bumpmaps.
//llassert( LLStandardBumpmap::sStandardBumpmapCount == 0 );
clear();
@@ -910,6 +917,7 @@ void LLBumpImageList::restoreGL()
{
if(!gTextureList.isInitialized())
{
+ //safe to return here because bump images will be reloaded during initialization later.
return ;
}
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index d1bff9f423..83844048d1 100644
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -1,807 +1,807 @@
-/**
- * @file llfeaturemanager.cpp
- * @brief LLFeatureManager class implementation
- *
- * $LicenseInfo:firstyear=2003&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 <iostream>
-#include <fstream>
-
-#include <boost/regex.hpp>
-
-#include "llfeaturemanager.h"
-#include "lldir.h"
-
-#include "llsys.h"
-#include "llgl.h"
-#include "llsecondlifeurls.h"
-
-#include "llappviewer.h"
-#include "llhttpclient.h"
-#include "llnotificationsutil.h"
-#include "llviewercontrol.h"
-#include "llworld.h"
-#include "lldrawpoolterrain.h"
-#include "llviewertexturelist.h"
-#include "llversioninfo.h"
-#include "llwindow.h"
-#include "llui.h"
-#include "llcontrol.h"
-#include "llboost.h"
-#include "llweb.h"
-
-#if LL_WINDOWS
-#include "lldxhardware.h"
-#endif
-
-
-#if LL_DARWIN
-const char FEATURE_TABLE_FILENAME[] = "featuretable_mac.txt";
-const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_mac.%s.txt";
-#elif LL_LINUX
-const char FEATURE_TABLE_FILENAME[] = "featuretable_linux.txt";
-const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_linux.%s.txt";
-#elif LL_SOLARIS
-const char FEATURE_TABLE_FILENAME[] = "featuretable_solaris.txt";
-const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_solaris.%s.txt";
-#else
-const char FEATURE_TABLE_FILENAME[] = "featuretable%s.txt";
-const char FEATURE_TABLE_VER_FILENAME[] = "featuretable%s.%s.txt";
-#endif
-
-const char GPU_TABLE_FILENAME[] = "gpu_table.txt";
-const char GPU_TABLE_VER_FILENAME[] = "gpu_table.%s.txt";
-
-LLFeatureInfo::LLFeatureInfo(const std::string& name, const BOOL available, const F32 level)
- : mValid(TRUE), mName(name), mAvailable(available), mRecommendedLevel(level)
-{
-}
-
-LLFeatureList::LLFeatureList(const std::string& name)
- : mName(name)
-{
-}
-
-LLFeatureList::~LLFeatureList()
-{
-}
-
-void LLFeatureList::addFeature(const std::string& name, const BOOL available, const F32 level)
-{
- if (mFeatures.count(name))
- {
- LL_WARNS("RenderInit") << "LLFeatureList::Attempting to add preexisting feature " << name << LL_ENDL;
- }
-
- LLFeatureInfo fi(name, available, level);
- mFeatures[name] = fi;
-}
-
-BOOL LLFeatureList::isFeatureAvailable(const std::string& name)
-{
- if (mFeatures.count(name))
- {
- return mFeatures[name].mAvailable;
- }
-
- LL_WARNS("RenderInit") << "Feature " << name << " not on feature list!" << LL_ENDL;
-
- // changing this to TRUE so you have to explicitly disable
- // something for it to be disabled
- return TRUE;
-}
-
-F32 LLFeatureList::getRecommendedValue(const std::string& name)
-{
- if (mFeatures.count(name) && isFeatureAvailable(name))
- {
- return mFeatures[name].mRecommendedLevel;
- }
-
- LL_WARNS("RenderInit") << "Feature " << name << " not on feature list or not available!" << LL_ENDL;
- return 0;
-}
-
-BOOL LLFeatureList::maskList(LLFeatureList &mask)
-{
- //llinfos << "Masking with " << mask.mName << llendl;
- //
- // Lookup the specified feature mask, and overlay it on top of the
- // current feature mask.
- //
-
- LLFeatureInfo mask_fi;
-
- feature_map_t::iterator feature_it;
- for (feature_it = mask.mFeatures.begin(); feature_it != mask.mFeatures.end(); ++feature_it)
- {
- mask_fi = feature_it->second;
- //
- // Look for the corresponding feature
- //
- if (!mFeatures.count(mask_fi.mName))
- {
- LL_WARNS("RenderInit") << "Feature " << mask_fi.mName << " in mask not in top level!" << LL_ENDL;
- continue;
- }
-
- LLFeatureInfo &cur_fi = mFeatures[mask_fi.mName];
- if (mask_fi.mAvailable && !cur_fi.mAvailable)
- {
- LL_WARNS("RenderInit") << "Mask attempting to reenabling disabled feature, ignoring " << cur_fi.mName << LL_ENDL;
- continue;
- }
- cur_fi.mAvailable = mask_fi.mAvailable;
- cur_fi.mRecommendedLevel = llmin(cur_fi.mRecommendedLevel, mask_fi.mRecommendedLevel);
- LL_DEBUGS("RenderInit") << "Feature mask " << mask.mName
- << " Feature " << mask_fi.mName
- << " Mask: " << mask_fi.mRecommendedLevel
- << " Now: " << cur_fi.mRecommendedLevel << LL_ENDL;
- }
-
- LL_DEBUGS("RenderInit") << "After applying mask " << mask.mName << std::endl;
- // Will conditionally call dump only if the above message will be logged, thanks
- // to it being wrapped by the LL_DEBUGS and LL_ENDL macros.
- dump();
- LL_CONT << LL_ENDL;
-
- return TRUE;
-}
-
-void LLFeatureList::dump()
-{
- LL_DEBUGS("RenderInit") << "Feature list: " << mName << LL_ENDL;
- LL_DEBUGS("RenderInit") << "--------------" << LL_ENDL;
-
- LLFeatureInfo fi;
- feature_map_t::iterator feature_it;
- for (feature_it = mFeatures.begin(); feature_it != mFeatures.end(); ++feature_it)
- {
- fi = feature_it->second;
- LL_DEBUGS("RenderInit") << fi.mName << "\t\t" << fi.mAvailable << ":" << fi.mRecommendedLevel << LL_ENDL;
- }
- LL_DEBUGS("RenderInit") << LL_ENDL;
-}
-
-LLFeatureList *LLFeatureManager::findMask(const std::string& name)
-{
- if (mMaskList.count(name))
- {
- return mMaskList[name];
- }
-
- return NULL;
-}
-
-BOOL LLFeatureManager::maskFeatures(const std::string& name)
-{
- LLFeatureList *maskp = findMask(name);
- if (!maskp)
- {
- LL_DEBUGS("RenderInit") << "Unknown feature mask " << name << LL_ENDL;
- return FALSE;
- }
- LL_INFOS("RenderInit") << "Applying GPU Feature list: " << name << LL_ENDL;
- return maskList(*maskp);
-}
-
-BOOL LLFeatureManager::loadFeatureTables()
-{
- // *TODO - if I or anyone else adds something else to the skipped list
- // make this data driven. Put it in the feature table and parse it
- // correctly
- mSkippedFeatures.insert("RenderAnisotropic");
- mSkippedFeatures.insert("RenderGamma");
- mSkippedFeatures.insert("RenderVBOEnable");
- mSkippedFeatures.insert("RenderFogRatio");
-
- // first table is install with app
- std::string app_path = gDirUtilp->getAppRODataDir();
- app_path += gDirUtilp->getDirDelimiter();
-
- std::string filename;
- std::string http_filename;
-#if LL_WINDOWS
- std::string os_string = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
- if (os_string.find("Microsoft Windows XP") == 0)
- {
- filename = llformat(FEATURE_TABLE_FILENAME, "_xp");
- http_filename = llformat(FEATURE_TABLE_VER_FILENAME, "_xp", LLVersionInfo::getVersion().c_str());
- }
- else
- {
- filename = llformat(FEATURE_TABLE_FILENAME, "");
- http_filename = llformat(FEATURE_TABLE_VER_FILENAME, "", LLVersionInfo::getVersion().c_str());
- }
-#else
- filename = FEATURE_TABLE_FILENAME;
- http_filename = llformat(FEATURE_TABLE_VER_FILENAME, LLVersionInfo::getVersion().c_str());
-#endif
-
- app_path += filename;
-
-
- // second table is downloaded with HTTP
- std::string http_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, http_filename);
-
- // use HTTP table if it exists
- std::string path;
- if (gDirUtilp->fileExists(http_path))
- {
- path = http_path;
- }
- else
- {
- path = app_path;
- }
-
-
- return parseFeatureTable(path);
-}
-
-
-BOOL LLFeatureManager::parseFeatureTable(std::string filename)
-{
- llinfos << "Looking for feature table in " << filename << llendl;
-
- llifstream file;
- std::string name;
- U32 version;
-
- file.open(filename); /*Flawfinder: ignore*/
-
- if (!file)
- {
- LL_WARNS("RenderInit") << "Unable to open feature table " << filename << LL_ENDL;
- return FALSE;
- }
-
- // Check file version
- file >> name;
- file >> version;
- if (name != "version")
- {
- LL_WARNS("RenderInit") << filename << " does not appear to be a valid feature table!" << LL_ENDL;
- return FALSE;
- }
-
- mTableVersion = version;
-
- LLFeatureList *flp = NULL;
- while (file >> name)
- {
- char buffer[MAX_STRING]; /*Flawfinder: ignore*/
-
- if (name.substr(0,2) == "//")
- {
- // This is a comment.
- file.getline(buffer, MAX_STRING);
- continue;
- }
-
- if (name == "list")
- {
- if (flp)
- {
- //flp->dump();
- }
- // It's a new mask, create it.
- file >> name;
- if (mMaskList.count(name))
- {
- LL_ERRS("RenderInit") << "Overriding mask " << name << ", this is invalid!" << LL_ENDL;
- }
-
- flp = new LLFeatureList(name);
- mMaskList[name] = flp;
- }
- else
- {
- if (!flp)
- {
- LL_ERRS("RenderInit") << "Specified parameter before <list> keyword!" << LL_ENDL;
- return FALSE;
- }
- S32 available;
- F32 recommended;
- file >> available >> recommended;
- flp->addFeature(name, available, recommended);
- }
- }
- file.close();
-
- return TRUE;
-}
-
-void LLFeatureManager::loadGPUClass()
-{
- // defaults
- mGPUClass = GPU_CLASS_UNKNOWN;
- mGPUString = gGLManager.getRawGLString();
- mGPUSupported = FALSE;
-
- // first table is in the app dir
- std::string app_path = gDirUtilp->getAppRODataDir();
- app_path += gDirUtilp->getDirDelimiter();
- app_path += GPU_TABLE_FILENAME;
-
- // second table is downloaded with HTTP
- std::string http_filename = llformat(GPU_TABLE_VER_FILENAME, LLVersionInfo::getVersion().c_str());
- std::string http_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, http_filename);
-
- // use HTTP table if it exists
- std::string path;
- if (gDirUtilp->fileExists(http_path))
- {
- path = http_path;
- }
- else
- {
- path = app_path;
- }
-
- parseGPUTable(path);
-}
-
-
-void LLFeatureManager::parseGPUTable(std::string filename)
-{
- llifstream file;
-
- file.open(filename);
-
- if (!file)
- {
- LL_WARNS("RenderInit") << "Unable to open GPU table: " << filename << "!" << LL_ENDL;
- return;
- }
-
- std::string rawRenderer = gGLManager.getRawGLString();
- std::string renderer = rawRenderer;
- for (std::string::iterator i = renderer.begin(); i != renderer.end(); ++i)
- {
- *i = tolower(*i);
- }
-
- bool gpuFound;
- U32 lineNumber;
- for (gpuFound = false, lineNumber = 0; !gpuFound && !file.eof(); lineNumber++)
- {
- char buffer[MAX_STRING]; /*Flawfinder: ignore*/
- buffer[0] = 0;
-
- file.getline(buffer, MAX_STRING);
-
- if (strlen(buffer) >= 2 && /*Flawfinder: ignore*/
- buffer[0] == '/' &&
- buffer[1] == '/')
- {
- // This is a comment.
- continue;
- }
-
- if (strlen(buffer) == 0) /*Flawfinder: ignore*/
- {
- // This is a blank line
- continue;
- }
-
- // setup the tokenizer
- std::string buf(buffer);
- std::string cls, label, expr, supported;
- boost_tokenizer tokens(buf, boost::char_separator<char>("\t\n"));
- boost_tokenizer::iterator token_iter = tokens.begin();
-
- // grab the label, pseudo regular expression, and class
- if(token_iter != tokens.end())
- {
- label = *token_iter++;
- }
- if(token_iter != tokens.end())
- {
- expr = *token_iter++;
- }
- if(token_iter != tokens.end())
- {
- cls = *token_iter++;
- }
- if(token_iter != tokens.end())
- {
- supported = *token_iter++;
- }
-
- if (label.empty() || expr.empty() || cls.empty() || supported.empty())
- {
- LL_WARNS("RenderInit") << "invald gpu_table.txt:" << lineNumber << ": '" << buffer << "'" << LL_ENDL;
- continue;
- }
-
- for (U32 i = 0; i < expr.length(); i++) /*Flawfinder: ignore*/
- {
- expr[i] = tolower(expr[i]);
- }
-
- // run the regular expression against the renderer
- boost::regex re(expr.c_str());
- if(boost::regex_search(renderer, re))
- {
- // if we found it, stop!
- gpuFound = true;
- mGPUString = label;
- mGPUClass = (EGPUClass) strtol(cls.c_str(), NULL, 10);
- mGPUSupported = (BOOL) strtol(supported.c_str(), NULL, 10);
- }
- }
- file.close();
-
- if ( gpuFound )
- {
- LL_INFOS("RenderInit") << "GPU '" << rawRenderer << "' recognized as '" << mGPUString << "'" << LL_ENDL;
- if (!mGPUSupported)
- {
- LL_INFOS("RenderInit") << "GPU '" << mGPUString << "' is not supported." << LL_ENDL;
- }
- }
- else
- {
- LL_WARNS("RenderInit") << "GPU '" << rawRenderer << "' not recognized" << LL_ENDL;
- }
-}
-
-// responder saves table into file
-class LLHTTPFeatureTableResponder : public LLHTTPClient::Responder
-{
-public:
-
- LLHTTPFeatureTableResponder(std::string filename) :
- mFilename(filename)
- {
- }
-
-
- virtual void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
- {
- if (isGoodStatus(status))
- {
- // write to file
-
- llinfos << "writing feature table to " << mFilename << llendl;
-
- S32 file_size = buffer->countAfter(channels.in(), NULL);
- if (file_size > 0)
- {
- // read from buffer
- U8* copy_buffer = new U8[file_size];
- buffer->readAfter(channels.in(), NULL, copy_buffer, file_size);
-
- // write to file
- LLAPRFile out(mFilename, LL_APR_WB);
- out.write(copy_buffer, file_size);
- out.close();
- }
- }
-
- }
-
-private:
- std::string mFilename;
-};
-
-void fetch_feature_table(std::string table)
-{
- const std::string base = gSavedSettings.getString("FeatureManagerHTTPTable");
-
-#if LL_WINDOWS
- std::string os_string = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
- std::string filename;
- if (os_string.find("Microsoft Windows XP") == 0)
- {
- filename = llformat(table.c_str(), "_xp", LLVersionInfo::getVersion().c_str());
- }
- else
- {
- filename = llformat(table.c_str(), "", LLVersionInfo::getVersion().c_str());
- }
-#else
- const std::string filename = llformat(table.c_str(), LLVersionInfo::getVersion().c_str());
-#endif
-
- const std::string url = base + "/" + filename;
-
- const std::string path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, filename);
-
- llinfos << "LLFeatureManager fetching " << url << " into " << path << llendl;
-
- LLHTTPClient::get(url, new LLHTTPFeatureTableResponder(path));
-}
-
-void fetch_gpu_table(std::string table)
-{
- const std::string base = gSavedSettings.getString("FeatureManagerHTTPTable");
-
- const std::string filename = llformat(table.c_str(), LLVersionInfo::getVersion().c_str());
-
- const std::string url = base + "/" + filename;
-
- const std::string path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, filename);
-
- llinfos << "LLFeatureManager fetching " << url << " into " << path << llendl;
-
- LLHTTPClient::get(url, new LLHTTPFeatureTableResponder(path));
-}
-
-// fetch table(s) from a website (S3)
-void LLFeatureManager::fetchHTTPTables()
-{
- fetch_feature_table(FEATURE_TABLE_VER_FILENAME);
- fetch_gpu_table(GPU_TABLE_VER_FILENAME);
-}
-
-
-void LLFeatureManager::cleanupFeatureTables()
-{
- std::for_each(mMaskList.begin(), mMaskList.end(), DeletePairedPointer());
- mMaskList.clear();
-}
-
-void LLFeatureManager::init()
-{
- // load the tables
- loadFeatureTables();
-
- // get the gpu class
- loadGPUClass();
-
- // apply the base masks, so we know if anything is disabled
- applyBaseMasks();
-}
-
-void LLFeatureManager::applyRecommendedSettings()
-{
- // apply saved settings
- // cap the level at 2 (high)
- S32 level = llmax(GPU_CLASS_0, llmin(mGPUClass, GPU_CLASS_2));
-
- llinfos << "Applying Recommended Features" << llendl;
-
- setGraphicsLevel(level, false);
- gSavedSettings.setU32("RenderQualityPerformance", level);
-
- // now apply the tweaks to draw distance
- // these are double negatives, because feature masks only work by
- // downgrading values, so i needed to make a true value go to false
- // for certain cards, thus the awkward name, "Disregard..."
- if(!gSavedSettings.getBOOL("Disregard96DefaultDrawDistance"))
- {
- gSavedSettings.setF32("RenderFarClip", 96.0f);
- }
- else if(!gSavedSettings.getBOOL("Disregard128DefaultDrawDistance"))
- {
- gSavedSettings.setF32("RenderFarClip", 128.0f);
- }
-}
-
-void LLFeatureManager::applyFeatures(bool skipFeatures)
-{
- // see featuretable.txt / featuretable_linux.txt / featuretable_mac.txt
-
-#ifndef LL_RELEASE_FOR_DOWNLOAD
- dump();
-#endif
-
- // scroll through all of these and set their corresponding control value
- for(feature_map_t::iterator mIt = mFeatures.begin();
- mIt != mFeatures.end();
- ++mIt)
- {
- // skip features you want to skip
- // do this for when you don't want to change certain settings
- if(skipFeatures)
- {
- if(mSkippedFeatures.find(mIt->first) != mSkippedFeatures.end())
- {
- continue;
- }
- }
-
- // get the control setting
- LLControlVariable* ctrl = gSavedSettings.getControl(mIt->first);
- if(ctrl == NULL)
- {
- llwarns << "AHHH! Control setting " << mIt->first << " does not exist!" << llendl;
- continue;
- }
-
- // handle all the different types
- if(ctrl->isType(TYPE_BOOLEAN))
- {
- gSavedSettings.setBOOL(mIt->first, (BOOL)getRecommendedValue(mIt->first));
- }
- else if (ctrl->isType(TYPE_S32))
- {
- gSavedSettings.setS32(mIt->first, (S32)getRecommendedValue(mIt->first));
- }
- else if (ctrl->isType(TYPE_U32))
- {
- gSavedSettings.setU32(mIt->first, (U32)getRecommendedValue(mIt->first));
- }
- else if (ctrl->isType(TYPE_F32))
- {
- gSavedSettings.setF32(mIt->first, (F32)getRecommendedValue(mIt->first));
- }
- else
- {
- llwarns << "AHHH! Control variable is not a numeric type!" << llendl;
- }
- }
-}
-
-void LLFeatureManager::setGraphicsLevel(S32 level, bool skipFeatures)
-{
- applyBaseMasks();
-
- switch (level)
- {
- case 0:
- maskFeatures("Low");
- break;
- case 1:
- maskFeatures("Mid");
- break;
- case 2:
- maskFeatures("High");
- break;
- case 3:
- maskFeatures("Ultra");
- break;
- default:
- maskFeatures("Low");
- break;
- }
-
- applyFeatures(skipFeatures);
-}
-
-void LLFeatureManager::applyBaseMasks()
-{
- // reapply masks
- mFeatures.clear();
-
- LLFeatureList* maskp = findMask("all");
- if(maskp == NULL)
- {
- LL_WARNS("RenderInit") << "AHH! No \"all\" in feature table!" << LL_ENDL;
- return;
- }
-
- mFeatures = maskp->getFeatures();
-
- // mask class
- if (mGPUClass >= 0 && mGPUClass < 4)
- {
- const char* class_table[] =
- {
- "Class0",
- "Class1",
- "Class2",
- "Class3"
- };
-
- LL_INFOS("RenderInit") << "Setting GPU Class to " << class_table[mGPUClass] << LL_ENDL;
- maskFeatures(class_table[mGPUClass]);
- }
- else
- {
- LL_INFOS("RenderInit") << "Setting GPU Class to Unknown" << LL_ENDL;
- maskFeatures("Unknown");
- }
-
- // now all those wacky ones
- if (!gGLManager.mHasFragmentShader)
- {
- maskFeatures("NoPixelShaders");
- }
- if (!gGLManager.mHasVertexShader)
- {
- maskFeatures("NoVertexShaders");
- }
- if (gGLManager.mIsNVIDIA)
- {
- maskFeatures("NVIDIA");
- }
- if (gGLManager.mIsGF2or4MX)
- {
- maskFeatures("GeForce2");
- }
- if (gGLManager.mIsATI)
- {
- maskFeatures("ATI");
- }
- if (gGLManager.mHasATIMemInfo && gGLManager.mVRAM < 256)
- {
- maskFeatures("ATIVramLT256");
- }
- if (gGLManager.mATIOldDriver)
- {
- maskFeatures("ATIOldDriver");
- }
- if (gGLManager.mIsGFFX)
- {
- maskFeatures("GeForceFX");
- }
- if (gGLManager.mIsIntel)
- {
- maskFeatures("Intel");
- }
- if (gGLManager.mGLVersion < 1.5f)
- {
- maskFeatures("OpenGLPre15");
- }
- if (gGLManager.mGLVersion < 3.f)
- {
- maskFeatures("OpenGLPre30");
- }
- if (gGLManager.mNumTextureImageUnits <= 8)
- {
- maskFeatures("TexUnit8orLess");
- }
-
- // now mask by gpu string
- // Replaces ' ' with '_' in mGPUString to deal with inability for parser to handle spaces
- std::string gpustr = mGPUString;
- for (std::string::iterator iter = gpustr.begin(); iter != gpustr.end(); ++iter)
- {
- if (*iter == ' ')
- {
- *iter = '_';
- }
- }
-
- //llinfos << "Masking features from gpu table match: " << gpustr << llendl;
- maskFeatures(gpustr);
-
- // now mask cpu type ones
- if (gSysMemory.getPhysicalMemoryClamped() <= 256*1024*1024)
- {
- maskFeatures("RAM256MB");
- }
-
-#if LL_SOLARIS && defined(__sparc) // even low MHz SPARCs are fast
-#error The 800 is hinky. Would something like a LL_MIN_MHZ make more sense here?
- if (gSysCPU.getMHz() < 800)
-#else
- if (gSysCPU.getMHz() < 1100)
-#endif
- {
- maskFeatures("CPUSlow");
- }
-
- if (isSafe())
- {
- maskFeatures("safe");
- }
-}
+/**
+ * @file llfeaturemanager.cpp
+ * @brief LLFeatureManager class implementation
+ *
+ * $LicenseInfo:firstyear=2003&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 <iostream>
+#include <fstream>
+
+#include <boost/regex.hpp>
+
+#include "llfeaturemanager.h"
+#include "lldir.h"
+
+#include "llsys.h"
+#include "llgl.h"
+#include "llsecondlifeurls.h"
+
+#include "llappviewer.h"
+#include "llhttpclient.h"
+#include "llnotificationsutil.h"
+#include "llviewercontrol.h"
+#include "llworld.h"
+#include "lldrawpoolterrain.h"
+#include "llviewertexturelist.h"
+#include "llversioninfo.h"
+#include "llwindow.h"
+#include "llui.h"
+#include "llcontrol.h"
+#include "llboost.h"
+#include "llweb.h"
+
+#if LL_WINDOWS
+#include "lldxhardware.h"
+#endif
+
+
+#if LL_DARWIN
+const char FEATURE_TABLE_FILENAME[] = "featuretable_mac.txt";
+const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_mac.%s.txt";
+#elif LL_LINUX
+const char FEATURE_TABLE_FILENAME[] = "featuretable_linux.txt";
+const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_linux.%s.txt";
+#elif LL_SOLARIS
+const char FEATURE_TABLE_FILENAME[] = "featuretable_solaris.txt";
+const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_solaris.%s.txt";
+#else
+const char FEATURE_TABLE_FILENAME[] = "featuretable%s.txt";
+const char FEATURE_TABLE_VER_FILENAME[] = "featuretable%s.%s.txt";
+#endif
+
+const char GPU_TABLE_FILENAME[] = "gpu_table.txt";
+const char GPU_TABLE_VER_FILENAME[] = "gpu_table.%s.txt";
+
+LLFeatureInfo::LLFeatureInfo(const std::string& name, const BOOL available, const F32 level)
+ : mValid(TRUE), mName(name), mAvailable(available), mRecommendedLevel(level)
+{
+}
+
+LLFeatureList::LLFeatureList(const std::string& name)
+ : mName(name)
+{
+}
+
+LLFeatureList::~LLFeatureList()
+{
+}
+
+void LLFeatureList::addFeature(const std::string& name, const BOOL available, const F32 level)
+{
+ if (mFeatures.count(name))
+ {
+ LL_WARNS("RenderInit") << "LLFeatureList::Attempting to add preexisting feature " << name << LL_ENDL;
+ }
+
+ LLFeatureInfo fi(name, available, level);
+ mFeatures[name] = fi;
+}
+
+BOOL LLFeatureList::isFeatureAvailable(const std::string& name)
+{
+ if (mFeatures.count(name))
+ {
+ return mFeatures[name].mAvailable;
+ }
+
+ LL_WARNS("RenderInit") << "Feature " << name << " not on feature list!" << LL_ENDL;
+
+ // changing this to TRUE so you have to explicitly disable
+ // something for it to be disabled
+ return TRUE;
+}
+
+F32 LLFeatureList::getRecommendedValue(const std::string& name)
+{
+ if (mFeatures.count(name) && isFeatureAvailable(name))
+ {
+ return mFeatures[name].mRecommendedLevel;
+ }
+
+ LL_WARNS("RenderInit") << "Feature " << name << " not on feature list or not available!" << LL_ENDL;
+ return 0;
+}
+
+BOOL LLFeatureList::maskList(LLFeatureList &mask)
+{
+ //llinfos << "Masking with " << mask.mName << llendl;
+ //
+ // Lookup the specified feature mask, and overlay it on top of the
+ // current feature mask.
+ //
+
+ LLFeatureInfo mask_fi;
+
+ feature_map_t::iterator feature_it;
+ for (feature_it = mask.mFeatures.begin(); feature_it != mask.mFeatures.end(); ++feature_it)
+ {
+ mask_fi = feature_it->second;
+ //
+ // Look for the corresponding feature
+ //
+ if (!mFeatures.count(mask_fi.mName))
+ {
+ LL_WARNS("RenderInit") << "Feature " << mask_fi.mName << " in mask not in top level!" << LL_ENDL;
+ continue;
+ }
+
+ LLFeatureInfo &cur_fi = mFeatures[mask_fi.mName];
+ if (mask_fi.mAvailable && !cur_fi.mAvailable)
+ {
+ LL_WARNS("RenderInit") << "Mask attempting to reenabling disabled feature, ignoring " << cur_fi.mName << LL_ENDL;
+ continue;
+ }
+ cur_fi.mAvailable = mask_fi.mAvailable;
+ cur_fi.mRecommendedLevel = llmin(cur_fi.mRecommendedLevel, mask_fi.mRecommendedLevel);
+ LL_DEBUGS("RenderInit") << "Feature mask " << mask.mName
+ << " Feature " << mask_fi.mName
+ << " Mask: " << mask_fi.mRecommendedLevel
+ << " Now: " << cur_fi.mRecommendedLevel << LL_ENDL;
+ }
+
+ LL_DEBUGS("RenderInit") << "After applying mask " << mask.mName << std::endl;
+ // Will conditionally call dump only if the above message will be logged, thanks
+ // to it being wrapped by the LL_DEBUGS and LL_ENDL macros.
+ dump();
+ LL_CONT << LL_ENDL;
+
+ return TRUE;
+}
+
+void LLFeatureList::dump()
+{
+ LL_DEBUGS("RenderInit") << "Feature list: " << mName << LL_ENDL;
+ LL_DEBUGS("RenderInit") << "--------------" << LL_ENDL;
+
+ LLFeatureInfo fi;
+ feature_map_t::iterator feature_it;
+ for (feature_it = mFeatures.begin(); feature_it != mFeatures.end(); ++feature_it)
+ {
+ fi = feature_it->second;
+ LL_DEBUGS("RenderInit") << fi.mName << "\t\t" << fi.mAvailable << ":" << fi.mRecommendedLevel << LL_ENDL;
+ }
+ LL_DEBUGS("RenderInit") << LL_ENDL;
+}
+
+LLFeatureList *LLFeatureManager::findMask(const std::string& name)
+{
+ if (mMaskList.count(name))
+ {
+ return mMaskList[name];
+ }
+
+ return NULL;
+}
+
+BOOL LLFeatureManager::maskFeatures(const std::string& name)
+{
+ LLFeatureList *maskp = findMask(name);
+ if (!maskp)
+ {
+ LL_DEBUGS("RenderInit") << "Unknown feature mask " << name << LL_ENDL;
+ return FALSE;
+ }
+ LL_INFOS("RenderInit") << "Applying GPU Feature list: " << name << LL_ENDL;
+ return maskList(*maskp);
+}
+
+BOOL LLFeatureManager::loadFeatureTables()
+{
+ // *TODO - if I or anyone else adds something else to the skipped list
+ // make this data driven. Put it in the feature table and parse it
+ // correctly
+ mSkippedFeatures.insert("RenderAnisotropic");
+ mSkippedFeatures.insert("RenderGamma");
+ mSkippedFeatures.insert("RenderVBOEnable");
+ mSkippedFeatures.insert("RenderFogRatio");
+
+ // first table is install with app
+ std::string app_path = gDirUtilp->getAppRODataDir();
+ app_path += gDirUtilp->getDirDelimiter();
+
+ std::string filename;
+ std::string http_filename;
+#if LL_WINDOWS
+ std::string os_string = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
+ if (os_string.find("Microsoft Windows XP") == 0)
+ {
+ filename = llformat(FEATURE_TABLE_FILENAME, "_xp");
+ http_filename = llformat(FEATURE_TABLE_VER_FILENAME, "_xp", LLVersionInfo::getVersion().c_str());
+ }
+ else
+ {
+ filename = llformat(FEATURE_TABLE_FILENAME, "");
+ http_filename = llformat(FEATURE_TABLE_VER_FILENAME, "", LLVersionInfo::getVersion().c_str());
+ }
+#else
+ filename = FEATURE_TABLE_FILENAME;
+ http_filename = llformat(FEATURE_TABLE_VER_FILENAME, LLVersionInfo::getVersion().c_str());
+#endif
+
+ app_path += filename;
+
+
+ // second table is downloaded with HTTP
+ std::string http_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, http_filename);
+
+ // use HTTP table if it exists
+ std::string path;
+ if (gDirUtilp->fileExists(http_path))
+ {
+ path = http_path;
+ }
+ else
+ {
+ path = app_path;
+ }
+
+
+ return parseFeatureTable(path);
+}
+
+
+BOOL LLFeatureManager::parseFeatureTable(std::string filename)
+{
+ llinfos << "Looking for feature table in " << filename << llendl;
+
+ llifstream file;
+ std::string name;
+ U32 version;
+
+ file.open(filename); /*Flawfinder: ignore*/
+
+ if (!file)
+ {
+ LL_WARNS("RenderInit") << "Unable to open feature table " << filename << LL_ENDL;
+ return FALSE;
+ }
+
+ // Check file version
+ file >> name;
+ file >> version;
+ if (name != "version")
+ {
+ LL_WARNS("RenderInit") << filename << " does not appear to be a valid feature table!" << LL_ENDL;
+ return FALSE;
+ }
+
+ mTableVersion = version;
+
+ LLFeatureList *flp = NULL;
+ while (file >> name)
+ {
+ char buffer[MAX_STRING]; /*Flawfinder: ignore*/
+
+ if (name.substr(0,2) == "//")
+ {
+ // This is a comment.
+ file.getline(buffer, MAX_STRING);
+ continue;
+ }
+
+ if (name == "list")
+ {
+ if (flp)
+ {
+ //flp->dump();
+ }
+ // It's a new mask, create it.
+ file >> name;
+ if (mMaskList.count(name))
+ {
+ LL_ERRS("RenderInit") << "Overriding mask " << name << ", this is invalid!" << LL_ENDL;
+ }
+
+ flp = new LLFeatureList(name);
+ mMaskList[name] = flp;
+ }
+ else
+ {
+ if (!flp)
+ {
+ LL_ERRS("RenderInit") << "Specified parameter before <list> keyword!" << LL_ENDL;
+ return FALSE;
+ }
+ S32 available;
+ F32 recommended;
+ file >> available >> recommended;
+ flp->addFeature(name, available, recommended);
+ }
+ }
+ file.close();
+
+ return TRUE;
+}
+
+void LLFeatureManager::loadGPUClass()
+{
+ // defaults
+ mGPUClass = GPU_CLASS_UNKNOWN;
+ mGPUString = gGLManager.getRawGLString();
+ mGPUSupported = FALSE;
+
+ // first table is in the app dir
+ std::string app_path = gDirUtilp->getAppRODataDir();
+ app_path += gDirUtilp->getDirDelimiter();
+ app_path += GPU_TABLE_FILENAME;
+
+ // second table is downloaded with HTTP
+ std::string http_filename = llformat(GPU_TABLE_VER_FILENAME, LLVersionInfo::getVersion().c_str());
+ std::string http_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, http_filename);
+
+ // use HTTP table if it exists
+ std::string path;
+ if (gDirUtilp->fileExists(http_path))
+ {
+ path = http_path;
+ }
+ else
+ {
+ path = app_path;
+ }
+
+ parseGPUTable(path);
+}
+
+
+void LLFeatureManager::parseGPUTable(std::string filename)
+{
+ llifstream file;
+
+ file.open(filename);
+
+ if (!file)
+ {
+ LL_WARNS("RenderInit") << "Unable to open GPU table: " << filename << "!" << LL_ENDL;
+ return;
+ }
+
+ std::string rawRenderer = gGLManager.getRawGLString();
+ std::string renderer = rawRenderer;
+ for (std::string::iterator i = renderer.begin(); i != renderer.end(); ++i)
+ {
+ *i = tolower(*i);
+ }
+
+ bool gpuFound;
+ U32 lineNumber;
+ for (gpuFound = false, lineNumber = 0; !gpuFound && !file.eof(); lineNumber++)
+ {
+ char buffer[MAX_STRING]; /*Flawfinder: ignore*/
+ buffer[0] = 0;
+
+ file.getline(buffer, MAX_STRING);
+
+ if (strlen(buffer) >= 2 && /*Flawfinder: ignore*/
+ buffer[0] == '/' &&
+ buffer[1] == '/')
+ {
+ // This is a comment.
+ continue;
+ }
+
+ if (strlen(buffer) == 0) /*Flawfinder: ignore*/
+ {
+ // This is a blank line
+ continue;
+ }
+
+ // setup the tokenizer
+ std::string buf(buffer);
+ std::string cls, label, expr, supported;
+ boost_tokenizer tokens(buf, boost::char_separator<char>("\t\n"));
+ boost_tokenizer::iterator token_iter = tokens.begin();
+
+ // grab the label, pseudo regular expression, and class
+ if(token_iter != tokens.end())
+ {
+ label = *token_iter++;
+ }
+ if(token_iter != tokens.end())
+ {
+ expr = *token_iter++;
+ }
+ if(token_iter != tokens.end())
+ {
+ cls = *token_iter++;
+ }
+ if(token_iter != tokens.end())
+ {
+ supported = *token_iter++;
+ }
+
+ if (label.empty() || expr.empty() || cls.empty() || supported.empty())
+ {
+ LL_WARNS("RenderInit") << "invald gpu_table.txt:" << lineNumber << ": '" << buffer << "'" << LL_ENDL;
+ continue;
+ }
+
+ for (U32 i = 0; i < expr.length(); i++) /*Flawfinder: ignore*/
+ {
+ expr[i] = tolower(expr[i]);
+ }
+
+ // run the regular expression against the renderer
+ boost::regex re(expr.c_str());
+ if(boost::regex_search(renderer, re))
+ {
+ // if we found it, stop!
+ gpuFound = true;
+ mGPUString = label;
+ mGPUClass = (EGPUClass) strtol(cls.c_str(), NULL, 10);
+ mGPUSupported = (BOOL) strtol(supported.c_str(), NULL, 10);
+ }
+ }
+ file.close();
+
+ if ( gpuFound )
+ {
+ LL_INFOS("RenderInit") << "GPU '" << rawRenderer << "' recognized as '" << mGPUString << "'" << LL_ENDL;
+ if (!mGPUSupported)
+ {
+ LL_INFOS("RenderInit") << "GPU '" << mGPUString << "' is not supported." << LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_WARNS("RenderInit") << "GPU '" << rawRenderer << "' not recognized" << LL_ENDL;
+ }
+}
+
+// responder saves table into file
+class LLHTTPFeatureTableResponder : public LLHTTPClient::Responder
+{
+public:
+
+ LLHTTPFeatureTableResponder(std::string filename) :
+ mFilename(filename)
+ {
+ }
+
+
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+ {
+ if (isGoodStatus(status))
+ {
+ // write to file
+
+ llinfos << "writing feature table to " << mFilename << llendl;
+
+ S32 file_size = buffer->countAfter(channels.in(), NULL);
+ if (file_size > 0)
+ {
+ // read from buffer
+ U8* copy_buffer = new U8[file_size];
+ buffer->readAfter(channels.in(), NULL, copy_buffer, file_size);
+
+ // write to file
+ LLAPRFile out(mFilename, LL_APR_WB);
+ out.write(copy_buffer, file_size);
+ out.close();
+ }
+ }
+
+ }
+
+private:
+ std::string mFilename;
+};
+
+void fetch_feature_table(std::string table)
+{
+ const std::string base = gSavedSettings.getString("FeatureManagerHTTPTable");
+
+#if LL_WINDOWS
+ std::string os_string = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
+ std::string filename;
+ if (os_string.find("Microsoft Windows XP") == 0)
+ {
+ filename = llformat(table.c_str(), "_xp", LLVersionInfo::getVersion().c_str());
+ }
+ else
+ {
+ filename = llformat(table.c_str(), "", LLVersionInfo::getVersion().c_str());
+ }
+#else
+ const std::string filename = llformat(table.c_str(), LLVersionInfo::getVersion().c_str());
+#endif
+
+ const std::string url = base + "/" + filename;
+
+ const std::string path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, filename);
+
+ llinfos << "LLFeatureManager fetching " << url << " into " << path << llendl;
+
+ LLHTTPClient::get(url, new LLHTTPFeatureTableResponder(path));
+}
+
+void fetch_gpu_table(std::string table)
+{
+ const std::string base = gSavedSettings.getString("FeatureManagerHTTPTable");
+
+ const std::string filename = llformat(table.c_str(), LLVersionInfo::getVersion().c_str());
+
+ const std::string url = base + "/" + filename;
+
+ const std::string path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, filename);
+
+ llinfos << "LLFeatureManager fetching " << url << " into " << path << llendl;
+
+ LLHTTPClient::get(url, new LLHTTPFeatureTableResponder(path));
+}
+
+// fetch table(s) from a website (S3)
+void LLFeatureManager::fetchHTTPTables()
+{
+ fetch_feature_table(FEATURE_TABLE_VER_FILENAME);
+ fetch_gpu_table(GPU_TABLE_VER_FILENAME);
+}
+
+
+void LLFeatureManager::cleanupFeatureTables()
+{
+ std::for_each(mMaskList.begin(), mMaskList.end(), DeletePairedPointer());
+ mMaskList.clear();
+}
+
+void LLFeatureManager::init()
+{
+ // load the tables
+ loadFeatureTables();
+
+ // get the gpu class
+ loadGPUClass();
+
+ // apply the base masks, so we know if anything is disabled
+ applyBaseMasks();
+}
+
+void LLFeatureManager::applyRecommendedSettings()
+{
+ // apply saved settings
+ // cap the level at 2 (high)
+ S32 level = llmax(GPU_CLASS_0, llmin(mGPUClass, GPU_CLASS_2));
+
+ llinfos << "Applying Recommended Features" << llendl;
+
+ setGraphicsLevel(level, false);
+ gSavedSettings.setU32("RenderQualityPerformance", level);
+
+ // now apply the tweaks to draw distance
+ // these are double negatives, because feature masks only work by
+ // downgrading values, so i needed to make a true value go to false
+ // for certain cards, thus the awkward name, "Disregard..."
+ if(!gSavedSettings.getBOOL("Disregard96DefaultDrawDistance"))
+ {
+ gSavedSettings.setF32("RenderFarClip", 96.0f);
+ }
+ else if(!gSavedSettings.getBOOL("Disregard128DefaultDrawDistance"))
+ {
+ gSavedSettings.setF32("RenderFarClip", 128.0f);
+ }
+}
+
+void LLFeatureManager::applyFeatures(bool skipFeatures)
+{
+ // see featuretable.txt / featuretable_linux.txt / featuretable_mac.txt
+
+#ifndef LL_RELEASE_FOR_DOWNLOAD
+ dump();
+#endif
+
+ // scroll through all of these and set their corresponding control value
+ for(feature_map_t::iterator mIt = mFeatures.begin();
+ mIt != mFeatures.end();
+ ++mIt)
+ {
+ // skip features you want to skip
+ // do this for when you don't want to change certain settings
+ if(skipFeatures)
+ {
+ if(mSkippedFeatures.find(mIt->first) != mSkippedFeatures.end())
+ {
+ continue;
+ }
+ }
+
+ // get the control setting
+ LLControlVariable* ctrl = gSavedSettings.getControl(mIt->first);
+ if(ctrl == NULL)
+ {
+ llwarns << "AHHH! Control setting " << mIt->first << " does not exist!" << llendl;
+ continue;
+ }
+
+ // handle all the different types
+ if(ctrl->isType(TYPE_BOOLEAN))
+ {
+ gSavedSettings.setBOOL(mIt->first, (BOOL)getRecommendedValue(mIt->first));
+ }
+ else if (ctrl->isType(TYPE_S32))
+ {
+ gSavedSettings.setS32(mIt->first, (S32)getRecommendedValue(mIt->first));
+ }
+ else if (ctrl->isType(TYPE_U32))
+ {
+ gSavedSettings.setU32(mIt->first, (U32)getRecommendedValue(mIt->first));
+ }
+ else if (ctrl->isType(TYPE_F32))
+ {
+ gSavedSettings.setF32(mIt->first, (F32)getRecommendedValue(mIt->first));
+ }
+ else
+ {
+ llwarns << "AHHH! Control variable is not a numeric type!" << llendl;
+ }
+ }
+}
+
+void LLFeatureManager::setGraphicsLevel(S32 level, bool skipFeatures)
+{
+ applyBaseMasks();
+
+ switch (level)
+ {
+ case 0:
+ maskFeatures("Low");
+ break;
+ case 1:
+ maskFeatures("Mid");
+ break;
+ case 2:
+ maskFeatures("High");
+ break;
+ case 3:
+ maskFeatures("Ultra");
+ break;
+ default:
+ maskFeatures("Low");
+ break;
+ }
+
+ applyFeatures(skipFeatures);
+}
+
+void LLFeatureManager::applyBaseMasks()
+{
+ // reapply masks
+ mFeatures.clear();
+
+ LLFeatureList* maskp = findMask("all");
+ if(maskp == NULL)
+ {
+ LL_WARNS("RenderInit") << "AHH! No \"all\" in feature table!" << LL_ENDL;
+ return;
+ }
+
+ mFeatures = maskp->getFeatures();
+
+ // mask class
+ if (mGPUClass >= 0 && mGPUClass < 4)
+ {
+ const char* class_table[] =
+ {
+ "Class0",
+ "Class1",
+ "Class2",
+ "Class3"
+ };
+
+ LL_INFOS("RenderInit") << "Setting GPU Class to " << class_table[mGPUClass] << LL_ENDL;
+ maskFeatures(class_table[mGPUClass]);
+ }
+ else
+ {
+ LL_INFOS("RenderInit") << "Setting GPU Class to Unknown" << LL_ENDL;
+ maskFeatures("Unknown");
+ }
+
+ // now all those wacky ones
+ if (!gGLManager.mHasFragmentShader)
+ {
+ maskFeatures("NoPixelShaders");
+ }
+ if (!gGLManager.mHasVertexShader)
+ {
+ maskFeatures("NoVertexShaders");
+ }
+ if (gGLManager.mIsNVIDIA)
+ {
+ maskFeatures("NVIDIA");
+ }
+ if (gGLManager.mIsGF2or4MX)
+ {
+ maskFeatures("GeForce2");
+ }
+ if (gGLManager.mIsATI)
+ {
+ maskFeatures("ATI");
+ }
+ if (gGLManager.mHasATIMemInfo && gGLManager.mVRAM < 256)
+ {
+ maskFeatures("ATIVramLT256");
+ }
+ if (gGLManager.mATIOldDriver)
+ {
+ maskFeatures("ATIOldDriver");
+ }
+ if (gGLManager.mIsGFFX)
+ {
+ maskFeatures("GeForceFX");
+ }
+ if (gGLManager.mIsIntel)
+ {
+ maskFeatures("Intel");
+ }
+ if (gGLManager.mGLVersion < 1.5f)
+ {
+ maskFeatures("OpenGLPre15");
+ }
+ if (gGLManager.mGLVersion < 3.f)
+ {
+ maskFeatures("OpenGLPre30");
+ }
+ if (gGLManager.mNumTextureImageUnits <= 8)
+ {
+ maskFeatures("TexUnit8orLess");
+ }
+
+ // now mask by gpu string
+ // Replaces ' ' with '_' in mGPUString to deal with inability for parser to handle spaces
+ std::string gpustr = mGPUString;
+ for (std::string::iterator iter = gpustr.begin(); iter != gpustr.end(); ++iter)
+ {
+ if (*iter == ' ')
+ {
+ *iter = '_';
+ }
+ }
+
+ //llinfos << "Masking features from gpu table match: " << gpustr << llendl;
+ maskFeatures(gpustr);
+
+ // now mask cpu type ones
+ if (gSysMemory.getPhysicalMemoryClamped() <= 256*1024*1024)
+ {
+ maskFeatures("RAM256MB");
+ }
+
+#if LL_SOLARIS && defined(__sparc) // even low MHz SPARCs are fast
+#error The 800 is hinky. Would something like a LL_MIN_MHZ make more sense here?
+ if (gSysCPU.getMHz() < 800)
+#else
+ if (gSysCPU.getMHz() < 1100)
+#endif
+ {
+ maskFeatures("CPUSlow");
+ }
+
+ if (isSafe())
+ {
+ maskFeatures("safe");
+ }
+}
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 4b15695cbf..60a2f813aa 100644..100755
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -187,12 +187,26 @@ void LLVoiceSetKeyDialog::onCancel(void* user_data)
void handleNameTagOptionChanged(const LLSD& newvalue);
void handleDisplayNamesOptionChanged(const LLSD& newvalue);
bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response);
+bool callback_clear_cache(const LLSD& notification, const LLSD& response);
//bool callback_skip_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater);
//bool callback_reset_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater);
void fractionFromDecimal(F32 decimal_val, S32& numerator, S32& denominator);
+bool callback_clear_cache(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if ( option == 0 ) // YES
+ {
+ // flag client texture cache for clearing next time the client runs
+ gSavedSettings.setBOOL("PurgeCacheOnNextStartup", TRUE);
+ LLNotificationsUtil::add("CacheWillClear");
+ }
+
+ return false;
+}
+
bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
@@ -305,7 +319,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mCommitCallbackRegistrar.add("Pref.Cancel", boost::bind(&LLFloaterPreference::onBtnCancel, this));
mCommitCallbackRegistrar.add("Pref.OK", boost::bind(&LLFloaterPreference::onBtnOK, this));
-// mCommitCallbackRegistrar.add("Pref.ClearCache", boost::bind(&LLFloaterPreference::onClickClearCache, this));
+ mCommitCallbackRegistrar.add("Pref.ClearCache", boost::bind(&LLFloaterPreference::onClickClearCache, this));
mCommitCallbackRegistrar.add("Pref.WebClearCache", boost::bind(&LLFloaterPreference::onClickBrowserClearCache, this));
mCommitCallbackRegistrar.add("Pref.SetCache", boost::bind(&LLFloaterPreference::onClickSetCache, this));
mCommitCallbackRegistrar.add("Pref.ResetCache", boost::bind(&LLFloaterPreference::onClickResetCache, this));
@@ -809,6 +823,11 @@ void LLFloaterPreference::refreshEnabledGraphics()
}
}
+void LLFloaterPreference::onClickClearCache()
+{
+ LLNotificationsUtil::add("ConfirmClearCache", LLSD(), LLSD(), callback_clear_cache);
+}
+
void LLFloaterPreference::onClickBrowserClearCache()
{
LLNotificationsUtil::add("ConfirmClearBrowserCache", LLSD(), LLSD(), callback_clear_browser_cache);
@@ -868,14 +887,15 @@ void LLFloaterPreference::onClickSetCache()
void LLFloaterPreference::onClickResetCache()
{
- if (!gSavedSettings.getString("CacheLocation").empty())
+ if (gDirUtilp->getCacheDir(false) == gDirUtilp->getCacheDir(true))
{
- gSavedSettings.setString("NewCacheLocation", "");
- gSavedSettings.setString("NewCacheLocationTopFolder", "");
+ // The cache location was already the default.
+ return;
}
-
+ gSavedSettings.setString("NewCacheLocation", "");
+ gSavedSettings.setString("NewCacheLocationTopFolder", "");
LLNotificationsUtil::add("CacheWillBeMoved");
- std::string cache_location = gDirUtilp->getCacheDir(true);
+ std::string cache_location = gDirUtilp->getCacheDir(false);
gSavedSettings.setString("CacheLocation", cache_location);
std::string top_folder(gDirUtilp->getBaseFileName(cache_location));
gSavedSettings.setString("CacheLocationTopFolder", top_folder);
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index 5fe509fb37..ef92575347 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -88,7 +88,8 @@ protected:
void onBtnCancel();
void onBtnApply();
- void onClickBrowserClearCache();
+ void onClickClearCache(); // Clear viewer texture cache, vfs, and VO cache on next startup
+ void onClickBrowserClearCache(); // Clear web history and caches as well as viewer caches above
void onLanguageChange();
void onNameTagOpacityChange(const LLSD& newvalue);
@@ -99,7 +100,7 @@ protected:
void onChangeCustom();
void updateMeterText(LLUICtrl* ctrl);
void onOpenHardwareSettings();
- /// callback for defaults
+ // callback for defaults
void setHardwareDefaults();
// callback for when client turns on shaders
void onVertexShaderEnable();
diff --git a/indra/newview/llfloatersounddevices.cpp b/indra/newview/llfloatersounddevices.cpp
index 9fe7c7f9dd..e692f1735a 100644
--- a/indra/newview/llfloatersounddevices.cpp
+++ b/indra/newview/llfloatersounddevices.cpp
@@ -68,6 +68,9 @@ BOOL LLFloaterSoundDevices::postBuild()
if (panel)
{
panel->setUseTuningMode(false);
+ getChild<LLUICtrl>("voice_input_device")->setCommitCallback(boost::bind(&LLPanelVoiceDeviceSettings::apply, panel));
+ getChild<LLUICtrl>("voice_output_device")->setCommitCallback(boost::bind(&LLPanelVoiceDeviceSettings::apply, panel));
+ getChild<LLUICtrl>("mic_volume_slider")->setCommitCallback(boost::bind(&LLPanelVoiceDeviceSettings::apply, panel));
}
return TRUE;
}
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 061a42ab57..edcb96314b 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -423,7 +423,7 @@ void LLFloaterTools::refresh()
// Refresh object and prim count labels
LLLocale locale(LLLocale::USER_LOCALE);
- if ((gAgent.getRegion() && gAgent.getRegion()->getCapability("GetMesh").empty()) || !gSavedSettings.getBOOL("MeshEnabled"))
+ if ((gAgent.getRegion() && (gAgent.getRegion()->getCapability("GetMesh").empty() || gAgent.getRegion()->getCapability("ObjectAdd").empty())) || !gSavedSettings.getBOOL("MeshEnabled"))
{
std::string obj_count_string;
LLResMgr::getInstance()->getIntegerString(obj_count_string, LLSelectMgr::getInstance()->getSelection()->getRootObjectCount());
@@ -790,7 +790,8 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
bool show_mesh_cost = gAgent.getRegion() &&
!gAgent.getRegion()->getCapability("GetMesh").empty() &&
- gSavedSettings.getBOOL("MeshEnabled");
+ gSavedSettings.getBOOL("MeshEnabled") &&
+ !gAgent.getRegion()->getCapability("ObjectAdd").empty();
getChildView("obj_count")->setVisible( !land_visible && !show_mesh_cost);
getChildView("prim_count")->setVisible( !land_visible && !show_mesh_cost);
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index f8a4ce7ad0..f8a4ce7ad0 100644..100755
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
diff --git a/indra/newview/llgesturelistener.cpp b/indra/newview/llgesturelistener.cpp
new file mode 100644
index 0000000000..2fff506681
--- /dev/null
+++ b/indra/newview/llgesturelistener.cpp
@@ -0,0 +1,159 @@
+/**
+ * @file llgesturelistener.cpp
+ * @author Dave Simmons
+ * @date 2011-03-28
+ * @brief Implementation for LLGestureListener.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llgesturelistener.h"
+#include "llgesturemgr.h"
+#include "llmultigesture.h"
+
+
+LLGestureListener::LLGestureListener()
+ : LLEventAPI("LLGesture",
+ "LLGesture listener interface to control gestures")
+{
+ add("getActiveGestures",
+ "Return information about the agent's available gestures [\"reply\"]:\n"
+ "[\"gestures\"]: a dictionary with UUID strings as keys\n"
+ " and the following dict values for each entry:\n"
+ " [\"name\"]: name of the gesture, may be empty\n"
+ " [\"trigger\"]: trigger string used to invoke via user chat, may be empty\n"
+ " [\"playing\"]: true or false indicating the playing state",
+ &LLGestureListener::getActiveGestures,
+ LLSDMap("reply", LLSD()));
+ add("isGesturePlaying",
+ "[\"id\"]: UUID of the gesture to query. Returns True or False in [\"playing\"] value of the result",
+ &LLGestureListener::isGesturePlaying);
+ add("startGesture",
+ "[\"id\"]: UUID of the gesture to start playing",
+ &LLGestureListener::startGesture);
+ add("stopGesture",
+ "[\"id\"]: UUID of the gesture to stop",
+ &LLGestureListener::stopGesture);
+}
+
+
+// "getActiveGestures" command
+void LLGestureListener::getActiveGestures(const LLSD& event_data) const
+{
+ LLSD reply = LLSD::emptyMap();
+ LLSD gesture_map = LLSD::emptyMap();
+
+ const LLGestureMgr::item_map_t& active_gestures = LLGestureMgr::instance().getActiveGestures();
+
+ // Scan active gesture map and get all the names
+ LLGestureMgr::item_map_t::const_iterator it;
+ for (it = active_gestures.begin(); it != active_gestures.end(); ++it)
+ {
+ LLMultiGesture* gesture = (*it).second;
+ if (gesture)
+ { // Add an entry to the result map with the LLUUID as key with a map containing data
+ LLSD info = LLSD::emptyMap();
+ info["name"] = (LLSD::String) gesture->mName;
+ info["trigger"] = (LLSD::String) gesture->mTrigger;
+ info["playing"] = (LLSD::Boolean) gesture->mPlaying;
+
+ gesture_map[(*it).first.asString()] = info;
+ }
+ }
+
+ reply["gestures"] = gesture_map;
+ sendReply(reply, event_data);
+}
+
+
+
+// "isGesturePlaying" command
+void LLGestureListener::isGesturePlaying(const LLSD& event_data) const
+{
+ bool is_playing = false;
+ if (event_data.has("id"))
+ {
+ LLUUID gesture_id = event_data["id"].asUUID();
+ if (gesture_id.notNull())
+ {
+ is_playing = LLGestureMgr::instance().isGesturePlaying(gesture_id);
+ }
+ else
+ {
+ llwarns << "isGesturePlaying did not find a gesture object for " << gesture_id << llendl;
+ }
+ }
+ else
+ {
+ llwarns << "isGesturePlaying didn't have 'id' value passed in" << llendl;
+ }
+
+ LLSD reply = LLSD::emptyMap();
+ reply["playing"] = (LLSD::Boolean) is_playing;
+ sendReply(reply, event_data);
+}
+
+
+// "startGesture" command
+void LLGestureListener::startGesture(LLSD const & event_data) const
+{
+ startOrStopGesture(event_data, true);
+}
+
+
+// "stopGesture" command
+void LLGestureListener::stopGesture(LLSD const & event_data) const
+{
+ startOrStopGesture(event_data, false);
+}
+
+
+// Real code for "startGesture" or "stopGesture"
+void LLGestureListener::startOrStopGesture(LLSD const & event_data, bool start) const
+{
+ if (event_data.has("id"))
+ {
+ LLUUID gesture_id = event_data["id"].asUUID();
+ if (gesture_id.notNull())
+ {
+ if (start)
+ {
+ LLGestureMgr::instance().playGesture(gesture_id);
+ }
+ else
+ {
+ LLGestureMgr::instance().stopGesture(gesture_id);
+ }
+ }
+ else
+ {
+ llwarns << "startOrStopGesture did not find a gesture object for " << gesture_id << llendl;
+ }
+ }
+ else
+ {
+ llwarns << "startOrStopGesture didn't have 'id' value passed in" << llendl;
+ }
+}
+
diff --git a/indra/newview/llgesturelistener.h b/indra/newview/llgesturelistener.h
new file mode 100644
index 0000000000..6f59698ed1
--- /dev/null
+++ b/indra/newview/llgesturelistener.h
@@ -0,0 +1,52 @@
+/**
+ * @file llgesturelistener.h
+ * @author Dave Simmons
+ * @date 2011-03-15
+ * @brief Class definition for LLGestureListener.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+
+#ifndef LL_LLGESTURELISTENER_H
+#define LL_LLGESTURELISTENER_H
+
+#include "lleventapi.h"
+
+class LLSD;
+
+class LLGestureListener : public LLEventAPI
+{
+public:
+ LLGestureListener();
+
+private:
+ void getActiveGestures(LLSD const & gesture_data) const;
+ void isGesturePlaying(LLSD const & gesture_data) const;
+ void startGesture(LLSD const & gesture_data) const;
+ void stopGesture(LLSD const & gesture_data) const;
+
+ void startOrStopGesture(LLSD const & event_data, bool start) const;
+};
+
+#endif // LL_LLGESTURELISTENER_H
+
diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp
index 2f9856c650..66ca76bfb0 100644
--- a/indra/newview/llgesturemgr.cpp
+++ b/indra/newview/llgesturemgr.cpp
@@ -53,6 +53,7 @@
#include "llviewerstats.h"
#include "llnearbychatbar.h"
#include "llappearancemgr.h"
+#include "llgesturelistener.h"
// Longest time, in seconds, to wait for all animations to stop playing
const F32 MAX_WAIT_ANIM_SECS = 30.f;
@@ -70,6 +71,7 @@ LLGestureMgr::LLGestureMgr()
mLoadingCount(0)
{
gInventory.addObserver(this);
+ mListener.reset(new LLGestureListener());
}
diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h
index 5930841cbc..26a5924ec3 100644
--- a/indra/newview/llgesturemgr.h
+++ b/indra/newview/llgesturemgr.h
@@ -37,6 +37,7 @@
#include "llviewerinventory.h"
class LLMultiGesture;
+class LLGestureListener;
class LLGestureStep;
class LLUUID;
class LLVFS;
@@ -154,9 +155,9 @@ protected:
// Used by loadGesture
static void onLoadComplete(LLVFS *vfs,
- const LLUUID& asset_uuid,
- LLAssetType::EType type,
- void* user_data, S32 status, LLExtStat ext_status);
+ const LLUUID& asset_uuid,
+ LLAssetType::EType type,
+ void* user_data, S32 status, LLExtStat ext_status);
// Used by playGesture to load an asset file
// required to play a gesture step
@@ -185,6 +186,9 @@ private:
BOOL mValid;
std::set<LLUUID> mLoadingAssets;
+
+ // LLEventHost interface
+ boost::shared_ptr<LLGestureListener> mListener;
};
#endif
diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp
index 738d82e732..673f28e01f 100644
--- a/indra/newview/llmanipscale.cpp
+++ b/indra/newview/llmanipscale.cpp
@@ -93,6 +93,7 @@ F32 get_default_max_prim_scale(bool is_flora)
if (gSavedSettings.getBOOL("MeshEnabled") &&
gAgent.getRegion() &&
!gAgent.getRegion()->getCapability("GetMesh").empty() &&
+ !gAgent.getRegion()->getCapability("ObjectAdd").empty() &&
!is_flora)
{
return DEFAULT_MAX_PRIM_SCALE;
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index 12e0b26fed..8f084b9bfc 100755..100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -1,3957 +1,3957 @@
-/**
- * @file llmeshrepository.cpp
- * @brief Mesh repository implementation.
- *
- * $LicenseInfo:firstyear=2005&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "apr_pools.h"
-#include "apr_dso.h"
-#include "llhttpstatuscodes.h"
-#include "llmeshrepository.h"
-
-#include "llagent.h"
-#include "llappviewer.h"
-#include "llbufferstream.h"
-#include "llcurl.h"
-#include "lldatapacker.h"
-#include "llfasttimer.h"
-#include "llfloatermodelpreview.h"
-#include "llfloaterperms.h"
-#include "lleconomy.h"
-#include "llimagej2c.h"
-#include "llhost.h"
-#include "llnotificationsutil.h"
-#include "llsd.h"
-#include "llsdutil_math.h"
-#include "llsdserialize.h"
-#include "llthread.h"
-#include "llvfile.h"
-#include "llviewercontrol.h"
-#include "llviewermenufile.h"
-#include "llviewerobjectlist.h"
-#include "llviewerregion.h"
-#include "llviewertexturelist.h"
-#include "llvolume.h"
-#include "llvolumemgr.h"
-#include "llvovolume.h"
-#include "llworld.h"
-#include "material_codes.h"
-#include "pipeline.h"
-#include "llinventorymodel.h"
-#include "llfoldertype.h"
-
-#ifndef LL_WINDOWS
-#include "netdb.h"
-#endif
-
-#include <queue>
-
-LLFastTimer::DeclareTimer FTM_MESH_UPDATE("Mesh Update");
-LLFastTimer::DeclareTimer FTM_LOAD_MESH("Load Mesh");
-
-LLMeshRepository gMeshRepo;
-
-const U32 MAX_MESH_REQUESTS_PER_SECOND = 100;
-
-U32 LLMeshRepository::sBytesReceived = 0;
-U32 LLMeshRepository::sHTTPRequestCount = 0;
-U32 LLMeshRepository::sHTTPRetryCount = 0;
-U32 LLMeshRepository::sCacheBytesRead = 0;
-U32 LLMeshRepository::sCacheBytesWritten = 0;
-U32 LLMeshRepository::sPeakKbps = 0;
-
-
-const U32 MAX_TEXTURE_UPLOAD_RETRIES = 5;
-
-void dumpLLSDToFile(const LLSD& content, std::string filename);
-
-std::string header_lod[] =
-{
- "lowest_lod",
- "low_lod",
- "medium_lod",
- "high_lod"
-};
-
-
-//get the number of bytes resident in memory for given volume
-U32 get_volume_memory_size(const LLVolume* volume)
-{
- U32 indices = 0;
- U32 vertices = 0;
-
- for (U32 i = 0; i < volume->getNumVolumeFaces(); ++i)
- {
- const LLVolumeFace& face = volume->getVolumeFace(i);
- indices += face.mNumIndices;
- vertices += face.mNumVertices;
- }
-
-
- return indices*2+vertices*11+sizeof(LLVolume)+sizeof(LLVolumeFace)*volume->getNumVolumeFaces();
-}
-
-void get_vertex_buffer_from_mesh(LLCDMeshData& mesh, LLModel::PhysicsMesh& res, F32 scale = 1.f)
-{
- res.mPositions.clear();
- res.mNormals.clear();
-
- const F32* v = mesh.mVertexBase;
-
- if (mesh.mIndexType == LLCDMeshData::INT_16)
- {
- U16* idx = (U16*) mesh.mIndexBase;
- for (S32 j = 0; j < mesh.mNumTriangles; ++j)
- {
- F32* mp0 = (F32*) ((U8*)v+idx[0]*mesh.mVertexStrideBytes);
- F32* mp1 = (F32*) ((U8*)v+idx[1]*mesh.mVertexStrideBytes);
- F32* mp2 = (F32*) ((U8*)v+idx[2]*mesh.mVertexStrideBytes);
-
- idx = (U16*) (((U8*)idx)+mesh.mIndexStrideBytes);
-
- LLVector3 v0(mp0);
- LLVector3 v1(mp1);
- LLVector3 v2(mp2);
-
- LLVector3 n = (v1-v0)%(v2-v0);
- n.normalize();
-
- res.mPositions.push_back(v0*scale);
- res.mPositions.push_back(v1*scale);
- res.mPositions.push_back(v2*scale);
-
- res.mNormals.push_back(n);
- res.mNormals.push_back(n);
- res.mNormals.push_back(n);
- }
- }
- else
- {
- U32* idx = (U32*) mesh.mIndexBase;
- for (S32 j = 0; j < mesh.mNumTriangles; ++j)
- {
- F32* mp0 = (F32*) ((U8*)v+idx[0]*mesh.mVertexStrideBytes);
- F32* mp1 = (F32*) ((U8*)v+idx[1]*mesh.mVertexStrideBytes);
- F32* mp2 = (F32*) ((U8*)v+idx[2]*mesh.mVertexStrideBytes);
-
- idx = (U32*) (((U8*)idx)+mesh.mIndexStrideBytes);
-
- LLVector3 v0(mp0);
- LLVector3 v1(mp1);
- LLVector3 v2(mp2);
-
- LLVector3 n = (v1-v0)%(v2-v0);
- n.normalize();
-
- res.mPositions.push_back(v0*scale);
- res.mPositions.push_back(v1*scale);
- res.mPositions.push_back(v2*scale);
-
- res.mNormals.push_back(n);
- res.mNormals.push_back(n);
- res.mNormals.push_back(n);
- }
- }
-}
-
-S32 LLMeshRepoThread::sActiveHeaderRequests = 0;
-S32 LLMeshRepoThread::sActiveLODRequests = 0;
-U32 LLMeshRepoThread::sMaxConcurrentRequests = 1;
-
-
-class LLTextureCostResponder : public LLCurl::Responder
-{
-public:
- LLTextureUploadData mData;
- LLMeshUploadThread* mThread;
-
- LLTextureCostResponder(LLTextureUploadData data, LLMeshUploadThread* thread)
- : mData(data), mThread(thread)
- {
-
- }
-
- virtual void completed(U32 status, const std::string& reason, const LLSD& content)
- {
- mThread->mPendingConfirmations--;
- if (isGoodStatus(status))
- {
- mThread->priceResult(mData, content);
- }
- else
- {
- llwarns << status << ": " << reason << llendl;
-
- if (mData.mRetries < MAX_TEXTURE_UPLOAD_RETRIES)
- {
- llwarns << "Retrying. (" << ++mData.mRetries << ")" << llendl;
-
- if (status == 499 || status == 500)
- {
- mThread->uploadTexture(mData);
- }
- else
- {
- llerrs << "Unhandled status " << status << llendl;
- }
- }
- else
- {
- llwarns << "Giving up after " << mData.mRetries << " retries." << llendl;
- }
- }
- }
-};
-
-class LLTextureUploadResponder : public LLCurl::Responder
-{
-public:
- LLTextureUploadData mData;
- LLMeshUploadThread* mThread;
-
- LLTextureUploadResponder(LLTextureUploadData data, LLMeshUploadThread* thread)
- : mData(data), mThread(thread)
- {
- }
-
- virtual void completed(U32 status, const std::string& reason, const LLSD& content)
- {
- mThread->mPendingUploads--;
- if (isGoodStatus(status))
- {
- mData.mUUID = content["new_asset"].asUUID();
- gMeshRepo.updateInventory(LLMeshRepository::inventory_data(mData.mPostData, content));
- mThread->onTextureUploaded(mData);
- }
- else
- {
- llwarns << status << ": " << reason << llendl;
- llwarns << "Retrying. (" << ++mData.mRetries << ")" << llendl;
-
- if (status == 404)
- {
- mThread->uploadTexture(mData);
- }
- else if (status == 499)
- {
- mThread->mConfirmedTextureQ.push(mData);
- }
- else
- {
- llerrs << "Unhandled status " << status << llendl;
- }
- }
- }
-};
-
-class LLMeshCostResponder : public LLCurl::Responder
-{
-public:
- LLMeshUploadData mData;
- LLMeshUploadThread* mThread;
-
- LLMeshCostResponder(LLMeshUploadData data, LLMeshUploadThread* thread)
- : mData(data), mThread(thread)
- {
-
- }
-
- virtual void completed(U32 status, const std::string& reason, const LLSD& content)
- {
- mThread->mPendingConfirmations--;
-
- if (isGoodStatus(status))
- {
- mThread->priceResult(mData, content);
- }
- else
- {
- llwarns << status << ": " << reason << llendl;
-
- if (status == HTTP_INTERNAL_ERROR)
- {
- llwarns << "Retrying. (" << ++mData.mRetries << ")" << llendl;
- mThread->uploadModel(mData);
- }
- else if (status == HTTP_BAD_REQUEST)
- {
- llwarns << "Status 400 received from server, giving up." << llendl;
- }
- else if (status == HTTP_NOT_FOUND)
- {
- llwarns <<"Status 404 received, server is disconnected, giving up." << llendl ;
- }
- else
- {
- llerrs << "Unhandled status " << status << llendl;
- }
- }
- }
-};
-
-class LLMeshUploadResponder : public LLCurl::Responder
-{
-public:
- LLMeshUploadData mData;
- LLMeshUploadThread* mThread;
-
- LLMeshUploadResponder(LLMeshUploadData data, LLMeshUploadThread* thread)
- : mData(data), mThread(thread)
- {
- }
-
- virtual void completed(U32 status, const std::string& reason, const LLSD& content)
- {
- mThread->mPendingUploads--;
- if (isGoodStatus(status))
- {
- mData.mUUID = content["new_asset"].asUUID();
- if (mData.mUUID.isNull())
- {
- LLSD args;
- std::string message = content["error"]["message"];
- std::string identifier = content["error"]["identifier"];
- std::string invalidity_identifier = content["error"]["invalidity_identifier"];
-
- args["MESSAGE"] = message;
- args["IDENTIFIER"] = identifier;
- args["INVALIDITY_IDENTIFIER"] = invalidity_identifier;
- args["LABEL"] = mData.mBaseModel->mLabel;
-
- gMeshRepo.uploadError(args);
- }
- else
- {
- gMeshRepo.updateInventory(LLMeshRepository::inventory_data(mData.mPostData, content));
- mThread->onModelUploaded(mData);
- }
- }
- else
- {
- llwarns << status << ": " << reason << llendl;
- llwarns << "Retrying. (" << ++mData.mRetries << ")" << llendl;
-
- if (status == 404)
- {
- mThread->uploadModel(mData);
- }
- else if (status == 499)
- {
- mThread->mConfirmedQ.push(mData);
- }
- else if (status != 500)
- { //drop internal server errors on the floor, otherwise grab
- llerrs << "Unhandled status " << status << llendl;
- }
- }
- }
-};
-
-
-class LLMeshHeaderResponder : public LLCurl::Responder
-{
-public:
- LLVolumeParams mMeshParams;
-
- LLMeshHeaderResponder(const LLVolumeParams& mesh_params)
- : mMeshParams(mesh_params)
- {
- }
-
- virtual void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer);
-
-};
-
-class LLMeshLODResponder : public LLCurl::Responder
-{
-public:
- LLVolumeParams mMeshParams;
- S32 mLOD;
- U32 mRequestedBytes;
- U32 mOffset;
-
- LLMeshLODResponder(const LLVolumeParams& mesh_params, S32 lod, U32 offset, U32 requested_bytes)
- : mMeshParams(mesh_params), mLOD(lod), mOffset(offset), mRequestedBytes(requested_bytes)
- {
- }
-
- virtual void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer);
-
-};
-
-class LLMeshSkinInfoResponder : public LLCurl::Responder
-{
-public:
- LLUUID mMeshID;
- U32 mRequestedBytes;
- U32 mOffset;
-
- LLMeshSkinInfoResponder(const LLUUID& id, U32 offset, U32 size)
- : mMeshID(id), mRequestedBytes(size), mOffset(offset)
- {
- }
-
- virtual void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer);
-
-};
-
-class LLMeshDecompositionResponder : public LLCurl::Responder
-{
-public:
- LLUUID mMeshID;
- U32 mRequestedBytes;
- U32 mOffset;
-
- LLMeshDecompositionResponder(const LLUUID& id, U32 offset, U32 size)
- : mMeshID(id), mRequestedBytes(size), mOffset(offset)
- {
- }
-
- virtual void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer);
-
-};
-
-class LLMeshPhysicsShapeResponder : public LLCurl::Responder
-{
-public:
- LLUUID mMeshID;
- U32 mRequestedBytes;
- U32 mOffset;
-
- LLMeshPhysicsShapeResponder(const LLUUID& id, U32 offset, U32 size)
- : mMeshID(id), mRequestedBytes(size), mOffset(offset)
- {
- }
-
- virtual void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer);
-
-};
-
-class LLModelObjectUploadResponder: public LLCurl::Responder
-{
- LLSD mObjectAsset;
- LLMeshUploadThread* mThread;
-
-public:
- LLModelObjectUploadResponder(LLMeshUploadThread* thread, const LLSD& object_asset):
- mThread(thread),
- mObjectAsset(object_asset)
- {
- }
-
- virtual void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
- {
- assert_main_thread();
-
- llinfos << "completed" << llendl;
- mThread->mPendingUploads--;
- mThread->mFinished = true;
- }
-};
-
-class LLWholeModelFeeResponder: public LLCurl::Responder
-{
- LLMeshUploadThread* mThread;
-public:
- LLWholeModelFeeResponder(LLMeshUploadThread* thread):
- mThread(thread)
- {
- }
- virtual void completed(U32 status,
- const std::string& reason,
- const LLSD& content)
- {
- //assert_main_thread();
- llinfos << "completed" << llendl;
- mThread->mPendingUploads--;
- dumpLLSDToFile(content,"whole_model_fee_response.xml");
- if (isGoodStatus(status))
- {
- mThread->mWholeModelUploadURL = content["uploader"].asString();
- }
- else
- {
- llinfos << "upload failed" << llendl;
- mThread->mWholeModelUploadURL = "";
- }
-
- }
-};
-
-class LLWholeModelUploadResponder: public LLCurl::Responder
-{
- LLMeshUploadThread* mThread;
- LLSD mPostData;
-
-public:
- LLWholeModelUploadResponder(LLMeshUploadThread* thread, LLSD& post_data):
- mThread(thread),
- mPostData(post_data)
- {
- }
- virtual void completed(U32 status,
- const std::string& reason,
- const LLSD& content)
- {
- //assert_main_thread();
- llinfos << "upload completed" << llendl;
- mThread->mPendingUploads--;
- dumpLLSDToFile(content,"whole_model_upload_response.xml");
- // requested "mesh" asset type isn't actually the type
- // of the resultant object, fix it up here.
- mPostData["asset_type"] = "object";
- gMeshRepo.updateInventory(LLMeshRepository::inventory_data(mPostData,content));
- }
-};
-
-LLMeshRepoThread::LLMeshRepoThread()
-: LLThread("mesh repo", NULL)
-{
- mWaiting = false;
- mMutex = new LLMutex(NULL);
- mHeaderMutex = new LLMutex(NULL);
- mSignal = new LLCondition(NULL);
-}
-
-LLMeshRepoThread::~LLMeshRepoThread()
-{
- delete mMutex;
- mMutex = NULL;
- delete mHeaderMutex;
- mHeaderMutex = NULL;
- delete mSignal;
- mSignal = NULL;
-}
-
-void LLMeshRepoThread::run()
-{
- mCurlRequest = new LLCurlRequest();
- LLCDResult res = LLConvexDecomposition::initThread();
- if (res != LLCD_OK)
- {
- llwarns << "convex decomposition unable to be loaded" << llendl;
- }
-
- while (!LLApp::isQuitting())
- {
- mWaiting = true;
- mSignal->wait();
- mWaiting = false;
-
- if (!LLApp::isQuitting())
- {
- static U32 count = 0;
-
- static F32 last_hundred = gFrameTimeSeconds;
-
- if (gFrameTimeSeconds - last_hundred > 1.f)
- { //a second has gone by, clear count
- last_hundred = gFrameTimeSeconds;
- count = 0;
- }
-
- // NOTE: throttling intentionally favors LOD requests over header requests
-
- while (!mLODReqQ.empty() && count < MAX_MESH_REQUESTS_PER_SECOND && sActiveLODRequests < sMaxConcurrentRequests)
- {
- {
- mMutex->lock();
- LODRequest req = mLODReqQ.front();
- mLODReqQ.pop();
- mMutex->unlock();
- if (fetchMeshLOD(req.mMeshParams, req.mLOD))
- {
- count++;
- }
- }
- }
-
- while (!mHeaderReqQ.empty() && count < MAX_MESH_REQUESTS_PER_SECOND && sActiveHeaderRequests < sMaxConcurrentRequests)
- {
- {
- mMutex->lock();
- HeaderRequest req = mHeaderReqQ.front();
- mHeaderReqQ.pop();
- mMutex->unlock();
- if (fetchMeshHeader(req.mMeshParams))
- {
- count++;
- }
- }
- }
-
- { //mSkinRequests is protected by mSignal
- std::set<LLUUID> incomplete;
- for (std::set<LLUUID>::iterator iter = mSkinRequests.begin(); iter != mSkinRequests.end(); ++iter)
- {
- LLUUID mesh_id = *iter;
- if (!fetchMeshSkinInfo(mesh_id))
- {
- incomplete.insert(mesh_id);
- }
- }
- mSkinRequests = incomplete;
- }
-
- { //mDecompositionRequests is protected by mSignal
- std::set<LLUUID> incomplete;
- for (std::set<LLUUID>::iterator iter = mDecompositionRequests.begin(); iter != mDecompositionRequests.end(); ++iter)
- {
- LLUUID mesh_id = *iter;
- if (!fetchMeshDecomposition(mesh_id))
- {
- incomplete.insert(mesh_id);
- }
- }
- mDecompositionRequests = incomplete;
- }
-
- { //mPhysicsShapeRequests is protected by mSignal
- std::set<LLUUID> incomplete;
- for (std::set<LLUUID>::iterator iter = mPhysicsShapeRequests.begin(); iter != mPhysicsShapeRequests.end(); ++iter)
- {
- LLUUID mesh_id = *iter;
- if (!fetchMeshPhysicsShape(mesh_id))
- {
- incomplete.insert(mesh_id);
- }
- }
- mPhysicsShapeRequests = incomplete;
- }
-
- mCurlRequest->process();
- }
- }
-
- if (mSignal->isLocked())
- { //make sure to let go of the mutex associated with the given signal before shutting down
- mSignal->unlock();
- }
-
- res = LLConvexDecomposition::quitThread();
- if (res != LLCD_OK)
- {
- llwarns << "convex decomposition unable to be quit" << llendl;
- }
-
- delete mCurlRequest;
- mCurlRequest = NULL;
-}
-
-void LLMeshRepoThread::loadMeshSkinInfo(const LLUUID& mesh_id)
-{ //protected by mSignal, no locking needed here
- mSkinRequests.insert(mesh_id);
-}
-
-void LLMeshRepoThread::loadMeshDecomposition(const LLUUID& mesh_id)
-{ //protected by mSignal, no locking needed here
- mDecompositionRequests.insert(mesh_id);
-}
-
-void LLMeshRepoThread::loadMeshPhysicsShape(const LLUUID& mesh_id)
-{ //protected by mSignal, no locking needed here
- mPhysicsShapeRequests.insert(mesh_id);
-}
-
-
-void LLMeshRepoThread::loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
-{ //protected by mSignal, no locking needed here
-
- mesh_header_map::iterator iter = mMeshHeader.find(mesh_params.getSculptID());
- if (iter != mMeshHeader.end())
- { //if we have the header, request LOD byte range
- LODRequest req(mesh_params, lod);
- {
- LLMutexLock lock(mMutex);
- mLODReqQ.push(req);
- }
- }
- else
- {
- HeaderRequest req(mesh_params);
-
- pending_lod_map::iterator pending = mPendingLOD.find(mesh_params);
-
- if (pending != mPendingLOD.end())
- { //append this lod request to existing header request
- pending->second.push_back(lod);
- llassert(pending->second.size() <= LLModel::NUM_LODS)
- }
- else
- { //if no header request is pending, fetch header
- LLMutexLock lock(mMutex);
- mHeaderReqQ.push(req);
- mPendingLOD[mesh_params].push_back(lod);
- }
- }
-}
-
-//static
-std::string LLMeshRepoThread::constructUrl(LLUUID mesh_id)
-{
- std::string http_url;
-
- if (gAgent.getRegion())
- {
- http_url = gMeshRepo.mGetMeshCapability;
- }
-
- if (!http_url.empty())
- {
- http_url += "/?mesh_id=";
- http_url += mesh_id.asString().c_str();
- }
- else
- {
- llwarns << "Current region does not have GetMesh capability! Cannot load " << mesh_id << ".mesh" << llendl;
- }
-
- return http_url;
-}
-
-bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)
-{ //protected by mMutex
- mHeaderMutex->lock();
-
- if (mMeshHeader.find(mesh_id) == mMeshHeader.end())
- { //we have no header info for this mesh, do nothing
- mHeaderMutex->unlock();
- return false;
- }
-
- U32 header_size = mMeshHeaderSize[mesh_id];
-
- if (header_size > 0)
- {
- S32 offset = header_size + mMeshHeader[mesh_id]["skin"]["offset"].asInteger();
- S32 size = mMeshHeader[mesh_id]["skin"]["size"].asInteger();
-
- mHeaderMutex->unlock();
-
- if (offset >= 0 && size > 0)
- {
- //check VFS for mesh skin info
- LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
- if (file.getSize() >= offset+size)
- {
- LLMeshRepository::sCacheBytesRead += size;
- file.seek(offset);
- U8* buffer = new U8[size];
- file.read(buffer, size);
-
- //make sure buffer isn't all 0's (reserved block but not written)
- bool zero = true;
- for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
- {
- zero = buffer[i] > 0 ? false : true;
- }
-
- if (!zero)
- { //attempt to parse
- if (skinInfoReceived(mesh_id, buffer, size))
- {
- delete[] buffer;
- return true;
- }
- }
-
- delete[] buffer;
- }
-
- //reading from VFS failed for whatever reason, fetch from sim
- std::vector<std::string> headers;
- headers.push_back("Accept: application/octet-stream");
-
- std::string http_url = constructUrl(mesh_id);
- if (!http_url.empty())
- {
- ++sActiveLODRequests;
- LLMeshRepository::sHTTPRequestCount++;
- mCurlRequest->getByteRange(constructUrl(mesh_id), headers, offset, size,
- new LLMeshSkinInfoResponder(mesh_id, offset, size));
- }
- }
- }
- else
- {
- mHeaderMutex->unlock();
- }
-
- //early out was not hit, effectively fetched
- return true;
-}
-
-bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)
-{ //protected by mMutex
- mHeaderMutex->lock();
-
- if (mMeshHeader.find(mesh_id) == mMeshHeader.end())
- { //we have no header info for this mesh, do nothing
- mHeaderMutex->unlock();
- return false;
- }
-
- U32 header_size = mMeshHeaderSize[mesh_id];
-
- if (header_size > 0)
- {
- S32 offset = header_size + mMeshHeader[mesh_id]["decomposition"]["offset"].asInteger();
- S32 size = mMeshHeader[mesh_id]["decomposition"]["size"].asInteger();
-
- mHeaderMutex->unlock();
-
- if (offset >= 0 && size > 0)
- {
- //check VFS for mesh skin info
- LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
- if (file.getSize() >= offset+size)
- {
- LLMeshRepository::sCacheBytesRead += size;
- file.seek(offset);
- U8* buffer = new U8[size];
- file.read(buffer, size);
-
- //make sure buffer isn't all 0's (reserved block but not written)
- bool zero = true;
- for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
- {
- zero = buffer[i] > 0 ? false : true;
- }
-
- if (!zero)
- { //attempt to parse
- if (decompositionReceived(mesh_id, buffer, size))
- {
- delete[] buffer;
- return true;
- }
- }
-
- delete[] buffer;
- }
-
- //reading from VFS failed for whatever reason, fetch from sim
- std::vector<std::string> headers;
- headers.push_back("Accept: application/octet-stream");
-
- std::string http_url = constructUrl(mesh_id);
- if (!http_url.empty())
- {
- ++sActiveLODRequests;
- LLMeshRepository::sHTTPRequestCount++;
- mCurlRequest->getByteRange(http_url, headers, offset, size,
- new LLMeshDecompositionResponder(mesh_id, offset, size));
- }
- }
- }
- else
- {
- mHeaderMutex->unlock();
- }
-
- //early out was not hit, effectively fetched
- return true;
-}
-
-bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
-{ //protected by mMutex
- mHeaderMutex->lock();
-
- if (mMeshHeader.find(mesh_id) == mMeshHeader.end())
- { //we have no header info for this mesh, do nothing
- mHeaderMutex->unlock();
- return false;
- }
-
- U32 header_size = mMeshHeaderSize[mesh_id];
-
- if (header_size > 0)
- {
- S32 offset = header_size + mMeshHeader[mesh_id]["physics_shape"]["offset"].asInteger();
- S32 size = mMeshHeader[mesh_id]["physics_shape"]["size"].asInteger();
-
- mHeaderMutex->unlock();
-
- if (offset >= 0 && size > 0)
- {
- //check VFS for mesh physics shape info
- LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
- if (file.getSize() >= offset+size)
- {
- LLMeshRepository::sCacheBytesRead += size;
- file.seek(offset);
- U8* buffer = new U8[size];
- file.read(buffer, size);
-
- //make sure buffer isn't all 0's (reserved block but not written)
- bool zero = true;
- for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
- {
- zero = buffer[i] > 0 ? false : true;
- }
-
- if (!zero)
- { //attempt to parse
- if (physicsShapeReceived(mesh_id, buffer, size))
- {
- delete[] buffer;
- return true;
- }
- }
-
- delete[] buffer;
- }
-
- //reading from VFS failed for whatever reason, fetch from sim
- std::vector<std::string> headers;
- headers.push_back("Accept: application/octet-stream");
-
- std::string http_url = constructUrl(mesh_id);
- if (!http_url.empty())
- {
- ++sActiveLODRequests;
- LLMeshRepository::sHTTPRequestCount++;
- mCurlRequest->getByteRange(http_url, headers, offset, size,
- new LLMeshPhysicsShapeResponder(mesh_id, offset, size));
- }
- }
- else
- { //no physics shape whatsoever, report back NULL
- physicsShapeReceived(mesh_id, NULL, 0);
- }
- }
- else
- {
- mHeaderMutex->unlock();
- }
-
- //early out was not hit, effectively fetched
- return true;
-}
-
-bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params)
-{
- bool retval = false;
-
- {
- //look for mesh in asset in vfs
- LLVFile file(gVFS, mesh_params.getSculptID(), LLAssetType::AT_MESH);
-
- S32 size = file.getSize();
-
- if (size > 0)
- {
- U8 buffer[1024];
- S32 bytes = llmin(size, 1024);
- LLMeshRepository::sCacheBytesRead += bytes;
- file.read(buffer, bytes);
- if (headerReceived(mesh_params, buffer, bytes))
- { //did not do an HTTP request, return false
- return false;
- }
- }
- }
-
- //either cache entry doesn't exist or is corrupt, request header from simulator
-
- std::vector<std::string> headers;
- headers.push_back("Accept: application/octet-stream");
-
- std::string http_url = constructUrl(mesh_params.getSculptID());
- if (!http_url.empty())
- {
- ++sActiveHeaderRequests;
- retval = true;
- //grab first 4KB if we're going to bother with a fetch. Cache will prevent future fetches if a full mesh fits
- //within the first 4KB
- LLMeshRepository::sHTTPRequestCount++;
- mCurlRequest->getByteRange(http_url, headers, 0, 4096, new LLMeshHeaderResponder(mesh_params));
- }
-
- return retval;
-}
-
-bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
-{ //protected by mMutex
- mHeaderMutex->lock();
-
- bool retval = false;
-
- LLUUID mesh_id = mesh_params.getSculptID();
-
- U32 header_size = mMeshHeaderSize[mesh_id];
-
- if (header_size > 0)
- {
- S32 offset = header_size + mMeshHeader[mesh_id][header_lod[lod]]["offset"].asInteger();
- S32 size = mMeshHeader[mesh_id][header_lod[lod]]["size"].asInteger();
- mHeaderMutex->unlock();
- if (offset >= 0 && size > 0)
- {
-
- //check VFS for mesh asset
- LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
- if (file.getSize() >= offset+size)
- {
- LLMeshRepository::sCacheBytesRead += size;
- file.seek(offset);
- U8* buffer = new U8[size];
- file.read(buffer, size);
-
- //make sure buffer isn't all 0's (reserved block but not written)
- bool zero = true;
- for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
- {
- zero = buffer[i] > 0 ? false : true;
- }
-
- if (!zero)
- { //attempt to parse
- if (lodReceived(mesh_params, lod, buffer, size))
- {
- delete[] buffer;
- return false;
- }
- }
-
- delete[] buffer;
- }
-
- //reading from VFS failed for whatever reason, fetch from sim
- std::vector<std::string> headers;
- headers.push_back("Accept: application/octet-stream");
-
- std::string http_url = constructUrl(mesh_id);
- if (!http_url.empty())
- {
- ++sActiveLODRequests;
- retval = true;
- LLMeshRepository::sHTTPRequestCount++;
- mCurlRequest->getByteRange(constructUrl(mesh_id), headers, offset, size,
- new LLMeshLODResponder(mesh_params, lod, offset, size));
- }
- else
- {
- mUnavailableQ.push(LODRequest(mesh_params, lod));
- }
- }
- else
- {
- mUnavailableQ.push(LODRequest(mesh_params, lod));
- }
- }
- else
- {
- mHeaderMutex->unlock();
- }
-
- return retval;
-}
-
-bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size)
-{
- LLSD header;
-
- U32 header_size = 0;
- if (data_size > 0)
- {
- std::string res_str((char*) data, data_size);
-
- std::string deprecated_header("<? LLSD/Binary ?>");
-
- if (res_str.substr(0, deprecated_header.size()) == deprecated_header)
- {
- res_str = res_str.substr(deprecated_header.size()+1, data_size);
- header_size = deprecated_header.size()+1;
- }
- data_size = res_str.size();
-
- std::istringstream stream(res_str);
-
- if (!LLSDSerialize::fromBinary(header, stream, data_size))
- {
- llwarns << "Mesh header parse error. Not a valid mesh asset!" << llendl;
- return false;
- }
-
- header_size += stream.tellg();
- }
- else
- {
- llinfos
- << "Marking header as non-existent, will not retry." << llendl;
- header["404"] = 1;
- }
-
- {
- U32 cost = gMeshRepo.calcResourceCost(header);
-
- LLUUID mesh_id = mesh_params.getSculptID();
-
- mHeaderMutex->lock();
- mMeshHeaderSize[mesh_id] = header_size;
- mMeshHeader[mesh_id] = header;
- mMeshResourceCost[mesh_id] = cost;
- mHeaderMutex->unlock();
-
- //check for pending requests
- pending_lod_map::iterator iter = mPendingLOD.find(mesh_params);
- if (iter != mPendingLOD.end())
- {
- LLMutexLock lock(mMutex);
- for (U32 i = 0; i < iter->second.size(); ++i)
- {
- LODRequest req(mesh_params, iter->second[i]);
- mLODReqQ.push(req);
- }
- }
- mPendingLOD.erase(iter);
- }
-
- return true;
-}
-
-bool LLMeshRepoThread::lodReceived(const LLVolumeParams& mesh_params, S32 lod, U8* data, S32 data_size)
-{
- LLVolume* volume = new LLVolume(mesh_params, LLVolumeLODGroup::getVolumeScaleFromDetail(lod));
- std::string mesh_string((char*) data, data_size);
- std::istringstream stream(mesh_string);
-
- if (volume->unpackVolumeFaces(stream, data_size))
- {
- LoadedMesh mesh(volume, mesh_params, lod);
- if (volume->getNumFaces() > 0)
- {
- LLMutexLock lock(mMutex);
- mLoadedQ.push(mesh);
- return true;
- }
- }
-
- return false;
-}
-
-bool LLMeshRepoThread::skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 data_size)
-{
- LLSD skin;
-
- if (data_size > 0)
- {
- std::string res_str((char*) data, data_size);
-
- std::istringstream stream(res_str);
-
- if (!unzip_llsd(skin, stream, data_size))
- {
- llwarns << "Mesh skin info parse error. Not a valid mesh asset!" << llendl;
- return false;
- }
- }
-
- {
- LLMeshSkinInfo info(skin);
- info.mMeshID = mesh_id;
-
- //llinfos<<"info pelvis offset"<<info.mPelvisOffset<<llendl;
- mSkinInfoQ.push(info);
- }
-
- return true;
-}
-
-bool LLMeshRepoThread::decompositionReceived(const LLUUID& mesh_id, U8* data, S32 data_size)
-{
- LLSD decomp;
-
- if (data_size > 0)
- {
- std::string res_str((char*) data, data_size);
-
- std::istringstream stream(res_str);
-
- if (!unzip_llsd(decomp, stream, data_size))
- {
- llwarns << "Mesh decomposition parse error. Not a valid mesh asset!" << llendl;
- return false;
- }
- }
-
- {
- LLModel::Decomposition* d = new LLModel::Decomposition(decomp);
- d->mMeshID = mesh_id;
- mDecompositionQ.push(d);
- }
-
- return true;
-}
-
-bool LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 data_size)
-{
- LLSD physics_shape;
-
- LLModel::Decomposition* d = new LLModel::Decomposition();
- d->mMeshID = mesh_id;
-
- if (data == NULL)
- { //no data, no physics shape exists
- d->mPhysicsShapeMesh.clear();
- }
- else
- {
- LLVolumeParams volume_params;
- volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
- volume_params.setSculptID(mesh_id, LL_SCULPT_TYPE_MESH);
- LLPointer<LLVolume> volume = new LLVolume(volume_params,0);
- std::string mesh_string((char*) data, data_size);
- std::istringstream stream(mesh_string);
-
- if (volume->unpackVolumeFaces(stream, data_size))
- {
- //load volume faces into decomposition buffer
- S32 vertex_count = 0;
- S32 index_count = 0;
-
- for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
- {
- const LLVolumeFace& face = volume->getVolumeFace(i);
- vertex_count += face.mNumVertices;
- index_count += face.mNumIndices;
- }
-
- d->mPhysicsShapeMesh.clear();
-
- std::vector<LLVector3>& pos = d->mPhysicsShapeMesh.mPositions;
- std::vector<LLVector3>& norm = d->mPhysicsShapeMesh.mNormals;
-
- for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
- {
- const LLVolumeFace& face = volume->getVolumeFace(i);
-
- for (S32 i = 0; i < face.mNumIndices; ++i)
- {
- U16 idx = face.mIndices[i];
-
- pos.push_back(LLVector3(face.mPositions[idx].getF32ptr()));
- norm.push_back(LLVector3(face.mNormals[idx].getF32ptr()));
- }
- }
- }
- }
-
- mDecompositionQ.push(d);
- return true;
-}
-
-LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, LLVector3& scale, bool upload_textures,
- bool upload_skin, bool upload_joints)
-: LLThread("mesh upload"),
- mDiscarded(FALSE)
-{
- mInstanceList = data;
- mUploadTextures = upload_textures;
- mUploadSkin = upload_skin;
- mUploadJoints = upload_joints;
- mMutex = new LLMutex(NULL);
- mCurlRequest = NULL;
- mPendingConfirmations = 0;
- mPendingUploads = 0;
- mPendingCost = 0;
- mFinished = false;
- mOrigin = gAgent.getPositionAgent();
- mHost = gAgent.getRegionHost();
-
- mUploadObjectAssetCapability = gAgent.getRegion()->getCapability("UploadObjectAsset");
- mNewInventoryCapability = gAgent.getRegion()->getCapability("NewFileAgentInventoryVariablePrice");
- mWholeModelFeeCapability = gAgent.getRegion()->getCapability("NewFileAgentInventory");
-
- mOrigin += gAgent.getAtAxis() * scale.magVec();
-}
-
-LLMeshUploadThread::~LLMeshUploadThread()
-{
-
-}
-
-LLMeshUploadThread::DecompRequest::DecompRequest(LLModel* mdl, LLModel* base_model, LLMeshUploadThread* thread)
-{
- mStage = "single_hull";
- mModel = mdl;
- mDecompID = &mdl->mDecompID;
- mBaseModel = base_model;
- mThread = thread;
-
- //copy out positions and indices
- if (mdl)
- {
- U16 index_offset = 0;
-
- mPositions.clear();
- mIndices.clear();
-
- //queue up vertex positions and indices
- for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i)
- {
- const LLVolumeFace& face = mdl->getVolumeFace(i);
- if (mPositions.size() + face.mNumVertices > 65535)
- {
- continue;
- }
-
- for (U32 j = 0; j < face.mNumVertices; ++j)
- {
- mPositions.push_back(LLVector3(face.mPositions[j].getF32ptr()));
- }
-
- for (U32 j = 0; j < face.mNumIndices; ++j)
- {
- mIndices.push_back(face.mIndices[j]+index_offset);
- }
-
- index_offset += face.mNumVertices;
- }
- }
-
- mThread->mFinalDecomp = this;
- mThread->mPhysicsComplete = false;
-}
-
-void LLMeshUploadThread::DecompRequest::completed()
-{
- if (mThread->mFinalDecomp == this)
- {
- mThread->mPhysicsComplete = true;
- }
-
- llassert(mHull.size() == 1);
-
- mThread->mHullMap[mBaseModel] = mHull[0];
-}
-
-//called in the main thread.
-void LLMeshUploadThread::preStart()
-{
- //build map of LLModel refs to instances for callbacks
- for (instance_list::iterator iter = mInstanceList.begin(); iter != mInstanceList.end(); ++iter)
- {
- mInstance[iter->mModel].push_back(*iter);
- }
-}
-
-void LLMeshUploadThread::discard()
-{
- LLMutexLock lock(mMutex) ;
- mDiscarded = TRUE ;
-}
-
-BOOL LLMeshUploadThread::isDiscarded()
-{
- LLMutexLock lock(mMutex) ;
- return mDiscarded ;
-}
-
-void LLMeshUploadThread::run()
-{
- if (gSavedSettings.getBOOL("MeshUseWholeModelUpload"))
- {
- doWholeModelUpload();
- }
- else
- {
- doIterativeUpload();
- }
-}
-
-void dumpLLSDToFile(const LLSD& content, std::string filename)
-{
-#if 1
- std::ofstream of(filename.c_str());
- LLSDSerialize::toPrettyXML(content,of);
-#endif
-}
-
-void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
-{
- LLSD result;
-
- LLSD res;
- result["folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT);
- result["asset_type"] = "mesh";
- result["inventory_type"] = "object";
- result["name"] = "mesh model";
- result["description"] = "your description here";
-
- res["mesh_list"] = LLSD::emptyArray();
- res["texture_list"] = LLSD::emptyArray();
- res["instance_list"] = LLSD::emptyArray();
- S32 mesh_num = 0;
- S32 texture_num = 0;
-
- std::set<LLViewerTexture* > textures;
- std::map<LLViewerTexture*,S32> texture_index;
-
- std::map<LLModel*,S32> mesh_index;
-
- S32 instance_num = 0;
-
- for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
- {
- LLMeshUploadData data;
- data.mBaseModel = iter->first;
- LLModelInstance& instance = *(iter->second.begin());
- LLModel* model = instance.mModel;
- if (mesh_index.find(model) == mesh_index.end())
- {
- // Have not seen this model before - create a new mesh_list entry for it.
- std::string model_name = data.mBaseModel->getName();
- if (!model_name.empty())
- {
- result["name"] = model_name;
- }
-
- std::stringstream ostr;
-
- LLModel::Decomposition& decomp =
- data.mModel[LLModel::LOD_PHYSICS].notNull() ?
- data.mModel[LLModel::LOD_PHYSICS]->mPhysics :
- data.mBaseModel->mPhysics;
-
- decomp.mBaseHull = mHullMap[data.mBaseModel];
-
- LLSD mesh_header = LLModel::writeModel(
- ostr,
- data.mModel[LLModel::LOD_PHYSICS],
- data.mModel[LLModel::LOD_HIGH],
- data.mModel[LLModel::LOD_MEDIUM],
- data.mModel[LLModel::LOD_LOW],
- data.mModel[LLModel::LOD_IMPOSTOR],
- decomp,
- mUploadSkin,
- mUploadJoints);
-
- data.mAssetData = ostr.str();
- std::string str = ostr.str();
-
- res["mesh_list"][mesh_num] = LLSD::Binary(str.begin(),str.end());
- mesh_index[model] = mesh_num;
- mesh_num++;
- }
-
- LLSD instance_entry;
-
- for (S32 i = 0; i < 5; i++)
- {
- data.mModel[i] = instance.mLOD[i];
- }
-
- LLVector3 pos, scale;
- LLQuaternion rot;
- LLMatrix4 transformation = instance.mTransform;
- decomposeMeshMatrix(transformation,pos,rot,scale);
- instance_entry["position"] = ll_sd_from_vector3(pos);
- instance_entry["rotation"] = ll_sd_from_quaternion(rot);
- instance_entry["scale"] = ll_sd_from_vector3(scale);
-
- instance_entry["material"] = LL_MCODE_WOOD;
- LLPermissions perm;
- perm.setOwnerAndGroup(gAgent.getID(), gAgent.getID(), LLUUID::null, false);
- perm.setCreator(gAgent.getID());
-
- perm.initMasks(PERM_ITEM_UNRESTRICTED | PERM_MOVE, //base
- PERM_ITEM_UNRESTRICTED | PERM_MOVE, //owner
- LLFloaterPerms::getEveryonePerms(),
- LLFloaterPerms::getGroupPerms(),
- LLFloaterPerms::getNextOwnerPerms());
- instance_entry["permissions"] = ll_create_sd_from_permissions(perm);
- instance_entry["physics_shape_type"] = (U8)(LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL);
- instance_entry["mesh"] = mesh_index[model];
-
- if (mUploadTextures)
- {
- instance_entry["face_list"] = LLSD::emptyArray();
-
- for (S32 face_num = 0; face_num < model->getNumVolumeFaces(); face_num++)
- {
- LLImportMaterial& material = instance.mMaterial[face_num];
- LLSD face_entry = LLSD::emptyMap();
- LLViewerFetchedTexture *texture = material.mDiffuseMap.get();
-
- if (texture != NULL)
- {
- if (textures.find(texture) == textures.end())
- {
- textures.insert(texture);
- }
-
- std::stringstream ostr;
- if (include_textures) // otherwise data is blank.
- {
- LLTextureUploadData data(texture, material.mDiffuseMapLabel);
- if (!data.mTexture->isRawImageValid())
- {
- data.mTexture->reloadRawImage(data.mTexture->getDiscardLevel());
- }
-
- LLPointer<LLImageJ2C> upload_file =
- LLViewerTextureList::convertToUploadFile(data.mTexture->getRawImage());
- ostr.write((const char*) upload_file->getData(), upload_file->getDataSize());
- }
-
- if (texture_index.find(texture) == texture_index.end())
- {
- texture_index[texture] = texture_num;
- std::string str = ostr.str();
- res["texture_list"][texture_num] = LLSD::Binary(str.begin(),str.end());
- texture_num++;
- }
- }
-
- // Subset of TextureEntry fields.
- if (texture)
- {
- face_entry["image"] = texture_index[texture];
- }
- face_entry["scales"] = 1.0;
- face_entry["scalet"] = 1.0;
- face_entry["offsets"] = 0.0;
- face_entry["offsett"] = 0.0;
- face_entry["imagerot"] = 0.0;
- face_entry["colors"] = ll_sd_from_color4(material.mDiffuseColor);
- face_entry["fullbright"] = material.mFullbright;
- instance_entry["face_list"][face_num] = face_entry;
- }
- }
-
- res["instance_list"][instance_num] = instance_entry;
- instance_num++;
- }
-
- result["asset_resources"] = res;
- dumpLLSDToFile(result,"whole_model.xml");
-
- dest = result;
-}
-
-void LLMeshUploadThread::doWholeModelUpload()
-{
- mCurlRequest = new LLCurlRequest();
-
- // Queue up models for hull generation (viewer-side)
- for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
- {
- LLMeshUploadData data;
- data.mBaseModel = iter->first;
-
- LLModelInstance& instance = *(iter->second.begin());
-
- for (S32 i = 0; i < 5; i++)
- {
- data.mModel[i] = instance.mLOD[i];
- }
-
- //queue up models for hull generation
- LLModel* physics = NULL;
-
- if (data.mModel[LLModel::LOD_PHYSICS].notNull())
- {
- physics = data.mModel[LLModel::LOD_PHYSICS];
- }
- else if (data.mModel[LLModel::LOD_MEDIUM].notNull())
- {
- physics = data.mModel[LLModel::LOD_MEDIUM];
- }
- else
- {
- physics = data.mModel[LLModel::LOD_HIGH];
- }
-
- llassert(physics != NULL);
-
- DecompRequest* request = new DecompRequest(physics, data.mBaseModel, this);
- gMeshRepo.mDecompThread->submitRequest(request);
- }
-
- while (!mPhysicsComplete)
- {
- apr_sleep(100);
- }
-
- LLSD model_data;
- wholeModelToLLSD(model_data,false);
- dumpLLSDToFile(model_data,"whole_model_fee_request.xml");
-
- mPendingUploads++;
- LLCurlRequest::headers_t headers;
- mCurlRequest->post(mWholeModelFeeCapability, headers, model_data,
- new LLWholeModelFeeResponder(this));
-
- do
- {
- mCurlRequest->process();
- } while (mCurlRequest->getQueued() > 0);
-
-
- if (mWholeModelUploadURL.empty())
- {
- llinfos << "unable to upload, fee request failed" << llendl;
- }
- else
- {
- LLSD full_model_data;
- wholeModelToLLSD(full_model_data, true);
- LLSD body = full_model_data["asset_resources"];
- dumpLLSDToFile(body,"whole_model_body.xml");
- mCurlRequest->post(mWholeModelUploadURL, headers, body,
- new LLWholeModelUploadResponder(this, model_data));
- do
- {
- mCurlRequest->process();
- } while (mCurlRequest->getQueued() > 0);
- }
-
- delete mCurlRequest;
- mCurlRequest = NULL;
-
- // Currently a no-op.
- mFinished = true;
-}
-
-void LLMeshUploadThread::doIterativeUpload()
-{
- if(isDiscarded())
- {
- mFinished = true;
- return ;
- }
-
- mCurlRequest = new LLCurlRequest();
-
- std::set<LLViewerTexture* > textures;
-
- //populate upload queue with relevant models
- for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
- {
- LLMeshUploadData data;
- data.mBaseModel = iter->first;
-
- LLModelInstance& instance = *(iter->second.begin());
-
- for (S32 i = 0; i < 5; i++)
- {
- data.mModel[i] = instance.mLOD[i];
- }
-
- uploadModel(data);
-
- if (mUploadTextures)
- {
- for (std::vector<LLImportMaterial>::iterator material_iter = instance.mMaterial.begin();
- material_iter != instance.mMaterial.end(); ++material_iter)
- {
-
- if (textures.find(material_iter->mDiffuseMap.get()) == textures.end())
- {
- textures.insert(material_iter->mDiffuseMap.get());
-
- LLTextureUploadData data(material_iter->mDiffuseMap.get(), material_iter->mDiffuseMapLabel);
- uploadTexture(data);
- }
- }
- }
-
- //queue up models for hull generation
- LLModel* physics = data.mModel[LLModel::LOD_PHYSICS];
- if (physics == NULL)
- { //no physics model available, use high lod
- physics = data.mModel[LLModel::LOD_HIGH];
- }
-
- DecompRequest* request = new DecompRequest(physics, data.mBaseModel, this);
- gMeshRepo.mDecompThread->submitRequest(request);
- }
-
- while (!mPhysicsComplete)
- {
- apr_sleep(100);
- }
-
- //upload textures
- bool done = false;
- do
- {
- if (!mTextureQ.empty())
- {
- sendCostRequest(mTextureQ.front());
- mTextureQ.pop();
- }
-
- if (!mConfirmedTextureQ.empty())
- {
- doUploadTexture(mConfirmedTextureQ.front());
- mConfirmedTextureQ.pop();
- }
-
- mCurlRequest->process();
-
- done = mTextureQ.empty() && mConfirmedTextureQ.empty();
- }
- while (!done || mCurlRequest->getQueued() > 0);
-
- LLSD object_asset;
- object_asset["objects"] = LLSD::emptyArray();
-
- done = false;
- do
- {
- static S32 count = 0;
- static F32 last_hundred = gFrameTimeSeconds;
- if (gFrameTimeSeconds - last_hundred > 1.f)
- {
- last_hundred = gFrameTimeSeconds;
- count = 0;
- }
-
- //how many requests to push before calling process
- const S32 PUSH_PER_PROCESS = 32;
-
- S32 tcount = llmin(count+PUSH_PER_PROCESS, 100);
-
- while (!mUploadQ.empty() && count < tcount)
- { //send any pending upload requests
- mMutex->lock();
- LLMeshUploadData data = mUploadQ.front();
- mUploadQ.pop();
- mMutex->unlock();
- sendCostRequest(data);
- count++;
- }
-
- tcount = llmin(count+PUSH_PER_PROCESS, 100);
-
- while (!mConfirmedQ.empty() && count < tcount)
- { //process any meshes that have been confirmed for upload
- LLMeshUploadData& data = mConfirmedQ.front();
- doUploadModel(data);
- mConfirmedQ.pop();
- count++;
- }
-
- tcount = llmin(count+PUSH_PER_PROCESS, 100);
-
- while (!mInstanceQ.empty() && count < tcount && !isDiscarded())
- { //create any objects waiting for upload
- count++;
- object_asset["objects"].append(createObject(mInstanceQ.front()));
- mInstanceQ.pop();
- }
-
- mCurlRequest->process();
-
- done = isDiscarded() || (mInstanceQ.empty() && mConfirmedQ.empty() && mUploadQ.empty());
- }
- while (!done || mCurlRequest->getQueued() > 0);
-
- delete mCurlRequest;
- mCurlRequest = NULL;
-
- // now upload the object asset
- std::string url = mUploadObjectAssetCapability;
-
- if (object_asset["objects"][0].has("permissions"))
- { //copy permissions from first available object to be used for coalesced object
- object_asset["permissions"] = object_asset["objects"][0]["permissions"];
- }
-
- if(!isDiscarded())
- {
- mPendingUploads++;
- LLHTTPClient::post(url, object_asset, new LLModelObjectUploadResponder(this,object_asset));
- }
- else
- {
- mFinished = true;
- }
-}
-
-void LLMeshUploadThread::uploadModel(LLMeshUploadData& data)
-{ //called from arbitrary thread
- {
- LLMutexLock lock(mMutex);
- mUploadQ.push(data);
- }
-}
-
-void LLMeshUploadThread::uploadTexture(LLTextureUploadData& data)
-{ //called from mesh upload thread
- mTextureQ.push(data);
-}
-
-
-static LLFastTimer::DeclareTimer FTM_NOTIFY_MESH_LOADED("Notify Loaded");
-static LLFastTimer::DeclareTimer FTM_NOTIFY_MESH_UNAVAILABLE("Notify Unavailable");
-
-void LLMeshRepoThread::notifyLoadedMeshes()
-{
- while (!mLoadedQ.empty())
- {
- mMutex->lock();
- LoadedMesh mesh = mLoadedQ.front();
- mLoadedQ.pop();
- mMutex->unlock();
-
- if (mesh.mVolume && mesh.mVolume->getNumVolumeFaces() > 0)
- {
- gMeshRepo.notifyMeshLoaded(mesh.mMeshParams, mesh.mVolume);
- }
- else
- {
- gMeshRepo.notifyMeshUnavailable(mesh.mMeshParams,
- LLVolumeLODGroup::getVolumeDetailFromScale(mesh.mVolume->getDetail()));
- }
- }
-
- while (!mUnavailableQ.empty())
- {
- mMutex->lock();
- LODRequest req = mUnavailableQ.front();
- mUnavailableQ.pop();
- mMutex->unlock();
-
- gMeshRepo.notifyMeshUnavailable(req.mMeshParams, req.mLOD);
- }
-
- while (!mSkinInfoQ.empty())
- {
- gMeshRepo.notifySkinInfoReceived(mSkinInfoQ.front());
- mSkinInfoQ.pop();
- }
-
- while (!mDecompositionQ.empty())
- {
- gMeshRepo.notifyDecompositionReceived(mDecompositionQ.front());
- mDecompositionQ.pop();
- }
-}
-
-S32 LLMeshRepoThread::getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
-{ //only ever called from main thread
- LLMutexLock lock(mHeaderMutex);
- mesh_header_map::iterator iter = mMeshHeader.find(mesh_params.getSculptID());
-
- if (iter != mMeshHeader.end())
- {
- LLSD& header = iter->second;
-
- return LLMeshRepository::getActualMeshLOD(header, lod);
- }
-
- return lod;
-}
-
-//static
-S32 LLMeshRepository::getActualMeshLOD(LLSD& header, S32 lod)
-{
- lod = llclamp(lod, 0, 3);
-
- if (header.has("404"))
- {
- return -1;
- }
-
- if (header[header_lod[lod]]["size"].asInteger() > 0)
- {
- return lod;
- }
-
- //search down to find the next available lower lod
- for (S32 i = lod-1; i >= 0; --i)
- {
- if (header[header_lod[i]]["size"].asInteger() > 0)
- {
- return i;
- }
- }
-
- //search up to find then ext available higher lod
- for (S32 i = lod+1; i < 4; ++i)
- {
- if (header[header_lod[i]]["size"].asInteger() > 0)
- {
- return i;
- }
- }
-
- //header exists and no good lod found, treat as 404
- header["404"] = 1;
- return -1;
-}
-
-U32 LLMeshRepoThread::getResourceCost(const LLUUID& mesh_id)
-{
- LLMutexLock lock(mHeaderMutex);
-
- std::map<LLUUID, U32>::iterator iter = mMeshResourceCost.find(mesh_id);
- if (iter != mMeshResourceCost.end())
- {
- return iter->second;
- }
-
- return 0;
-}
-
-void LLMeshRepository::cacheOutgoingMesh(LLMeshUploadData& data, LLSD& header)
-{
- mThread->mMeshHeader[data.mUUID] = header;
-
- // we cache the mesh for default parameters
- LLVolumeParams volume_params;
- volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
- volume_params.setSculptID(data.mUUID, LL_SCULPT_TYPE_MESH);
-
- for (U32 i = 0; i < 4; i++)
- {
- if (data.mModel[i].notNull())
- {
- LLPointer<LLVolume> volume = new LLVolume(volume_params, LLVolumeLODGroup::getVolumeScaleFromDetail(i));
- volume->copyVolumeFaces(data.mModel[i]);
- }
- }
-
-}
-
-void LLMeshLODResponder::completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
-{
-
- LLMeshRepoThread::sActiveLODRequests--;
- S32 data_size = buffer->countAfter(channels.in(), NULL);
-
- if (status < 200 || status > 400)
- {
- llwarns << status << ": " << reason << llendl;
- }
-
- if (data_size < mRequestedBytes)
- {
- if (status == 499 || status == 503)
- { //timeout or service unavailable, try again
- LLMeshRepository::sHTTPRetryCount++;
- gMeshRepo.mThread->loadMeshLOD(mMeshParams, mLOD);
- }
- else
- {
- llwarns << "Unhandled status " << status << llendl;
- }
- return;
- }
-
- LLMeshRepository::sBytesReceived += mRequestedBytes;
-
- U8* data = NULL;
-
- if (data_size > 0)
- {
- data = new U8[data_size];
- buffer->readAfter(channels.in(), NULL, data, data_size);
- }
-
- if (gMeshRepo.mThread->lodReceived(mMeshParams, mLOD, data, data_size))
- {
- //good fetch from sim, write to VFS for caching
- LLVFile file(gVFS, mMeshParams.getSculptID(), LLAssetType::AT_MESH, LLVFile::WRITE);
-
- S32 offset = mOffset;
- S32 size = mRequestedBytes;
-
- if (file.getSize() >= offset+size)
- {
- file.seek(offset);
- file.write(data, size);
- LLMeshRepository::sCacheBytesWritten += size;
- }
- }
-
- delete [] data;
-}
-
-void LLMeshSkinInfoResponder::completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
-{
- S32 data_size = buffer->countAfter(channels.in(), NULL);
-
- if (status < 200 || status > 400)
- {
- llwarns << status << ": " << reason << llendl;
- }
-
- if (data_size < mRequestedBytes)
- {
- if (status == 499 || status == 503)
- { //timeout or service unavailable, try again
- LLMeshRepository::sHTTPRetryCount++;
- gMeshRepo.mThread->loadMeshSkinInfo(mMeshID);
- }
- else
- {
- llwarns << "Unhandled status " << status << llendl;
- }
- return;
- }
-
- LLMeshRepository::sBytesReceived += mRequestedBytes;
-
- U8* data = NULL;
-
- if (data_size > 0)
- {
- data = new U8[data_size];
- buffer->readAfter(channels.in(), NULL, data, data_size);
- }
-
- if (gMeshRepo.mThread->skinInfoReceived(mMeshID, data, data_size))
- {
- //good fetch from sim, write to VFS for caching
- LLVFile file(gVFS, mMeshID, LLAssetType::AT_MESH, LLVFile::WRITE);
-
- S32 offset = mOffset;
- S32 size = mRequestedBytes;
-
- if (file.getSize() >= offset+size)
- {
- LLMeshRepository::sCacheBytesWritten += size;
- file.seek(offset);
- file.write(data, size);
- }
- }
-
- delete [] data;
-}
-
-void LLMeshDecompositionResponder::completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
-{
- S32 data_size = buffer->countAfter(channels.in(), NULL);
-
- if (status < 200 || status > 400)
- {
- llwarns << status << ": " << reason << llendl;
- }
-
- if (data_size < mRequestedBytes)
- {
- if (status == 499 || status == 503)
- { //timeout or service unavailable, try again
- LLMeshRepository::sHTTPRetryCount++;
- gMeshRepo.mThread->loadMeshDecomposition(mMeshID);
- }
- else
- {
- llwarns << "Unhandled status " << status << llendl;
- }
- return;
- }
-
- LLMeshRepository::sBytesReceived += mRequestedBytes;
-
- U8* data = NULL;
-
- if (data_size > 0)
- {
- data = new U8[data_size];
- buffer->readAfter(channels.in(), NULL, data, data_size);
- }
-
- if (gMeshRepo.mThread->decompositionReceived(mMeshID, data, data_size))
- {
- //good fetch from sim, write to VFS for caching
- LLVFile file(gVFS, mMeshID, LLAssetType::AT_MESH, LLVFile::WRITE);
-
- S32 offset = mOffset;
- S32 size = mRequestedBytes;
-
- if (file.getSize() >= offset+size)
- {
- LLMeshRepository::sCacheBytesWritten += size;
- file.seek(offset);
- file.write(data, size);
- }
- }
-
- delete [] data;
-}
-
-void LLMeshPhysicsShapeResponder::completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
-{
- S32 data_size = buffer->countAfter(channels.in(), NULL);
-
- if (status < 200 || status > 400)
- {
- llwarns << status << ": " << reason << llendl;
- }
-
- if (data_size < mRequestedBytes)
- {
- if (status == 499 || status == 503)
- { //timeout or service unavailable, try again
- LLMeshRepository::sHTTPRetryCount++;
- gMeshRepo.mThread->loadMeshPhysicsShape(mMeshID);
- }
- else
- {
- llwarns << "Unhandled status " << status << llendl;
- }
- return;
- }
-
- LLMeshRepository::sBytesReceived += mRequestedBytes;
-
- U8* data = NULL;
-
- if (data_size > 0)
- {
- data = new U8[data_size];
- buffer->readAfter(channels.in(), NULL, data, data_size);
- }
-
- if (gMeshRepo.mThread->physicsShapeReceived(mMeshID, data, data_size))
- {
- //good fetch from sim, write to VFS for caching
- LLVFile file(gVFS, mMeshID, LLAssetType::AT_MESH, LLVFile::WRITE);
-
- S32 offset = mOffset;
- S32 size = mRequestedBytes;
-
- if (file.getSize() >= offset+size)
- {
- LLMeshRepository::sCacheBytesWritten += size;
- file.seek(offset);
- file.write(data, size);
- }
- }
-
- delete [] data;
-}
-
-void LLMeshHeaderResponder::completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
-{
- LLMeshRepoThread::sActiveHeaderRequests--;
- if (status < 200 || status > 400)
- {
- //llwarns
- // << "Header responder failed with status: "
- // << status << ": " << reason << llendl;
-
- // 503 (service unavailable) or 499 (timeout)
- // can be due to server load and can be retried
-
- // TODO*: Add maximum retry logic, exponential backoff
- // and (somewhat more optional than the others) retries
- // again after some set period of time
- if (status == 503 || status == 499)
- { //retry
- LLMeshRepository::sHTTPRetryCount++;
- LLMeshRepoThread::HeaderRequest req(mMeshParams);
- LLMutexLock lock(gMeshRepo.mThread->mMutex);
- gMeshRepo.mThread->mHeaderReqQ.push(req);
-
- return;
- }
- }
-
- S32 data_size = buffer->countAfter(channels.in(), NULL);
-
- U8* data = NULL;
-
- if (data_size > 0)
- {
- data = new U8[data_size];
- buffer->readAfter(channels.in(), NULL, data, data_size);
- }
-
- LLMeshRepository::sBytesReceived += llmin(data_size, 4096);
-
- if (!gMeshRepo.mThread->headerReceived(mMeshParams, data, data_size))
- {
- llwarns
- << "Unable to parse mesh header: "
- << status << ": " << reason << llendl;
- }
- else if (data && data_size > 0)
- {
- //header was successfully retrieved from sim, cache in vfs
- LLUUID mesh_id = mMeshParams.getSculptID();
- LLSD header = gMeshRepo.mThread->mMeshHeader[mesh_id];
-
- std::stringstream str;
-
- S32 lod_bytes = 0;
-
- for (U32 i = 0; i < LLModel::LOD_PHYSICS; ++i)
- { //figure out how many bytes we'll need to reserve in the file
- std::string lod_name = header_lod[i];
- lod_bytes = llmax(lod_bytes, header[lod_name]["offset"].asInteger()+header[lod_name]["size"].asInteger());
- }
-
- //just in case skin info or decomposition is at the end of the file (which it shouldn't be)
- lod_bytes = llmax(lod_bytes, header["skin"]["offset"].asInteger() + header["skin"]["size"].asInteger());
- lod_bytes = llmax(lod_bytes, header["decomposition"]["offset"].asInteger() + header["decomposition"]["size"].asInteger());
-
- S32 header_bytes = (S32) gMeshRepo.mThread->mMeshHeaderSize[mesh_id];
- S32 bytes = lod_bytes + header_bytes;
-
-
- //it's possible for the remote asset to have more data than is needed for the local cache
- //only allocate as much space in the VFS as is needed for the local cache
- data_size = llmin(data_size, bytes);
-
- LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH, LLVFile::WRITE);
- if (file.getMaxSize() >= bytes || file.setMaxSize(bytes))
- {
- LLMeshRepository::sCacheBytesWritten += data_size;
-
- file.write((const U8*) data, data_size);
-
- //zero out the rest of the file
- U8 block[4096];
- memset(block, 0, 4096);
-
- while (bytes-file.tell() > 4096)
- {
- file.write(block, 4096);
- }
-
- S32 remaining = bytes-file.tell();
-
- if (remaining < 0 || remaining > 4096)
- {
- llerrs << "Bad padding of mesh asset cache entry." << llendl;
- }
-
- if (remaining > 0)
- {
- file.write(block, remaining);
- }
- }
- }
-
- delete [] data;
-}
-
-
-LLMeshRepository::LLMeshRepository()
-: mMeshMutex(NULL),
- mMeshThreadCount(0),
- mThread(NULL)
-{
-
-}
-
-void LLMeshRepository::init()
-{
- mMeshMutex = new LLMutex(NULL);
-
- LLConvexDecomposition::getInstance()->initSystem();
-
- mDecompThread = new LLPhysicsDecomp();
- mDecompThread->start();
-
- while (!mDecompThread->mInited)
- { //wait for physics decomp thread to init
- apr_sleep(100);
- }
-
-
-
- mThread = new LLMeshRepoThread();
- mThread->start();
-}
-
-void LLMeshRepository::shutdown()
-{
- llinfos << "Shutting down mesh repository." << llendl;
-
- for (U32 i = 0; i < mUploads.size(); ++i)
- {
- llinfos << "Discard the pending mesh uploads " << llendl;
- mUploads[i]->discard() ; //discard the uploading requests.
- }
-
- mThread->mSignal->signal();
-
- while (!mThread->isStopped())
- {
- apr_sleep(10);
- }
- delete mThread;
- mThread = NULL;
-
- for (U32 i = 0; i < mUploads.size(); ++i)
- {
- llinfos << "Waiting for pending mesh upload " << i << "/" << mUploads.size() << llendl;
- while (!mUploads[i]->isStopped())
- {
- apr_sleep(10);
- }
- delete mUploads[i];
- }
-
- mUploads.clear();
-
- delete mMeshMutex;
- mMeshMutex = NULL;
-
- llinfos << "Shutting down decomposition system." << llendl;
-
- if (mDecompThread)
- {
- mDecompThread->shutdown();
- delete mDecompThread;
- mDecompThread = NULL;
- }
-
- LLConvexDecomposition::quitSystem();
-}
-
-//called in the main thread.
-S32 LLMeshRepository::update()
-{
- if(mUploadWaitList.empty())
- {
- return 0 ;
- }
-
- S32 size = mUploadWaitList.size() ;
- for (S32 i = 0; i < size; ++i)
- {
- mUploads.push_back(mUploadWaitList[i]);
- mUploadWaitList[i]->preStart() ;
- mUploadWaitList[i]->start() ;
- }
- mUploadWaitList.clear() ;
-
- return size ;
-}
-
-S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_params, S32 detail, S32 last_lod)
-{
- if (detail < 0 || detail > 4)
- {
- return detail;
- }
-
- LLFastTimer t(FTM_LOAD_MESH);
-
- {
- LLMutexLock lock(mMeshMutex);
- //add volume to list of loading meshes
- mesh_load_map::iterator iter = mLoadingMeshes[detail].find(mesh_params);
- if (iter != mLoadingMeshes[detail].end())
- { //request pending for this mesh, append volume id to list
- iter->second.insert(vobj->getID());
- }
- else
- {
- //first request for this mesh
- mLoadingMeshes[detail][mesh_params].insert(vobj->getID());
- mPendingRequests.push_back(LLMeshRepoThread::LODRequest(mesh_params, detail));
- }
- }
-
- //do a quick search to see if we can't display something while we wait for this mesh to load
- LLVolume* volume = vobj->getVolume();
-
- if (volume)
- {
- if (volume->getNumVolumeFaces() == 0 && !volume->isTetrahedron())
- {
- volume->makeTetrahedron();
- }
-
- LLVolumeParams params = volume->getParams();
-
- LLVolumeLODGroup* group = LLPrimitive::getVolumeManager()->getGroup(params);
-
- if (group)
- {
- //first, see if last_lod is available (don't transition down to avoid funny popping a la SH-641)
- if (last_lod >= 0)
- {
- LLVolume* lod = group->refLOD(last_lod);
- if (lod && !lod->isTetrahedron() && lod->getNumVolumeFaces() > 0)
- {
- group->derefLOD(lod);
- return last_lod;
- }
- group->derefLOD(lod);
- }
-
- //next, see what the next lowest LOD available might be
- for (S32 i = detail-1; i >= 0; --i)
- {
- LLVolume* lod = group->refLOD(i);
- if (lod && !lod->isTetrahedron() && lod->getNumVolumeFaces() > 0)
- {
- group->derefLOD(lod);
- return i;
- }
-
- group->derefLOD(lod);
- }
-
- //no lower LOD is a available, is a higher lod available?
- for (S32 i = detail+1; i < 4; ++i)
- {
- LLVolume* lod = group->refLOD(i);
- if (lod && !lod->isTetrahedron() && lod->getNumVolumeFaces() > 0)
- {
- group->derefLOD(lod);
- return i;
- }
-
- group->derefLOD(lod);
- }
- }
- }
-
- return detail;
-}
-
-static LLFastTimer::DeclareTimer FTM_START_MESH_THREAD("Start Thread");
-static LLFastTimer::DeclareTimer FTM_LOAD_MESH_LOD("Load LOD");
-static LLFastTimer::DeclareTimer FTM_MESH_LOCK1("Lock 1");
-static LLFastTimer::DeclareTimer FTM_MESH_LOCK2("Lock 2");
-
-void LLMeshRepository::notifyLoadedMeshes()
-{ //called from main thread
-
- LLMeshRepoThread::sMaxConcurrentRequests = gSavedSettings.getU32("MeshMaxConcurrentRequests");
-
- //clean up completed upload threads
- for (std::vector<LLMeshUploadThread*>::iterator iter = mUploads.begin(); iter != mUploads.end(); )
- {
- LLMeshUploadThread* thread = *iter;
-
- if (thread->isStopped() && thread->finished())
- {
- iter = mUploads.erase(iter);
- delete thread;
- }
- else
- {
- ++iter;
- }
- }
-
- //update inventory
- if (!mInventoryQ.empty())
- {
- LLMutexLock lock(mMeshMutex);
- while (!mInventoryQ.empty())
- {
- inventory_data& data = mInventoryQ.front();
-
- LLAssetType::EType asset_type = LLAssetType::lookup(data.mPostData["asset_type"].asString());
- LLInventoryType::EType inventory_type = LLInventoryType::lookup(data.mPostData["inventory_type"].asString());
-
- on_new_single_inventory_upload_complete(
- asset_type,
- inventory_type,
- data.mPostData["asset_type"].asString(),
- data.mPostData["folder_id"].asUUID(),
- data.mPostData["name"],
- data.mPostData["description"],
- data.mResponse,
- 0);
-
- mInventoryQ.pop();
- }
- }
-
- //call completed callbacks on finished decompositions
- mDecompThread->notifyCompleted();
-
- if (!mThread->mWaiting)
- { //curl thread is churning, wait for it to go idle
- return;
- }
-
- static std::string region_name("never name a region this");
-
- if (gAgent.getRegion())
- { //update capability url
- if (gAgent.getRegion()->getName() != region_name && gAgent.getRegion()->capabilitiesReceived())
- {
- region_name = gAgent.getRegion()->getName();
-
- mGetMeshCapability = gAgent.getRegion()->getCapability("GetMesh");
- }
- }
-
- LLFastTimer t(FTM_MESH_UPDATE);
-
- {
- LLFastTimer t(FTM_MESH_LOCK1);
- mMeshMutex->lock();
- }
-
- {
- LLFastTimer t(FTM_MESH_LOCK2);
- mThread->mMutex->lock();
- }
-
- //popup queued error messages from background threads
- while (!mUploadErrorQ.empty())
- {
- LLNotificationsUtil::add("MeshUploadError", mUploadErrorQ.front());
- mUploadErrorQ.pop();
- }
-
- S32 push_count = LLMeshRepoThread::sMaxConcurrentRequests-(LLMeshRepoThread::sActiveHeaderRequests+LLMeshRepoThread::sActiveLODRequests);
-
- if (push_count > 0)
- {
- //calculate "score" for pending requests
-
- //create score map
- std::map<LLUUID, F32> score_map;
-
- for (U32 i = 0; i < 4; ++i)
- {
- for (mesh_load_map::iterator iter = mLoadingMeshes[i].begin(); iter != mLoadingMeshes[i].end(); ++iter)
- {
- F32 max_score = 0.f;
- for (std::set<LLUUID>::iterator obj_iter = iter->second.begin(); obj_iter != iter->second.end(); ++obj_iter)
- {
- LLViewerObject* object = gObjectList.findObject(*obj_iter);
-
- if (object)
- {
- LLDrawable* drawable = object->mDrawable;
- if (drawable)
- {
- F32 cur_score = drawable->getRadius()/llmax(drawable->mDistanceWRTCamera, 1.f);
- max_score = llmax(max_score, cur_score);
- }
- }
- }
-
- score_map[iter->first.getSculptID()] = max_score;
- }
- }
-
- //set "score" for pending requests
- for (std::vector<LLMeshRepoThread::LODRequest>::iterator iter = mPendingRequests.begin(); iter != mPendingRequests.end(); ++iter)
- {
- iter->mScore = score_map[iter->mMeshParams.getSculptID()];
- }
-
- //sort by "score"
- std::sort(mPendingRequests.begin(), mPendingRequests.end(), LLMeshRepoThread::CompareScoreGreater());
-
- while (!mPendingRequests.empty() && push_count > 0)
- {
- LLFastTimer t(FTM_LOAD_MESH_LOD);
- LLMeshRepoThread::LODRequest& request = mPendingRequests.front();
- mThread->loadMeshLOD(request.mMeshParams, request.mLOD);
- mPendingRequests.erase(mPendingRequests.begin());
- push_count--;
- }
- }
-
- //send skin info requests
- while (!mPendingSkinRequests.empty())
- {
- mThread->loadMeshSkinInfo(mPendingSkinRequests.front());
- mPendingSkinRequests.pop();
- }
-
- //send decomposition requests
- while (!mPendingDecompositionRequests.empty())
- {
- mThread->loadMeshDecomposition(mPendingDecompositionRequests.front());
- mPendingDecompositionRequests.pop();
- }
-
- //send physics shapes decomposition requests
- while (!mPendingPhysicsShapeRequests.empty())
- {
- mThread->loadMeshPhysicsShape(mPendingPhysicsShapeRequests.front());
- mPendingPhysicsShapeRequests.pop();
- }
-
- mThread->notifyLoadedMeshes();
-
- mThread->mMutex->unlock();
- mMeshMutex->unlock();
-
- mThread->mSignal->signal();
-}
-
-void LLMeshRepository::notifySkinInfoReceived(LLMeshSkinInfo& info)
-{
- mSkinMap[info.mMeshID] = info;
-
- skin_load_map::iterator iter = mLoadingSkins.find(info.mMeshID);
- if (iter != mLoadingSkins.end())
- {
- for (std::set<LLUUID>::iterator obj_id = iter->second.begin(); obj_id != iter->second.end(); ++obj_id)
- {
- LLVOVolume* vobj = (LLVOVolume*) gObjectList.findObject(*obj_id);
- if (vobj)
- {
- vobj->notifyMeshLoaded();
- }
- }
- }
-
- mLoadingSkins.erase(info.mMeshID);
-}
-
-void LLMeshRepository::notifyDecompositionReceived(LLModel::Decomposition* decomp)
-{
- decomposition_map::iterator iter = mDecompositionMap.find(decomp->mMeshID);
- if (iter == mDecompositionMap.end())
- { //just insert decomp into map
- mDecompositionMap[decomp->mMeshID] = decomp;
- }
- else
- { //merge decomp with existing entry
- iter->second->merge(decomp);
- delete decomp;
- }
-
- mLoadingDecompositions.erase(decomp->mMeshID);
-}
-
-void LLMeshRepository::notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVolume* volume)
-{ //called from main thread
- S32 detail = LLVolumeLODGroup::getVolumeDetailFromScale(volume->getDetail());
-
- //get list of objects waiting to be notified this mesh is loaded
- mesh_load_map::iterator obj_iter = mLoadingMeshes[detail].find(mesh_params);
-
- if (volume && obj_iter != mLoadingMeshes[detail].end())
- {
- //make sure target volume is still valid
- if (volume->getNumVolumeFaces() <= 0)
- {
- llwarns << "Mesh loading returned empty volume." << llendl;
- volume->makeTetrahedron();
- }
-
- { //update system volume
- LLVolume* sys_volume = LLPrimitive::getVolumeManager()->refVolume(mesh_params, detail);
- if (sys_volume)
- {
- sys_volume->copyVolumeFaces(volume);
- LLPrimitive::getVolumeManager()->unrefVolume(sys_volume);
- }
- else
- {
- llwarns << "Couldn't find system volume for given mesh." << llendl;
- }
- }
-
- //notify waiting LLVOVolume instances that their requested mesh is available
- for (std::set<LLUUID>::iterator vobj_iter = obj_iter->second.begin(); vobj_iter != obj_iter->second.end(); ++vobj_iter)
- {
- LLVOVolume* vobj = (LLVOVolume*) gObjectList.findObject(*vobj_iter);
- if (vobj)
- {
- vobj->notifyMeshLoaded();
- }
- }
-
- mLoadingMeshes[detail].erase(mesh_params);
- }
-}
-
-void LLMeshRepository::notifyMeshUnavailable(const LLVolumeParams& mesh_params, S32 lod)
-{ //called from main thread
- //get list of objects waiting to be notified this mesh is loaded
- mesh_load_map::iterator obj_iter = mLoadingMeshes[lod].find(mesh_params);
-
- F32 detail = LLVolumeLODGroup::getVolumeScaleFromDetail(lod);
-
- if (obj_iter != mLoadingMeshes[lod].end())
- {
- for (std::set<LLUUID>::iterator vobj_iter = obj_iter->second.begin(); vobj_iter != obj_iter->second.end(); ++vobj_iter)
- {
- LLVOVolume* vobj = (LLVOVolume*) gObjectList.findObject(*vobj_iter);
- if (vobj)
- {
- LLVolume* obj_volume = vobj->getVolume();
-
- if (obj_volume &&
- obj_volume->getDetail() == detail &&
- obj_volume->getParams() == mesh_params)
- { //should force volume to find most appropriate LOD
- vobj->setVolume(obj_volume->getParams(), lod);
- }
- }
- }
-
- mLoadingMeshes[lod].erase(mesh_params);
- }
-}
-
-S32 LLMeshRepository::getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
-{
- return mThread->getActualMeshLOD(mesh_params, lod);
-}
-
-U32 LLMeshRepository::calcResourceCost(LLSD& header)
-{
- U32 bytes = 0;
-
- for (U32 i = 0; i < 4; i++)
- {
- bytes += header[header_lod[i]]["size"].asInteger();
- }
-
- bytes += header["skin"]["size"].asInteger();
-
- return bytes/4096 + 1;
-}
-
-U32 LLMeshRepository::getResourceCost(const LLUUID& mesh_id)
-{
- return mThread->getResourceCost(mesh_id);
-}
-
-const LLMeshSkinInfo* LLMeshRepository::getSkinInfo(const LLUUID& mesh_id, LLVOVolume* requesting_obj)
-{
- if (mesh_id.notNull())
- {
- skin_map::iterator iter = mSkinMap.find(mesh_id);
- if (iter != mSkinMap.end())
- {
- return &(iter->second);
- }
-
- //no skin info known about given mesh, try to fetch it
- {
- LLMutexLock lock(mMeshMutex);
- //add volume to list of loading meshes
- skin_load_map::iterator iter = mLoadingSkins.find(mesh_id);
- if (iter == mLoadingSkins.end())
- { //no request pending for this skin info
- mPendingSkinRequests.push(mesh_id);
- }
- mLoadingSkins[mesh_id].insert(requesting_obj->getID());
- }
- }
-
- return NULL;
-}
-
-void LLMeshRepository::fetchPhysicsShape(const LLUUID& mesh_id)
-{
- if (mesh_id.notNull())
- {
- LLModel::Decomposition* decomp = NULL;
- decomposition_map::iterator iter = mDecompositionMap.find(mesh_id);
- if (iter != mDecompositionMap.end())
- {
- decomp = iter->second;
- }
-
- //decomposition block hasn't been fetched yet
- if (!decomp || decomp->mPhysicsShapeMesh.empty())
- {
- LLMutexLock lock(mMeshMutex);
- //add volume to list of loading meshes
- std::set<LLUUID>::iterator iter = mLoadingPhysicsShapes.find(mesh_id);
- if (iter == mLoadingPhysicsShapes.end())
- { //no request pending for this skin info
- mLoadingPhysicsShapes.insert(mesh_id);
- mPendingPhysicsShapeRequests.push(mesh_id);
- }
- }
- }
-
-}
-
-LLModel::Decomposition* LLMeshRepository::getDecomposition(const LLUUID& mesh_id)
-{
- LLModel::Decomposition* ret = NULL;
-
- if (mesh_id.notNull())
- {
- decomposition_map::iterator iter = mDecompositionMap.find(mesh_id);
- if (iter != mDecompositionMap.end())
- {
- ret = iter->second;
- }
-
- //decomposition block hasn't been fetched yet
- if (!ret || ret->mBaseHullMesh.empty())
- {
- LLMutexLock lock(mMeshMutex);
- //add volume to list of loading meshes
- std::set<LLUUID>::iterator iter = mLoadingDecompositions.find(mesh_id);
- if (iter == mLoadingDecompositions.end())
- { //no request pending for this skin info
- mLoadingDecompositions.insert(mesh_id);
- mPendingDecompositionRequests.push(mesh_id);
- }
- }
- }
-
- return ret;
-}
-
-void LLMeshRepository::buildHull(const LLVolumeParams& params, S32 detail)
-{
- LLVolume* volume = LLPrimitive::sVolumeManager->refVolume(params, detail);
-
- if (!volume->mHullPoints)
- {
- //all default params
- //execute first stage
- //set simplify mode to retain
- //set retain percentage to zero
- //run second stage
- }
-
- LLPrimitive::sVolumeManager->unrefVolume(volume);
-}
-
-bool LLMeshRepository::hasPhysicsShape(const LLUUID& mesh_id)
-{
- LLSD mesh = mThread->getMeshHeader(mesh_id);
- return mesh.has("physics_shape") && mesh["physics_shape"].has("size") && (mesh["physics_shape"]["size"].asInteger() > 0);
-}
-
-LLSD& LLMeshRepository::getMeshHeader(const LLUUID& mesh_id)
-{
- return mThread->getMeshHeader(mesh_id);
-}
-
-LLSD& LLMeshRepoThread::getMeshHeader(const LLUUID& mesh_id)
-{
- static LLSD dummy_ret;
- if (mesh_id.notNull())
- {
- LLMutexLock lock(mHeaderMutex);
- mesh_header_map::iterator iter = mMeshHeader.find(mesh_id);
- if (iter != mMeshHeader.end())
- {
- return iter->second;
- }
- }
-
- return dummy_ret;
-}
-
-
-void LLMeshRepository::uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures,
- bool upload_skin, bool upload_joints)
-{
- LLMeshUploadThread* thread = new LLMeshUploadThread(data, scale, upload_textures, upload_skin, upload_joints);
- mUploadWaitList.push_back(thread);
-}
-
-S32 LLMeshRepository::getMeshSize(const LLUUID& mesh_id, S32 lod)
-{
- if (mThread)
- {
- LLMeshRepoThread::mesh_header_map::iterator iter = mThread->mMeshHeader.find(mesh_id);
- if (iter != mThread->mMeshHeader.end())
- {
- LLSD& header = iter->second;
-
- if (header.has("404"))
- {
- return -1;
- }
-
- S32 size = header[header_lod[lod]]["size"].asInteger();
- return size;
- }
-
- }
-
- return -1;
-
-}
-
-void LLMeshUploadThread::sendCostRequest(LLMeshUploadData& data)
-{
- if(isDiscarded())
- {
- return ;
- }
-
- //write model file to memory buffer
- std::stringstream ostr;
-
- LLModel::Decomposition& decomp =
- data.mModel[LLModel::LOD_PHYSICS].notNull() ?
- data.mModel[LLModel::LOD_PHYSICS]->mPhysics :
- data.mBaseModel->mPhysics;
-
- LLSD header = LLModel::writeModel(
- ostr,
- data.mModel[LLModel::LOD_PHYSICS],
- data.mModel[LLModel::LOD_HIGH],
- data.mModel[LLModel::LOD_MEDIUM],
- data.mModel[LLModel::LOD_LOW],
- data.mModel[LLModel::LOD_IMPOSTOR],
- decomp,
- mUploadSkin,
- mUploadJoints,
- true);
-
- std::string desc = data.mBaseModel->mLabel;
-
- // Grab the total vertex count of the model
- // along with other information for the "asset_resources" map
- // to send to the server.
- LLSD asset_resources = LLSD::emptyMap();
-
-
- std::string url = mNewInventoryCapability;
-
- if (!url.empty())
- {
- LLSD body = generate_new_resource_upload_capability_body(
- LLAssetType::AT_MESH,
- desc,
- desc,
- LLFolderType::FT_MESH,
- LLInventoryType::IT_MESH,
- LLFloaterPerms::getNextOwnerPerms(),
- LLFloaterPerms::getGroupPerms(),
- LLFloaterPerms::getEveryonePerms());
-
- body["asset_resources"] = asset_resources;
-
- mPendingConfirmations++;
- LLCurlRequest::headers_t headers;
-
- data.mPostData = body;
-
- mCurlRequest->post(url, headers, body, new LLMeshCostResponder(data, this));
- }
-}
-
-void LLMeshUploadThread::sendCostRequest(LLTextureUploadData& data)
-{
- if(isDiscarded())
- {
- return ;
- }
-
- if (data.mTexture && data.mTexture->getDiscardLevel() >= 0)
- {
- LLSD asset_resources = LLSD::emptyMap();
-
- std::string url = mNewInventoryCapability;
-
- if (!url.empty())
- {
- LLSD body = generate_new_resource_upload_capability_body(
- LLAssetType::AT_TEXTURE,
- data.mLabel,
- data.mLabel,
- LLFolderType::FT_TEXTURE,
- LLInventoryType::IT_TEXTURE,
- LLFloaterPerms::getNextOwnerPerms(),
- LLFloaterPerms::getGroupPerms(),
- LLFloaterPerms::getEveryonePerms());
-
- body["asset_resources"] = asset_resources;
-
- mPendingConfirmations++;
- LLCurlRequest::headers_t headers;
-
- data.mPostData = body;
- mCurlRequest->post(url, headers, body, new LLTextureCostResponder(data, this));
- }
- }
-}
-
-
-void LLMeshUploadThread::doUploadModel(LLMeshUploadData& data)
-{
- if(isDiscarded())
- {
- return ;
- }
-
- if (!data.mRSVP.empty())
- {
- std::stringstream ostr;
-
- LLModel::Decomposition& decomp =
- data.mModel[LLModel::LOD_PHYSICS].notNull() ?
- data.mModel[LLModel::LOD_PHYSICS]->mPhysics :
- data.mBaseModel->mPhysics;
-
- decomp.mBaseHull = mHullMap[data.mBaseModel];
-
- LLModel::writeModel(
- ostr,
- data.mModel[LLModel::LOD_PHYSICS],
- data.mModel[LLModel::LOD_HIGH],
- data.mModel[LLModel::LOD_MEDIUM],
- data.mModel[LLModel::LOD_LOW],
- data.mModel[LLModel::LOD_IMPOSTOR],
- decomp,
- mUploadSkin,
- mUploadJoints);
-
- data.mAssetData = ostr.str();
-
- LLCurlRequest::headers_t headers;
- mPendingUploads++;
-
- mCurlRequest->post(data.mRSVP, headers, data.mAssetData, new LLMeshUploadResponder(data, this));
- }
-}
-
-void LLMeshUploadThread::doUploadTexture(LLTextureUploadData& data)
-{
- if(isDiscarded())
- {
- return ;
- }
-
- if (!data.mRSVP.empty())
- {
- std::stringstream ostr;
-
- if (!data.mTexture->isRawImageValid())
- {
- data.mTexture->reloadRawImage(data.mTexture->getDiscardLevel());
- }
-
- LLPointer<LLImageJ2C> upload_file = LLViewerTextureList::convertToUploadFile(data.mTexture->getRawImage());
-
- ostr.write((const char*) upload_file->getData(), upload_file->getDataSize());
-
- data.mAssetData = ostr.str();
-
- LLCurlRequest::headers_t headers;
- mPendingUploads++;
-
- mCurlRequest->post(data.mRSVP, headers, data.mAssetData, new LLTextureUploadResponder(data, this));
- }
-}
-
-
-void LLMeshUploadThread::onModelUploaded(LLMeshUploadData& data)
-{
- createObjects(data);
-}
-
-void LLMeshUploadThread::onTextureUploaded(LLTextureUploadData& data)
-{
- mTextureMap[data.mTexture] = data;
-}
-
-
-void LLMeshUploadThread::createObjects(LLMeshUploadData& data)
-{
- instance_list& instances = mInstance[data.mBaseModel];
-
- for (instance_list::iterator iter = instances.begin(); iter != instances.end(); ++iter)
- { //create prims that reference given mesh
- LLModelInstance& instance = *iter;
- instance.mMeshID = data.mUUID;
- mInstanceQ.push(instance);
- }
-}
-
-void LLMeshUploadThread::decomposeMeshMatrix(LLMatrix4& transformation,
- LLVector3& result_pos,
- LLQuaternion& result_rot,
- LLVector3& result_scale)
-{
- // check for reflection
- BOOL reflected = (transformation.determinant() < 0);
-
- // compute position
- LLVector3 position = LLVector3(0, 0, 0) * transformation;
-
- // compute scale
- LLVector3 x_transformed = LLVector3(1, 0, 0) * transformation - position;
- LLVector3 y_transformed = LLVector3(0, 1, 0) * transformation - position;
- LLVector3 z_transformed = LLVector3(0, 0, 1) * transformation - position;
- F32 x_length = x_transformed.normalize();
- F32 y_length = y_transformed.normalize();
- F32 z_length = z_transformed.normalize();
- LLVector3 scale = LLVector3(x_length, y_length, z_length);
-
- // adjust for "reflected" geometry
- LLVector3 x_transformed_reflected = x_transformed;
- if (reflected)
- {
- x_transformed_reflected *= -1.0;
- }
-
- // compute rotation
- LLMatrix3 rotation_matrix;
- rotation_matrix.setRows(x_transformed_reflected, y_transformed, z_transformed);
- LLQuaternion quat_rotation = rotation_matrix.quaternion();
- quat_rotation.normalize(); // the rotation_matrix might not have been orthoginal. make it so here.
- LLVector3 euler_rotation;
- quat_rotation.getEulerAngles(&euler_rotation.mV[VX], &euler_rotation.mV[VY], &euler_rotation.mV[VZ]);
-
- result_pos = position + mOrigin;
- result_scale = scale;
- result_rot = quat_rotation;
-}
-
-
-LLSD LLMeshUploadThread::createObject(LLModelInstance& instance)
-{
- LLMatrix4 transformation = instance.mTransform;
-
- llassert(instance.mMeshID.notNull());
-
- // check for reflection
- BOOL reflected = (transformation.determinant() < 0);
-
- // compute position
- LLVector3 position = LLVector3(0, 0, 0) * transformation;
-
- // compute scale
- LLVector3 x_transformed = LLVector3(1, 0, 0) * transformation - position;
- LLVector3 y_transformed = LLVector3(0, 1, 0) * transformation - position;
- LLVector3 z_transformed = LLVector3(0, 0, 1) * transformation - position;
- F32 x_length = x_transformed.normalize();
- F32 y_length = y_transformed.normalize();
- F32 z_length = z_transformed.normalize();
- LLVector3 scale = LLVector3(x_length, y_length, z_length);
-
- // adjust for "reflected" geometry
- LLVector3 x_transformed_reflected = x_transformed;
- if (reflected)
- {
- x_transformed_reflected *= -1.0;
- }
-
- // compute rotation
- LLMatrix3 rotation_matrix;
- rotation_matrix.setRows(x_transformed_reflected, y_transformed, z_transformed);
- LLQuaternion quat_rotation = rotation_matrix.quaternion();
- quat_rotation.normalize(); // the rotation_matrix might not have been orthoginal. make it so here.
- LLVector3 euler_rotation;
- quat_rotation.getEulerAngles(&euler_rotation.mV[VX], &euler_rotation.mV[VY], &euler_rotation.mV[VZ]);
-
- //
- // build parameter block to construct this prim
- //
-
- LLSD object_params;
-
- // create prim
-
- // set volume params
- U8 sculpt_type = LL_SCULPT_TYPE_MESH;
- if (reflected)
- {
- sculpt_type |= LL_SCULPT_FLAG_MIRROR;
- }
- LLVolumeParams volume_params;
- volume_params.setType( LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE );
- volume_params.setBeginAndEndS( 0.f, 1.f );
- volume_params.setBeginAndEndT( 0.f, 1.f );
- volume_params.setRatio ( 1, 1 );
- volume_params.setShear ( 0, 0 );
- volume_params.setSculptID(instance.mMeshID, sculpt_type);
- object_params["shape"] = volume_params.asLLSD();
-
- object_params["material"] = LL_MCODE_WOOD;
-
- object_params["group-id"] = gAgent.getGroupID();
- object_params["pos"] = ll_sd_from_vector3(position + mOrigin);
- object_params["rotation"] = ll_sd_from_quaternion(quat_rotation);
- object_params["scale"] = ll_sd_from_vector3(scale);
- object_params["name"] = instance.mLabel;
-
- // load material from dae file
- object_params["facelist"] = LLSD::emptyArray();
- for (S32 i = 0; i < instance.mMaterial.size(); i++)
- {
- LLTextureEntry te;
- LLImportMaterial& mat = instance.mMaterial[i];
-
- te.setColor(mat.mDiffuseColor);
-
- LLUUID diffuse_id = mTextureMap[mat.mDiffuseMap].mUUID;
-
- if (diffuse_id.notNull())
- {
- te.setID(diffuse_id);
- }
- else
- {
- te.setID(LLUUID("5748decc-f629-461c-9a36-a35a221fe21f")); // blank texture
- }
-
- te.setFullbright(mat.mFullbright);
-
- object_params["facelist"][i] = te.asLLSD();
- }
-
- // set extra parameters
- LLSculptParams sculpt_params;
- sculpt_params.setSculptTexture(instance.mMeshID);
- sculpt_params.setSculptType(sculpt_type);
- U8 buffer[MAX_OBJECT_PARAMS_SIZE+1];
- LLDataPackerBinaryBuffer dp(buffer, MAX_OBJECT_PARAMS_SIZE);
- sculpt_params.pack(dp);
- std::vector<U8> v(dp.getCurrentSize());
- memcpy(&v[0], buffer, dp.getCurrentSize());
- LLSD extra_parameter;
- extra_parameter["extra_parameter"] = sculpt_params.mType;
- extra_parameter["param_data"] = v;
- object_params["extra_parameters"].append(extra_parameter);
-
- LLPermissions perm;
- perm.setOwnerAndGroup(gAgent.getID(), gAgent.getID(), LLUUID::null, false);
- perm.setCreator(gAgent.getID());
-
- perm.initMasks(PERM_ITEM_UNRESTRICTED | PERM_MOVE, //base
- PERM_ITEM_UNRESTRICTED | PERM_MOVE, //owner
- LLFloaterPerms::getEveryonePerms(),
- LLFloaterPerms::getGroupPerms(),
- LLFloaterPerms::getNextOwnerPerms());
-
- object_params["permissions"] = ll_create_sd_from_permissions(perm);
-
- object_params["physics_shape_type"] = (U8)(LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL);
-
- return object_params;
-}
-
-void LLMeshUploadThread::priceResult(LLMeshUploadData& data, const LLSD& content)
-{
- mPendingCost += content["upload_price"].asInteger();
- data.mRSVP = content["rsvp"].asString();
-
- mConfirmedQ.push(data);
-}
-
-void LLMeshUploadThread::priceResult(LLTextureUploadData& data, const LLSD& content)
-{
- mPendingCost += content["upload_price"].asInteger();
- data.mRSVP = content["rsvp"].asString();
-
- mConfirmedTextureQ.push(data);
-}
-
-
-bool LLImportMaterial::operator<(const LLImportMaterial &rhs) const
-{
- if (mDiffuseMap != rhs.mDiffuseMap)
- {
- return mDiffuseMap < rhs.mDiffuseMap;
- }
-
- if (mDiffuseMapFilename != rhs.mDiffuseMapFilename)
- {
- return mDiffuseMapFilename < rhs.mDiffuseMapFilename;
- }
-
- if (mDiffuseMapLabel != rhs.mDiffuseMapLabel)
- {
- return mDiffuseMapLabel < rhs.mDiffuseMapLabel;
- }
-
- if (mDiffuseColor != rhs.mDiffuseColor)
- {
- return mDiffuseColor < rhs.mDiffuseColor;
- }
-
- return mFullbright < rhs.mFullbright;
-}
-
-
-void LLMeshRepository::updateInventory(inventory_data data)
-{
- LLMutexLock lock(mMeshMutex);
- dumpLLSDToFile(data.mPostData,"update_inventory_post_data.xml");
- dumpLLSDToFile(data.mResponse,"update_inventory_response.xml");
- mInventoryQ.push(data);
-}
-
-void LLMeshRepository::uploadError(LLSD& args)
-{
- LLMutexLock lock(mMeshMutex);
- mUploadErrorQ.push(args);
-}
-
-//static
-F32 LLMeshRepository::getStreamingCost(LLSD& header, F32 radius, S32* bytes, S32* bytes_visible, S32 lod)
-{
- F32 dlowest = llmin(radius/0.03f, 256.f);
- F32 dlow = llmin(radius/0.06f, 256.f);
- F32 dmid = llmin(radius/0.24f, 256.f);
-
- F32 bytes_lowest = header["lowest_lod"]["size"].asReal()/1024.f;
- F32 bytes_low = header["low_lod"]["size"].asReal()/1024.f;
- F32 bytes_mid = header["medium_lod"]["size"].asReal()/1024.f;
- F32 bytes_high = header["high_lod"]["size"].asReal()/1024.f;
-
- if (bytes)
- {
- *bytes = 0;
- *bytes += header["lowest_lod"]["size"].asInteger();
- *bytes += header["low_lod"]["size"].asInteger();
- *bytes += header["medium_lod"]["size"].asInteger();
- *bytes += header["high_lod"]["size"].asInteger();
- }
-
-
- if (bytes_visible)
- {
- lod = LLMeshRepository::getActualMeshLOD(header, lod);
- if (lod >= 0 && lod <= 3)
- {
- *bytes_visible = header[header_lod[lod]]["size"].asInteger();
- }
- }
-
- if (bytes_high == 0.f)
- {
- return 0.f;
- }
-
- if (bytes_mid == 0.f)
- {
- bytes_mid = bytes_high;
- }
-
- if (bytes_low == 0.f)
- {
- bytes_low = bytes_mid;
- }
-
- if (bytes_lowest == 0.f)
- {
- bytes_lowest = bytes_low;
- }
-
- F32 max_area = 65536.f;
- F32 min_area = 1.f;
-
- F32 high_area = llmin(F_PI*dmid*dmid, max_area);
- F32 mid_area = llmin(F_PI*dlow*dlow, max_area);
- F32 low_area = llmin(F_PI*dlowest*dlowest, max_area);
- F32 lowest_area = max_area;
-
- lowest_area -= low_area;
- low_area -= mid_area;
- mid_area -= high_area;
-
- high_area = llclamp(high_area, min_area, max_area);
- mid_area = llclamp(mid_area, min_area, max_area);
- low_area = llclamp(low_area, min_area, max_area);
- lowest_area = llclamp(lowest_area, min_area, max_area);
-
- F32 total_area = high_area + mid_area + low_area + lowest_area;
- high_area /= total_area;
- mid_area /= total_area;
- low_area /= total_area;
- lowest_area /= total_area;
-
- F32 weighted_avg = bytes_high*high_area +
- bytes_mid*mid_area +
- bytes_low*low_area +
- bytes_lowest*lowest_area;
-
- return weighted_avg * gSavedSettings.getF32("MeshStreamingCostScaler");
-}
-
-
-LLPhysicsDecomp::LLPhysicsDecomp()
-: LLThread("Physics Decomp")
-{
- mInited = false;
- mQuitting = false;
- mDone = false;
-
- mSignal = new LLCondition(NULL);
- mMutex = new LLMutex(NULL);
-}
-
-LLPhysicsDecomp::~LLPhysicsDecomp()
-{
- shutdown();
-
- delete mSignal;
- mSignal = NULL;
- delete mMutex;
- mMutex = NULL;
-}
-
-void LLPhysicsDecomp::shutdown()
-{
- if (mSignal)
- {
- mQuitting = true;
- mSignal->signal();
-
- while (!isStopped())
- {
- apr_sleep(10);
- }
- }
-}
-
-void LLPhysicsDecomp::submitRequest(LLPhysicsDecomp::Request* request)
-{
- LLMutexLock lock(mMutex);
- mRequestQ.push(request);
- mSignal->signal();
-}
-
-//static
-S32 LLPhysicsDecomp::llcdCallback(const char* status, S32 p1, S32 p2)
-{
- if (gMeshRepo.mDecompThread && gMeshRepo.mDecompThread->mCurRequest.notNull())
- {
- return gMeshRepo.mDecompThread->mCurRequest->statusCallback(status, p1, p2);
- }
-
- return 1;
-}
-
-void LLPhysicsDecomp::setMeshData(LLCDMeshData& mesh)
-{
- mesh.mVertexBase = mCurRequest->mPositions[0].mV;
- mesh.mVertexStrideBytes = 12;
- mesh.mNumVertices = mCurRequest->mPositions.size();
-
- mesh.mIndexType = LLCDMeshData::INT_16;
- mesh.mIndexBase = &(mCurRequest->mIndices[0]);
- mesh.mIndexStrideBytes = 6;
-
- mesh.mNumTriangles = mCurRequest->mIndices.size()/3;
-
- LLCDResult ret = LLCD_OK;
- if (LLConvexDecomposition::getInstance() != NULL)
- {
- ret = LLConvexDecomposition::getInstance()->setMeshData(&mesh);
- }
-
- if (ret)
- {
- llerrs << "Convex Decomposition thread valid but could not set mesh data" << llendl;
- }
-}
-
-void LLPhysicsDecomp::doDecomposition()
-{
- LLCDMeshData mesh;
- S32 stage = mStageID[mCurRequest->mStage];
-
- if (LLConvexDecomposition::getInstance() == NULL)
- {
- // stub library. do nothing.
- return;
- }
-
- //load data intoLLCD
- if (stage == 0)
- {
- setMeshData(mesh);
- }
-
- //build parameter map
- std::map<std::string, const LLCDParam*> param_map;
-
- static const LLCDParam* params = NULL;
- static S32 param_count = 0;
- if (!params)
- {
- param_count = LLConvexDecomposition::getInstance()->getParameters(&params);
- }
-
- for (S32 i = 0; i < param_count; ++i)
- {
- param_map[params[i].mName] = params+i;
- }
-
- //set parameter values
- for (decomp_params::iterator iter = mCurRequest->mParams.begin(); iter != mCurRequest->mParams.end(); ++iter)
- {
- const std::string& name = iter->first;
- const LLSD& value = iter->second;
-
- const LLCDParam* param = param_map[name];
-
- if (param == NULL)
- { //couldn't find valid parameter
- continue;
- }
-
- U32 ret = LLCD_OK;
-
- if (param->mType == LLCDParam::LLCD_FLOAT)
- {
- ret = LLConvexDecomposition::getInstance()->setParam(param->mName, (F32) value.asReal());
- }
- else if (param->mType == LLCDParam::LLCD_INTEGER ||
- param->mType == LLCDParam::LLCD_ENUM)
- {
- ret = LLConvexDecomposition::getInstance()->setParam(param->mName, value.asInteger());
- }
- else if (param->mType == LLCDParam::LLCD_BOOLEAN)
- {
- ret = LLConvexDecomposition::getInstance()->setParam(param->mName, value.asBoolean());
- }
- }
-
- mCurRequest->setStatusMessage("Executing.");
-
- LLCDResult ret = LLCD_OK;
-
- if (LLConvexDecomposition::getInstance() != NULL)
- {
- ret = LLConvexDecomposition::getInstance()->executeStage(stage);
- }
-
- if (ret)
- {
- llwarns << "Convex Decomposition thread valid but could not execute stage " << stage << llendl;
- LLMutexLock lock(mMutex);
-
- mCurRequest->mHull.clear();
- mCurRequest->mHullMesh.clear();
-
- mCurRequest->setStatusMessage("FAIL");
-
- completeCurrent();
- }
- else
- {
- mCurRequest->setStatusMessage("Reading results");
-
- S32 num_hulls =0;
- if (LLConvexDecomposition::getInstance() != NULL)
- {
- num_hulls = LLConvexDecomposition::getInstance()->getNumHullsFromStage(stage);
- }
-
- mMutex->lock();
- mCurRequest->mHull.clear();
- mCurRequest->mHull.resize(num_hulls);
-
- mCurRequest->mHullMesh.clear();
- mCurRequest->mHullMesh.resize(num_hulls);
- mMutex->unlock();
-
- for (S32 i = 0; i < num_hulls; ++i)
- {
- std::vector<LLVector3> p;
- LLCDHull hull;
- // if LLConvexDecomposition is a stub, num_hulls should have been set to 0 above, and we should not reach this code
- LLConvexDecomposition::getInstance()->getHullFromStage(stage, i, &hull);
-
- const F32* v = hull.mVertexBase;
-
- for (S32 j = 0; j < hull.mNumVertices; ++j)
- {
- LLVector3 vert(v[0], v[1], v[2]);
- p.push_back(vert);
- v = (F32*) (((U8*) v) + hull.mVertexStrideBytes);
- }
-
- LLCDMeshData mesh;
- // if LLConvexDecomposition is a stub, num_hulls should have been set to 0 above, and we should not reach this code
- LLConvexDecomposition::getInstance()->getMeshFromStage(stage, i, &mesh);
-
- get_vertex_buffer_from_mesh(mesh, mCurRequest->mHullMesh[i]);
-
- mMutex->lock();
- mCurRequest->mHull[i] = p;
- mMutex->unlock();
- }
-
- {
- LLMutexLock lock(mMutex);
-
- mCurRequest->setStatusMessage("FAIL");
- completeCurrent();
- }
- }
-}
-
-void LLPhysicsDecomp::completeCurrent()
-{
- LLMutexLock lock(mMutex);
- mCompletedQ.push(mCurRequest);
- mCurRequest = NULL;
-}
-
-void LLPhysicsDecomp::notifyCompleted()
-{
- if (!mCompletedQ.empty())
- {
- LLMutexLock lock(mMutex);
- while (!mCompletedQ.empty())
- {
- Request* req = mCompletedQ.front();
- req->completed();
- mCompletedQ.pop();
- }
- }
-}
-
-
-void make_box(LLPhysicsDecomp::Request * request)
-{
- LLVector3 min,max;
- min = request->mPositions[0];
- max = min;
-
- for (U32 i = 0; i < request->mPositions.size(); ++i)
- {
- update_min_max(min, max, request->mPositions[i]);
- }
-
- request->mHull.clear();
-
- LLModel::hull box;
- box.push_back(LLVector3(min[0],min[1],min[2]));
- box.push_back(LLVector3(max[0],min[1],min[2]));
- box.push_back(LLVector3(min[0],max[1],min[2]));
- box.push_back(LLVector3(max[0],max[1],min[2]));
- box.push_back(LLVector3(min[0],min[1],max[2]));
- box.push_back(LLVector3(max[0],min[1],max[2]));
- box.push_back(LLVector3(min[0],max[1],max[2]));
- box.push_back(LLVector3(max[0],max[1],max[2]));
-
- request->mHull.push_back(box);
-}
-
-
-void LLPhysicsDecomp::doDecompositionSingleHull()
-{
- LLCDMeshData mesh;
-
- setMeshData(mesh);
-
-
- //set all parameters to default
- std::map<std::string, const LLCDParam*> param_map;
-
- static const LLCDParam* params = NULL;
- static S32 param_count = 0;
-
- if (!params)
- {
- param_count = LLConvexDecomposition::getInstance()->getParameters(&params);
- }
-
- LLConvexDecomposition* decomp = LLConvexDecomposition::getInstance();
-
- if (decomp == NULL)
- {
- //stub. do nothing.
- return;
- }
-
- for (S32 i = 0; i < param_count; ++i)
- {
- decomp->setParam(params[i].mName, params[i].mDefault.mIntOrEnumValue);
- }
-
- const S32 STAGE_DECOMPOSE = mStageID["Decompose"];
- const S32 STAGE_SIMPLIFY = mStageID["Simplify"];
- const S32 DECOMP_PREVIEW = 0;
- const S32 SIMPLIFY_RETAIN = 0;
-
- decomp->setParam("Decompose Quality", DECOMP_PREVIEW);
- decomp->setParam("Simplify Method", SIMPLIFY_RETAIN);
- decomp->setParam("Retain%", 0.f);
-
- LLCDResult ret = LLCD_OK;
- ret = decomp->executeStage(STAGE_DECOMPOSE);
-
- if (ret)
- {
- llwarns << "Could not execute decomposition stage when attempting to create single hull." << llendl;
- make_box(mCurRequest);
- }
- else
- {
- ret = decomp->executeStage(STAGE_SIMPLIFY);
-
- if (ret)
- {
- llwarns << "Could not execute simiplification stage when attempting to create single hull." << llendl;
- make_box(mCurRequest);
- }
- else
- {
- S32 num_hulls =0;
- if (LLConvexDecomposition::getInstance() != NULL)
- {
- num_hulls = LLConvexDecomposition::getInstance()->getNumHullsFromStage(STAGE_SIMPLIFY);
- }
-
- mMutex->lock();
- mCurRequest->mHull.clear();
- mCurRequest->mHull.resize(num_hulls);
- mCurRequest->mHullMesh.clear();
- mMutex->unlock();
-
- for (S32 i = 0; i < num_hulls; ++i)
- {
- std::vector<LLVector3> p;
- LLCDHull hull;
- // if LLConvexDecomposition is a stub, num_hulls should have been set to 0 above, and we should not reach this code
- LLConvexDecomposition::getInstance()->getHullFromStage(STAGE_SIMPLIFY, i, &hull);
-
- const F32* v = hull.mVertexBase;
-
- for (S32 j = 0; j < hull.mNumVertices; ++j)
- {
- LLVector3 vert(v[0], v[1], v[2]);
- p.push_back(vert);
- v = (F32*) (((U8*) v) + hull.mVertexStrideBytes);
- }
-
- mMutex->lock();
- mCurRequest->mHull[i] = p;
- mMutex->unlock();
- }
- }
- }
-
-
- {
- completeCurrent();
-
- }
-}
-
-
-void LLPhysicsDecomp::run()
-{
- LLConvexDecomposition* decomp = LLConvexDecomposition::getInstance();
- if (decomp == NULL)
- {
- // stub library. Set init to true so the main thread
- // doesn't wait for this to finish.
- mInited = true;
- return;
- }
-
- decomp->initThread();
- mInited = true;
-
- static const LLCDStageData* stages = NULL;
- static S32 num_stages = 0;
-
- if (!stages)
- {
- num_stages = decomp->getStages(&stages);
- }
-
- for (S32 i = 0; i < num_stages; i++)
- {
- mStageID[stages[i].mName] = i;
- }
-
- while (!mQuitting)
- {
- mSignal->wait();
- while (!mQuitting && !mRequestQ.empty())
- {
- {
- LLMutexLock lock(mMutex);
- mCurRequest = mRequestQ.front();
- mRequestQ.pop();
- }
-
- S32& id = *(mCurRequest->mDecompID);
- if (id == -1)
- {
- decomp->genDecomposition(id);
- }
- decomp->bindDecomposition(id);
-
- if (mCurRequest->mStage == "single_hull")
- {
- doDecompositionSingleHull();
- }
- else
- {
- doDecomposition();
- }
- }
- }
-
- decomp->quitThread();
-
- if (mSignal->isLocked())
- { //let go of mSignal's associated mutex
- mSignal->unlock();
- }
-
- mDone = true;
-}
-
-void LLPhysicsDecomp::Request::updateTriangleAreaThreshold()
-{
- F32 range = mBBox[1].mV[0] - mBBox[0].mV[0] ;
- range = llmin(range, mBBox[1].mV[1] - mBBox[0].mV[1]) ;
- range = llmin(range, mBBox[1].mV[2] - mBBox[0].mV[2]) ;
-
- mTriangleAreaThreshold = llmin(0.0002f, range * 0.000002f) ;
-}
-
-//check if the triangle area is large enough to qualify for a valid triangle
-bool LLPhysicsDecomp::Request::isValidTriangle(U16 idx1, U16 idx2, U16 idx3)
-{
- LLVector3 a = mPositions[idx2] - mPositions[idx1] ;
- LLVector3 b = mPositions[idx3] - mPositions[idx1] ;
- F32 c = a * b ;
-
- return ((a*a) * (b*b) - c * c) > mTriangleAreaThreshold ;
-}
-
-void LLPhysicsDecomp::Request::setStatusMessage(const std::string& msg)
-{
- mStatusMessage = msg;
-}
-
-LLModelInstance::LLModelInstance(LLSD& data)
-{
- mLocalMeshID = data["mesh_id"].asInteger();
- mLabel = data["label"].asString();
- mTransform.setValue(data["transform"]);
-
- for (U32 i = 0; i < data["material"].size(); ++i)
- {
- mMaterial.push_back(LLImportMaterial(data["material"][i]));
- }
-}
-
-
-LLSD LLModelInstance::asLLSD()
-{
- LLSD ret;
-
- ret["mesh_id"] = mModel->mLocalID;
- ret["label"] = mLabel;
- ret["transform"] = mTransform.getValue();
-
- for (U32 i = 0; i < mMaterial.size(); ++i)
- {
- ret["material"][i] = mMaterial[i].asLLSD();
- }
-
- return ret;
-}
-
-LLImportMaterial::LLImportMaterial(LLSD& data)
-{
- mDiffuseMapFilename = data["diffuse"]["filename"].asString();
- mDiffuseMapLabel = data["diffuse"]["label"].asString();
- mDiffuseColor.setValue(data["diffuse"]["color"]);
- mFullbright = data["fullbright"].asBoolean();
-}
-
-
-LLSD LLImportMaterial::asLLSD()
-{
- LLSD ret;
-
- ret["diffuse"]["filename"] = mDiffuseMapFilename;
- ret["diffuse"]["label"] = mDiffuseMapLabel;
- ret["diffuse"]["color"] = mDiffuseColor.getValue();
- ret["fullbright"] = mFullbright;
-
- return ret;
-}
-
-void LLMeshRepository::buildPhysicsMesh(LLModel::Decomposition& decomp)
-{
- decomp.mMesh.resize(decomp.mHull.size());
-
- for (U32 i = 0; i < decomp.mHull.size(); ++i)
- {
- LLCDHull hull;
- hull.mNumVertices = decomp.mHull[i].size();
- hull.mVertexBase = decomp.mHull[i][0].mV;
- hull.mVertexStrideBytes = 12;
-
- LLCDMeshData mesh;
- LLCDResult res = LLCD_OK;
- if (LLConvexDecomposition::getInstance() != NULL)
- {
- res = LLConvexDecomposition::getInstance()->getMeshFromHull(&hull, &mesh);
- }
- if (res == LLCD_OK)
- {
- get_vertex_buffer_from_mesh(mesh, decomp.mMesh[i]);
- }
- }
-
- if (!decomp.mBaseHull.empty() && decomp.mBaseHullMesh.empty())
- { //get mesh for base hull
- LLCDHull hull;
- hull.mNumVertices = decomp.mBaseHull.size();
- hull.mVertexBase = decomp.mBaseHull[0].mV;
- hull.mVertexStrideBytes = 12;
-
- LLCDMeshData mesh;
- LLCDResult res = LLCD_OK;
- if (LLConvexDecomposition::getInstance() != NULL)
- {
- res = LLConvexDecomposition::getInstance()->getMeshFromHull(&hull, &mesh);
- }
- if (res == LLCD_OK)
- {
- get_vertex_buffer_from_mesh(mesh, decomp.mBaseHullMesh);
- }
- }
-}
+/**
+ * @file llmeshrepository.cpp
+ * @brief Mesh repository implementation.
+ *
+ * $LicenseInfo:firstyear=2005&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "apr_pools.h"
+#include "apr_dso.h"
+#include "llhttpstatuscodes.h"
+#include "llmeshrepository.h"
+
+#include "llagent.h"
+#include "llappviewer.h"
+#include "llbufferstream.h"
+#include "llcurl.h"
+#include "lldatapacker.h"
+#include "llfasttimer.h"
+#include "llfloatermodelpreview.h"
+#include "llfloaterperms.h"
+#include "lleconomy.h"
+#include "llimagej2c.h"
+#include "llhost.h"
+#include "llnotificationsutil.h"
+#include "llsd.h"
+#include "llsdutil_math.h"
+#include "llsdserialize.h"
+#include "llthread.h"
+#include "llvfile.h"
+#include "llviewercontrol.h"
+#include "llviewermenufile.h"
+#include "llviewerobjectlist.h"
+#include "llviewerregion.h"
+#include "llviewertexturelist.h"
+#include "llvolume.h"
+#include "llvolumemgr.h"
+#include "llvovolume.h"
+#include "llworld.h"
+#include "material_codes.h"
+#include "pipeline.h"
+#include "llinventorymodel.h"
+#include "llfoldertype.h"
+
+#ifndef LL_WINDOWS
+#include "netdb.h"
+#endif
+
+#include <queue>
+
+LLFastTimer::DeclareTimer FTM_MESH_UPDATE("Mesh Update");
+LLFastTimer::DeclareTimer FTM_LOAD_MESH("Load Mesh");
+
+LLMeshRepository gMeshRepo;
+
+const U32 MAX_MESH_REQUESTS_PER_SECOND = 100;
+
+U32 LLMeshRepository::sBytesReceived = 0;
+U32 LLMeshRepository::sHTTPRequestCount = 0;
+U32 LLMeshRepository::sHTTPRetryCount = 0;
+U32 LLMeshRepository::sCacheBytesRead = 0;
+U32 LLMeshRepository::sCacheBytesWritten = 0;
+U32 LLMeshRepository::sPeakKbps = 0;
+
+
+const U32 MAX_TEXTURE_UPLOAD_RETRIES = 5;
+
+void dumpLLSDToFile(const LLSD& content, std::string filename);
+
+std::string header_lod[] =
+{
+ "lowest_lod",
+ "low_lod",
+ "medium_lod",
+ "high_lod"
+};
+
+
+//get the number of bytes resident in memory for given volume
+U32 get_volume_memory_size(const LLVolume* volume)
+{
+ U32 indices = 0;
+ U32 vertices = 0;
+
+ for (U32 i = 0; i < volume->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = volume->getVolumeFace(i);
+ indices += face.mNumIndices;
+ vertices += face.mNumVertices;
+ }
+
+
+ return indices*2+vertices*11+sizeof(LLVolume)+sizeof(LLVolumeFace)*volume->getNumVolumeFaces();
+}
+
+void get_vertex_buffer_from_mesh(LLCDMeshData& mesh, LLModel::PhysicsMesh& res, F32 scale = 1.f)
+{
+ res.mPositions.clear();
+ res.mNormals.clear();
+
+ const F32* v = mesh.mVertexBase;
+
+ if (mesh.mIndexType == LLCDMeshData::INT_16)
+ {
+ U16* idx = (U16*) mesh.mIndexBase;
+ for (S32 j = 0; j < mesh.mNumTriangles; ++j)
+ {
+ F32* mp0 = (F32*) ((U8*)v+idx[0]*mesh.mVertexStrideBytes);
+ F32* mp1 = (F32*) ((U8*)v+idx[1]*mesh.mVertexStrideBytes);
+ F32* mp2 = (F32*) ((U8*)v+idx[2]*mesh.mVertexStrideBytes);
+
+ idx = (U16*) (((U8*)idx)+mesh.mIndexStrideBytes);
+
+ LLVector3 v0(mp0);
+ LLVector3 v1(mp1);
+ LLVector3 v2(mp2);
+
+ LLVector3 n = (v1-v0)%(v2-v0);
+ n.normalize();
+
+ res.mPositions.push_back(v0*scale);
+ res.mPositions.push_back(v1*scale);
+ res.mPositions.push_back(v2*scale);
+
+ res.mNormals.push_back(n);
+ res.mNormals.push_back(n);
+ res.mNormals.push_back(n);
+ }
+ }
+ else
+ {
+ U32* idx = (U32*) mesh.mIndexBase;
+ for (S32 j = 0; j < mesh.mNumTriangles; ++j)
+ {
+ F32* mp0 = (F32*) ((U8*)v+idx[0]*mesh.mVertexStrideBytes);
+ F32* mp1 = (F32*) ((U8*)v+idx[1]*mesh.mVertexStrideBytes);
+ F32* mp2 = (F32*) ((U8*)v+idx[2]*mesh.mVertexStrideBytes);
+
+ idx = (U32*) (((U8*)idx)+mesh.mIndexStrideBytes);
+
+ LLVector3 v0(mp0);
+ LLVector3 v1(mp1);
+ LLVector3 v2(mp2);
+
+ LLVector3 n = (v1-v0)%(v2-v0);
+ n.normalize();
+
+ res.mPositions.push_back(v0*scale);
+ res.mPositions.push_back(v1*scale);
+ res.mPositions.push_back(v2*scale);
+
+ res.mNormals.push_back(n);
+ res.mNormals.push_back(n);
+ res.mNormals.push_back(n);
+ }
+ }
+}
+
+S32 LLMeshRepoThread::sActiveHeaderRequests = 0;
+S32 LLMeshRepoThread::sActiveLODRequests = 0;
+U32 LLMeshRepoThread::sMaxConcurrentRequests = 1;
+
+
+class LLTextureCostResponder : public LLCurl::Responder
+{
+public:
+ LLTextureUploadData mData;
+ LLMeshUploadThread* mThread;
+
+ LLTextureCostResponder(LLTextureUploadData data, LLMeshUploadThread* thread)
+ : mData(data), mThread(thread)
+ {
+
+ }
+
+ virtual void completed(U32 status, const std::string& reason, const LLSD& content)
+ {
+ mThread->mPendingConfirmations--;
+ if (isGoodStatus(status))
+ {
+ mThread->priceResult(mData, content);
+ }
+ else
+ {
+ llwarns << status << ": " << reason << llendl;
+
+ if (mData.mRetries < MAX_TEXTURE_UPLOAD_RETRIES)
+ {
+ llwarns << "Retrying. (" << ++mData.mRetries << ")" << llendl;
+
+ if (status == 499 || status == 500)
+ {
+ mThread->uploadTexture(mData);
+ }
+ else
+ {
+ llerrs << "Unhandled status " << status << llendl;
+ }
+ }
+ else
+ {
+ llwarns << "Giving up after " << mData.mRetries << " retries." << llendl;
+ }
+ }
+ }
+};
+
+class LLTextureUploadResponder : public LLCurl::Responder
+{
+public:
+ LLTextureUploadData mData;
+ LLMeshUploadThread* mThread;
+
+ LLTextureUploadResponder(LLTextureUploadData data, LLMeshUploadThread* thread)
+ : mData(data), mThread(thread)
+ {
+ }
+
+ virtual void completed(U32 status, const std::string& reason, const LLSD& content)
+ {
+ mThread->mPendingUploads--;
+ if (isGoodStatus(status))
+ {
+ mData.mUUID = content["new_asset"].asUUID();
+ gMeshRepo.updateInventory(LLMeshRepository::inventory_data(mData.mPostData, content));
+ mThread->onTextureUploaded(mData);
+ }
+ else
+ {
+ llwarns << status << ": " << reason << llendl;
+ llwarns << "Retrying. (" << ++mData.mRetries << ")" << llendl;
+
+ if (status == 404)
+ {
+ mThread->uploadTexture(mData);
+ }
+ else if (status == 499)
+ {
+ mThread->mConfirmedTextureQ.push(mData);
+ }
+ else
+ {
+ llerrs << "Unhandled status " << status << llendl;
+ }
+ }
+ }
+};
+
+class LLMeshCostResponder : public LLCurl::Responder
+{
+public:
+ LLMeshUploadData mData;
+ LLMeshUploadThread* mThread;
+
+ LLMeshCostResponder(LLMeshUploadData data, LLMeshUploadThread* thread)
+ : mData(data), mThread(thread)
+ {
+
+ }
+
+ virtual void completed(U32 status, const std::string& reason, const LLSD& content)
+ {
+ mThread->mPendingConfirmations--;
+
+ if (isGoodStatus(status))
+ {
+ mThread->priceResult(mData, content);
+ }
+ else
+ {
+ llwarns << status << ": " << reason << llendl;
+
+ if (status == HTTP_INTERNAL_ERROR)
+ {
+ llwarns << "Retrying. (" << ++mData.mRetries << ")" << llendl;
+ mThread->uploadModel(mData);
+ }
+ else if (status == HTTP_BAD_REQUEST)
+ {
+ llwarns << "Status 400 received from server, giving up." << llendl;
+ }
+ else if (status == HTTP_NOT_FOUND)
+ {
+ llwarns <<"Status 404 received, server is disconnected, giving up." << llendl ;
+ }
+ else
+ {
+ llerrs << "Unhandled status " << status << llendl;
+ }
+ }
+ }
+};
+
+class LLMeshUploadResponder : public LLCurl::Responder
+{
+public:
+ LLMeshUploadData mData;
+ LLMeshUploadThread* mThread;
+
+ LLMeshUploadResponder(LLMeshUploadData data, LLMeshUploadThread* thread)
+ : mData(data), mThread(thread)
+ {
+ }
+
+ virtual void completed(U32 status, const std::string& reason, const LLSD& content)
+ {
+ mThread->mPendingUploads--;
+ if (isGoodStatus(status))
+ {
+ mData.mUUID = content["new_asset"].asUUID();
+ if (mData.mUUID.isNull())
+ {
+ LLSD args;
+ std::string message = content["error"]["message"];
+ std::string identifier = content["error"]["identifier"];
+ std::string invalidity_identifier = content["error"]["invalidity_identifier"];
+
+ args["MESSAGE"] = message;
+ args["IDENTIFIER"] = identifier;
+ args["INVALIDITY_IDENTIFIER"] = invalidity_identifier;
+ args["LABEL"] = mData.mBaseModel->mLabel;
+
+ gMeshRepo.uploadError(args);
+ }
+ else
+ {
+ gMeshRepo.updateInventory(LLMeshRepository::inventory_data(mData.mPostData, content));
+ mThread->onModelUploaded(mData);
+ }
+ }
+ else
+ {
+ llwarns << status << ": " << reason << llendl;
+ llwarns << "Retrying. (" << ++mData.mRetries << ")" << llendl;
+
+ if (status == 404)
+ {
+ mThread->uploadModel(mData);
+ }
+ else if (status == 499)
+ {
+ mThread->mConfirmedQ.push(mData);
+ }
+ else if (status != 500)
+ { //drop internal server errors on the floor, otherwise grab
+ llerrs << "Unhandled status " << status << llendl;
+ }
+ }
+ }
+};
+
+
+class LLMeshHeaderResponder : public LLCurl::Responder
+{
+public:
+ LLVolumeParams mMeshParams;
+
+ LLMeshHeaderResponder(const LLVolumeParams& mesh_params)
+ : mMeshParams(mesh_params)
+ {
+ }
+
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+
+};
+
+class LLMeshLODResponder : public LLCurl::Responder
+{
+public:
+ LLVolumeParams mMeshParams;
+ S32 mLOD;
+ U32 mRequestedBytes;
+ U32 mOffset;
+
+ LLMeshLODResponder(const LLVolumeParams& mesh_params, S32 lod, U32 offset, U32 requested_bytes)
+ : mMeshParams(mesh_params), mLOD(lod), mOffset(offset), mRequestedBytes(requested_bytes)
+ {
+ }
+
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+
+};
+
+class LLMeshSkinInfoResponder : public LLCurl::Responder
+{
+public:
+ LLUUID mMeshID;
+ U32 mRequestedBytes;
+ U32 mOffset;
+
+ LLMeshSkinInfoResponder(const LLUUID& id, U32 offset, U32 size)
+ : mMeshID(id), mRequestedBytes(size), mOffset(offset)
+ {
+ }
+
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+
+};
+
+class LLMeshDecompositionResponder : public LLCurl::Responder
+{
+public:
+ LLUUID mMeshID;
+ U32 mRequestedBytes;
+ U32 mOffset;
+
+ LLMeshDecompositionResponder(const LLUUID& id, U32 offset, U32 size)
+ : mMeshID(id), mRequestedBytes(size), mOffset(offset)
+ {
+ }
+
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+
+};
+
+class LLMeshPhysicsShapeResponder : public LLCurl::Responder
+{
+public:
+ LLUUID mMeshID;
+ U32 mRequestedBytes;
+ U32 mOffset;
+
+ LLMeshPhysicsShapeResponder(const LLUUID& id, U32 offset, U32 size)
+ : mMeshID(id), mRequestedBytes(size), mOffset(offset)
+ {
+ }
+
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer);
+
+};
+
+class LLModelObjectUploadResponder: public LLCurl::Responder
+{
+ LLSD mObjectAsset;
+ LLMeshUploadThread* mThread;
+
+public:
+ LLModelObjectUploadResponder(LLMeshUploadThread* thread, const LLSD& object_asset):
+ mThread(thread),
+ mObjectAsset(object_asset)
+ {
+ }
+
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+ {
+ assert_main_thread();
+
+ llinfos << "completed" << llendl;
+ mThread->mPendingUploads--;
+ mThread->mFinished = true;
+ }
+};
+
+class LLWholeModelFeeResponder: public LLCurl::Responder
+{
+ LLMeshUploadThread* mThread;
+public:
+ LLWholeModelFeeResponder(LLMeshUploadThread* thread):
+ mThread(thread)
+ {
+ }
+ virtual void completed(U32 status,
+ const std::string& reason,
+ const LLSD& content)
+ {
+ //assert_main_thread();
+ llinfos << "completed" << llendl;
+ mThread->mPendingUploads--;
+ dumpLLSDToFile(content,"whole_model_fee_response.xml");
+ if (isGoodStatus(status))
+ {
+ mThread->mWholeModelUploadURL = content["uploader"].asString();
+ }
+ else
+ {
+ llinfos << "upload failed" << llendl;
+ mThread->mWholeModelUploadURL = "";
+ }
+
+ }
+};
+
+class LLWholeModelUploadResponder: public LLCurl::Responder
+{
+ LLMeshUploadThread* mThread;
+ LLSD mPostData;
+
+public:
+ LLWholeModelUploadResponder(LLMeshUploadThread* thread, LLSD& post_data):
+ mThread(thread),
+ mPostData(post_data)
+ {
+ }
+ virtual void completed(U32 status,
+ const std::string& reason,
+ const LLSD& content)
+ {
+ //assert_main_thread();
+ llinfos << "upload completed" << llendl;
+ mThread->mPendingUploads--;
+ dumpLLSDToFile(content,"whole_model_upload_response.xml");
+ // requested "mesh" asset type isn't actually the type
+ // of the resultant object, fix it up here.
+ mPostData["asset_type"] = "object";
+ gMeshRepo.updateInventory(LLMeshRepository::inventory_data(mPostData,content));
+ }
+};
+
+LLMeshRepoThread::LLMeshRepoThread()
+: LLThread("mesh repo", NULL)
+{
+ mWaiting = false;
+ mMutex = new LLMutex(NULL);
+ mHeaderMutex = new LLMutex(NULL);
+ mSignal = new LLCondition(NULL);
+}
+
+LLMeshRepoThread::~LLMeshRepoThread()
+{
+ delete mMutex;
+ mMutex = NULL;
+ delete mHeaderMutex;
+ mHeaderMutex = NULL;
+ delete mSignal;
+ mSignal = NULL;
+}
+
+void LLMeshRepoThread::run()
+{
+ mCurlRequest = new LLCurlRequest();
+ LLCDResult res = LLConvexDecomposition::initThread();
+ if (res != LLCD_OK)
+ {
+ llwarns << "convex decomposition unable to be loaded" << llendl;
+ }
+
+ while (!LLApp::isQuitting())
+ {
+ mWaiting = true;
+ mSignal->wait();
+ mWaiting = false;
+
+ if (!LLApp::isQuitting())
+ {
+ static U32 count = 0;
+
+ static F32 last_hundred = gFrameTimeSeconds;
+
+ if (gFrameTimeSeconds - last_hundred > 1.f)
+ { //a second has gone by, clear count
+ last_hundred = gFrameTimeSeconds;
+ count = 0;
+ }
+
+ // NOTE: throttling intentionally favors LOD requests over header requests
+
+ while (!mLODReqQ.empty() && count < MAX_MESH_REQUESTS_PER_SECOND && sActiveLODRequests < sMaxConcurrentRequests)
+ {
+ {
+ mMutex->lock();
+ LODRequest req = mLODReqQ.front();
+ mLODReqQ.pop();
+ mMutex->unlock();
+ if (fetchMeshLOD(req.mMeshParams, req.mLOD))
+ {
+ count++;
+ }
+ }
+ }
+
+ while (!mHeaderReqQ.empty() && count < MAX_MESH_REQUESTS_PER_SECOND && sActiveHeaderRequests < sMaxConcurrentRequests)
+ {
+ {
+ mMutex->lock();
+ HeaderRequest req = mHeaderReqQ.front();
+ mHeaderReqQ.pop();
+ mMutex->unlock();
+ if (fetchMeshHeader(req.mMeshParams))
+ {
+ count++;
+ }
+ }
+ }
+
+ { //mSkinRequests is protected by mSignal
+ std::set<LLUUID> incomplete;
+ for (std::set<LLUUID>::iterator iter = mSkinRequests.begin(); iter != mSkinRequests.end(); ++iter)
+ {
+ LLUUID mesh_id = *iter;
+ if (!fetchMeshSkinInfo(mesh_id))
+ {
+ incomplete.insert(mesh_id);
+ }
+ }
+ mSkinRequests = incomplete;
+ }
+
+ { //mDecompositionRequests is protected by mSignal
+ std::set<LLUUID> incomplete;
+ for (std::set<LLUUID>::iterator iter = mDecompositionRequests.begin(); iter != mDecompositionRequests.end(); ++iter)
+ {
+ LLUUID mesh_id = *iter;
+ if (!fetchMeshDecomposition(mesh_id))
+ {
+ incomplete.insert(mesh_id);
+ }
+ }
+ mDecompositionRequests = incomplete;
+ }
+
+ { //mPhysicsShapeRequests is protected by mSignal
+ std::set<LLUUID> incomplete;
+ for (std::set<LLUUID>::iterator iter = mPhysicsShapeRequests.begin(); iter != mPhysicsShapeRequests.end(); ++iter)
+ {
+ LLUUID mesh_id = *iter;
+ if (!fetchMeshPhysicsShape(mesh_id))
+ {
+ incomplete.insert(mesh_id);
+ }
+ }
+ mPhysicsShapeRequests = incomplete;
+ }
+
+ mCurlRequest->process();
+ }
+ }
+
+ if (mSignal->isLocked())
+ { //make sure to let go of the mutex associated with the given signal before shutting down
+ mSignal->unlock();
+ }
+
+ res = LLConvexDecomposition::quitThread();
+ if (res != LLCD_OK)
+ {
+ llwarns << "convex decomposition unable to be quit" << llendl;
+ }
+
+ delete mCurlRequest;
+ mCurlRequest = NULL;
+}
+
+void LLMeshRepoThread::loadMeshSkinInfo(const LLUUID& mesh_id)
+{ //protected by mSignal, no locking needed here
+ mSkinRequests.insert(mesh_id);
+}
+
+void LLMeshRepoThread::loadMeshDecomposition(const LLUUID& mesh_id)
+{ //protected by mSignal, no locking needed here
+ mDecompositionRequests.insert(mesh_id);
+}
+
+void LLMeshRepoThread::loadMeshPhysicsShape(const LLUUID& mesh_id)
+{ //protected by mSignal, no locking needed here
+ mPhysicsShapeRequests.insert(mesh_id);
+}
+
+
+void LLMeshRepoThread::loadMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
+{ //protected by mSignal, no locking needed here
+
+ mesh_header_map::iterator iter = mMeshHeader.find(mesh_params.getSculptID());
+ if (iter != mMeshHeader.end())
+ { //if we have the header, request LOD byte range
+ LODRequest req(mesh_params, lod);
+ {
+ LLMutexLock lock(mMutex);
+ mLODReqQ.push(req);
+ }
+ }
+ else
+ {
+ HeaderRequest req(mesh_params);
+
+ pending_lod_map::iterator pending = mPendingLOD.find(mesh_params);
+
+ if (pending != mPendingLOD.end())
+ { //append this lod request to existing header request
+ pending->second.push_back(lod);
+ llassert(pending->second.size() <= LLModel::NUM_LODS)
+ }
+ else
+ { //if no header request is pending, fetch header
+ LLMutexLock lock(mMutex);
+ mHeaderReqQ.push(req);
+ mPendingLOD[mesh_params].push_back(lod);
+ }
+ }
+}
+
+//static
+std::string LLMeshRepoThread::constructUrl(LLUUID mesh_id)
+{
+ std::string http_url;
+
+ if (gAgent.getRegion())
+ {
+ http_url = gMeshRepo.mGetMeshCapability;
+ }
+
+ if (!http_url.empty())
+ {
+ http_url += "/?mesh_id=";
+ http_url += mesh_id.asString().c_str();
+ }
+ else
+ {
+ llwarns << "Current region does not have GetMesh capability! Cannot load " << mesh_id << ".mesh" << llendl;
+ }
+
+ return http_url;
+}
+
+bool LLMeshRepoThread::fetchMeshSkinInfo(const LLUUID& mesh_id)
+{ //protected by mMutex
+ mHeaderMutex->lock();
+
+ if (mMeshHeader.find(mesh_id) == mMeshHeader.end())
+ { //we have no header info for this mesh, do nothing
+ mHeaderMutex->unlock();
+ return false;
+ }
+
+ U32 header_size = mMeshHeaderSize[mesh_id];
+
+ if (header_size > 0)
+ {
+ S32 offset = header_size + mMeshHeader[mesh_id]["skin"]["offset"].asInteger();
+ S32 size = mMeshHeader[mesh_id]["skin"]["size"].asInteger();
+
+ mHeaderMutex->unlock();
+
+ if (offset >= 0 && size > 0)
+ {
+ //check VFS for mesh skin info
+ LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesRead += size;
+ file.seek(offset);
+ U8* buffer = new U8[size];
+ file.read(buffer, size);
+
+ //make sure buffer isn't all 0's (reserved block but not written)
+ bool zero = true;
+ for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
+ {
+ zero = buffer[i] > 0 ? false : true;
+ }
+
+ if (!zero)
+ { //attempt to parse
+ if (skinInfoReceived(mesh_id, buffer, size))
+ {
+ delete[] buffer;
+ return true;
+ }
+ }
+
+ delete[] buffer;
+ }
+
+ //reading from VFS failed for whatever reason, fetch from sim
+ std::vector<std::string> headers;
+ headers.push_back("Accept: application/octet-stream");
+
+ std::string http_url = constructUrl(mesh_id);
+ if (!http_url.empty())
+ {
+ ++sActiveLODRequests;
+ LLMeshRepository::sHTTPRequestCount++;
+ mCurlRequest->getByteRange(constructUrl(mesh_id), headers, offset, size,
+ new LLMeshSkinInfoResponder(mesh_id, offset, size));
+ }
+ }
+ }
+ else
+ {
+ mHeaderMutex->unlock();
+ }
+
+ //early out was not hit, effectively fetched
+ return true;
+}
+
+bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id)
+{ //protected by mMutex
+ mHeaderMutex->lock();
+
+ if (mMeshHeader.find(mesh_id) == mMeshHeader.end())
+ { //we have no header info for this mesh, do nothing
+ mHeaderMutex->unlock();
+ return false;
+ }
+
+ U32 header_size = mMeshHeaderSize[mesh_id];
+
+ if (header_size > 0)
+ {
+ S32 offset = header_size + mMeshHeader[mesh_id]["decomposition"]["offset"].asInteger();
+ S32 size = mMeshHeader[mesh_id]["decomposition"]["size"].asInteger();
+
+ mHeaderMutex->unlock();
+
+ if (offset >= 0 && size > 0)
+ {
+ //check VFS for mesh skin info
+ LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesRead += size;
+ file.seek(offset);
+ U8* buffer = new U8[size];
+ file.read(buffer, size);
+
+ //make sure buffer isn't all 0's (reserved block but not written)
+ bool zero = true;
+ for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
+ {
+ zero = buffer[i] > 0 ? false : true;
+ }
+
+ if (!zero)
+ { //attempt to parse
+ if (decompositionReceived(mesh_id, buffer, size))
+ {
+ delete[] buffer;
+ return true;
+ }
+ }
+
+ delete[] buffer;
+ }
+
+ //reading from VFS failed for whatever reason, fetch from sim
+ std::vector<std::string> headers;
+ headers.push_back("Accept: application/octet-stream");
+
+ std::string http_url = constructUrl(mesh_id);
+ if (!http_url.empty())
+ {
+ ++sActiveLODRequests;
+ LLMeshRepository::sHTTPRequestCount++;
+ mCurlRequest->getByteRange(http_url, headers, offset, size,
+ new LLMeshDecompositionResponder(mesh_id, offset, size));
+ }
+ }
+ }
+ else
+ {
+ mHeaderMutex->unlock();
+ }
+
+ //early out was not hit, effectively fetched
+ return true;
+}
+
+bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id)
+{ //protected by mMutex
+ mHeaderMutex->lock();
+
+ if (mMeshHeader.find(mesh_id) == mMeshHeader.end())
+ { //we have no header info for this mesh, do nothing
+ mHeaderMutex->unlock();
+ return false;
+ }
+
+ U32 header_size = mMeshHeaderSize[mesh_id];
+
+ if (header_size > 0)
+ {
+ S32 offset = header_size + mMeshHeader[mesh_id]["physics_shape"]["offset"].asInteger();
+ S32 size = mMeshHeader[mesh_id]["physics_shape"]["size"].asInteger();
+
+ mHeaderMutex->unlock();
+
+ if (offset >= 0 && size > 0)
+ {
+ //check VFS for mesh physics shape info
+ LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesRead += size;
+ file.seek(offset);
+ U8* buffer = new U8[size];
+ file.read(buffer, size);
+
+ //make sure buffer isn't all 0's (reserved block but not written)
+ bool zero = true;
+ for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
+ {
+ zero = buffer[i] > 0 ? false : true;
+ }
+
+ if (!zero)
+ { //attempt to parse
+ if (physicsShapeReceived(mesh_id, buffer, size))
+ {
+ delete[] buffer;
+ return true;
+ }
+ }
+
+ delete[] buffer;
+ }
+
+ //reading from VFS failed for whatever reason, fetch from sim
+ std::vector<std::string> headers;
+ headers.push_back("Accept: application/octet-stream");
+
+ std::string http_url = constructUrl(mesh_id);
+ if (!http_url.empty())
+ {
+ ++sActiveLODRequests;
+ LLMeshRepository::sHTTPRequestCount++;
+ mCurlRequest->getByteRange(http_url, headers, offset, size,
+ new LLMeshPhysicsShapeResponder(mesh_id, offset, size));
+ }
+ }
+ else
+ { //no physics shape whatsoever, report back NULL
+ physicsShapeReceived(mesh_id, NULL, 0);
+ }
+ }
+ else
+ {
+ mHeaderMutex->unlock();
+ }
+
+ //early out was not hit, effectively fetched
+ return true;
+}
+
+bool LLMeshRepoThread::fetchMeshHeader(const LLVolumeParams& mesh_params)
+{
+ bool retval = false;
+
+ {
+ //look for mesh in asset in vfs
+ LLVFile file(gVFS, mesh_params.getSculptID(), LLAssetType::AT_MESH);
+
+ S32 size = file.getSize();
+
+ if (size > 0)
+ {
+ U8 buffer[1024];
+ S32 bytes = llmin(size, 1024);
+ LLMeshRepository::sCacheBytesRead += bytes;
+ file.read(buffer, bytes);
+ if (headerReceived(mesh_params, buffer, bytes))
+ { //did not do an HTTP request, return false
+ return false;
+ }
+ }
+ }
+
+ //either cache entry doesn't exist or is corrupt, request header from simulator
+
+ std::vector<std::string> headers;
+ headers.push_back("Accept: application/octet-stream");
+
+ std::string http_url = constructUrl(mesh_params.getSculptID());
+ if (!http_url.empty())
+ {
+ ++sActiveHeaderRequests;
+ retval = true;
+ //grab first 4KB if we're going to bother with a fetch. Cache will prevent future fetches if a full mesh fits
+ //within the first 4KB
+ LLMeshRepository::sHTTPRequestCount++;
+ mCurlRequest->getByteRange(http_url, headers, 0, 4096, new LLMeshHeaderResponder(mesh_params));
+ }
+
+ return retval;
+}
+
+bool LLMeshRepoThread::fetchMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
+{ //protected by mMutex
+ mHeaderMutex->lock();
+
+ bool retval = false;
+
+ LLUUID mesh_id = mesh_params.getSculptID();
+
+ U32 header_size = mMeshHeaderSize[mesh_id];
+
+ if (header_size > 0)
+ {
+ S32 offset = header_size + mMeshHeader[mesh_id][header_lod[lod]]["offset"].asInteger();
+ S32 size = mMeshHeader[mesh_id][header_lod[lod]]["size"].asInteger();
+ mHeaderMutex->unlock();
+ if (offset >= 0 && size > 0)
+ {
+
+ //check VFS for mesh asset
+ LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH);
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesRead += size;
+ file.seek(offset);
+ U8* buffer = new U8[size];
+ file.read(buffer, size);
+
+ //make sure buffer isn't all 0's (reserved block but not written)
+ bool zero = true;
+ for (S32 i = 0; i < llmin(size, 1024) && zero; ++i)
+ {
+ zero = buffer[i] > 0 ? false : true;
+ }
+
+ if (!zero)
+ { //attempt to parse
+ if (lodReceived(mesh_params, lod, buffer, size))
+ {
+ delete[] buffer;
+ return false;
+ }
+ }
+
+ delete[] buffer;
+ }
+
+ //reading from VFS failed for whatever reason, fetch from sim
+ std::vector<std::string> headers;
+ headers.push_back("Accept: application/octet-stream");
+
+ std::string http_url = constructUrl(mesh_id);
+ if (!http_url.empty())
+ {
+ ++sActiveLODRequests;
+ retval = true;
+ LLMeshRepository::sHTTPRequestCount++;
+ mCurlRequest->getByteRange(constructUrl(mesh_id), headers, offset, size,
+ new LLMeshLODResponder(mesh_params, lod, offset, size));
+ }
+ else
+ {
+ mUnavailableQ.push(LODRequest(mesh_params, lod));
+ }
+ }
+ else
+ {
+ mUnavailableQ.push(LODRequest(mesh_params, lod));
+ }
+ }
+ else
+ {
+ mHeaderMutex->unlock();
+ }
+
+ return retval;
+}
+
+bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* data, S32 data_size)
+{
+ LLSD header;
+
+ U32 header_size = 0;
+ if (data_size > 0)
+ {
+ std::string res_str((char*) data, data_size);
+
+ std::string deprecated_header("<? LLSD/Binary ?>");
+
+ if (res_str.substr(0, deprecated_header.size()) == deprecated_header)
+ {
+ res_str = res_str.substr(deprecated_header.size()+1, data_size);
+ header_size = deprecated_header.size()+1;
+ }
+ data_size = res_str.size();
+
+ std::istringstream stream(res_str);
+
+ if (!LLSDSerialize::fromBinary(header, stream, data_size))
+ {
+ llwarns << "Mesh header parse error. Not a valid mesh asset!" << llendl;
+ return false;
+ }
+
+ header_size += stream.tellg();
+ }
+ else
+ {
+ llinfos
+ << "Marking header as non-existent, will not retry." << llendl;
+ header["404"] = 1;
+ }
+
+ {
+ U32 cost = gMeshRepo.calcResourceCost(header);
+
+ LLUUID mesh_id = mesh_params.getSculptID();
+
+ mHeaderMutex->lock();
+ mMeshHeaderSize[mesh_id] = header_size;
+ mMeshHeader[mesh_id] = header;
+ mMeshResourceCost[mesh_id] = cost;
+ mHeaderMutex->unlock();
+
+ //check for pending requests
+ pending_lod_map::iterator iter = mPendingLOD.find(mesh_params);
+ if (iter != mPendingLOD.end())
+ {
+ LLMutexLock lock(mMutex);
+ for (U32 i = 0; i < iter->second.size(); ++i)
+ {
+ LODRequest req(mesh_params, iter->second[i]);
+ mLODReqQ.push(req);
+ }
+ }
+ mPendingLOD.erase(iter);
+ }
+
+ return true;
+}
+
+bool LLMeshRepoThread::lodReceived(const LLVolumeParams& mesh_params, S32 lod, U8* data, S32 data_size)
+{
+ LLVolume* volume = new LLVolume(mesh_params, LLVolumeLODGroup::getVolumeScaleFromDetail(lod));
+ std::string mesh_string((char*) data, data_size);
+ std::istringstream stream(mesh_string);
+
+ if (volume->unpackVolumeFaces(stream, data_size))
+ {
+ LoadedMesh mesh(volume, mesh_params, lod);
+ if (volume->getNumFaces() > 0)
+ {
+ LLMutexLock lock(mMutex);
+ mLoadedQ.push(mesh);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool LLMeshRepoThread::skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 data_size)
+{
+ LLSD skin;
+
+ if (data_size > 0)
+ {
+ std::string res_str((char*) data, data_size);
+
+ std::istringstream stream(res_str);
+
+ if (!unzip_llsd(skin, stream, data_size))
+ {
+ llwarns << "Mesh skin info parse error. Not a valid mesh asset!" << llendl;
+ return false;
+ }
+ }
+
+ {
+ LLMeshSkinInfo info(skin);
+ info.mMeshID = mesh_id;
+
+ //llinfos<<"info pelvis offset"<<info.mPelvisOffset<<llendl;
+ mSkinInfoQ.push(info);
+ }
+
+ return true;
+}
+
+bool LLMeshRepoThread::decompositionReceived(const LLUUID& mesh_id, U8* data, S32 data_size)
+{
+ LLSD decomp;
+
+ if (data_size > 0)
+ {
+ std::string res_str((char*) data, data_size);
+
+ std::istringstream stream(res_str);
+
+ if (!unzip_llsd(decomp, stream, data_size))
+ {
+ llwarns << "Mesh decomposition parse error. Not a valid mesh asset!" << llendl;
+ return false;
+ }
+ }
+
+ {
+ LLModel::Decomposition* d = new LLModel::Decomposition(decomp);
+ d->mMeshID = mesh_id;
+ mDecompositionQ.push(d);
+ }
+
+ return true;
+}
+
+bool LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 data_size)
+{
+ LLSD physics_shape;
+
+ LLModel::Decomposition* d = new LLModel::Decomposition();
+ d->mMeshID = mesh_id;
+
+ if (data == NULL)
+ { //no data, no physics shape exists
+ d->mPhysicsShapeMesh.clear();
+ }
+ else
+ {
+ LLVolumeParams volume_params;
+ volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
+ volume_params.setSculptID(mesh_id, LL_SCULPT_TYPE_MESH);
+ LLPointer<LLVolume> volume = new LLVolume(volume_params,0);
+ std::string mesh_string((char*) data, data_size);
+ std::istringstream stream(mesh_string);
+
+ if (volume->unpackVolumeFaces(stream, data_size))
+ {
+ //load volume faces into decomposition buffer
+ S32 vertex_count = 0;
+ S32 index_count = 0;
+
+ for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = volume->getVolumeFace(i);
+ vertex_count += face.mNumVertices;
+ index_count += face.mNumIndices;
+ }
+
+ d->mPhysicsShapeMesh.clear();
+
+ std::vector<LLVector3>& pos = d->mPhysicsShapeMesh.mPositions;
+ std::vector<LLVector3>& norm = d->mPhysicsShapeMesh.mNormals;
+
+ for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = volume->getVolumeFace(i);
+
+ for (S32 i = 0; i < face.mNumIndices; ++i)
+ {
+ U16 idx = face.mIndices[i];
+
+ pos.push_back(LLVector3(face.mPositions[idx].getF32ptr()));
+ norm.push_back(LLVector3(face.mNormals[idx].getF32ptr()));
+ }
+ }
+ }
+ }
+
+ mDecompositionQ.push(d);
+ return true;
+}
+
+LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, LLVector3& scale, bool upload_textures,
+ bool upload_skin, bool upload_joints)
+: LLThread("mesh upload"),
+ mDiscarded(FALSE)
+{
+ mInstanceList = data;
+ mUploadTextures = upload_textures;
+ mUploadSkin = upload_skin;
+ mUploadJoints = upload_joints;
+ mMutex = new LLMutex(NULL);
+ mCurlRequest = NULL;
+ mPendingConfirmations = 0;
+ mPendingUploads = 0;
+ mPendingCost = 0;
+ mFinished = false;
+ mOrigin = gAgent.getPositionAgent();
+ mHost = gAgent.getRegionHost();
+
+ mUploadObjectAssetCapability = gAgent.getRegion()->getCapability("UploadObjectAsset");
+ mNewInventoryCapability = gAgent.getRegion()->getCapability("NewFileAgentInventoryVariablePrice");
+ mWholeModelFeeCapability = gAgent.getRegion()->getCapability("NewFileAgentInventory");
+
+ mOrigin += gAgent.getAtAxis() * scale.magVec();
+}
+
+LLMeshUploadThread::~LLMeshUploadThread()
+{
+
+}
+
+LLMeshUploadThread::DecompRequest::DecompRequest(LLModel* mdl, LLModel* base_model, LLMeshUploadThread* thread)
+{
+ mStage = "single_hull";
+ mModel = mdl;
+ mDecompID = &mdl->mDecompID;
+ mBaseModel = base_model;
+ mThread = thread;
+
+ //copy out positions and indices
+ if (mdl)
+ {
+ U16 index_offset = 0;
+
+ mPositions.clear();
+ mIndices.clear();
+
+ //queue up vertex positions and indices
+ for (S32 i = 0; i < mdl->getNumVolumeFaces(); ++i)
+ {
+ const LLVolumeFace& face = mdl->getVolumeFace(i);
+ if (mPositions.size() + face.mNumVertices > 65535)
+ {
+ continue;
+ }
+
+ for (U32 j = 0; j < face.mNumVertices; ++j)
+ {
+ mPositions.push_back(LLVector3(face.mPositions[j].getF32ptr()));
+ }
+
+ for (U32 j = 0; j < face.mNumIndices; ++j)
+ {
+ mIndices.push_back(face.mIndices[j]+index_offset);
+ }
+
+ index_offset += face.mNumVertices;
+ }
+ }
+
+ mThread->mFinalDecomp = this;
+ mThread->mPhysicsComplete = false;
+}
+
+void LLMeshUploadThread::DecompRequest::completed()
+{
+ if (mThread->mFinalDecomp == this)
+ {
+ mThread->mPhysicsComplete = true;
+ }
+
+ llassert(mHull.size() == 1);
+
+ mThread->mHullMap[mBaseModel] = mHull[0];
+}
+
+//called in the main thread.
+void LLMeshUploadThread::preStart()
+{
+ //build map of LLModel refs to instances for callbacks
+ for (instance_list::iterator iter = mInstanceList.begin(); iter != mInstanceList.end(); ++iter)
+ {
+ mInstance[iter->mModel].push_back(*iter);
+ }
+}
+
+void LLMeshUploadThread::discard()
+{
+ LLMutexLock lock(mMutex) ;
+ mDiscarded = TRUE ;
+}
+
+BOOL LLMeshUploadThread::isDiscarded()
+{
+ LLMutexLock lock(mMutex) ;
+ return mDiscarded ;
+}
+
+void LLMeshUploadThread::run()
+{
+ if (gSavedSettings.getBOOL("MeshUseWholeModelUpload"))
+ {
+ doWholeModelUpload();
+ }
+ else
+ {
+ doIterativeUpload();
+ }
+}
+
+void dumpLLSDToFile(const LLSD& content, std::string filename)
+{
+#if 1
+ std::ofstream of(filename.c_str());
+ LLSDSerialize::toPrettyXML(content,of);
+#endif
+}
+
+void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
+{
+ LLSD result;
+
+ LLSD res;
+ result["folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT);
+ result["asset_type"] = "mesh";
+ result["inventory_type"] = "object";
+ result["name"] = "mesh model";
+ result["description"] = "your description here";
+
+ res["mesh_list"] = LLSD::emptyArray();
+ res["texture_list"] = LLSD::emptyArray();
+ res["instance_list"] = LLSD::emptyArray();
+ S32 mesh_num = 0;
+ S32 texture_num = 0;
+
+ std::set<LLViewerTexture* > textures;
+ std::map<LLViewerTexture*,S32> texture_index;
+
+ std::map<LLModel*,S32> mesh_index;
+
+ S32 instance_num = 0;
+
+ for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
+ {
+ LLMeshUploadData data;
+ data.mBaseModel = iter->first;
+ LLModelInstance& instance = *(iter->second.begin());
+ LLModel* model = instance.mModel;
+ if (mesh_index.find(model) == mesh_index.end())
+ {
+ // Have not seen this model before - create a new mesh_list entry for it.
+ std::string model_name = data.mBaseModel->getName();
+ if (!model_name.empty())
+ {
+ result["name"] = model_name;
+ }
+
+ std::stringstream ostr;
+
+ LLModel::Decomposition& decomp =
+ data.mModel[LLModel::LOD_PHYSICS].notNull() ?
+ data.mModel[LLModel::LOD_PHYSICS]->mPhysics :
+ data.mBaseModel->mPhysics;
+
+ decomp.mBaseHull = mHullMap[data.mBaseModel];
+
+ LLSD mesh_header = LLModel::writeModel(
+ ostr,
+ data.mModel[LLModel::LOD_PHYSICS],
+ data.mModel[LLModel::LOD_HIGH],
+ data.mModel[LLModel::LOD_MEDIUM],
+ data.mModel[LLModel::LOD_LOW],
+ data.mModel[LLModel::LOD_IMPOSTOR],
+ decomp,
+ mUploadSkin,
+ mUploadJoints);
+
+ data.mAssetData = ostr.str();
+ std::string str = ostr.str();
+
+ res["mesh_list"][mesh_num] = LLSD::Binary(str.begin(),str.end());
+ mesh_index[model] = mesh_num;
+ mesh_num++;
+ }
+
+ LLSD instance_entry;
+
+ for (S32 i = 0; i < 5; i++)
+ {
+ data.mModel[i] = instance.mLOD[i];
+ }
+
+ LLVector3 pos, scale;
+ LLQuaternion rot;
+ LLMatrix4 transformation = instance.mTransform;
+ decomposeMeshMatrix(transformation,pos,rot,scale);
+ instance_entry["position"] = ll_sd_from_vector3(pos);
+ instance_entry["rotation"] = ll_sd_from_quaternion(rot);
+ instance_entry["scale"] = ll_sd_from_vector3(scale);
+
+ instance_entry["material"] = LL_MCODE_WOOD;
+ LLPermissions perm;
+ perm.setOwnerAndGroup(gAgent.getID(), gAgent.getID(), LLUUID::null, false);
+ perm.setCreator(gAgent.getID());
+
+ perm.initMasks(PERM_ITEM_UNRESTRICTED | PERM_MOVE, //base
+ PERM_ITEM_UNRESTRICTED | PERM_MOVE, //owner
+ LLFloaterPerms::getEveryonePerms(),
+ LLFloaterPerms::getGroupPerms(),
+ LLFloaterPerms::getNextOwnerPerms());
+ instance_entry["permissions"] = ll_create_sd_from_permissions(perm);
+ instance_entry["physics_shape_type"] = (U8)(LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL);
+ instance_entry["mesh"] = mesh_index[model];
+
+ if (mUploadTextures)
+ {
+ instance_entry["face_list"] = LLSD::emptyArray();
+
+ for (S32 face_num = 0; face_num < model->getNumVolumeFaces(); face_num++)
+ {
+ LLImportMaterial& material = instance.mMaterial[face_num];
+ LLSD face_entry = LLSD::emptyMap();
+ LLViewerFetchedTexture *texture = material.mDiffuseMap.get();
+
+ if (texture != NULL)
+ {
+ if (textures.find(texture) == textures.end())
+ {
+ textures.insert(texture);
+ }
+
+ std::stringstream ostr;
+ if (include_textures) // otherwise data is blank.
+ {
+ LLTextureUploadData data(texture, material.mDiffuseMapLabel);
+ if (!data.mTexture->isRawImageValid())
+ {
+ data.mTexture->reloadRawImage(data.mTexture->getDiscardLevel());
+ }
+
+ LLPointer<LLImageJ2C> upload_file =
+ LLViewerTextureList::convertToUploadFile(data.mTexture->getRawImage());
+ ostr.write((const char*) upload_file->getData(), upload_file->getDataSize());
+ }
+
+ if (texture_index.find(texture) == texture_index.end())
+ {
+ texture_index[texture] = texture_num;
+ std::string str = ostr.str();
+ res["texture_list"][texture_num] = LLSD::Binary(str.begin(),str.end());
+ texture_num++;
+ }
+ }
+
+ // Subset of TextureEntry fields.
+ if (texture)
+ {
+ face_entry["image"] = texture_index[texture];
+ }
+ face_entry["scales"] = 1.0;
+ face_entry["scalet"] = 1.0;
+ face_entry["offsets"] = 0.0;
+ face_entry["offsett"] = 0.0;
+ face_entry["imagerot"] = 0.0;
+ face_entry["colors"] = ll_sd_from_color4(material.mDiffuseColor);
+ face_entry["fullbright"] = material.mFullbright;
+ instance_entry["face_list"][face_num] = face_entry;
+ }
+ }
+
+ res["instance_list"][instance_num] = instance_entry;
+ instance_num++;
+ }
+
+ result["asset_resources"] = res;
+ dumpLLSDToFile(result,"whole_model.xml");
+
+ dest = result;
+}
+
+void LLMeshUploadThread::doWholeModelUpload()
+{
+ mCurlRequest = new LLCurlRequest();
+
+ // Queue up models for hull generation (viewer-side)
+ for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
+ {
+ LLMeshUploadData data;
+ data.mBaseModel = iter->first;
+
+ LLModelInstance& instance = *(iter->second.begin());
+
+ for (S32 i = 0; i < 5; i++)
+ {
+ data.mModel[i] = instance.mLOD[i];
+ }
+
+ //queue up models for hull generation
+ LLModel* physics = NULL;
+
+ if (data.mModel[LLModel::LOD_PHYSICS].notNull())
+ {
+ physics = data.mModel[LLModel::LOD_PHYSICS];
+ }
+ else if (data.mModel[LLModel::LOD_MEDIUM].notNull())
+ {
+ physics = data.mModel[LLModel::LOD_MEDIUM];
+ }
+ else
+ {
+ physics = data.mModel[LLModel::LOD_HIGH];
+ }
+
+ llassert(physics != NULL);
+
+ DecompRequest* request = new DecompRequest(physics, data.mBaseModel, this);
+ gMeshRepo.mDecompThread->submitRequest(request);
+ }
+
+ while (!mPhysicsComplete)
+ {
+ apr_sleep(100);
+ }
+
+ LLSD model_data;
+ wholeModelToLLSD(model_data,false);
+ dumpLLSDToFile(model_data,"whole_model_fee_request.xml");
+
+ mPendingUploads++;
+ LLCurlRequest::headers_t headers;
+ mCurlRequest->post(mWholeModelFeeCapability, headers, model_data,
+ new LLWholeModelFeeResponder(this));
+
+ do
+ {
+ mCurlRequest->process();
+ } while (mCurlRequest->getQueued() > 0);
+
+
+ if (mWholeModelUploadURL.empty())
+ {
+ llinfos << "unable to upload, fee request failed" << llendl;
+ }
+ else
+ {
+ LLSD full_model_data;
+ wholeModelToLLSD(full_model_data, true);
+ LLSD body = full_model_data["asset_resources"];
+ dumpLLSDToFile(body,"whole_model_body.xml");
+ mCurlRequest->post(mWholeModelUploadURL, headers, body,
+ new LLWholeModelUploadResponder(this, model_data));
+ do
+ {
+ mCurlRequest->process();
+ } while (mCurlRequest->getQueued() > 0);
+ }
+
+ delete mCurlRequest;
+ mCurlRequest = NULL;
+
+ // Currently a no-op.
+ mFinished = true;
+}
+
+void LLMeshUploadThread::doIterativeUpload()
+{
+ if(isDiscarded())
+ {
+ mFinished = true;
+ return ;
+ }
+
+ mCurlRequest = new LLCurlRequest();
+
+ std::set<LLViewerTexture* > textures;
+
+ //populate upload queue with relevant models
+ for (instance_map::iterator iter = mInstance.begin(); iter != mInstance.end(); ++iter)
+ {
+ LLMeshUploadData data;
+ data.mBaseModel = iter->first;
+
+ LLModelInstance& instance = *(iter->second.begin());
+
+ for (S32 i = 0; i < 5; i++)
+ {
+ data.mModel[i] = instance.mLOD[i];
+ }
+
+ uploadModel(data);
+
+ if (mUploadTextures)
+ {
+ for (std::vector<LLImportMaterial>::iterator material_iter = instance.mMaterial.begin();
+ material_iter != instance.mMaterial.end(); ++material_iter)
+ {
+
+ if (textures.find(material_iter->mDiffuseMap.get()) == textures.end())
+ {
+ textures.insert(material_iter->mDiffuseMap.get());
+
+ LLTextureUploadData data(material_iter->mDiffuseMap.get(), material_iter->mDiffuseMapLabel);
+ uploadTexture(data);
+ }
+ }
+ }
+
+ //queue up models for hull generation
+ LLModel* physics = data.mModel[LLModel::LOD_PHYSICS];
+ if (physics == NULL)
+ { //no physics model available, use high lod
+ physics = data.mModel[LLModel::LOD_HIGH];
+ }
+
+ DecompRequest* request = new DecompRequest(physics, data.mBaseModel, this);
+ gMeshRepo.mDecompThread->submitRequest(request);
+ }
+
+ while (!mPhysicsComplete)
+ {
+ apr_sleep(100);
+ }
+
+ //upload textures
+ bool done = false;
+ do
+ {
+ if (!mTextureQ.empty())
+ {
+ sendCostRequest(mTextureQ.front());
+ mTextureQ.pop();
+ }
+
+ if (!mConfirmedTextureQ.empty())
+ {
+ doUploadTexture(mConfirmedTextureQ.front());
+ mConfirmedTextureQ.pop();
+ }
+
+ mCurlRequest->process();
+
+ done = mTextureQ.empty() && mConfirmedTextureQ.empty();
+ }
+ while (!done || mCurlRequest->getQueued() > 0);
+
+ LLSD object_asset;
+ object_asset["objects"] = LLSD::emptyArray();
+
+ done = false;
+ do
+ {
+ static S32 count = 0;
+ static F32 last_hundred = gFrameTimeSeconds;
+ if (gFrameTimeSeconds - last_hundred > 1.f)
+ {
+ last_hundred = gFrameTimeSeconds;
+ count = 0;
+ }
+
+ //how many requests to push before calling process
+ const S32 PUSH_PER_PROCESS = 32;
+
+ S32 tcount = llmin(count+PUSH_PER_PROCESS, 100);
+
+ while (!mUploadQ.empty() && count < tcount)
+ { //send any pending upload requests
+ mMutex->lock();
+ LLMeshUploadData data = mUploadQ.front();
+ mUploadQ.pop();
+ mMutex->unlock();
+ sendCostRequest(data);
+ count++;
+ }
+
+ tcount = llmin(count+PUSH_PER_PROCESS, 100);
+
+ while (!mConfirmedQ.empty() && count < tcount)
+ { //process any meshes that have been confirmed for upload
+ LLMeshUploadData& data = mConfirmedQ.front();
+ doUploadModel(data);
+ mConfirmedQ.pop();
+ count++;
+ }
+
+ tcount = llmin(count+PUSH_PER_PROCESS, 100);
+
+ while (!mInstanceQ.empty() && count < tcount && !isDiscarded())
+ { //create any objects waiting for upload
+ count++;
+ object_asset["objects"].append(createObject(mInstanceQ.front()));
+ mInstanceQ.pop();
+ }
+
+ mCurlRequest->process();
+
+ done = isDiscarded() || (mInstanceQ.empty() && mConfirmedQ.empty() && mUploadQ.empty());
+ }
+ while (!done || mCurlRequest->getQueued() > 0);
+
+ delete mCurlRequest;
+ mCurlRequest = NULL;
+
+ // now upload the object asset
+ std::string url = mUploadObjectAssetCapability;
+
+ if (object_asset["objects"][0].has("permissions"))
+ { //copy permissions from first available object to be used for coalesced object
+ object_asset["permissions"] = object_asset["objects"][0]["permissions"];
+ }
+
+ if(!isDiscarded())
+ {
+ mPendingUploads++;
+ LLHTTPClient::post(url, object_asset, new LLModelObjectUploadResponder(this,object_asset));
+ }
+ else
+ {
+ mFinished = true;
+ }
+}
+
+void LLMeshUploadThread::uploadModel(LLMeshUploadData& data)
+{ //called from arbitrary thread
+ {
+ LLMutexLock lock(mMutex);
+ mUploadQ.push(data);
+ }
+}
+
+void LLMeshUploadThread::uploadTexture(LLTextureUploadData& data)
+{ //called from mesh upload thread
+ mTextureQ.push(data);
+}
+
+
+static LLFastTimer::DeclareTimer FTM_NOTIFY_MESH_LOADED("Notify Loaded");
+static LLFastTimer::DeclareTimer FTM_NOTIFY_MESH_UNAVAILABLE("Notify Unavailable");
+
+void LLMeshRepoThread::notifyLoadedMeshes()
+{
+ while (!mLoadedQ.empty())
+ {
+ mMutex->lock();
+ LoadedMesh mesh = mLoadedQ.front();
+ mLoadedQ.pop();
+ mMutex->unlock();
+
+ if (mesh.mVolume && mesh.mVolume->getNumVolumeFaces() > 0)
+ {
+ gMeshRepo.notifyMeshLoaded(mesh.mMeshParams, mesh.mVolume);
+ }
+ else
+ {
+ gMeshRepo.notifyMeshUnavailable(mesh.mMeshParams,
+ LLVolumeLODGroup::getVolumeDetailFromScale(mesh.mVolume->getDetail()));
+ }
+ }
+
+ while (!mUnavailableQ.empty())
+ {
+ mMutex->lock();
+ LODRequest req = mUnavailableQ.front();
+ mUnavailableQ.pop();
+ mMutex->unlock();
+
+ gMeshRepo.notifyMeshUnavailable(req.mMeshParams, req.mLOD);
+ }
+
+ while (!mSkinInfoQ.empty())
+ {
+ gMeshRepo.notifySkinInfoReceived(mSkinInfoQ.front());
+ mSkinInfoQ.pop();
+ }
+
+ while (!mDecompositionQ.empty())
+ {
+ gMeshRepo.notifyDecompositionReceived(mDecompositionQ.front());
+ mDecompositionQ.pop();
+ }
+}
+
+S32 LLMeshRepoThread::getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
+{ //only ever called from main thread
+ LLMutexLock lock(mHeaderMutex);
+ mesh_header_map::iterator iter = mMeshHeader.find(mesh_params.getSculptID());
+
+ if (iter != mMeshHeader.end())
+ {
+ LLSD& header = iter->second;
+
+ return LLMeshRepository::getActualMeshLOD(header, lod);
+ }
+
+ return lod;
+}
+
+//static
+S32 LLMeshRepository::getActualMeshLOD(LLSD& header, S32 lod)
+{
+ lod = llclamp(lod, 0, 3);
+
+ if (header.has("404"))
+ {
+ return -1;
+ }
+
+ if (header[header_lod[lod]]["size"].asInteger() > 0)
+ {
+ return lod;
+ }
+
+ //search down to find the next available lower lod
+ for (S32 i = lod-1; i >= 0; --i)
+ {
+ if (header[header_lod[i]]["size"].asInteger() > 0)
+ {
+ return i;
+ }
+ }
+
+ //search up to find then ext available higher lod
+ for (S32 i = lod+1; i < 4; ++i)
+ {
+ if (header[header_lod[i]]["size"].asInteger() > 0)
+ {
+ return i;
+ }
+ }
+
+ //header exists and no good lod found, treat as 404
+ header["404"] = 1;
+ return -1;
+}
+
+U32 LLMeshRepoThread::getResourceCost(const LLUUID& mesh_id)
+{
+ LLMutexLock lock(mHeaderMutex);
+
+ std::map<LLUUID, U32>::iterator iter = mMeshResourceCost.find(mesh_id);
+ if (iter != mMeshResourceCost.end())
+ {
+ return iter->second;
+ }
+
+ return 0;
+}
+
+void LLMeshRepository::cacheOutgoingMesh(LLMeshUploadData& data, LLSD& header)
+{
+ mThread->mMeshHeader[data.mUUID] = header;
+
+ // we cache the mesh for default parameters
+ LLVolumeParams volume_params;
+ volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE);
+ volume_params.setSculptID(data.mUUID, LL_SCULPT_TYPE_MESH);
+
+ for (U32 i = 0; i < 4; i++)
+ {
+ if (data.mModel[i].notNull())
+ {
+ LLPointer<LLVolume> volume = new LLVolume(volume_params, LLVolumeLODGroup::getVolumeScaleFromDetail(i));
+ volume->copyVolumeFaces(data.mModel[i]);
+ }
+ }
+
+}
+
+void LLMeshLODResponder::completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+{
+
+ LLMeshRepoThread::sActiveLODRequests--;
+ S32 data_size = buffer->countAfter(channels.in(), NULL);
+
+ if (status < 200 || status > 400)
+ {
+ llwarns << status << ": " << reason << llendl;
+ }
+
+ if (data_size < mRequestedBytes)
+ {
+ if (status == 499 || status == 503)
+ { //timeout or service unavailable, try again
+ LLMeshRepository::sHTTPRetryCount++;
+ gMeshRepo.mThread->loadMeshLOD(mMeshParams, mLOD);
+ }
+ else
+ {
+ llwarns << "Unhandled status " << status << llendl;
+ }
+ return;
+ }
+
+ LLMeshRepository::sBytesReceived += mRequestedBytes;
+
+ U8* data = NULL;
+
+ if (data_size > 0)
+ {
+ data = new U8[data_size];
+ buffer->readAfter(channels.in(), NULL, data, data_size);
+ }
+
+ if (gMeshRepo.mThread->lodReceived(mMeshParams, mLOD, data, data_size))
+ {
+ //good fetch from sim, write to VFS for caching
+ LLVFile file(gVFS, mMeshParams.getSculptID(), LLAssetType::AT_MESH, LLVFile::WRITE);
+
+ S32 offset = mOffset;
+ S32 size = mRequestedBytes;
+
+ if (file.getSize() >= offset+size)
+ {
+ file.seek(offset);
+ file.write(data, size);
+ LLMeshRepository::sCacheBytesWritten += size;
+ }
+ }
+
+ delete [] data;
+}
+
+void LLMeshSkinInfoResponder::completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+{
+ S32 data_size = buffer->countAfter(channels.in(), NULL);
+
+ if (status < 200 || status > 400)
+ {
+ llwarns << status << ": " << reason << llendl;
+ }
+
+ if (data_size < mRequestedBytes)
+ {
+ if (status == 499 || status == 503)
+ { //timeout or service unavailable, try again
+ LLMeshRepository::sHTTPRetryCount++;
+ gMeshRepo.mThread->loadMeshSkinInfo(mMeshID);
+ }
+ else
+ {
+ llwarns << "Unhandled status " << status << llendl;
+ }
+ return;
+ }
+
+ LLMeshRepository::sBytesReceived += mRequestedBytes;
+
+ U8* data = NULL;
+
+ if (data_size > 0)
+ {
+ data = new U8[data_size];
+ buffer->readAfter(channels.in(), NULL, data, data_size);
+ }
+
+ if (gMeshRepo.mThread->skinInfoReceived(mMeshID, data, data_size))
+ {
+ //good fetch from sim, write to VFS for caching
+ LLVFile file(gVFS, mMeshID, LLAssetType::AT_MESH, LLVFile::WRITE);
+
+ S32 offset = mOffset;
+ S32 size = mRequestedBytes;
+
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesWritten += size;
+ file.seek(offset);
+ file.write(data, size);
+ }
+ }
+
+ delete [] data;
+}
+
+void LLMeshDecompositionResponder::completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+{
+ S32 data_size = buffer->countAfter(channels.in(), NULL);
+
+ if (status < 200 || status > 400)
+ {
+ llwarns << status << ": " << reason << llendl;
+ }
+
+ if (data_size < mRequestedBytes)
+ {
+ if (status == 499 || status == 503)
+ { //timeout or service unavailable, try again
+ LLMeshRepository::sHTTPRetryCount++;
+ gMeshRepo.mThread->loadMeshDecomposition(mMeshID);
+ }
+ else
+ {
+ llwarns << "Unhandled status " << status << llendl;
+ }
+ return;
+ }
+
+ LLMeshRepository::sBytesReceived += mRequestedBytes;
+
+ U8* data = NULL;
+
+ if (data_size > 0)
+ {
+ data = new U8[data_size];
+ buffer->readAfter(channels.in(), NULL, data, data_size);
+ }
+
+ if (gMeshRepo.mThread->decompositionReceived(mMeshID, data, data_size))
+ {
+ //good fetch from sim, write to VFS for caching
+ LLVFile file(gVFS, mMeshID, LLAssetType::AT_MESH, LLVFile::WRITE);
+
+ S32 offset = mOffset;
+ S32 size = mRequestedBytes;
+
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesWritten += size;
+ file.seek(offset);
+ file.write(data, size);
+ }
+ }
+
+ delete [] data;
+}
+
+void LLMeshPhysicsShapeResponder::completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+{
+ S32 data_size = buffer->countAfter(channels.in(), NULL);
+
+ if (status < 200 || status > 400)
+ {
+ llwarns << status << ": " << reason << llendl;
+ }
+
+ if (data_size < mRequestedBytes)
+ {
+ if (status == 499 || status == 503)
+ { //timeout or service unavailable, try again
+ LLMeshRepository::sHTTPRetryCount++;
+ gMeshRepo.mThread->loadMeshPhysicsShape(mMeshID);
+ }
+ else
+ {
+ llwarns << "Unhandled status " << status << llendl;
+ }
+ return;
+ }
+
+ LLMeshRepository::sBytesReceived += mRequestedBytes;
+
+ U8* data = NULL;
+
+ if (data_size > 0)
+ {
+ data = new U8[data_size];
+ buffer->readAfter(channels.in(), NULL, data, data_size);
+ }
+
+ if (gMeshRepo.mThread->physicsShapeReceived(mMeshID, data, data_size))
+ {
+ //good fetch from sim, write to VFS for caching
+ LLVFile file(gVFS, mMeshID, LLAssetType::AT_MESH, LLVFile::WRITE);
+
+ S32 offset = mOffset;
+ S32 size = mRequestedBytes;
+
+ if (file.getSize() >= offset+size)
+ {
+ LLMeshRepository::sCacheBytesWritten += size;
+ file.seek(offset);
+ file.write(data, size);
+ }
+ }
+
+ delete [] data;
+}
+
+void LLMeshHeaderResponder::completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+{
+ LLMeshRepoThread::sActiveHeaderRequests--;
+ if (status < 200 || status > 400)
+ {
+ //llwarns
+ // << "Header responder failed with status: "
+ // << status << ": " << reason << llendl;
+
+ // 503 (service unavailable) or 499 (timeout)
+ // can be due to server load and can be retried
+
+ // TODO*: Add maximum retry logic, exponential backoff
+ // and (somewhat more optional than the others) retries
+ // again after some set period of time
+ if (status == 503 || status == 499)
+ { //retry
+ LLMeshRepository::sHTTPRetryCount++;
+ LLMeshRepoThread::HeaderRequest req(mMeshParams);
+ LLMutexLock lock(gMeshRepo.mThread->mMutex);
+ gMeshRepo.mThread->mHeaderReqQ.push(req);
+
+ return;
+ }
+ }
+
+ S32 data_size = buffer->countAfter(channels.in(), NULL);
+
+ U8* data = NULL;
+
+ if (data_size > 0)
+ {
+ data = new U8[data_size];
+ buffer->readAfter(channels.in(), NULL, data, data_size);
+ }
+
+ LLMeshRepository::sBytesReceived += llmin(data_size, 4096);
+
+ if (!gMeshRepo.mThread->headerReceived(mMeshParams, data, data_size))
+ {
+ llwarns
+ << "Unable to parse mesh header: "
+ << status << ": " << reason << llendl;
+ }
+ else if (data && data_size > 0)
+ {
+ //header was successfully retrieved from sim, cache in vfs
+ LLUUID mesh_id = mMeshParams.getSculptID();
+ LLSD header = gMeshRepo.mThread->mMeshHeader[mesh_id];
+
+ std::stringstream str;
+
+ S32 lod_bytes = 0;
+
+ for (U32 i = 0; i < LLModel::LOD_PHYSICS; ++i)
+ { //figure out how many bytes we'll need to reserve in the file
+ std::string lod_name = header_lod[i];
+ lod_bytes = llmax(lod_bytes, header[lod_name]["offset"].asInteger()+header[lod_name]["size"].asInteger());
+ }
+
+ //just in case skin info or decomposition is at the end of the file (which it shouldn't be)
+ lod_bytes = llmax(lod_bytes, header["skin"]["offset"].asInteger() + header["skin"]["size"].asInteger());
+ lod_bytes = llmax(lod_bytes, header["decomposition"]["offset"].asInteger() + header["decomposition"]["size"].asInteger());
+
+ S32 header_bytes = (S32) gMeshRepo.mThread->mMeshHeaderSize[mesh_id];
+ S32 bytes = lod_bytes + header_bytes;
+
+
+ //it's possible for the remote asset to have more data than is needed for the local cache
+ //only allocate as much space in the VFS as is needed for the local cache
+ data_size = llmin(data_size, bytes);
+
+ LLVFile file(gVFS, mesh_id, LLAssetType::AT_MESH, LLVFile::WRITE);
+ if (file.getMaxSize() >= bytes || file.setMaxSize(bytes))
+ {
+ LLMeshRepository::sCacheBytesWritten += data_size;
+
+ file.write((const U8*) data, data_size);
+
+ //zero out the rest of the file
+ U8 block[4096];
+ memset(block, 0, 4096);
+
+ while (bytes-file.tell() > 4096)
+ {
+ file.write(block, 4096);
+ }
+
+ S32 remaining = bytes-file.tell();
+
+ if (remaining < 0 || remaining > 4096)
+ {
+ llerrs << "Bad padding of mesh asset cache entry." << llendl;
+ }
+
+ if (remaining > 0)
+ {
+ file.write(block, remaining);
+ }
+ }
+ }
+
+ delete [] data;
+}
+
+
+LLMeshRepository::LLMeshRepository()
+: mMeshMutex(NULL),
+ mMeshThreadCount(0),
+ mThread(NULL)
+{
+
+}
+
+void LLMeshRepository::init()
+{
+ mMeshMutex = new LLMutex(NULL);
+
+ LLConvexDecomposition::getInstance()->initSystem();
+
+ mDecompThread = new LLPhysicsDecomp();
+ mDecompThread->start();
+
+ while (!mDecompThread->mInited)
+ { //wait for physics decomp thread to init
+ apr_sleep(100);
+ }
+
+
+
+ mThread = new LLMeshRepoThread();
+ mThread->start();
+}
+
+void LLMeshRepository::shutdown()
+{
+ llinfos << "Shutting down mesh repository." << llendl;
+
+ for (U32 i = 0; i < mUploads.size(); ++i)
+ {
+ llinfos << "Discard the pending mesh uploads " << llendl;
+ mUploads[i]->discard() ; //discard the uploading requests.
+ }
+
+ mThread->mSignal->signal();
+
+ while (!mThread->isStopped())
+ {
+ apr_sleep(10);
+ }
+ delete mThread;
+ mThread = NULL;
+
+ for (U32 i = 0; i < mUploads.size(); ++i)
+ {
+ llinfos << "Waiting for pending mesh upload " << i << "/" << mUploads.size() << llendl;
+ while (!mUploads[i]->isStopped())
+ {
+ apr_sleep(10);
+ }
+ delete mUploads[i];
+ }
+
+ mUploads.clear();
+
+ delete mMeshMutex;
+ mMeshMutex = NULL;
+
+ llinfos << "Shutting down decomposition system." << llendl;
+
+ if (mDecompThread)
+ {
+ mDecompThread->shutdown();
+ delete mDecompThread;
+ mDecompThread = NULL;
+ }
+
+ LLConvexDecomposition::quitSystem();
+}
+
+//called in the main thread.
+S32 LLMeshRepository::update()
+{
+ if(mUploadWaitList.empty())
+ {
+ return 0 ;
+ }
+
+ S32 size = mUploadWaitList.size() ;
+ for (S32 i = 0; i < size; ++i)
+ {
+ mUploads.push_back(mUploadWaitList[i]);
+ mUploadWaitList[i]->preStart() ;
+ mUploadWaitList[i]->start() ;
+ }
+ mUploadWaitList.clear() ;
+
+ return size ;
+}
+
+S32 LLMeshRepository::loadMesh(LLVOVolume* vobj, const LLVolumeParams& mesh_params, S32 detail, S32 last_lod)
+{
+ if (detail < 0 || detail > 4)
+ {
+ return detail;
+ }
+
+ LLFastTimer t(FTM_LOAD_MESH);
+
+ {
+ LLMutexLock lock(mMeshMutex);
+ //add volume to list of loading meshes
+ mesh_load_map::iterator iter = mLoadingMeshes[detail].find(mesh_params);
+ if (iter != mLoadingMeshes[detail].end())
+ { //request pending for this mesh, append volume id to list
+ iter->second.insert(vobj->getID());
+ }
+ else
+ {
+ //first request for this mesh
+ mLoadingMeshes[detail][mesh_params].insert(vobj->getID());
+ mPendingRequests.push_back(LLMeshRepoThread::LODRequest(mesh_params, detail));
+ }
+ }
+
+ //do a quick search to see if we can't display something while we wait for this mesh to load
+ LLVolume* volume = vobj->getVolume();
+
+ if (volume)
+ {
+ if (volume->getNumVolumeFaces() == 0 && !volume->isTetrahedron())
+ {
+ volume->makeTetrahedron();
+ }
+
+ LLVolumeParams params = volume->getParams();
+
+ LLVolumeLODGroup* group = LLPrimitive::getVolumeManager()->getGroup(params);
+
+ if (group)
+ {
+ //first, see if last_lod is available (don't transition down to avoid funny popping a la SH-641)
+ if (last_lod >= 0)
+ {
+ LLVolume* lod = group->refLOD(last_lod);
+ if (lod && !lod->isTetrahedron() && lod->getNumVolumeFaces() > 0)
+ {
+ group->derefLOD(lod);
+ return last_lod;
+ }
+ group->derefLOD(lod);
+ }
+
+ //next, see what the next lowest LOD available might be
+ for (S32 i = detail-1; i >= 0; --i)
+ {
+ LLVolume* lod = group->refLOD(i);
+ if (lod && !lod->isTetrahedron() && lod->getNumVolumeFaces() > 0)
+ {
+ group->derefLOD(lod);
+ return i;
+ }
+
+ group->derefLOD(lod);
+ }
+
+ //no lower LOD is a available, is a higher lod available?
+ for (S32 i = detail+1; i < 4; ++i)
+ {
+ LLVolume* lod = group->refLOD(i);
+ if (lod && !lod->isTetrahedron() && lod->getNumVolumeFaces() > 0)
+ {
+ group->derefLOD(lod);
+ return i;
+ }
+
+ group->derefLOD(lod);
+ }
+ }
+ }
+
+ return detail;
+}
+
+static LLFastTimer::DeclareTimer FTM_START_MESH_THREAD("Start Thread");
+static LLFastTimer::DeclareTimer FTM_LOAD_MESH_LOD("Load LOD");
+static LLFastTimer::DeclareTimer FTM_MESH_LOCK1("Lock 1");
+static LLFastTimer::DeclareTimer FTM_MESH_LOCK2("Lock 2");
+
+void LLMeshRepository::notifyLoadedMeshes()
+{ //called from main thread
+
+ LLMeshRepoThread::sMaxConcurrentRequests = gSavedSettings.getU32("MeshMaxConcurrentRequests");
+
+ //clean up completed upload threads
+ for (std::vector<LLMeshUploadThread*>::iterator iter = mUploads.begin(); iter != mUploads.end(); )
+ {
+ LLMeshUploadThread* thread = *iter;
+
+ if (thread->isStopped() && thread->finished())
+ {
+ iter = mUploads.erase(iter);
+ delete thread;
+ }
+ else
+ {
+ ++iter;
+ }
+ }
+
+ //update inventory
+ if (!mInventoryQ.empty())
+ {
+ LLMutexLock lock(mMeshMutex);
+ while (!mInventoryQ.empty())
+ {
+ inventory_data& data = mInventoryQ.front();
+
+ LLAssetType::EType asset_type = LLAssetType::lookup(data.mPostData["asset_type"].asString());
+ LLInventoryType::EType inventory_type = LLInventoryType::lookup(data.mPostData["inventory_type"].asString());
+
+ on_new_single_inventory_upload_complete(
+ asset_type,
+ inventory_type,
+ data.mPostData["asset_type"].asString(),
+ data.mPostData["folder_id"].asUUID(),
+ data.mPostData["name"],
+ data.mPostData["description"],
+ data.mResponse,
+ 0);
+
+ mInventoryQ.pop();
+ }
+ }
+
+ //call completed callbacks on finished decompositions
+ mDecompThread->notifyCompleted();
+
+ if (!mThread->mWaiting)
+ { //curl thread is churning, wait for it to go idle
+ return;
+ }
+
+ static std::string region_name("never name a region this");
+
+ if (gAgent.getRegion())
+ { //update capability url
+ if (gAgent.getRegion()->getName() != region_name && gAgent.getRegion()->capabilitiesReceived())
+ {
+ region_name = gAgent.getRegion()->getName();
+
+ mGetMeshCapability = gAgent.getRegion()->getCapability("GetMesh");
+ }
+ }
+
+ LLFastTimer t(FTM_MESH_UPDATE);
+
+ {
+ LLFastTimer t(FTM_MESH_LOCK1);
+ mMeshMutex->lock();
+ }
+
+ {
+ LLFastTimer t(FTM_MESH_LOCK2);
+ mThread->mMutex->lock();
+ }
+
+ //popup queued error messages from background threads
+ while (!mUploadErrorQ.empty())
+ {
+ LLNotificationsUtil::add("MeshUploadError", mUploadErrorQ.front());
+ mUploadErrorQ.pop();
+ }
+
+ S32 push_count = LLMeshRepoThread::sMaxConcurrentRequests-(LLMeshRepoThread::sActiveHeaderRequests+LLMeshRepoThread::sActiveLODRequests);
+
+ if (push_count > 0)
+ {
+ //calculate "score" for pending requests
+
+ //create score map
+ std::map<LLUUID, F32> score_map;
+
+ for (U32 i = 0; i < 4; ++i)
+ {
+ for (mesh_load_map::iterator iter = mLoadingMeshes[i].begin(); iter != mLoadingMeshes[i].end(); ++iter)
+ {
+ F32 max_score = 0.f;
+ for (std::set<LLUUID>::iterator obj_iter = iter->second.begin(); obj_iter != iter->second.end(); ++obj_iter)
+ {
+ LLViewerObject* object = gObjectList.findObject(*obj_iter);
+
+ if (object)
+ {
+ LLDrawable* drawable = object->mDrawable;
+ if (drawable)
+ {
+ F32 cur_score = drawable->getRadius()/llmax(drawable->mDistanceWRTCamera, 1.f);
+ max_score = llmax(max_score, cur_score);
+ }
+ }
+ }
+
+ score_map[iter->first.getSculptID()] = max_score;
+ }
+ }
+
+ //set "score" for pending requests
+ for (std::vector<LLMeshRepoThread::LODRequest>::iterator iter = mPendingRequests.begin(); iter != mPendingRequests.end(); ++iter)
+ {
+ iter->mScore = score_map[iter->mMeshParams.getSculptID()];
+ }
+
+ //sort by "score"
+ std::sort(mPendingRequests.begin(), mPendingRequests.end(), LLMeshRepoThread::CompareScoreGreater());
+
+ while (!mPendingRequests.empty() && push_count > 0)
+ {
+ LLFastTimer t(FTM_LOAD_MESH_LOD);
+ LLMeshRepoThread::LODRequest& request = mPendingRequests.front();
+ mThread->loadMeshLOD(request.mMeshParams, request.mLOD);
+ mPendingRequests.erase(mPendingRequests.begin());
+ push_count--;
+ }
+ }
+
+ //send skin info requests
+ while (!mPendingSkinRequests.empty())
+ {
+ mThread->loadMeshSkinInfo(mPendingSkinRequests.front());
+ mPendingSkinRequests.pop();
+ }
+
+ //send decomposition requests
+ while (!mPendingDecompositionRequests.empty())
+ {
+ mThread->loadMeshDecomposition(mPendingDecompositionRequests.front());
+ mPendingDecompositionRequests.pop();
+ }
+
+ //send physics shapes decomposition requests
+ while (!mPendingPhysicsShapeRequests.empty())
+ {
+ mThread->loadMeshPhysicsShape(mPendingPhysicsShapeRequests.front());
+ mPendingPhysicsShapeRequests.pop();
+ }
+
+ mThread->notifyLoadedMeshes();
+
+ mThread->mMutex->unlock();
+ mMeshMutex->unlock();
+
+ mThread->mSignal->signal();
+}
+
+void LLMeshRepository::notifySkinInfoReceived(LLMeshSkinInfo& info)
+{
+ mSkinMap[info.mMeshID] = info;
+
+ skin_load_map::iterator iter = mLoadingSkins.find(info.mMeshID);
+ if (iter != mLoadingSkins.end())
+ {
+ for (std::set<LLUUID>::iterator obj_id = iter->second.begin(); obj_id != iter->second.end(); ++obj_id)
+ {
+ LLVOVolume* vobj = (LLVOVolume*) gObjectList.findObject(*obj_id);
+ if (vobj)
+ {
+ vobj->notifyMeshLoaded();
+ }
+ }
+ }
+
+ mLoadingSkins.erase(info.mMeshID);
+}
+
+void LLMeshRepository::notifyDecompositionReceived(LLModel::Decomposition* decomp)
+{
+ decomposition_map::iterator iter = mDecompositionMap.find(decomp->mMeshID);
+ if (iter == mDecompositionMap.end())
+ { //just insert decomp into map
+ mDecompositionMap[decomp->mMeshID] = decomp;
+ }
+ else
+ { //merge decomp with existing entry
+ iter->second->merge(decomp);
+ delete decomp;
+ }
+
+ mLoadingDecompositions.erase(decomp->mMeshID);
+}
+
+void LLMeshRepository::notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVolume* volume)
+{ //called from main thread
+ S32 detail = LLVolumeLODGroup::getVolumeDetailFromScale(volume->getDetail());
+
+ //get list of objects waiting to be notified this mesh is loaded
+ mesh_load_map::iterator obj_iter = mLoadingMeshes[detail].find(mesh_params);
+
+ if (volume && obj_iter != mLoadingMeshes[detail].end())
+ {
+ //make sure target volume is still valid
+ if (volume->getNumVolumeFaces() <= 0)
+ {
+ llwarns << "Mesh loading returned empty volume." << llendl;
+ volume->makeTetrahedron();
+ }
+
+ { //update system volume
+ LLVolume* sys_volume = LLPrimitive::getVolumeManager()->refVolume(mesh_params, detail);
+ if (sys_volume)
+ {
+ sys_volume->copyVolumeFaces(volume);
+ LLPrimitive::getVolumeManager()->unrefVolume(sys_volume);
+ }
+ else
+ {
+ llwarns << "Couldn't find system volume for given mesh." << llendl;
+ }
+ }
+
+ //notify waiting LLVOVolume instances that their requested mesh is available
+ for (std::set<LLUUID>::iterator vobj_iter = obj_iter->second.begin(); vobj_iter != obj_iter->second.end(); ++vobj_iter)
+ {
+ LLVOVolume* vobj = (LLVOVolume*) gObjectList.findObject(*vobj_iter);
+ if (vobj)
+ {
+ vobj->notifyMeshLoaded();
+ }
+ }
+
+ mLoadingMeshes[detail].erase(mesh_params);
+ }
+}
+
+void LLMeshRepository::notifyMeshUnavailable(const LLVolumeParams& mesh_params, S32 lod)
+{ //called from main thread
+ //get list of objects waiting to be notified this mesh is loaded
+ mesh_load_map::iterator obj_iter = mLoadingMeshes[lod].find(mesh_params);
+
+ F32 detail = LLVolumeLODGroup::getVolumeScaleFromDetail(lod);
+
+ if (obj_iter != mLoadingMeshes[lod].end())
+ {
+ for (std::set<LLUUID>::iterator vobj_iter = obj_iter->second.begin(); vobj_iter != obj_iter->second.end(); ++vobj_iter)
+ {
+ LLVOVolume* vobj = (LLVOVolume*) gObjectList.findObject(*vobj_iter);
+ if (vobj)
+ {
+ LLVolume* obj_volume = vobj->getVolume();
+
+ if (obj_volume &&
+ obj_volume->getDetail() == detail &&
+ obj_volume->getParams() == mesh_params)
+ { //should force volume to find most appropriate LOD
+ vobj->setVolume(obj_volume->getParams(), lod);
+ }
+ }
+ }
+
+ mLoadingMeshes[lod].erase(mesh_params);
+ }
+}
+
+S32 LLMeshRepository::getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod)
+{
+ return mThread->getActualMeshLOD(mesh_params, lod);
+}
+
+U32 LLMeshRepository::calcResourceCost(LLSD& header)
+{
+ U32 bytes = 0;
+
+ for (U32 i = 0; i < 4; i++)
+ {
+ bytes += header[header_lod[i]]["size"].asInteger();
+ }
+
+ bytes += header["skin"]["size"].asInteger();
+
+ return bytes/4096 + 1;
+}
+
+U32 LLMeshRepository::getResourceCost(const LLUUID& mesh_id)
+{
+ return mThread->getResourceCost(mesh_id);
+}
+
+const LLMeshSkinInfo* LLMeshRepository::getSkinInfo(const LLUUID& mesh_id, LLVOVolume* requesting_obj)
+{
+ if (mesh_id.notNull())
+ {
+ skin_map::iterator iter = mSkinMap.find(mesh_id);
+ if (iter != mSkinMap.end())
+ {
+ return &(iter->second);
+ }
+
+ //no skin info known about given mesh, try to fetch it
+ {
+ LLMutexLock lock(mMeshMutex);
+ //add volume to list of loading meshes
+ skin_load_map::iterator iter = mLoadingSkins.find(mesh_id);
+ if (iter == mLoadingSkins.end())
+ { //no request pending for this skin info
+ mPendingSkinRequests.push(mesh_id);
+ }
+ mLoadingSkins[mesh_id].insert(requesting_obj->getID());
+ }
+ }
+
+ return NULL;
+}
+
+void LLMeshRepository::fetchPhysicsShape(const LLUUID& mesh_id)
+{
+ if (mesh_id.notNull())
+ {
+ LLModel::Decomposition* decomp = NULL;
+ decomposition_map::iterator iter = mDecompositionMap.find(mesh_id);
+ if (iter != mDecompositionMap.end())
+ {
+ decomp = iter->second;
+ }
+
+ //decomposition block hasn't been fetched yet
+ if (!decomp || decomp->mPhysicsShapeMesh.empty())
+ {
+ LLMutexLock lock(mMeshMutex);
+ //add volume to list of loading meshes
+ std::set<LLUUID>::iterator iter = mLoadingPhysicsShapes.find(mesh_id);
+ if (iter == mLoadingPhysicsShapes.end())
+ { //no request pending for this skin info
+ mLoadingPhysicsShapes.insert(mesh_id);
+ mPendingPhysicsShapeRequests.push(mesh_id);
+ }
+ }
+ }
+
+}
+
+LLModel::Decomposition* LLMeshRepository::getDecomposition(const LLUUID& mesh_id)
+{
+ LLModel::Decomposition* ret = NULL;
+
+ if (mesh_id.notNull())
+ {
+ decomposition_map::iterator iter = mDecompositionMap.find(mesh_id);
+ if (iter != mDecompositionMap.end())
+ {
+ ret = iter->second;
+ }
+
+ //decomposition block hasn't been fetched yet
+ if (!ret || ret->mBaseHullMesh.empty())
+ {
+ LLMutexLock lock(mMeshMutex);
+ //add volume to list of loading meshes
+ std::set<LLUUID>::iterator iter = mLoadingDecompositions.find(mesh_id);
+ if (iter == mLoadingDecompositions.end())
+ { //no request pending for this skin info
+ mLoadingDecompositions.insert(mesh_id);
+ mPendingDecompositionRequests.push(mesh_id);
+ }
+ }
+ }
+
+ return ret;
+}
+
+void LLMeshRepository::buildHull(const LLVolumeParams& params, S32 detail)
+{
+ LLVolume* volume = LLPrimitive::sVolumeManager->refVolume(params, detail);
+
+ if (!volume->mHullPoints)
+ {
+ //all default params
+ //execute first stage
+ //set simplify mode to retain
+ //set retain percentage to zero
+ //run second stage
+ }
+
+ LLPrimitive::sVolumeManager->unrefVolume(volume);
+}
+
+bool LLMeshRepository::hasPhysicsShape(const LLUUID& mesh_id)
+{
+ LLSD mesh = mThread->getMeshHeader(mesh_id);
+ return mesh.has("physics_shape") && mesh["physics_shape"].has("size") && (mesh["physics_shape"]["size"].asInteger() > 0);
+}
+
+LLSD& LLMeshRepository::getMeshHeader(const LLUUID& mesh_id)
+{
+ return mThread->getMeshHeader(mesh_id);
+}
+
+LLSD& LLMeshRepoThread::getMeshHeader(const LLUUID& mesh_id)
+{
+ static LLSD dummy_ret;
+ if (mesh_id.notNull())
+ {
+ LLMutexLock lock(mHeaderMutex);
+ mesh_header_map::iterator iter = mMeshHeader.find(mesh_id);
+ if (iter != mMeshHeader.end())
+ {
+ return iter->second;
+ }
+ }
+
+ return dummy_ret;
+}
+
+
+void LLMeshRepository::uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures,
+ bool upload_skin, bool upload_joints)
+{
+ LLMeshUploadThread* thread = new LLMeshUploadThread(data, scale, upload_textures, upload_skin, upload_joints);
+ mUploadWaitList.push_back(thread);
+}
+
+S32 LLMeshRepository::getMeshSize(const LLUUID& mesh_id, S32 lod)
+{
+ if (mThread)
+ {
+ LLMeshRepoThread::mesh_header_map::iterator iter = mThread->mMeshHeader.find(mesh_id);
+ if (iter != mThread->mMeshHeader.end())
+ {
+ LLSD& header = iter->second;
+
+ if (header.has("404"))
+ {
+ return -1;
+ }
+
+ S32 size = header[header_lod[lod]]["size"].asInteger();
+ return size;
+ }
+
+ }
+
+ return -1;
+
+}
+
+void LLMeshUploadThread::sendCostRequest(LLMeshUploadData& data)
+{
+ if(isDiscarded())
+ {
+ return ;
+ }
+
+ //write model file to memory buffer
+ std::stringstream ostr;
+
+ LLModel::Decomposition& decomp =
+ data.mModel[LLModel::LOD_PHYSICS].notNull() ?
+ data.mModel[LLModel::LOD_PHYSICS]->mPhysics :
+ data.mBaseModel->mPhysics;
+
+ LLSD header = LLModel::writeModel(
+ ostr,
+ data.mModel[LLModel::LOD_PHYSICS],
+ data.mModel[LLModel::LOD_HIGH],
+ data.mModel[LLModel::LOD_MEDIUM],
+ data.mModel[LLModel::LOD_LOW],
+ data.mModel[LLModel::LOD_IMPOSTOR],
+ decomp,
+ mUploadSkin,
+ mUploadJoints,
+ true);
+
+ std::string desc = data.mBaseModel->mLabel;
+
+ // Grab the total vertex count of the model
+ // along with other information for the "asset_resources" map
+ // to send to the server.
+ LLSD asset_resources = LLSD::emptyMap();
+
+
+ std::string url = mNewInventoryCapability;
+
+ if (!url.empty())
+ {
+ LLSD body = generate_new_resource_upload_capability_body(
+ LLAssetType::AT_MESH,
+ desc,
+ desc,
+ LLFolderType::FT_MESH,
+ LLInventoryType::IT_MESH,
+ LLFloaterPerms::getNextOwnerPerms(),
+ LLFloaterPerms::getGroupPerms(),
+ LLFloaterPerms::getEveryonePerms());
+
+ body["asset_resources"] = asset_resources;
+
+ mPendingConfirmations++;
+ LLCurlRequest::headers_t headers;
+
+ data.mPostData = body;
+
+ mCurlRequest->post(url, headers, body, new LLMeshCostResponder(data, this));
+ }
+}
+
+void LLMeshUploadThread::sendCostRequest(LLTextureUploadData& data)
+{
+ if(isDiscarded())
+ {
+ return ;
+ }
+
+ if (data.mTexture && data.mTexture->getDiscardLevel() >= 0)
+ {
+ LLSD asset_resources = LLSD::emptyMap();
+
+ std::string url = mNewInventoryCapability;
+
+ if (!url.empty())
+ {
+ LLSD body = generate_new_resource_upload_capability_body(
+ LLAssetType::AT_TEXTURE,
+ data.mLabel,
+ data.mLabel,
+ LLFolderType::FT_TEXTURE,
+ LLInventoryType::IT_TEXTURE,
+ LLFloaterPerms::getNextOwnerPerms(),
+ LLFloaterPerms::getGroupPerms(),
+ LLFloaterPerms::getEveryonePerms());
+
+ body["asset_resources"] = asset_resources;
+
+ mPendingConfirmations++;
+ LLCurlRequest::headers_t headers;
+
+ data.mPostData = body;
+ mCurlRequest->post(url, headers, body, new LLTextureCostResponder(data, this));
+ }
+ }
+}
+
+
+void LLMeshUploadThread::doUploadModel(LLMeshUploadData& data)
+{
+ if(isDiscarded())
+ {
+ return ;
+ }
+
+ if (!data.mRSVP.empty())
+ {
+ std::stringstream ostr;
+
+ LLModel::Decomposition& decomp =
+ data.mModel[LLModel::LOD_PHYSICS].notNull() ?
+ data.mModel[LLModel::LOD_PHYSICS]->mPhysics :
+ data.mBaseModel->mPhysics;
+
+ decomp.mBaseHull = mHullMap[data.mBaseModel];
+
+ LLModel::writeModel(
+ ostr,
+ data.mModel[LLModel::LOD_PHYSICS],
+ data.mModel[LLModel::LOD_HIGH],
+ data.mModel[LLModel::LOD_MEDIUM],
+ data.mModel[LLModel::LOD_LOW],
+ data.mModel[LLModel::LOD_IMPOSTOR],
+ decomp,
+ mUploadSkin,
+ mUploadJoints);
+
+ data.mAssetData = ostr.str();
+
+ LLCurlRequest::headers_t headers;
+ mPendingUploads++;
+
+ mCurlRequest->post(data.mRSVP, headers, data.mAssetData, new LLMeshUploadResponder(data, this));
+ }
+}
+
+void LLMeshUploadThread::doUploadTexture(LLTextureUploadData& data)
+{
+ if(isDiscarded())
+ {
+ return ;
+ }
+
+ if (!data.mRSVP.empty())
+ {
+ std::stringstream ostr;
+
+ if (!data.mTexture->isRawImageValid())
+ {
+ data.mTexture->reloadRawImage(data.mTexture->getDiscardLevel());
+ }
+
+ LLPointer<LLImageJ2C> upload_file = LLViewerTextureList::convertToUploadFile(data.mTexture->getRawImage());
+
+ ostr.write((const char*) upload_file->getData(), upload_file->getDataSize());
+
+ data.mAssetData = ostr.str();
+
+ LLCurlRequest::headers_t headers;
+ mPendingUploads++;
+
+ mCurlRequest->post(data.mRSVP, headers, data.mAssetData, new LLTextureUploadResponder(data, this));
+ }
+}
+
+
+void LLMeshUploadThread::onModelUploaded(LLMeshUploadData& data)
+{
+ createObjects(data);
+}
+
+void LLMeshUploadThread::onTextureUploaded(LLTextureUploadData& data)
+{
+ mTextureMap[data.mTexture] = data;
+}
+
+
+void LLMeshUploadThread::createObjects(LLMeshUploadData& data)
+{
+ instance_list& instances = mInstance[data.mBaseModel];
+
+ for (instance_list::iterator iter = instances.begin(); iter != instances.end(); ++iter)
+ { //create prims that reference given mesh
+ LLModelInstance& instance = *iter;
+ instance.mMeshID = data.mUUID;
+ mInstanceQ.push(instance);
+ }
+}
+
+void LLMeshUploadThread::decomposeMeshMatrix(LLMatrix4& transformation,
+ LLVector3& result_pos,
+ LLQuaternion& result_rot,
+ LLVector3& result_scale)
+{
+ // check for reflection
+ BOOL reflected = (transformation.determinant() < 0);
+
+ // compute position
+ LLVector3 position = LLVector3(0, 0, 0) * transformation;
+
+ // compute scale
+ LLVector3 x_transformed = LLVector3(1, 0, 0) * transformation - position;
+ LLVector3 y_transformed = LLVector3(0, 1, 0) * transformation - position;
+ LLVector3 z_transformed = LLVector3(0, 0, 1) * transformation - position;
+ F32 x_length = x_transformed.normalize();
+ F32 y_length = y_transformed.normalize();
+ F32 z_length = z_transformed.normalize();
+ LLVector3 scale = LLVector3(x_length, y_length, z_length);
+
+ // adjust for "reflected" geometry
+ LLVector3 x_transformed_reflected = x_transformed;
+ if (reflected)
+ {
+ x_transformed_reflected *= -1.0;
+ }
+
+ // compute rotation
+ LLMatrix3 rotation_matrix;
+ rotation_matrix.setRows(x_transformed_reflected, y_transformed, z_transformed);
+ LLQuaternion quat_rotation = rotation_matrix.quaternion();
+ quat_rotation.normalize(); // the rotation_matrix might not have been orthoginal. make it so here.
+ LLVector3 euler_rotation;
+ quat_rotation.getEulerAngles(&euler_rotation.mV[VX], &euler_rotation.mV[VY], &euler_rotation.mV[VZ]);
+
+ result_pos = position + mOrigin;
+ result_scale = scale;
+ result_rot = quat_rotation;
+}
+
+
+LLSD LLMeshUploadThread::createObject(LLModelInstance& instance)
+{
+ LLMatrix4 transformation = instance.mTransform;
+
+ llassert(instance.mMeshID.notNull());
+
+ // check for reflection
+ BOOL reflected = (transformation.determinant() < 0);
+
+ // compute position
+ LLVector3 position = LLVector3(0, 0, 0) * transformation;
+
+ // compute scale
+ LLVector3 x_transformed = LLVector3(1, 0, 0) * transformation - position;
+ LLVector3 y_transformed = LLVector3(0, 1, 0) * transformation - position;
+ LLVector3 z_transformed = LLVector3(0, 0, 1) * transformation - position;
+ F32 x_length = x_transformed.normalize();
+ F32 y_length = y_transformed.normalize();
+ F32 z_length = z_transformed.normalize();
+ LLVector3 scale = LLVector3(x_length, y_length, z_length);
+
+ // adjust for "reflected" geometry
+ LLVector3 x_transformed_reflected = x_transformed;
+ if (reflected)
+ {
+ x_transformed_reflected *= -1.0;
+ }
+
+ // compute rotation
+ LLMatrix3 rotation_matrix;
+ rotation_matrix.setRows(x_transformed_reflected, y_transformed, z_transformed);
+ LLQuaternion quat_rotation = rotation_matrix.quaternion();
+ quat_rotation.normalize(); // the rotation_matrix might not have been orthoginal. make it so here.
+ LLVector3 euler_rotation;
+ quat_rotation.getEulerAngles(&euler_rotation.mV[VX], &euler_rotation.mV[VY], &euler_rotation.mV[VZ]);
+
+ //
+ // build parameter block to construct this prim
+ //
+
+ LLSD object_params;
+
+ // create prim
+
+ // set volume params
+ U8 sculpt_type = LL_SCULPT_TYPE_MESH;
+ if (reflected)
+ {
+ sculpt_type |= LL_SCULPT_FLAG_MIRROR;
+ }
+ LLVolumeParams volume_params;
+ volume_params.setType( LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE );
+ volume_params.setBeginAndEndS( 0.f, 1.f );
+ volume_params.setBeginAndEndT( 0.f, 1.f );
+ volume_params.setRatio ( 1, 1 );
+ volume_params.setShear ( 0, 0 );
+ volume_params.setSculptID(instance.mMeshID, sculpt_type);
+ object_params["shape"] = volume_params.asLLSD();
+
+ object_params["material"] = LL_MCODE_WOOD;
+
+ object_params["group-id"] = gAgent.getGroupID();
+ object_params["pos"] = ll_sd_from_vector3(position + mOrigin);
+ object_params["rotation"] = ll_sd_from_quaternion(quat_rotation);
+ object_params["scale"] = ll_sd_from_vector3(scale);
+ object_params["name"] = instance.mLabel;
+
+ // load material from dae file
+ object_params["facelist"] = LLSD::emptyArray();
+ for (S32 i = 0; i < instance.mMaterial.size(); i++)
+ {
+ LLTextureEntry te;
+ LLImportMaterial& mat = instance.mMaterial[i];
+
+ te.setColor(mat.mDiffuseColor);
+
+ LLUUID diffuse_id = mTextureMap[mat.mDiffuseMap].mUUID;
+
+ if (diffuse_id.notNull())
+ {
+ te.setID(diffuse_id);
+ }
+ else
+ {
+ te.setID(LLUUID("5748decc-f629-461c-9a36-a35a221fe21f")); // blank texture
+ }
+
+ te.setFullbright(mat.mFullbright);
+
+ object_params["facelist"][i] = te.asLLSD();
+ }
+
+ // set extra parameters
+ LLSculptParams sculpt_params;
+ sculpt_params.setSculptTexture(instance.mMeshID);
+ sculpt_params.setSculptType(sculpt_type);
+ U8 buffer[MAX_OBJECT_PARAMS_SIZE+1];
+ LLDataPackerBinaryBuffer dp(buffer, MAX_OBJECT_PARAMS_SIZE);
+ sculpt_params.pack(dp);
+ std::vector<U8> v(dp.getCurrentSize());
+ memcpy(&v[0], buffer, dp.getCurrentSize());
+ LLSD extra_parameter;
+ extra_parameter["extra_parameter"] = sculpt_params.mType;
+ extra_parameter["param_data"] = v;
+ object_params["extra_parameters"].append(extra_parameter);
+
+ LLPermissions perm;
+ perm.setOwnerAndGroup(gAgent.getID(), gAgent.getID(), LLUUID::null, false);
+ perm.setCreator(gAgent.getID());
+
+ perm.initMasks(PERM_ITEM_UNRESTRICTED | PERM_MOVE, //base
+ PERM_ITEM_UNRESTRICTED | PERM_MOVE, //owner
+ LLFloaterPerms::getEveryonePerms(),
+ LLFloaterPerms::getGroupPerms(),
+ LLFloaterPerms::getNextOwnerPerms());
+
+ object_params["permissions"] = ll_create_sd_from_permissions(perm);
+
+ object_params["physics_shape_type"] = (U8)(LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL);
+
+ return object_params;
+}
+
+void LLMeshUploadThread::priceResult(LLMeshUploadData& data, const LLSD& content)
+{
+ mPendingCost += content["upload_price"].asInteger();
+ data.mRSVP = content["rsvp"].asString();
+
+ mConfirmedQ.push(data);
+}
+
+void LLMeshUploadThread::priceResult(LLTextureUploadData& data, const LLSD& content)
+{
+ mPendingCost += content["upload_price"].asInteger();
+ data.mRSVP = content["rsvp"].asString();
+
+ mConfirmedTextureQ.push(data);
+}
+
+
+bool LLImportMaterial::operator<(const LLImportMaterial &rhs) const
+{
+ if (mDiffuseMap != rhs.mDiffuseMap)
+ {
+ return mDiffuseMap < rhs.mDiffuseMap;
+ }
+
+ if (mDiffuseMapFilename != rhs.mDiffuseMapFilename)
+ {
+ return mDiffuseMapFilename < rhs.mDiffuseMapFilename;
+ }
+
+ if (mDiffuseMapLabel != rhs.mDiffuseMapLabel)
+ {
+ return mDiffuseMapLabel < rhs.mDiffuseMapLabel;
+ }
+
+ if (mDiffuseColor != rhs.mDiffuseColor)
+ {
+ return mDiffuseColor < rhs.mDiffuseColor;
+ }
+
+ return mFullbright < rhs.mFullbright;
+}
+
+
+void LLMeshRepository::updateInventory(inventory_data data)
+{
+ LLMutexLock lock(mMeshMutex);
+ dumpLLSDToFile(data.mPostData,"update_inventory_post_data.xml");
+ dumpLLSDToFile(data.mResponse,"update_inventory_response.xml");
+ mInventoryQ.push(data);
+}
+
+void LLMeshRepository::uploadError(LLSD& args)
+{
+ LLMutexLock lock(mMeshMutex);
+ mUploadErrorQ.push(args);
+}
+
+//static
+F32 LLMeshRepository::getStreamingCost(LLSD& header, F32 radius, S32* bytes, S32* bytes_visible, S32 lod)
+{
+ F32 dlowest = llmin(radius/0.03f, 256.f);
+ F32 dlow = llmin(radius/0.06f, 256.f);
+ F32 dmid = llmin(radius/0.24f, 256.f);
+
+ F32 bytes_lowest = header["lowest_lod"]["size"].asReal()/1024.f;
+ F32 bytes_low = header["low_lod"]["size"].asReal()/1024.f;
+ F32 bytes_mid = header["medium_lod"]["size"].asReal()/1024.f;
+ F32 bytes_high = header["high_lod"]["size"].asReal()/1024.f;
+
+ if (bytes)
+ {
+ *bytes = 0;
+ *bytes += header["lowest_lod"]["size"].asInteger();
+ *bytes += header["low_lod"]["size"].asInteger();
+ *bytes += header["medium_lod"]["size"].asInteger();
+ *bytes += header["high_lod"]["size"].asInteger();
+ }
+
+
+ if (bytes_visible)
+ {
+ lod = LLMeshRepository::getActualMeshLOD(header, lod);
+ if (lod >= 0 && lod <= 3)
+ {
+ *bytes_visible = header[header_lod[lod]]["size"].asInteger();
+ }
+ }
+
+ if (bytes_high == 0.f)
+ {
+ return 0.f;
+ }
+
+ if (bytes_mid == 0.f)
+ {
+ bytes_mid = bytes_high;
+ }
+
+ if (bytes_low == 0.f)
+ {
+ bytes_low = bytes_mid;
+ }
+
+ if (bytes_lowest == 0.f)
+ {
+ bytes_lowest = bytes_low;
+ }
+
+ F32 max_area = 65536.f;
+ F32 min_area = 1.f;
+
+ F32 high_area = llmin(F_PI*dmid*dmid, max_area);
+ F32 mid_area = llmin(F_PI*dlow*dlow, max_area);
+ F32 low_area = llmin(F_PI*dlowest*dlowest, max_area);
+ F32 lowest_area = max_area;
+
+ lowest_area -= low_area;
+ low_area -= mid_area;
+ mid_area -= high_area;
+
+ high_area = llclamp(high_area, min_area, max_area);
+ mid_area = llclamp(mid_area, min_area, max_area);
+ low_area = llclamp(low_area, min_area, max_area);
+ lowest_area = llclamp(lowest_area, min_area, max_area);
+
+ F32 total_area = high_area + mid_area + low_area + lowest_area;
+ high_area /= total_area;
+ mid_area /= total_area;
+ low_area /= total_area;
+ lowest_area /= total_area;
+
+ F32 weighted_avg = bytes_high*high_area +
+ bytes_mid*mid_area +
+ bytes_low*low_area +
+ bytes_lowest*lowest_area;
+
+ return weighted_avg * gSavedSettings.getF32("MeshStreamingCostScaler");
+}
+
+
+LLPhysicsDecomp::LLPhysicsDecomp()
+: LLThread("Physics Decomp")
+{
+ mInited = false;
+ mQuitting = false;
+ mDone = false;
+
+ mSignal = new LLCondition(NULL);
+ mMutex = new LLMutex(NULL);
+}
+
+LLPhysicsDecomp::~LLPhysicsDecomp()
+{
+ shutdown();
+
+ delete mSignal;
+ mSignal = NULL;
+ delete mMutex;
+ mMutex = NULL;
+}
+
+void LLPhysicsDecomp::shutdown()
+{
+ if (mSignal)
+ {
+ mQuitting = true;
+ mSignal->signal();
+
+ while (!isStopped())
+ {
+ apr_sleep(10);
+ }
+ }
+}
+
+void LLPhysicsDecomp::submitRequest(LLPhysicsDecomp::Request* request)
+{
+ LLMutexLock lock(mMutex);
+ mRequestQ.push(request);
+ mSignal->signal();
+}
+
+//static
+S32 LLPhysicsDecomp::llcdCallback(const char* status, S32 p1, S32 p2)
+{
+ if (gMeshRepo.mDecompThread && gMeshRepo.mDecompThread->mCurRequest.notNull())
+ {
+ return gMeshRepo.mDecompThread->mCurRequest->statusCallback(status, p1, p2);
+ }
+
+ return 1;
+}
+
+void LLPhysicsDecomp::setMeshData(LLCDMeshData& mesh)
+{
+ mesh.mVertexBase = mCurRequest->mPositions[0].mV;
+ mesh.mVertexStrideBytes = 12;
+ mesh.mNumVertices = mCurRequest->mPositions.size();
+
+ mesh.mIndexType = LLCDMeshData::INT_16;
+ mesh.mIndexBase = &(mCurRequest->mIndices[0]);
+ mesh.mIndexStrideBytes = 6;
+
+ mesh.mNumTriangles = mCurRequest->mIndices.size()/3;
+
+ LLCDResult ret = LLCD_OK;
+ if (LLConvexDecomposition::getInstance() != NULL)
+ {
+ ret = LLConvexDecomposition::getInstance()->setMeshData(&mesh);
+ }
+
+ if (ret)
+ {
+ llerrs << "Convex Decomposition thread valid but could not set mesh data" << llendl;
+ }
+}
+
+void LLPhysicsDecomp::doDecomposition()
+{
+ LLCDMeshData mesh;
+ S32 stage = mStageID[mCurRequest->mStage];
+
+ if (LLConvexDecomposition::getInstance() == NULL)
+ {
+ // stub library. do nothing.
+ return;
+ }
+
+ //load data intoLLCD
+ if (stage == 0)
+ {
+ setMeshData(mesh);
+ }
+
+ //build parameter map
+ std::map<std::string, const LLCDParam*> param_map;
+
+ static const LLCDParam* params = NULL;
+ static S32 param_count = 0;
+ if (!params)
+ {
+ param_count = LLConvexDecomposition::getInstance()->getParameters(&params);
+ }
+
+ for (S32 i = 0; i < param_count; ++i)
+ {
+ param_map[params[i].mName] = params+i;
+ }
+
+ //set parameter values
+ for (decomp_params::iterator iter = mCurRequest->mParams.begin(); iter != mCurRequest->mParams.end(); ++iter)
+ {
+ const std::string& name = iter->first;
+ const LLSD& value = iter->second;
+
+ const LLCDParam* param = param_map[name];
+
+ if (param == NULL)
+ { //couldn't find valid parameter
+ continue;
+ }
+
+ U32 ret = LLCD_OK;
+
+ if (param->mType == LLCDParam::LLCD_FLOAT)
+ {
+ ret = LLConvexDecomposition::getInstance()->setParam(param->mName, (F32) value.asReal());
+ }
+ else if (param->mType == LLCDParam::LLCD_INTEGER ||
+ param->mType == LLCDParam::LLCD_ENUM)
+ {
+ ret = LLConvexDecomposition::getInstance()->setParam(param->mName, value.asInteger());
+ }
+ else if (param->mType == LLCDParam::LLCD_BOOLEAN)
+ {
+ ret = LLConvexDecomposition::getInstance()->setParam(param->mName, value.asBoolean());
+ }
+ }
+
+ mCurRequest->setStatusMessage("Executing.");
+
+ LLCDResult ret = LLCD_OK;
+
+ if (LLConvexDecomposition::getInstance() != NULL)
+ {
+ ret = LLConvexDecomposition::getInstance()->executeStage(stage);
+ }
+
+ if (ret)
+ {
+ llwarns << "Convex Decomposition thread valid but could not execute stage " << stage << llendl;
+ LLMutexLock lock(mMutex);
+
+ mCurRequest->mHull.clear();
+ mCurRequest->mHullMesh.clear();
+
+ mCurRequest->setStatusMessage("FAIL");
+
+ completeCurrent();
+ }
+ else
+ {
+ mCurRequest->setStatusMessage("Reading results");
+
+ S32 num_hulls =0;
+ if (LLConvexDecomposition::getInstance() != NULL)
+ {
+ num_hulls = LLConvexDecomposition::getInstance()->getNumHullsFromStage(stage);
+ }
+
+ mMutex->lock();
+ mCurRequest->mHull.clear();
+ mCurRequest->mHull.resize(num_hulls);
+
+ mCurRequest->mHullMesh.clear();
+ mCurRequest->mHullMesh.resize(num_hulls);
+ mMutex->unlock();
+
+ for (S32 i = 0; i < num_hulls; ++i)
+ {
+ std::vector<LLVector3> p;
+ LLCDHull hull;
+ // if LLConvexDecomposition is a stub, num_hulls should have been set to 0 above, and we should not reach this code
+ LLConvexDecomposition::getInstance()->getHullFromStage(stage, i, &hull);
+
+ const F32* v = hull.mVertexBase;
+
+ for (S32 j = 0; j < hull.mNumVertices; ++j)
+ {
+ LLVector3 vert(v[0], v[1], v[2]);
+ p.push_back(vert);
+ v = (F32*) (((U8*) v) + hull.mVertexStrideBytes);
+ }
+
+ LLCDMeshData mesh;
+ // if LLConvexDecomposition is a stub, num_hulls should have been set to 0 above, and we should not reach this code
+ LLConvexDecomposition::getInstance()->getMeshFromStage(stage, i, &mesh);
+
+ get_vertex_buffer_from_mesh(mesh, mCurRequest->mHullMesh[i]);
+
+ mMutex->lock();
+ mCurRequest->mHull[i] = p;
+ mMutex->unlock();
+ }
+
+ {
+ LLMutexLock lock(mMutex);
+
+ mCurRequest->setStatusMessage("FAIL");
+ completeCurrent();
+ }
+ }
+}
+
+void LLPhysicsDecomp::completeCurrent()
+{
+ LLMutexLock lock(mMutex);
+ mCompletedQ.push(mCurRequest);
+ mCurRequest = NULL;
+}
+
+void LLPhysicsDecomp::notifyCompleted()
+{
+ if (!mCompletedQ.empty())
+ {
+ LLMutexLock lock(mMutex);
+ while (!mCompletedQ.empty())
+ {
+ Request* req = mCompletedQ.front();
+ req->completed();
+ mCompletedQ.pop();
+ }
+ }
+}
+
+
+void make_box(LLPhysicsDecomp::Request * request)
+{
+ LLVector3 min,max;
+ min = request->mPositions[0];
+ max = min;
+
+ for (U32 i = 0; i < request->mPositions.size(); ++i)
+ {
+ update_min_max(min, max, request->mPositions[i]);
+ }
+
+ request->mHull.clear();
+
+ LLModel::hull box;
+ box.push_back(LLVector3(min[0],min[1],min[2]));
+ box.push_back(LLVector3(max[0],min[1],min[2]));
+ box.push_back(LLVector3(min[0],max[1],min[2]));
+ box.push_back(LLVector3(max[0],max[1],min[2]));
+ box.push_back(LLVector3(min[0],min[1],max[2]));
+ box.push_back(LLVector3(max[0],min[1],max[2]));
+ box.push_back(LLVector3(min[0],max[1],max[2]));
+ box.push_back(LLVector3(max[0],max[1],max[2]));
+
+ request->mHull.push_back(box);
+}
+
+
+void LLPhysicsDecomp::doDecompositionSingleHull()
+{
+ LLCDMeshData mesh;
+
+ setMeshData(mesh);
+
+
+ //set all parameters to default
+ std::map<std::string, const LLCDParam*> param_map;
+
+ static const LLCDParam* params = NULL;
+ static S32 param_count = 0;
+
+ if (!params)
+ {
+ param_count = LLConvexDecomposition::getInstance()->getParameters(&params);
+ }
+
+ LLConvexDecomposition* decomp = LLConvexDecomposition::getInstance();
+
+ if (decomp == NULL)
+ {
+ //stub. do nothing.
+ return;
+ }
+
+ for (S32 i = 0; i < param_count; ++i)
+ {
+ decomp->setParam(params[i].mName, params[i].mDefault.mIntOrEnumValue);
+ }
+
+ const S32 STAGE_DECOMPOSE = mStageID["Decompose"];
+ const S32 STAGE_SIMPLIFY = mStageID["Simplify"];
+ const S32 DECOMP_PREVIEW = 0;
+ const S32 SIMPLIFY_RETAIN = 0;
+
+ decomp->setParam("Decompose Quality", DECOMP_PREVIEW);
+ decomp->setParam("Simplify Method", SIMPLIFY_RETAIN);
+ decomp->setParam("Retain%", 0.f);
+
+ LLCDResult ret = LLCD_OK;
+ ret = decomp->executeStage(STAGE_DECOMPOSE);
+
+ if (ret)
+ {
+ llwarns << "Could not execute decomposition stage when attempting to create single hull." << llendl;
+ make_box(mCurRequest);
+ }
+ else
+ {
+ ret = decomp->executeStage(STAGE_SIMPLIFY);
+
+ if (ret)
+ {
+ llwarns << "Could not execute simiplification stage when attempting to create single hull." << llendl;
+ make_box(mCurRequest);
+ }
+ else
+ {
+ S32 num_hulls =0;
+ if (LLConvexDecomposition::getInstance() != NULL)
+ {
+ num_hulls = LLConvexDecomposition::getInstance()->getNumHullsFromStage(STAGE_SIMPLIFY);
+ }
+
+ mMutex->lock();
+ mCurRequest->mHull.clear();
+ mCurRequest->mHull.resize(num_hulls);
+ mCurRequest->mHullMesh.clear();
+ mMutex->unlock();
+
+ for (S32 i = 0; i < num_hulls; ++i)
+ {
+ std::vector<LLVector3> p;
+ LLCDHull hull;
+ // if LLConvexDecomposition is a stub, num_hulls should have been set to 0 above, and we should not reach this code
+ LLConvexDecomposition::getInstance()->getHullFromStage(STAGE_SIMPLIFY, i, &hull);
+
+ const F32* v = hull.mVertexBase;
+
+ for (S32 j = 0; j < hull.mNumVertices; ++j)
+ {
+ LLVector3 vert(v[0], v[1], v[2]);
+ p.push_back(vert);
+ v = (F32*) (((U8*) v) + hull.mVertexStrideBytes);
+ }
+
+ mMutex->lock();
+ mCurRequest->mHull[i] = p;
+ mMutex->unlock();
+ }
+ }
+ }
+
+
+ {
+ completeCurrent();
+
+ }
+}
+
+
+void LLPhysicsDecomp::run()
+{
+ LLConvexDecomposition* decomp = LLConvexDecomposition::getInstance();
+ if (decomp == NULL)
+ {
+ // stub library. Set init to true so the main thread
+ // doesn't wait for this to finish.
+ mInited = true;
+ return;
+ }
+
+ decomp->initThread();
+ mInited = true;
+
+ static const LLCDStageData* stages = NULL;
+ static S32 num_stages = 0;
+
+ if (!stages)
+ {
+ num_stages = decomp->getStages(&stages);
+ }
+
+ for (S32 i = 0; i < num_stages; i++)
+ {
+ mStageID[stages[i].mName] = i;
+ }
+
+ while (!mQuitting)
+ {
+ mSignal->wait();
+ while (!mQuitting && !mRequestQ.empty())
+ {
+ {
+ LLMutexLock lock(mMutex);
+ mCurRequest = mRequestQ.front();
+ mRequestQ.pop();
+ }
+
+ S32& id = *(mCurRequest->mDecompID);
+ if (id == -1)
+ {
+ decomp->genDecomposition(id);
+ }
+ decomp->bindDecomposition(id);
+
+ if (mCurRequest->mStage == "single_hull")
+ {
+ doDecompositionSingleHull();
+ }
+ else
+ {
+ doDecomposition();
+ }
+ }
+ }
+
+ decomp->quitThread();
+
+ if (mSignal->isLocked())
+ { //let go of mSignal's associated mutex
+ mSignal->unlock();
+ }
+
+ mDone = true;
+}
+
+void LLPhysicsDecomp::Request::updateTriangleAreaThreshold()
+{
+ F32 range = mBBox[1].mV[0] - mBBox[0].mV[0] ;
+ range = llmin(range, mBBox[1].mV[1] - mBBox[0].mV[1]) ;
+ range = llmin(range, mBBox[1].mV[2] - mBBox[0].mV[2]) ;
+
+ mTriangleAreaThreshold = llmin(0.0002f, range * 0.000002f) ;
+}
+
+//check if the triangle area is large enough to qualify for a valid triangle
+bool LLPhysicsDecomp::Request::isValidTriangle(U16 idx1, U16 idx2, U16 idx3)
+{
+ LLVector3 a = mPositions[idx2] - mPositions[idx1] ;
+ LLVector3 b = mPositions[idx3] - mPositions[idx1] ;
+ F32 c = a * b ;
+
+ return ((a*a) * (b*b) - c * c) > mTriangleAreaThreshold ;
+}
+
+void LLPhysicsDecomp::Request::setStatusMessage(const std::string& msg)
+{
+ mStatusMessage = msg;
+}
+
+LLModelInstance::LLModelInstance(LLSD& data)
+{
+ mLocalMeshID = data["mesh_id"].asInteger();
+ mLabel = data["label"].asString();
+ mTransform.setValue(data["transform"]);
+
+ for (U32 i = 0; i < data["material"].size(); ++i)
+ {
+ mMaterial.push_back(LLImportMaterial(data["material"][i]));
+ }
+}
+
+
+LLSD LLModelInstance::asLLSD()
+{
+ LLSD ret;
+
+ ret["mesh_id"] = mModel->mLocalID;
+ ret["label"] = mLabel;
+ ret["transform"] = mTransform.getValue();
+
+ for (U32 i = 0; i < mMaterial.size(); ++i)
+ {
+ ret["material"][i] = mMaterial[i].asLLSD();
+ }
+
+ return ret;
+}
+
+LLImportMaterial::LLImportMaterial(LLSD& data)
+{
+ mDiffuseMapFilename = data["diffuse"]["filename"].asString();
+ mDiffuseMapLabel = data["diffuse"]["label"].asString();
+ mDiffuseColor.setValue(data["diffuse"]["color"]);
+ mFullbright = data["fullbright"].asBoolean();
+}
+
+
+LLSD LLImportMaterial::asLLSD()
+{
+ LLSD ret;
+
+ ret["diffuse"]["filename"] = mDiffuseMapFilename;
+ ret["diffuse"]["label"] = mDiffuseMapLabel;
+ ret["diffuse"]["color"] = mDiffuseColor.getValue();
+ ret["fullbright"] = mFullbright;
+
+ return ret;
+}
+
+void LLMeshRepository::buildPhysicsMesh(LLModel::Decomposition& decomp)
+{
+ decomp.mMesh.resize(decomp.mHull.size());
+
+ for (U32 i = 0; i < decomp.mHull.size(); ++i)
+ {
+ LLCDHull hull;
+ hull.mNumVertices = decomp.mHull[i].size();
+ hull.mVertexBase = decomp.mHull[i][0].mV;
+ hull.mVertexStrideBytes = 12;
+
+ LLCDMeshData mesh;
+ LLCDResult res = LLCD_OK;
+ if (LLConvexDecomposition::getInstance() != NULL)
+ {
+ res = LLConvexDecomposition::getInstance()->getMeshFromHull(&hull, &mesh);
+ }
+ if (res == LLCD_OK)
+ {
+ get_vertex_buffer_from_mesh(mesh, decomp.mMesh[i]);
+ }
+ }
+
+ if (!decomp.mBaseHull.empty() && decomp.mBaseHullMesh.empty())
+ { //get mesh for base hull
+ LLCDHull hull;
+ hull.mNumVertices = decomp.mBaseHull.size();
+ hull.mVertexBase = decomp.mBaseHull[0].mV;
+ hull.mVertexStrideBytes = 12;
+
+ LLCDMeshData mesh;
+ LLCDResult res = LLCD_OK;
+ if (LLConvexDecomposition::getInstance() != NULL)
+ {
+ res = LLConvexDecomposition::getInstance()->getMeshFromHull(&hull, &mesh);
+ }
+ if (res == LLCD_OK)
+ {
+ get_vertex_buffer_from_mesh(mesh, decomp.mBaseHullMesh);
+ }
+ }
+}
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index d3fd959152..4b961db5f9 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -889,11 +889,11 @@ void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32
LLViewerStats::getInstance()->incStat(LLViewerStats::ST_CHAT_COUNT);
}
-class LLChatHandler : public LLCommandHandler
+class LLChatCommandHandler : public LLCommandHandler
{
public:
// not allowed from outside the app
- LLChatHandler() : LLCommandHandler("chat", UNTRUSTED_BLOCK) { }
+ LLChatCommandHandler() : LLCommandHandler("chat", UNTRUSTED_BLOCK) { }
// Your code here
bool handle(const LLSD& tokens, const LLSD& query_map,
@@ -909,7 +909,7 @@ public:
{
S32 channel = tokens[0].asInteger();
// VWR-19499 Restrict function to chat channels greater than 0.
- if ((channel > 0) && (channel < 2147483647))
+ if ((channel > 0) && (channel < CHAT_CHANNEL_DEBUG))
{
retval = true;
// Send unescaped message, see EXT-6353.
@@ -927,6 +927,6 @@ public:
};
// Creating the object registers with the dispatcher.
-LLChatHandler gChatHandler;
+LLChatCommandHandler gChatHandler;
diff --git a/indra/newview/llnearbychatbarlistener.cpp b/indra/newview/llnearbychatbarlistener.cpp
new file mode 100644
index 0000000000..a63e1fb76e
--- /dev/null
+++ b/indra/newview/llnearbychatbarlistener.cpp
@@ -0,0 +1,100 @@
+/**
+ * @file llnearbychatbarlistener.cpp
+ * @author Dave Simmons
+ * @date 2011-03-15
+ * @brief Implementation for LLNearbyChatBarListener.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llnearbychatbarlistener.h"
+#include "llnearbychatbar.h"
+
+#include "llagent.h"
+#include "llchat.h"
+
+
+
+LLNearbyChatBarListener::LLNearbyChatBarListener(LLNearbyChatBar & chatbar)
+ : LLEventAPI("LLChatBar",
+ "LLChatBar listener to (e.g.) sendChat, etc."),
+ mChatbar(chatbar)
+{
+ add("sendChat",
+ "Send chat to the simulator:\n"
+ "[\"message\"] chat message text [required]\n"
+ "[\"channel\"] chat channel number [default = 0]\n"
+ "[\"type\"] chat type \"whisper\", \"normal\", \"shout\" [default = \"normal\"]",
+ &LLNearbyChatBarListener::sendChat);
+}
+
+
+// "sendChat" command
+void LLNearbyChatBarListener::sendChat(LLSD const & chat_data) const
+{
+ // Extract the data
+ std::string chat_text = chat_data["message"].asString();
+
+ S32 channel = 0;
+ if (chat_data.has("channel"))
+ {
+ channel = chat_data["channel"].asInteger();
+ if (channel < 0 || channel >= CHAT_CHANNEL_DEBUG)
+ { // Use 0 up to (but not including) CHAT_CHANNEL_DEBUG
+ channel = 0;
+ }
+ }
+
+ EChatType type_o_chat = CHAT_TYPE_NORMAL;
+ if (chat_data.has("type"))
+ {
+ std::string type_string = chat_data["type"].asString();
+ if (type_string == "whisper")
+ {
+ type_o_chat = CHAT_TYPE_WHISPER;
+ }
+ else if (type_string == "shout")
+ {
+ type_o_chat = CHAT_TYPE_SHOUT;
+ }
+ }
+
+ // Have to prepend /42 style channel numbers
+ std::string chat_to_send;
+ if (channel == 0)
+ {
+ chat_to_send = chat_text;
+ }
+ else
+ {
+ chat_to_send += "/";
+ chat_to_send += chat_data["channel"].asString();
+ chat_to_send += " ";
+ chat_to_send += chat_text;
+ }
+
+ // Send it as if it was typed in
+ mChatbar.sendChatFromViewer(chat_to_send, type_o_chat, (BOOL)(channel == 0));
+}
+
diff --git a/indra/newview/llnearbychatbarlistener.h b/indra/newview/llnearbychatbarlistener.h
new file mode 100644
index 0000000000..9af9bc1f7b
--- /dev/null
+++ b/indra/newview/llnearbychatbarlistener.h
@@ -0,0 +1,50 @@
+/**
+ * @file llnearbychatbarlistener.h
+ * @author Dave Simmons
+ * @date 2011-03-15
+ * @brief Class definition for LLNearbyChatBarListener.
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+
+#ifndef LL_LLNEARBYCHATBARLISTENER_H
+#define LL_LLNEARBYCHATBARLISTENER_H
+
+#include "lleventapi.h"
+
+class LLSD;
+class LLNearbyChatBar;
+
+class LLNearbyChatBarListener : public LLEventAPI
+{
+public:
+ LLNearbyChatBarListener(LLNearbyChatBar & chatbar);
+
+private:
+ void sendChat(LLSD const & chat_data) const;
+
+ LLNearbyChatBar & mChatbar;
+};
+
+#endif // LL_LLNEARBYCHATBARLISTENER_H
+
diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp
index b56fb65a4c..11dc496311 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -441,6 +441,8 @@ void LLNearbyChatScreenChannel::reshape (S32 width, S32 height, BOOL called_fr
//-----------------------------------------------------------------------------------------------
//LLNearbyChatHandler
//-----------------------------------------------------------------------------------------------
+boost::scoped_ptr<LLEventPump> LLNearbyChatHandler::sChatWatcher(new LLEventStream("LLChat"));
+
LLNearbyChatHandler::LLNearbyChatHandler(e_notification_type type, const LLSD& id)
{
mType = type;
@@ -487,6 +489,27 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
// tmp_chat.mFromName = tmp_chat.mFromID.asString();
}
+ // Build notification data
+ LLSD notification;
+ notification["message"] = chat_msg.mText;
+ notification["from"] = chat_msg.mFromName;
+ notification["from_id"] = chat_msg.mFromID;
+ notification["time"] = chat_msg.mTime;
+ notification["source"] = (S32)chat_msg.mSourceType;
+ notification["chat_type"] = (S32)chat_msg.mChatType;
+ notification["chat_style"] = (S32)chat_msg.mChatStyle;
+ // Pass sender info so that it can be rendered properly (STORM-1021).
+ notification["sender_slurl"] = LLViewerChat::getSenderSLURL(chat_msg, args);
+
+ if (chat_msg.mChatType == CHAT_TYPE_DIRECT &&
+ chat_msg.mText.length() > 0 &&
+ chat_msg.mText[0] == '@')
+ {
+ // Send event on to LLEventStream and exit
+ sChatWatcher->post(notification);
+ return;
+ }
+
// don't show toast and add message to chat history on receive debug message
// with disabled setting showing script errors or enabled setting to show script
// errors in separate window.
@@ -529,6 +552,10 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
}
+ // Send event on to LLEventStream
+ sChatWatcher->post(notification);
+
+
if( nearby_chat->getVisible()
|| ( chat_msg.mSourceType == CHAT_SOURCE_AGENT
&& gSavedSettings.getBOOL("UseChatBubbles") )
@@ -562,25 +589,14 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
}
*/
- // Add a nearby chat toast.
- LLUUID id;
- id.generate();
-
LLNearbyChatScreenChannel* channel = dynamic_cast<LLNearbyChatScreenChannel*>(mChannel);
-
if(channel)
{
- LLSD notification;
+ // Add a nearby chat toast.
+ LLUUID id;
+ id.generate();
notification["id"] = id;
- notification["message"] = chat_msg.mText;
- notification["from"] = chat_msg.mFromName;
- notification["from_id"] = chat_msg.mFromID;
- notification["time"] = chat_msg.mTime;
- notification["source"] = (S32)chat_msg.mSourceType;
- notification["chat_type"] = (S32)chat_msg.mChatType;
- notification["chat_style"] = (S32)chat_msg.mChatStyle;
-
std::string r_color_name = "White";
F32 r_color_alpha = 1.0f;
LLViewerChat::getChatColor( chat_msg, r_color_name, r_color_alpha);
@@ -588,13 +604,8 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
notification["text_color"] = r_color_name;
notification["color_alpha"] = r_color_alpha;
notification["font_size"] = (S32)LLViewerChat::getChatFontSize() ;
-
- // Pass sender info so that it can be rendered properly (STORM-1021).
- notification["sender_slurl"] = LLViewerChat::getSenderSLURL(chat_msg, args);
-
channel->addNotification(notification);
}
-
}
void LLNearbyChatHandler::onDeleteToast(LLToast* toast)
diff --git a/indra/newview/llnearbychathandler.h b/indra/newview/llnearbychathandler.h
index ec1f29cdfc..b0e4f62d51 100644
--- a/indra/newview/llnearbychathandler.h
+++ b/indra/newview/llnearbychathandler.h
@@ -29,6 +29,8 @@
#include "llnotificationhandler.h"
+class LLEventPump;
+
//add LLNearbyChatHandler to LLNotificationsUI namespace
namespace LLNotificationsUI{
@@ -44,6 +46,8 @@ public:
protected:
virtual void onDeleteToast(LLToast* toast);
virtual void initChannel();
+
+ static boost::scoped_ptr<LLEventPump> sChatWatcher;
};
}
diff --git a/indra/newview/llnotificationmanager.h b/indra/newview/llnotificationmanager.h
index 72fa394621..16e82e4cce 100644
--- a/indra/newview/llnotificationmanager.h
+++ b/indra/newview/llnotificationmanager.h
@@ -69,7 +69,7 @@ public:
private:
//TODO (*)
std::map<std::string, boost::shared_ptr<LLEventHandler> > mNotifyHandlers;
- std::map<std::string, LLChatHandler*> mChatHandlers;
+ // cruft std::map<std::string, LLChatHandler*> mChatHandlers;
};
}
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index ddce83c616..ddce83c616 100644..100755
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h
index 29db110523..29db110523 100644..100755
--- a/indra/newview/llpanelpicks.h
+++ b/indra/newview/llpanelpicks.h
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index fd5c3362bb..fd5c3362bb 100644..100755
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
diff --git a/indra/newview/llpanelprofile.h b/indra/newview/llpanelprofile.h
index fca359f51e..fca359f51e 100644..100755
--- a/indra/newview/llpanelprofile.h
+++ b/indra/newview/llpanelprofile.h
diff --git a/indra/newview/llpanelvoicedevicesettings.cpp b/indra/newview/llpanelvoicedevicesettings.cpp
index dc87bd0077..4a80bbbe5e 100644
--- a/indra/newview/llpanelvoicedevicesettings.cpp
+++ b/indra/newview/llpanelvoicedevicesettings.cpp
@@ -191,7 +191,21 @@ void LLPanelVoiceDeviceSettings::refresh()
mCtrlInputDevices = getChild<LLComboBox>("voice_input_device");
mCtrlOutputDevices = getChild<LLComboBox>("voice_output_device");
- if(!LLVoiceClient::getInstance()->deviceSettingsAvailable())
+ bool device_settings_available = LLVoiceClient::getInstance()->deviceSettingsAvailable();
+
+ if (mCtrlInputDevices)
+ {
+ mCtrlInputDevices->setEnabled(device_settings_available);
+ }
+
+ if (mCtrlOutputDevices)
+ {
+ mCtrlOutputDevices->setEnabled(device_settings_available);
+ }
+
+ getChild<LLSlider>("mic_volume_slider")->setEnabled(device_settings_available);
+
+ if(!device_settings_available)
{
// The combo boxes are disabled, since we can't get the device settings from the daemon just now.
// Put the currently set default (ONLY) in the box, and select it.
@@ -207,6 +221,7 @@ void LLPanelVoiceDeviceSettings::refresh()
mCtrlOutputDevices->add( mOutputDevice, ADD_BOTTOM );
mCtrlOutputDevices->setSimple(mOutputDevice);
}
+ mDevicesUpdated = FALSE;
}
else if (!mDevicesUpdated)
{
diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp
index ebddaa90bc..7839cdd811 100644
--- a/indra/newview/llpanelvolume.cpp
+++ b/indra/newview/llpanelvolume.cpp
@@ -532,7 +532,8 @@ void LLPanelVolume::refresh()
bool enable_mesh = gSavedSettings.getBOOL("MeshEnabled") &&
gAgent.getRegion() &&
- !gAgent.getRegion()->getCapability("GetMesh").empty();
+ !gAgent.getRegion()->getCapability("GetMesh").empty() &&
+ !gAgent.getRegion()->getCapability("ObjectAdd").empty();
getChildView("label physicsshapetype")->setVisible(enable_mesh);
getChildView("Physics Shape Type Combo Ctrl")->setVisible(enable_mesh);
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 7f91f9a952..d96fa087b1 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -35,6 +35,7 @@
#include "llvolumeoctree.h"
#include "llviewercamera.h"
#include "llface.h"
+#include "llfloatertools.h"
#include "llviewercontrol.h"
#include "llviewerregion.h"
#include "llcamera.h"
@@ -4272,7 +4273,29 @@ public:
if (vobj)
{
LLVector3 intersection;
- if (vobj->lineSegmentIntersect(mStart, mEnd, -1, mPickTransparent, mFaceHit, &intersection, mTexCoord, mNormal, mBinormal))
+ bool skip_check = false;
+ if (vobj->isAvatar())
+ {
+ LLVOAvatar* avatar = (LLVOAvatar*) vobj;
+ if (avatar->isSelf() && LLFloater::isVisible(gFloaterTools))
+ {
+ LLViewerObject* hit = avatar->lineSegmentIntersectRiggedAttachments(mStart, mEnd, -1, mPickTransparent, mFaceHit, &intersection, mTexCoord, mNormal, mBinormal);
+ if (hit)
+ {
+ mEnd = intersection;
+ if (mIntersection)
+ {
+ *mIntersection = intersection;
+ }
+
+ mHit = hit->mDrawable;
+ skip_check = true;
+ }
+
+ }
+ }
+
+ if (!skip_check && vobj->lineSegmentIntersect(mStart, mEnd, -1, mPickTransparent, mFaceHit, &intersection, mTexCoord, mNormal, mBinormal))
{
mEnd = intersection; // shorten ray so we only find CLOSER hits
if (mIntersection)
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 141a81c717..86b09473ab 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -1970,7 +1970,6 @@ bool idle_startup()
// Start automatic replay if the flag is set.
if (gSavedSettings.getBOOL("StatsAutoRun") || gAgentPilot.getReplaySession())
{
- LLUUID id;
LL_DEBUGS("AppInit") << "Starting automatic playback" << LL_ENDL;
gAgentPilot.startPlayback();
}
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index 7fb52c1939..9b417307fd 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -949,7 +949,7 @@ S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL texture_cache
max_size -= sCacheMaxTexturesSize;
LL_INFOS("TextureCache") << "Headers: " << sCacheMaxEntries
- << " Textures size: " << sCacheMaxTexturesSize/(1024*1024) << " MB" << LL_ENDL;
+ << " Textures size: " << sCacheMaxTexturesSize / (1024 * 1024) << " MB" << LL_ENDL;
setDirNames(location);
@@ -1513,12 +1513,12 @@ void LLTextureCache::purgeAllTextures(bool purge_directories)
{
const char* subdirs = "0123456789abcdef";
std::string delem = gDirUtilp->getDirDelimiter();
- std::string mask = delem + "*";
+ std::string mask = "*";
for (S32 i=0; i<16; i++)
{
std::string dirname = mTexturesDirName + delem + subdirs[i];
llinfos << "Deleting files in directory: " << dirname << llendl;
- gDirUtilp->deleteFilesInDir(dirname,mask);
+ gDirUtilp->deleteFilesInDir(dirname, mask);
if (purge_directories)
{
LLFile::rmdir(dirname);
@@ -1655,7 +1655,7 @@ void LLTextureCache::purgeTextures(bool validate)
LL_INFOS("TextureCache") << "TEXTURE CACHE:"
<< " PURGED: " << purge_count
<< " ENTRIES: " << num_entries
- << " CACHE SIZE: " << mTexturesSizeTotal / 1024*1024 << " MB"
+ << " CACHE SIZE: " << mTexturesSizeTotal / (1024 * 1024) << " MB"
<< llendl;
}
diff --git a/indra/newview/lltoolgrab.cpp b/indra/newview/lltoolgrab.cpp
index b6c0f662e5..319e2508e0 100644
--- a/indra/newview/lltoolgrab.cpp
+++ b/indra/newview/lltoolgrab.cpp
@@ -54,7 +54,6 @@
#include "llviewerobject.h"
#include "llviewerobjectlist.h"
#include "llviewerregion.h"
-#include "llviewerwindow.h"
#include "llvoavatarself.h"
#include "llworld.h"
@@ -387,22 +386,7 @@ void LLToolGrab::startGrab()
mDragStartPointGlobal = grab_start_global;
mDragStartFromCamera = grab_start_global - gAgentCamera.getCameraPositionGlobal();
- LLMessageSystem *msg = gMessageSystem;
- msg->newMessageFast(_PREHASH_ObjectGrab);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_ObjectData);
- msg->addU32Fast(_PREHASH_LocalID, objectp->mLocalID);
- msg->addVector3Fast(_PREHASH_GrabOffset, grab_offset );
- msg->nextBlock("SurfaceInfo");
- msg->addVector3("UVCoord", LLVector3(mGrabPick.mUVCoords));
- msg->addVector3("STCoord", LLVector3(mGrabPick.mSTCoords));
- msg->addS32Fast(_PREHASH_FaceIndex, mGrabPick.mObjectFace);
- msg->addVector3("Position", mGrabPick.mIntersection);
- msg->addVector3("Normal", mGrabPick.mNormal);
- msg->addVector3("Binormal", mGrabPick.mBinormal);
- msg->sendMessage( objectp->getRegion()->getHost());
+ send_ObjectGrab_message(objectp, mGrabPick, grab_offset);
mGrabOffsetFromCenterInitial = grab_offset;
mGrabHiddenOffsetFromCamera = mDragStartFromCamera;
@@ -1036,28 +1020,12 @@ void LLToolGrab::stopGrab()
}
// Next, send messages to simulator
- LLMessageSystem *msg = gMessageSystem;
switch(mMode)
{
case GRAB_ACTIVE_CENTER:
case GRAB_NONPHYSICAL:
case GRAB_LOCKED:
- msg->newMessageFast(_PREHASH_ObjectDeGrab);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_ObjectData);
- msg->addU32Fast(_PREHASH_LocalID, objectp->mLocalID);
- msg->nextBlock("SurfaceInfo");
- msg->addVector3("UVCoord", LLVector3(pick.mUVCoords));
- msg->addVector3("STCoord", LLVector3(pick.mSTCoords));
- msg->addS32Fast(_PREHASH_FaceIndex, pick.mObjectFace);
- msg->addVector3("Position", pick.mIntersection);
- msg->addVector3("Normal", pick.mNormal);
- msg->addVector3("Binormal", pick.mBinormal);
-
- msg->sendMessage(objectp->getRegion()->getHost());
-
+ send_ObjectDeGrab_message(objectp, pick);
mVerticalDragging = FALSE;
break;
@@ -1109,3 +1077,66 @@ LLVector3d LLToolGrab::getGrabPointGlobal()
return gAgent.getPositionGlobal();
}
}
+
+
+void send_ObjectGrab_message(LLViewerObject* object, const LLPickInfo & pick, const LLVector3 &grab_offset)
+{
+ if (!object) return;
+
+ LLMessageSystem *msg = gMessageSystem;
+
+ msg->newMessageFast(_PREHASH_ObjectGrab);
+ msg->nextBlockFast( _PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast( _PREHASH_ObjectData);
+ msg->addU32Fast( _PREHASH_LocalID, object->mLocalID);
+ msg->addVector3Fast(_PREHASH_GrabOffset, grab_offset);
+ msg->nextBlock("SurfaceInfo");
+ msg->addVector3("UVCoord", LLVector3(pick.mUVCoords));
+ msg->addVector3("STCoord", LLVector3(pick.mSTCoords));
+ msg->addS32Fast(_PREHASH_FaceIndex, pick.mObjectFace);
+ msg->addVector3("Position", pick.mIntersection);
+ msg->addVector3("Normal", pick.mNormal);
+ msg->addVector3("Binormal", pick.mBinormal);
+ msg->sendMessage( object->getRegion()->getHost());
+
+ /* Diagnostic code
+ llinfos << "mUVCoords: " << pick.mUVCoords
+ << ", mSTCoords: " << pick.mSTCoords
+ << ", mObjectFace: " << pick.mObjectFace
+ << ", mIntersection: " << pick.mIntersection
+ << ", mNormal: " << pick.mNormal
+ << ", mBinormal: " << pick.mBinormal
+ << llendl;
+
+ llinfos << "Avatar pos: " << gAgent.getPositionAgent() << llendl;
+ llinfos << "Object pos: " << object->getPosition() << llendl;
+ */
+}
+
+
+void send_ObjectDeGrab_message(LLViewerObject* object, const LLPickInfo & pick)
+{
+ if (!object) return;
+
+ LLMessageSystem *msg = gMessageSystem;
+
+ msg->newMessageFast(_PREHASH_ObjectDeGrab);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_ObjectData);
+ msg->addU32Fast(_PREHASH_LocalID, object->mLocalID);
+ msg->nextBlock("SurfaceInfo");
+ msg->addVector3("UVCoord", LLVector3(pick.mUVCoords));
+ msg->addVector3("STCoord", LLVector3(pick.mSTCoords));
+ msg->addS32Fast(_PREHASH_FaceIndex, pick.mObjectFace);
+ msg->addVector3("Position", pick.mIntersection);
+ msg->addVector3("Normal", pick.mNormal);
+ msg->addVector3("Binormal", pick.mBinormal);
+ msg->sendMessage(object->getRegion()->getHost());
+}
+
+
+
diff --git a/indra/newview/lltoolgrab.h b/indra/newview/lltoolgrab.h
index 61e3fcb8b2..06a3b662c8 100644
--- a/indra/newview/lltoolgrab.h
+++ b/indra/newview/lltoolgrab.h
@@ -39,6 +39,13 @@ class LLTextBox;
class LLViewerObject;
class LLPickInfo;
+
+// Message utilities
+void send_ObjectGrab_message(LLViewerObject* object, const LLPickInfo & pick, const LLVector3 &grab_offset);
+void send_ObjectDeGrab_message(LLViewerObject* object, const LLPickInfo & pick);
+
+
+
class LLToolGrab : public LLTool, public LLSingleton<LLToolGrab>
{
public:
diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp
index e06fe7bda0..93687dbd5f 100644
--- a/indra/newview/llviewerchat.cpp
+++ b/indra/newview/llviewerchat.cpp
@@ -80,6 +80,10 @@ void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color)
{
r_color = LLUIColorTable::instance().getColor("llOwnerSayChatColor");
}
+ else if ( chat.mChatType == CHAT_TYPE_DIRECT )
+ {
+ r_color = LLUIColorTable::instance().getColor("DirectChatColor");
+ }
else
{
r_color = LLUIColorTable::instance().getColor("ObjectChatColor");
@@ -146,6 +150,10 @@ void LLViewerChat::getChatColor(const LLChat& chat, std::string& r_color_name, F
{
r_color_name = "llOwnerSayChatColor";
}
+ else if ( chat.mChatType == CHAT_TYPE_DIRECT )
+ {
+ r_color_name = "DirectChatColor";
+ }
else
{
r_color_name = "ObjectChatColor";
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 79c6c8db75..1e53274cd6 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -62,6 +62,7 @@
#include "llmutelist.h"
#include "llpanelprofile.h"
#include "llappviewer.h"
+#include "lllogininstance.h"
//#include "llfirstuse.h"
#include "llwindow.h"
@@ -2343,6 +2344,65 @@ BOOL LLViewerMediaImpl::handleMouseUp(S32 x, S32 y, MASK mask)
}
//////////////////////////////////////////////////////////////////////////////////////////
+void LLViewerMediaImpl::updateJavascriptObject()
+{
+ if ( mMediaSource )
+ {
+ // flag to expose this information to internal browser or not.
+ bool expose_javascript_object = gSavedSettings.getBOOL("BrowserEnableJSObject");
+ mMediaSource->jsExposeObjectEvent( expose_javascript_object );
+
+ // indicate if the values we have are valid (currently do this blanket-fashion for
+ // everything depending on whether you are logged in or not - this may require a
+ // more granular approach once variables are added that ARE valid before login
+ bool logged_in = LLLoginInstance::getInstance()->authSuccess();
+ mMediaSource->jsValuesValidEvent( logged_in );
+
+ // current location within a region
+ LLVector3 agent_pos = gAgent.getPositionAgent();
+ double x = agent_pos.mV[ VX ];
+ double y = agent_pos.mV[ VY ];
+ double z = agent_pos.mV[ VZ ];
+ mMediaSource->jsAgentLocationEvent( x, y, z );
+
+ // current location within the grid
+ LLVector3d agent_pos_global = gAgent.getLastPositionGlobal();
+ double global_x = agent_pos_global.mdV[ VX ];
+ double global_y = agent_pos_global.mdV[ VY ];
+ double global_z = agent_pos_global.mdV[ VZ ];
+ mMediaSource->jsAgentGlobalLocationEvent( global_x, global_y, global_z );
+
+ // current agent orientation
+ double rotation = atan2( gAgent.getAtAxis().mV[VX], gAgent.getAtAxis().mV[VY] );
+ double angle = rotation * RAD_TO_DEG;
+ if ( angle < 0.0f ) angle = 360.0f + angle; // TODO: has to be a better way to get orientation!
+ mMediaSource->jsAgentOrientationEvent( angle );
+
+ // current region agent is in
+ std::string region_name("");
+ LLViewerRegion* region = gAgent.getRegion();
+ if ( region )
+ {
+ region_name = region->getName();
+ };
+ mMediaSource->jsAgentRegionEvent( region_name );
+
+ // language code the viewer is set to
+ mMediaSource->jsAgentLanguageEvent( LLUI::getLanguage() );
+
+ // maturity setting the agent has selected
+ if ( gAgent.prefersAdult() )
+ mMediaSource->jsAgentMaturityEvent( "GMA" ); // Adult means see adult, mature and general content
+ else
+ if ( gAgent.prefersMature() )
+ mMediaSource->jsAgentMaturityEvent( "GM" ); // Mature means see mature and general content
+ else
+ if ( gAgent.prefersPG() )
+ mMediaSource->jsAgentMaturityEvent( "G" ); // PG means only see General content
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
std::string LLViewerMediaImpl::getName() const
{
if (mMediaSource)
@@ -2640,6 +2700,9 @@ void LLViewerMediaImpl::update()
{
updateVolume();
+ // TODO: this is updated every frame - is this bad?
+ updateJavascriptObject();
+
// If we didn't just create the impl, it may need to get cookie updates.
if(!sUpdatedCookies.empty())
{
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index e2e342cc45..a70c6f4887 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -339,7 +339,10 @@ public:
LLVOVolume *getSomeObject();
void setUpdated(BOOL updated) ;
BOOL isUpdated() ;
-
+
+ // updates the javascript object in the embedded browser with viewer values
+ void updateJavascriptObject();
+
// Updates the "interest" value in this object
void calculateInterest();
F64 getInterest() const { return mInterest; };
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 2ed208bad1..41d8b57f36 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -106,6 +106,7 @@
#include "llappearancemgr.h"
#include "lltrans.h"
#include "lleconomy.h"
+#include "lltoolgrab.h"
#include "boost/unordered_map.hpp"
using namespace LLVOAvatarDefines;
@@ -2420,50 +2421,23 @@ class LLObjectEnableReportAbuse : public view_listener_t
}
};
+
void handle_object_touch()
{
- LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
- if (!object) return;
-
- LLPickInfo pick = LLToolPie::getInstance()->getPick();
+ LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
+ if (!object) return;
- LLMessageSystem *msg = gMessageSystem;
+ LLPickInfo pick = LLToolPie::getInstance()->getPick();
- msg->newMessageFast(_PREHASH_ObjectGrab);
- msg->nextBlockFast( _PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast( _PREHASH_ObjectData);
- msg->addU32Fast( _PREHASH_LocalID, object->mLocalID);
- msg->addVector3Fast(_PREHASH_GrabOffset, LLVector3::zero );
- msg->nextBlock("SurfaceInfo");
- msg->addVector3("UVCoord", LLVector3(pick.mUVCoords));
- msg->addVector3("STCoord", LLVector3(pick.mSTCoords));
- msg->addS32Fast(_PREHASH_FaceIndex, pick.mObjectFace);
- msg->addVector3("Position", pick.mIntersection);
- msg->addVector3("Normal", pick.mNormal);
- msg->addVector3("Binormal", pick.mBinormal);
- msg->sendMessage( object->getRegion()->getHost());
-
- // *NOTE: Hope the packets arrive safely and in order or else
- // there will be some problems.
- // *TODO: Just fix this bad assumption.
- msg->newMessageFast(_PREHASH_ObjectDeGrab);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_ObjectData);
- msg->addU32Fast(_PREHASH_LocalID, object->mLocalID);
- msg->nextBlock("SurfaceInfo");
- msg->addVector3("UVCoord", LLVector3(pick.mUVCoords));
- msg->addVector3("STCoord", LLVector3(pick.mSTCoords));
- msg->addS32Fast(_PREHASH_FaceIndex, pick.mObjectFace);
- msg->addVector3("Position", pick.mIntersection);
- msg->addVector3("Normal", pick.mNormal);
- msg->addVector3("Binormal", pick.mBinormal);
- msg->sendMessage(object->getRegion()->getHost());
+ // *NOTE: Hope the packets arrive safely and in order or else
+ // there will be some problems.
+ // *TODO: Just fix this bad assumption.
+ send_ObjectGrab_message(object, pick, LLVector3::zero);
+ send_ObjectDeGrab_message(object, pick);
}
+
+
static void init_default_item_label(const std::string& item_name)
{
boost::unordered_map<std::string, LLStringExplicit>::iterator it = sDefaultItemLabels.find(item_name);
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index fdd1199b78..3832be727f 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -3213,7 +3213,6 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
if (is_audible)
{
BOOL visible_in_chat_bubble = FALSE;
- std::string verb;
color.setVec(1.f,1.f,1.f,1.f);
msg->getStringFast(_PREHASH_ChatData, _PREHASH_Message, mesg);
@@ -3262,18 +3261,19 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
}
else
{
+ chat.mText = "";
switch(chat.mChatType)
{
case CHAT_TYPE_WHISPER:
- verb = LLTrans::getString("whisper") + " ";
+ chat.mText = LLTrans::getString("whisper") + " ";
break;
case CHAT_TYPE_DEBUG_MSG:
case CHAT_TYPE_OWNER:
case CHAT_TYPE_NORMAL:
- verb = "";
+ case CHAT_TYPE_DIRECT:
break;
case CHAT_TYPE_SHOUT:
- verb = LLTrans::getString("shout") + " ";
+ chat.mText = LLTrans::getString("shout") + " ";
break;
case CHAT_TYPE_START:
case CHAT_TYPE_STOP:
@@ -3281,13 +3281,9 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
break;
default:
LL_WARNS("Messaging") << "Unknown type " << chat.mChatType << " in chat!" << LL_ENDL;
- verb = "";
break;
}
-
- chat.mText = "";
- chat.mText += verb;
chat.mText += mesg;
}
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index c4ca5d37ce..e876294ef2 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -1548,6 +1548,10 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
capabilityNames.append("ViewerMetrics");
capabilityNames.append("ViewerStartAuction");
capabilityNames.append("ViewerStats");
+ //prep# Finalize these!!!!!!!!!
+ //capabilityNames.append("AccountingVO");
+ capabilityNames.append("AccountingParcel");
+ capabilityNames.append("AccountingRegion");
// Please add new capabilities alphabetically to reduce
// merge conflicts.
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index cd6653b0c7..1ffae7ce83 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -89,16 +89,14 @@ LLViewerTextureList::LLViewerTextureList()
}
void LLViewerTextureList::init()
-{
+{
sRenderThreadID = LLThread::currentID() ;
-
mInitialized = TRUE ;
sNumImages = 0;
+ mUpdateStats = TRUE;
mMaxResidentTexMemInMegaBytes = 0;
mMaxTotalTextureMemInMegaBytes = 0 ;
- mUpdateStats = TRUE;
-
// Update how much texture RAM we're allowed to use.
updateMaxResidentTexMem(0); // 0 = use current
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 6fe79c2e85..34d15a597e 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -1638,6 +1638,7 @@ LLViewerWindow::LLViewerWindow(
gSavedSettings.setBOOL("RenderVBOEnable", FALSE);
}
LLVertexBuffer::initClass(gSavedSettings.getBOOL("RenderVBOEnable"), gSavedSettings.getBOOL("RenderVBOMappingDisable"));
+ LL_INFOS("RenderInit") << "LLVertexBuffer initialization done." << LL_ENDL ;
if (LLFeatureManager::getInstance()->isSafe()
|| (gSavedSettings.getS32("LastFeatureVersion") != LLFeatureManager::getInstance()->getVersion())
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 77bbf994e9..1b53348b43 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -56,6 +56,7 @@
#include "lleditingmotion.h"
#include "llemote.h"
//#include "llfirstuse.h"
+#include "llfloatertools.h"
#include "llheadrotmotion.h"
#include "llhudeffecttrail.h"
#include "llhudmanager.h"
@@ -1541,7 +1542,35 @@ BOOL LLVOAvatar::lineSegmentIntersect(const LLVector3& start, const LLVector3& e
return TRUE;
}
}
+
+ if (isSelf())
+ {
+ for (attachment_map_t::iterator iter = mAttachmentPoints.begin();
+ iter != mAttachmentPoints.end();
+ ++iter)
+ {
+ LLViewerJointAttachment* attachment = iter->second;
+
+ for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
+ attachment_iter != attachment->mAttachedObjects.end();
+ ++attachment_iter)
+ {
+ LLViewerObject* attached_object = (*attachment_iter);
+
+ if (attached_object && !attached_object->isDead() && attachment->getValid())
+ {
+ LLDrawable* drawable = attached_object->mDrawable;
+ if (drawable->isState(LLDrawable::RIGGED))
+ { //regenerate octree for rigged attachment
+ gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_RIGGED, TRUE);
+ }
+ }
+ }
+ }
+ }
}
+
+
LLVector3 position;
if (mNameText.notNull() && mNameText->lineSegmentIntersect(start, end, position))
@@ -1557,6 +1586,56 @@ BOOL LLVOAvatar::lineSegmentIntersect(const LLVector3& start, const LLVector3& e
return FALSE;
}
+LLViewerObject* LLVOAvatar::lineSegmentIntersectRiggedAttachments(const LLVector3& start, const LLVector3& end,
+ S32 face,
+ BOOL pick_transparent,
+ S32* face_hit,
+ LLVector3* intersection,
+ LLVector2* tex_coord,
+ LLVector3* normal,
+ LLVector3* bi_normal)
+{
+ if (isSelf() && !gAgent.needsRenderAvatar())
+ {
+ return NULL;
+ }
+
+ LLViewerObject* hit = NULL;
+
+ if (lineSegmentBoundingBox(start, end))
+ {
+ LLVector3 local_end = end;
+ LLVector3 local_intersection;
+
+ for (attachment_map_t::iterator iter = mAttachmentPoints.begin();
+ iter != mAttachmentPoints.end();
+ ++iter)
+ {
+ LLViewerJointAttachment* attachment = iter->second;
+
+ for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
+ attachment_iter != attachment->mAttachedObjects.end();
+ ++attachment_iter)
+ {
+ LLViewerObject* attached_object = (*attachment_iter);
+
+ if (attached_object->lineSegmentIntersect(start, local_end, face, pick_transparent, face_hit, &local_intersection, tex_coord, normal, bi_normal))
+ {
+ local_end = local_intersection;
+ if (intersection)
+ {
+ *intersection = local_intersection;
+ }
+
+ hit = attached_object;
+ }
+ }
+ }
+ }
+
+ return hit;
+}
+
//-----------------------------------------------------------------------------
// parseSkeletonFile()
//-----------------------------------------------------------------------------
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 295799fd24..03c0498a2a 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -145,6 +145,14 @@ public:
LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point
LLVector3* normal = NULL, // return the surface normal at the intersection point
LLVector3* bi_normal = NULL); // return the surface bi-normal at the intersection point
+ LLViewerObject* lineSegmentIntersectRiggedAttachments(const LLVector3& start, const LLVector3& end,
+ S32 face = -1, // which face to check, -1 = ALL_SIDES
+ BOOL pick_transparent = FALSE,
+ S32* face_hit = NULL, // which face was hit
+ LLVector3* intersection = NULL, // return the intersection point
+ LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point
+ LLVector3* normal = NULL, // return the surface normal at the intersection point
+ LLVector3* bi_normal = NULL); // return the surface bi-normal at the intersection point
//--------------------------------------------------------------------
// LLCharacter interface and related
diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp
index c605ddb1c8..bbb19a63f1 100644
--- a/indra/newview/llvocache.cpp
+++ b/indra/newview/llvocache.cpp
@@ -287,8 +287,6 @@ LLVOCache::~LLVOCache()
void LLVOCache::setDirNames(ELLPath location)
{
- std::string delem = gDirUtilp->getDirDelimiter();
-
mHeaderFileName = gDirUtilp->getExpandedFilename(location, object_cache_dirname, header_filename);
mObjectCacheDirName = gDirUtilp->getExpandedFilename(location, object_cache_dirname);
}
@@ -341,8 +339,7 @@ void LLVOCache::removeCache(ELLPath location)
llinfos << "about to remove the object cache due to settings." << llendl ;
- std::string delem = gDirUtilp->getDirDelimiter();
- std::string mask = delem + "*";
+ std::string mask = "*";
std::string cache_dir = gDirUtilp->getExpandedFilename(location, object_cache_dirname);
llinfos << "Removing cache at " << cache_dir << llendl;
gDirUtilp->deleteFilesInDir(cache_dir, mask); //delete all files
@@ -363,8 +360,7 @@ void LLVOCache::removeCache()
llinfos << "about to remove the object cache due to some error." << llendl ;
- std::string delem = gDirUtilp->getDirDelimiter();
- std::string mask = delem + "*";
+ std::string mask = "*";
llinfos << "Removing cache at " << mObjectCacheDirName << llendl;
gDirUtilp->deleteFilesInDir(mObjectCacheDirName, mask);
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 39e555f781..6de334eb82 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -3365,7 +3365,8 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector3& start, const LLVector3& e
{
if (LLFloater::isVisible(gFloaterTools) && getAvatar()->isSelf())
{
- gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_RIGGED, TRUE);
+ updateRiggedVolume();
+ genBBoxes(FALSE);
volume = mRiggedVolume;
transform = false;
}
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index d02662681b..973df6998a 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -760,7 +760,7 @@
<color
name="MenuBarProjectBgColor"
reference="MdBlue" />
-
+
<color
name="MeshImportTableNormalColor"
value="1 1 1 1"/>
@@ -768,6 +768,9 @@
name="MeshImportTableHighlightColor"
value="0.2 0.8 1 1"/>
+ <color
+ name="DirectChatColor"
+ reference="LtOrange" />
<!-- Generic color names (legacy) -->
<color
diff --git a/indra/newview/skins/default/xui/da/language_settings.xml b/indra/newview/skins/default/xui/da/language_settings.xml
index 3e46f69af1..0e3cbfd2d2 100644
--- a/indra/newview/skins/default/xui/da/language_settings.xml
+++ b/indra/newview/skins/default/xui/da/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">danish</string>
+ <string name="MacLocale">da_DK.UTF-8</string>
<string name="DarwinLocale">da_DK.UTF-8</string>
<string name="LinuxLocale">da_DK.UTF-8</string>
diff --git a/indra/newview/skins/default/xui/de/floater_postcard.xml b/indra/newview/skins/default/xui/de/floater_postcard.xml
index 49dcd4af51..28af0183cb 100644
--- a/indra/newview/skins/default/xui/de/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/de/floater_postcard.xml
@@ -1,36 +1,36 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Postcard" title="FOTO EMAILEN">
- <text name="to_label">
- E-Mail des Empfängers:
- </text>
- <text name="from_label">
- Ihre E-Mail:
- </text>
- <text name="name_label">
- Ihr Name:
- </text>
- <text name="subject_label">
- Betreff:
- </text>
- <line_editor label="Betreff hier eingeben." name="subject_form"/>
- <text name="msg_label">
- Nachricht:
- </text>
- <text_editor name="msg_form">
- Nachricht hier eingeben.
- </text_editor>
- <text name="fine_print">
- Wenn sich der Empfänger bei SL anmeldet, erhalten Sie einen Empfehlungsbonus.
- </text>
- <button label="Abbrechen" name="cancel_btn"/>
- <button label="Senden" name="send_btn"/>
- <text name="default_subject">
- Postkarte aus [SECOND_LIFE].
- </text>
- <text name="default_message">
- Sehen Sie hier!
- </text>
- <string name="upload_message">
- Wird gesendet...
- </string>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Postcard" title="FOTO EMAILEN">
+ <text name="to_label">
+ E-Mail des Empfängers:
+ </text>
+ <text name="from_label">
+ Ihre E-Mail:
+ </text>
+ <text name="name_label">
+ Ihr Name:
+ </text>
+ <text name="subject_label">
+ Betreff:
+ </text>
+ <line_editor label="Betreff hier eingeben." name="subject_form"/>
+ <text name="msg_label">
+ Nachricht:
+ </text>
+ <text_editor name="msg_form">
+ Nachricht hier eingeben.
+ </text_editor>
+ <text name="fine_print">
+ Wenn sich der Empfänger bei SL anmeldet, erhalten Sie einen Empfehlungsbonus.
+ </text>
+ <button label="Abbrechen" name="cancel_btn"/>
+ <button label="Senden" name="send_btn"/>
+ <text name="default_subject">
+ Postkarte aus [SECOND_LIFE].
+ </text>
+ <text name="default_message">
+ Sehen Sie hier!
+ </text>
+ <string name="upload_message">
+ Wird gesendet...
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/language_settings.xml b/indra/newview/skins/default/xui/de/language_settings.xml
index d54f548fe1..f9346eef7d 100644
--- a/indra/newview/skins/default/xui/de/language_settings.xml
+++ b/indra/newview/skins/default/xui/de/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">german</string>
+ <string name="MacLocale">de_DE.UTF-8</string>
<string name="DarwinLocale">de_DE.UTF-8</string>
<string name="LinuxLocale">de_DE.UTF-8</string>
diff --git a/indra/newview/skins/default/xui/en/floater_hardware_settings.xml b/indra/newview/skins/default/xui/en/floater_hardware_settings.xml
index a97c697b24..05f4c52b95 100644
--- a/indra/newview/skins/default/xui/en/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/en/floater_hardware_settings.xml
@@ -80,7 +80,7 @@
left_pad="10"
name="antialiasing restart"
top_delta="0"
- width="188">
+ width="230">
(requires viewer restart)
</text>
<spinner
diff --git a/indra/newview/skins/default/xui/en/language_settings.xml b/indra/newview/skins/default/xui/en/language_settings.xml
index c8a06fe401..51779e4bfd 100644
--- a/indra/newview/skins/default/xui/en/language_settings.xml
+++ b/indra/newview/skins/default/xui/en/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">english</string>
+ <string name="MacLocale">C</string>
<string name="DarwinLocale">C</string>
<string name="LinuxLocale">C</string>
diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml
index 0d4a095e14..4c4ff3e5c4 100644
--- a/indra/newview/skins/default/xui/en/menu_login.xml
+++ b/indra/newview/skins/default/xui/en/menu_login.xml
@@ -183,11 +183,11 @@
parameter="http://join.secondlife.com/"/>
</menu_item_call>
<menu_item_call
- label="Web Content Floater Test"
- name="Web Content Floater Test">
+ label="Web Content Floater Debug Test"
+ name="Web Content Floater Debug Test">
<menu_item_call.on_click
function="Advanced.WebContentTest"
- parameter="http://www.google.com"/>
+ parameter="http://google.com"/>
</menu_item_call>
<menu_item_check
label="Show Grid Picker"
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index ebfed990ec..ce96c488b4 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -4763,6 +4763,18 @@ Are you sure you want to delete your travel, web, and search history?
notext="Cancel"
yestext="OK"/>
</notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="ConfirmClearCache"
+ type="alertmodal">
+Are you sure you want to clear your viewer cache?
+ <tag>confirm</tag>
+ <usetemplate
+ name="okcancelbuttons"
+ notext="Cancel"
+ yestext="OK"/>
+ </notification>
<notification
icon="alertmodal.tga"
@@ -5227,6 +5239,20 @@ Insufficient permissions to rez object.
<notification
icon="notifytip.tga"
+ name="IMAcrossParentEstates"
+ type="notifytip">
+Unable to send IM across parent estates.
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="TransferInventoryAcrossParentEstates"
+ type="notifytip">
+Unable to transfer inventory across parent estates.
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
name="UnableToLoadNotecard"
type="notifytip">
Unable to load notecard.
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
index 37aab059a9..2cc9d9c1b0 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -20,8 +20,112 @@
height="12"
layout="topleft"
left="33"
+ name="Cache:"
+ top_pad="10"
+ width="100">
+ Cache:
+ </text>
+ <spinner
+ control_name="CacheSize"
+ decimal_digits="0"
+ follows="left|top"
+ height="23"
+ increment="64"
+ initial_value="1024"
+ label="Cache size (64 - 9984MB)"
+ label_width="150"
+ layout="topleft"
+ left="80"
+ max_val="9984"
+ min_val="64"
+ top_pad="10"
+ name="cachesizespinner"
+ width="200" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="text_box5"
+ width="20">
+ MB
+ </text>
+ <button
+ follows="left|top"
+ height="23"
+ label="Clear Cache"
+ label_selected="Clear Cache"
+ layout="topleft"
+ left_pad="30"
+ name="clear_cache"
+ top_delta="0"
+ width="100">
+ <button.commit_callback
+ function="Pref.ClearCache" />
+ </button>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="80"
+ name="Cache location"
+ top_pad="5"
+ width="300">
+ Cache location:
+ </text>
+ <line_editor
+ control_name="CacheLocationTopFolder"
+ border_style="line"
+ border_thickness="1"
+ follows="left|top"
+ font="SansSerif"
+ height="23"
+ layout="topleft"
+ left="80"
+ max_length="4096"
+ name="cache_location"
+ top_pad="5"
+ width="205" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Browse"
+ label_selected="Browse"
+ layout="topleft"
+ left_pad="5"
+ name="set_cache"
+ top_delta="0"
+ width="100">
+ <button.commit_callback
+ function="Pref.SetCache" />
+ </button>
+ <button
+ follows="left|top"
+ height="23"
+ label="Default Location"
+ label_selected="Default Location"
+ layout="topleft"
+ left_pad="3"
+ name="default_cache_location"
+ top_delta="0"
+ width="100">
+ <button.commit_callback
+ function="Pref.ResetCache" />
+ </button>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="12"
+ layout="topleft"
+ left="33"
name="UI Size:"
- top_pad="25"
+ top_pad="20"
width="100">
UI size:
</text>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_colors.xml b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
index 7717872a6a..2b22f0d6e3 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml
@@ -208,6 +208,37 @@
</text>
<color_swatch
can_apply_immediately="true"
+ color="LtOrange"
+ follows="left|top"
+ height="24"
+ label_height="0"
+ layout="topleft"
+ left="360"
+ name="direct"
+ top_pad="-15"
+ width="44" >
+ <color_swatch.init_callback
+ function="Pref.getUIColor"
+ parameter="DirectChatColor" />
+ <color_swatch.commit_callback
+ function="Pref.applyUIColor"
+ parameter="DirectChatColor" />
+ </color_swatch>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left_pad="5"
+ mouse_opaque="false"
+ name="text_box10"
+ top_delta="5"
+ width="95">
+ Direct
+ </text>
+ <color_swatch
+ can_apply_immediately="true"
color="LtYellow"
follows="left|top"
height="24"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
index 901a1257e0..1c22a5c02e 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
@@ -93,98 +93,6 @@
name="connection_port"
top_delta="3"
width="170" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="80"
- mouse_opaque="false"
- name="cache_size_label_l"
- top_pad="20"
- width="200">
- Cache size
- </text>
- <slider
- can_edit_text="true"
- control_name="CacheSize"
- decimal_digits="0"
- follows="left|top"
- height="15"
- increment="16"
- initial_value="512"
- layout="topleft"
- left_delta="150"
- max_val="1024"
- min_val="32"
- name="cache_size"
- top_delta="-2"
- width="180" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left_pad="6"
- mouse_opaque="false"
- name="text_box5"
- top_delta="1"
- width="40">
- MB
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="80"
- name="Cache location"
- top_delta="20"
- width="300">
- Cache location:
- </text>
- <line_editor
- control_name="CacheLocationTopFolder"
- border_style="line"
- border_thickness="1"
- follows="left|top"
- font="SansSerif"
- height="23"
- layout="topleft"
- left="80"
- max_length="4096"
- name="cache_location"
- top_pad="5"
- width="205" />
- <button
- follows="left|top"
- height="23"
- label="Browse"
- label_selected="Browse"
- layout="topleft"
- left_pad="5"
- name="set_cache"
- top_delta="-1"
- width="100">
- <button.commit_callback
- function="Pref.SetCache" />
- </button>
- <button
- follows="left|top"
- height="23"
- label="Reset"
- label_selected="Reset"
- layout="topleft"
- left_pad="3"
- name="reset_cache"
- top_delta="0"
- width="100">
- <button.commit_callback
- function="Pref.ResetCache" />
- </button>
<text
type="string"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index f8c90106b7..339f14eacb 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -1908,6 +1908,15 @@ Requests single-word username of an avatar. When data is available the dataserv
key llRequestDisplayName(key id)
Requests name of an avatar. When data is available the dataserver event will be raised.
</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_llGetEnv" translate="false">
+llGetEnv(string name)
+Returns a string with the requested data about the region
+</string>
+
<!-- Avatar busy/away mode -->
<string name="AvatarSetNotAway">Not Away</string>
diff --git a/indra/newview/skins/default/xui/es/floater_camera.xml b/indra/newview/skins/default/xui/es/floater_camera.xml
index ccf3d4bf91..87177e285c 100644
--- a/indra/newview/skins/default/xui/es/floater_camera.xml
+++ b/indra/newview/skins/default/xui/es/floater_camera.xml
@@ -13,7 +13,7 @@
Modos de cámara
</floater.string>
<floater.string name="pan_mode_title">
- Orbital - Zoom - Panóramica
+ Orbital - Zoom - Panorámica
</floater.string>
<floater.string name="presets_mode_title">
Vistas predefinidas
@@ -59,7 +59,7 @@
</panel>
<panel name="buttons">
<button label="" name="presets_btn" tool_tip="Vistas predefinidas"/>
- <button label="" name="pan_btn" tool_tip="Orbital - Zoom - Panóramica"/>
+ <button label="" name="pan_btn" tool_tip="Orbital - Zoom - Panorámica"/>
<button label="" name="avatarview_btn" tool_tip="Modos de cámara"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_help_browser.xml b/indra/newview/skins/default/xui/es/floater_help_browser.xml
index ec3c38e8c7..5ebd7ad6e0 100644
--- a/indra/newview/skins/default/xui/es/floater_help_browser.xml
+++ b/indra/newview/skins/default/xui/es/floater_help_browser.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_help_browser" title="BUSCADOR DE AYUDA">
+<floater name="floater_help_browser" title="BUSCAR EN LA AYUDA">
<floater.string name="loading_text">
Cargando...
</floater.string>
diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml
index fba969f267..13be47f700 100644
--- a/indra/newview/skins/default/xui/es/floater_tools.xml
+++ b/indra/newview/skins/default/xui/es/floater_tools.xml
@@ -58,7 +58,7 @@
<radio_item label="Horizontal (Ctrl+Shift)" name="radio spin"/>
</radio_group>
<radio_group name="edit_radio_group">
- <radio_item label="Moverse" name="radio position"/>
+ <radio_item label="Mover" name="radio position"/>
<radio_item label="Girar (Ctrl)" name="radio rotate"/>
<radio_item label="Estirar (Ctrl+Shift)" name="radio stretch"/>
<radio_item label="Elegir la cara" name="radio select face"/>
@@ -480,7 +480,7 @@
Modificar la parcela
</text>
<button label="Dividir" label_selected="Dividir" name="button subdivide land"/>
- <button label="Inscribirse" label_selected="Inscribirse" name="button join land"/>
+ <button label="Unir" label_selected="Unir" name="button join land"/>
<text name="label_parcel_trans">
Transacciones de terreno
</text>
diff --git a/indra/newview/skins/default/xui/es/language_settings.xml b/indra/newview/skins/default/xui/es/language_settings.xml
index f172994077..997293a741 100644
--- a/indra/newview/skins/default/xui/es/language_settings.xml
+++ b/indra/newview/skins/default/xui/es/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">spanish</string>
+ <string name="MacLocale">es_ES.UTF-8</string>
<string name="DarwinLocale">es_ES.UTF-8</string>
<string name="LinuxLocale">es_ES.UTF-8</string>
diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml
index 138bbd9412..1c45d36813 100644
--- a/indra/newview/skins/default/xui/es/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/es/menu_viewer.xml
@@ -146,7 +146,7 @@
<menu_item_check label="Estadísticas" name="Statistics Bar"/>
<menu_item_check label="Mostrar cuánto cuesta renderizar el avatar" name="Avatar Rendering Cost"/>
</menu>
- <menu label="Realzando y Visibilidad" name="Highlighting and Visibility">
+ <menu label="Realzado y Visibilidad" name="Highlighting and Visibility">
<menu_item_check label="Baliza con destellos" name="Cheesy Beacon"/>
<menu_item_check label="Ocultar las partículas" name="Hide Particles"/>
<menu_item_check label="Ocultar lo seleccionado" name="Hide Selected"/>
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
index 7d4db6a630..f218324d50 100644
--- a/indra/newview/skins/default/xui/es/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/es/panel_im_control_panel.xml
@@ -8,7 +8,7 @@
<button label="Añadir como amigo" name="add_friend_btn"/>
</layout_panel>
<layout_panel name="teleport_btn_panel">
- <button label="Teleportarme" name="teleport_btn" tool_tip="Ofrecer teleporte a esta persona"/>
+ <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"/>
diff --git a/indra/newview/skins/default/xui/es/panel_login.xml b/indra/newview/skins/default/xui/es/panel_login.xml
index eee1844c46..0e94cbe70b 100644
--- a/indra/newview/skins/default/xui/es/panel_login.xml
+++ b/indra/newview/skins/default/xui/es/panel_login.xml
@@ -30,6 +30,7 @@
<combo_box name="start_location_combo">
<combo_box.item label="Mi última posición" name="MyLastLocation"/>
<combo_box.item label="Mi Base" name="MyHome"/>
+ <combo_box.item label="&lt;Escribe en qué región&gt;" name="Typeregionname"/>
</combo_box>
</layout_panel>
<layout_panel name="links">
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml
index 0ac3d11ab0..ac40587033 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml
@@ -48,7 +48,7 @@
m
</text>
<slider label="Núm. máx. de partículas:" name="MaxParticleCount"/>
- <slider label="N.º máximo de avatares no impostores:" name="MaxNumberAvatarDrawn"/>
+ <slider label="Nº máx. de avats. no impostores:" name="MaxNumberAvatarDrawn"/>
<slider label="Calidad de procesamiento:" name="RenderPostProcess"/>
<text name="MeshDetailText">
Detalle de la malla:
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml
index 8ce8e23138..fa7806a75a 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml
@@ -14,7 +14,7 @@
<slider label="Música en streaming" name="Music Volume"/>
<check_box label="Activados" name="enable_music"/>
<slider label="Multimedia" name="Media Volume"/>
- <check_box label="Activada" name="enable_media"/>
+ <check_box label="Activados" name="enable_media"/>
<slider label="Chat de voz" name="Voice Volume"/>
<check_box label="Activado" name="enable_voice_check"/>
<check_box label="Permitir la ejecución automática de los media" name="media_auto_play_btn" tool_tip="Marcar esto para permitir la ejecución automática de los media" value="true"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_postcard.xml b/indra/newview/skins/default/xui/fr/floater_postcard.xml
index 948a3b973d..e65dfb09b4 100644
--- a/indra/newview/skins/default/xui/fr/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/fr/floater_postcard.xml
@@ -1,36 +1,36 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Postcard" title="ENVOYER LA PHOTO PAR E-MAIL">
- <text name="to_label">
- E-mail du destinataire :
- </text>
- <text name="from_label">
- Votre e-mail :
- </text>
- <text name="name_label">
- Votre nom :
- </text>
- <text name="subject_label">
- Objet :
- </text>
- <line_editor label="Saisir ici votre objet" name="subject_form"/>
- <text name="msg_label">
- Message :
- </text>
- <text_editor name="msg_form">
- Saisir ici votre message
- </text_editor>
- <text name="fine_print">
- Si le destinataire s&apos;inscrit sur [SECOND_LIFE], vous recevrez un bonus.
- </text>
- <button label="Annuler" name="cancel_btn"/>
- <button label="Envoyer" name="send_btn"/>
- <string name="default_subject">
- Carte postale de [SECOND_LIFE].
- </string>
- <string name="default_message">
- Ouvrez-moi !
- </string>
- <string name="upload_message">
- Envoi en cours...
- </string>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Postcard" title="ENVOYER LA PHOTO PAR E-MAIL">
+ <text name="to_label">
+ E-mail du destinataire :
+ </text>
+ <text name="from_label">
+ Votre e-mail :
+ </text>
+ <text name="name_label">
+ Votre nom :
+ </text>
+ <text name="subject_label">
+ Objet :
+ </text>
+ <line_editor label="Saisir ici votre objet" name="subject_form"/>
+ <text name="msg_label">
+ Message :
+ </text>
+ <text_editor name="msg_form">
+ Saisir ici votre message
+ </text_editor>
+ <text name="fine_print">
+ Si le destinataire s&apos;inscrit sur [SECOND_LIFE], vous recevrez un bonus.
+ </text>
+ <button label="Annuler" name="cancel_btn"/>
+ <button label="Envoyer" name="send_btn"/>
+ <string name="default_subject">
+ Carte postale de [SECOND_LIFE].
+ </string>
+ <string name="default_message">
+ Ouvrez-moi !
+ </string>
+ <string name="upload_message">
+ Envoi en cours...
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/language_settings.xml b/indra/newview/skins/default/xui/fr/language_settings.xml
index bd272e1f28..fdac9d65a7 100644
--- a/indra/newview/skins/default/xui/fr/language_settings.xml
+++ b/indra/newview/skins/default/xui/fr/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">french</string>
+ <string name="MacLocale">fr_FR.UTF-8</string>
<string name="DarwinLocale">fr_FR.UTF-8</string>
<string name="LinuxLocale">fr_FR.UTF-8</string>
diff --git a/indra/newview/skins/default/xui/it/floater_about_land.xml b/indra/newview/skins/default/xui/it/floater_about_land.xml
index 186ed59e36..b713bb8143 100644
--- a/indra/newview/skins/default/xui/it/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/it/floater_about_land.xml
@@ -352,6 +352,7 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
<combo_box.item label="Parchi &amp; Natura" name="item9"/>
<combo_box.item label="Residenziale" name="item10"/>
<combo_box.item label="Shopping" name="item11"/>
+ <combo_box.item label="Affitto" name="item13"/>
<combo_box.item label="Altro" name="item12"/>
</combo_box>
<combo_box name="land category">
@@ -366,6 +367,7 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
<combo_box.item label="Parchi &amp; Natura" name="item9"/>
<combo_box.item label="Residenziale" name="item10"/>
<combo_box.item label="Shopping" name="item11"/>
+ <combo_box.item label="Affitto" name="item13"/>
<combo_box.item label="Altro" name="item12"/>
</combo_box>
<check_box label="Contenuti di tipo Moderato" name="MatureCheck" tool_tip=" "/>
@@ -444,7 +446,7 @@ Media:
(Definito dalla proprietà)
</panel.string>
<panel.string name="allow_public_access">
- Consenti accesso pubblico ([MATURITY])
+ Consenti accesso pubblico ([MATURITY]) (Nota: se si rimuove la selezione vengono create linee di espulsione)
</panel.string>
<panel.string name="estate_override">
Una o più di queste impostazioni sono già impostate a livello regionale
diff --git a/indra/newview/skins/default/xui/it/floater_animation_preview.xml b/indra/newview/skins/default/xui/it/floater_animation_preview.xml
index 77341cad63..dc99d287b9 100644
--- a/indra/newview/skins/default/xui/it/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/it/floater_animation_preview.xml
@@ -115,14 +115,14 @@ La lunghezza massima è [MAX_LENGTH] secondi.
<text name="description_label">
Descrizione:
</text>
- <spinner label="Priorità" label_width="72" name="priority" tool_tip="Definisce quali altre animazioni possono essere sostituite da questa animazione" width="110"/>
+ <spinner label="Priorità" name="priority" tool_tip="Definisce quali altre animazioni possono essere sostituite da questa animazione"/>
<check_box label="Ciclica" name="loop_check" tool_tip="Riproduce questa animazione in ripetizione"/>
<spinner label="In(%)" name="loop_in_point" tool_tip="Imposta il punto sul quale ritorna l&apos;animazione"/>
<spinner label="Out(%)" name="loop_out_point" tool_tip="Imposta il punto sul quale termina l&apos;animazione"/>
<text name="hand_label">
Postura della mano
</text>
- <combo_box left_delta="100" name="hand_pose_combo" tool_tip="Definisce ciò che fanno le mani durante l&apos;animazione" width="184">
+ <combo_box name="hand_pose_combo" tool_tip="Definisce ciò che fanno le mani durante l&apos;animazione">
<combo_box.item label="Stendi" name="Spread"/>
<combo_box.item label="Rilassato" name="Relaxed"/>
<combo_box.item label="Indica entrambi" name="PointBoth"/>
@@ -140,7 +140,7 @@ La lunghezza massima è [MAX_LENGTH] secondi.
<text name="emote_label">
Espressione
</text>
- <combo_box left_delta="100" name="emote_combo" tool_tip="Definisce ciò che fa il viso durante l&apos;animazione" width="184">
+ <combo_box name="emote_combo" tool_tip="Definisce ciò che fa il viso durante l&apos;animazione">
<item label="(Nessuno)" name="[None]" value=""/>
<item label="Aaaaah" name="Aaaaah" value="Aaaaah"/>
<item label="Spavento" name="Afraid" value="Spavento"/>
@@ -162,18 +162,18 @@ La lunghezza massima è [MAX_LENGTH] secondi.
<item label="Occhiolino" name="Wink" value="Occhiolino"/>
<item label="Preoccupato" name="Worry" value="Preoccupato"/>
</combo_box>
- <text name="preview_label" width="250">
+ <text name="preview_label">
Vedi anteprima mentre
</text>
- <combo_box left_delta="154" name="preview_base_anim" tool_tip="Da usarsi per controllare il comportamento dell&apos;animazione mentre l&apos;avatar svolge azioni abituali." width="130">
+ <combo_box name="preview_base_anim" tool_tip="Da usarsi per controllare il comportamento dell&apos;animazione mentre l&apos;avatar svolge azioni abituali.">
<item label="In piedi" name="Standing" value="In piedi"/>
<item label="Camminando" name="Walking" value="Cammina"/>
<item label="Seduto" name="Sitting" value="Seduto"/>
<item label="Volo" name="Flying" value="Volo"/>
</combo_box>
- <spinner label="Avvio lento (sec)" label_width="125" name="ease_in_time" tool_tip="Durata (in secondi) della fusione in entrata delle animazioni" width="192"/>
- <spinner bottom_delta="-20" label="Arresto lento (sec)" label_width="125" left="10" name="ease_out_time" tool_tip="Durata (in secondi) della fusione in uscita delle animazioni" width="192"/>
- <button bottom_delta="-32" name="play_btn" tool_tip="Riproduci la tua animazione"/>
+ <spinner label="Avvio lento (sec)" name="ease_in_time" tool_tip="Durata (in secondi) della fusione in entrata delle animazioni"/>
+ <spinner label="Arresto lento (sec)" name="ease_out_time" tool_tip="Durata (in secondi) della fusione in uscita delle animazioni"/>
+ <button name="play_btn" tool_tip="Riproduci la tua animazione"/>
<button name="pause_btn" tool_tip="Metti in pausa la tua animazione"/>
<button label="" name="stop_btn" tool_tip="Ferma la riproduzione dell&apos;animazione"/>
<text name="bad_animation_text">
diff --git a/indra/newview/skins/default/xui/it/floater_avatar_picker.xml b/indra/newview/skins/default/xui/it/floater_avatar_picker.xml
index 7c037801e9..5a542d6a27 100644
--- a/indra/newview/skins/default/xui/it/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/it/floater_avatar_picker.xml
@@ -24,6 +24,10 @@
Comincia a digitare il nome della persona:
</text>
<button label="Vai" label_selected="Vai" name="Find"/>
+ <scroll_list name="SearchResults">
+ <columns label="Nome" name="name"/>
+ <columns label="Nome utente" name="username"/>
+ </scroll_list>
</panel>
<panel label="Amici" name="FriendsPanel">
<text name="InstructSelectFriend">
@@ -39,7 +43,10 @@
Metri
</text>
<button font="SansSerifSmall" label="Aggiorna la lista" label_selected="Aggiorna l&apos;elenco" left_delta="6" name="Refresh" width="110"/>
- <scroll_list bottom_delta="-169" height="159" name="NearMe"/>
+ <scroll_list bottom_delta="-169" height="159" name="NearMe">
+ <columns label="Nome" name="name"/>
+ <columns label="Nome utente" name="username"/>
+ </scroll_list>
</panel>
</tab_container>
<button label="OK" label_selected="OK" name="ok_btn"/>
diff --git a/indra/newview/skins/default/xui/it/floater_beacons.xml b/indra/newview/skins/default/xui/it/floater_beacons.xml
index ca6711468d..b7ab265cc2 100644
--- a/indra/newview/skins/default/xui/it/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/it/floater_beacons.xml
@@ -17,5 +17,6 @@
<check_box label="Tocca solo" name="touch_only"/>
<check_box label="Fonti sonore" name="sounds"/>
<check_box label="Fonti delle particelle" name="particles"/>
+ <check_box label="Fonti multimedia" name="moapbeacon"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_bumps.xml b/indra/newview/skins/default/xui/it/floater_bumps.xml
index 6de2fea67f..ae66148659 100644
--- a/indra/newview/skins/default/xui/it/floater_bumps.xml
+++ b/indra/newview/skins/default/xui/it/floater_bumps.xml
@@ -7,7 +7,7 @@
[TIME] [NAME] ti ha urtato
</floater.string>
<floater.string name="llpushobject">
- [TIME] [NAME] ti ha spinto per mezzo di uno script
+ [TIME] [NAME] ti ha spinto con uno script
</floater.string>
<floater.string name="selected_object_collide">
[TIME] [NAME] ti ha colpito con un oggetto
diff --git a/indra/newview/skins/default/xui/it/floater_buy_object.xml b/indra/newview/skins/default/xui/it/floater_buy_object.xml
index 895d8aa746..e7cbd68b38 100644
--- a/indra/newview/skins/default/xui/it/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/it/floater_buy_object.xml
@@ -1,26 +1,29 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="contents" title="ACQUISTA COPIA DELL&apos;OGGETTO">
+ <floater.string name="title_buy_text">
+ Compra
+ </floater.string>
+ <floater.string name="title_buy_copy_text">
+ Compra un copia di
+ </floater.string>
+ <floater.string name="no_copy_text">
+ (non copiabile)
+ </floater.string>
+ <floater.string name="no_modify_text">
+ (non modificabile)
+ </floater.string>
+ <floater.string name="no_transfer_text">
+ (non trasferibile)
+ </floater.string>
<text name="contents_text">
Contiene:
</text>
<text name="buy_text">
- Compra per [AMOUNT]L$ da [NAME]?
+ Acquista per L$[AMOUNT] da:
+ </text>
+ <text name="buy_name_text">
+ [NAME]?
</text>
- <button label="Annulla" label_selected="Annulla" name="cancel_btn"/>
<button label="Compra" label_selected="Compra" name="buy_btn"/>
- <string name="title_buy_text">
- Compra
- </string>
- <string name="title_buy_copy_text">
- Compra un copia di
- </string>
- <string name="no_copy_text">
- (non copiabile)
- </string>
- <string name="no_modify_text">
- (non modificabile)
- </string>
- <string name="no_transfer_text">
- (non trasferibile)
- </string>
+ <button label="Annulla" label_selected="Annulla" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_display_name.xml b/indra/newview/skins/default/xui/it/floater_display_name.xml
new file mode 100644
index 0000000000..3e0c43e741
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_display_name.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Display Name" title="CAMBIA NOME VISUALIZZATO">
+ <text name="info_text">
+ Il nome che assegni al tuo avatar è il Nome visualizzato. Puoi cambiarlo una volta alla settimana.
+ </text>
+ <text name="lockout_text">
+ Non puoi cambiare il Nome visualizzato fino a: [TIME].
+ </text>
+ <text name="set_name_label">
+ Nuovo Nome visualizzato:
+ </text>
+ <text name="name_confirm_label">
+ Digita nuovamente il nuovo nome per confermare:
+ </text>
+ <button label="Salva" name="save_btn" tool_tip="Salva il tuo nuovo Nome visualizzato"/>
+ <button label="Reimposta" name="reset_btn" tool_tip="Fai corrispondere Nome visualizzato e Nome utente"/>
+ <button label="Annulla" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_event.xml b/indra/newview/skins/default/xui/it/floater_event.xml
index 9a0105a589..b64f429870 100644
--- a/indra/newview/skins/default/xui/it/floater_event.xml
+++ b/indra/newview/skins/default/xui/it/floater_event.xml
@@ -1,40 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- follows="all"
- height="400"
- can_resize="true"
- help_topic="event_details"
- label="Event"
- layout="topleft"
- name="Event"
- save_rect="true"
- save_visibility="false"
- title="EVENT DETAILS"
- width="600">
- <floater.string
- name="loading_text">
+<?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.string name="loading_text">
Caricamento in corso...
</floater.string>
- <floater.string
- name="done_text">
- Done
- </floater.string>
- <web_browser
- trusted_content="true"
- follows="left|right|top|bottom"
- layout="topleft"
- left="10"
- name="browser"
- height="365"
- width="580"
- top="0"/>
- <text
- follows="bottom|left"
- height="16"
- layout="topleft"
- left_delta="0"
- name="status_text"
- top_pad="10"
- width="150" />
+ <floater.string name="done_text">
+ Fine
+ </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"/>
</floater>
-
diff --git a/indra/newview/skins/default/xui/it/floater_hardware_settings.xml b/indra/newview/skins/default/xui/it/floater_hardware_settings.xml
index 384e7c1272..561f8dbf34 100644
--- a/indra/newview/skins/default/xui/it/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/it/floater_hardware_settings.xml
@@ -14,6 +14,9 @@
<combo_box.item label="8x" name="8x"/>
<combo_box.item label="16x" name="16x"/>
</combo_box>
+ <text name="antialiasing restart">
+ (richiede il riavvio del viewer)
+ </text>
<spinner label="Gamma:" name="gamma"/>
<text name="(brightness, lower is brighter)">
(0 = luminosità default, più basso = più luminoso)
diff --git a/indra/newview/skins/default/xui/it/floater_incoming_call.xml b/indra/newview/skins/default/xui/it/floater_incoming_call.xml
index 4d9c1b98dd..a95ed44662 100644
--- a/indra/newview/skins/default/xui/it/floater_incoming_call.xml
+++ b/indra/newview/skins/default/xui/it/floater_incoming_call.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="incoming call" title="UNA PERSONA SCONOSCIUTA STA CHIAMANDO">
+<floater name="incoming call" title="Chiamata in arrivo">
<floater.string name="lifetime">
5
</floater.string>
diff --git a/indra/newview/skins/default/xui/it/floater_map.xml b/indra/newview/skins/default/xui/it/floater_map.xml
index 3dcfdd4662..bf19ba6674 100644
--- a/indra/newview/skins/default/xui/it/floater_map.xml
+++ b/indra/newview/skins/default/xui/it/floater_map.xml
@@ -3,6 +3,9 @@
<floater.string name="ToolTipMsg">
[REGION](Fai doppio clic per aprire la Mappa, premi il tasto Maiusc e trascina per la panoramica)
</floater.string>
+ <floater.string name="AltToolTipMsg">
+ [REGION](Fai doppio clic per teleportarti, premi il tasto Maiusc e trascina per la panoramica)
+ </floater.string>
<floater.string name="mini_map_caption">
MINI MAPPA
</floater.string>
diff --git a/indra/newview/skins/default/xui/it/floater_pay.xml b/indra/newview/skins/default/xui/it/floater_pay.xml
index 6389cbfbf7..5753c8c765 100644
--- a/indra/newview/skins/default/xui/it/floater_pay.xml
+++ b/indra/newview/skins/default/xui/it/floater_pay.xml
@@ -11,7 +11,7 @@
</text>
<icon name="icon_person" tool_tip="Persona"/>
<text left="115" name="payee_name">
- Test Name That Is Extremely Long To Check Clipping
+ Nome di test che è troppo lungo per controllare il taglio
</text>
<button label="1 L$" label_selected="1 L$" left="118" name="fastpay 1" width="80"/>
<button label="5 L$" label_selected="5 L$" left="210" name="fastpay 5"/>
diff --git a/indra/newview/skins/default/xui/it/floater_preferences.xml b/indra/newview/skins/default/xui/it/floater_preferences.xml
index c5b6654a69..7a1d2966ed 100644
--- a/indra/newview/skins/default/xui/it/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/it/floater_preferences.xml
@@ -5,10 +5,12 @@
<tab_container name="pref core" tab_width="100">
<panel label="Generale" name="general"/>
<panel label="Grafica" name="display"/>
- <panel label="Riservatezza" name="im"/>
<panel label="Audio e media" name="audio"/>
<panel label="Chat" name="chat"/>
+ <panel label="Sposta e visualizza" name="move"/>
<panel label="Notifiche" name="msgs"/>
+ <panel label="Colori" name="colors"/>
+ <panel label="Riservatezza" name="im"/>
<panel label="Impostazione" name="input"/>
<panel label="Avanzate" name="advanced1"/>
</tab_container>
diff --git a/indra/newview/skins/default/xui/it/floater_region_debug_console.xml b/indra/newview/skins/default/xui/it/floater_region_debug_console.xml
new file mode 100644
index 0000000000..6efa10290b
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_region_debug_console.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="region_debug_console" title="Debug regione"/>
diff --git a/indra/newview/skins/default/xui/it/floater_tools.xml b/indra/newview/skins/default/xui/it/floater_tools.xml
index fc13e09d1c..52b5566006 100644
--- a/indra/newview/skins/default/xui/it/floater_tools.xml
+++ b/indra/newview/skins/default/xui/it/floater_tools.xml
@@ -64,6 +64,8 @@
<radio_item label="Seleziona faccia" name="radio select face"/>
</radio_group>
<check_box label="Modifica parti collegate" name="checkbox edit linked parts"/>
+ <button label="Collegamento" name="link_btn"/>
+ <button label="Scollega" name="unlink_btn"/>
<text name="RenderingCost" tool_tip="Mostra il costo di rendering calcolato per questo oggetto">
þ: [COUNT]
</text>
@@ -171,9 +173,15 @@
<text name="Creator:">
Creatore:
</text>
+ <text name="Creator Name">
+ Sig.ra Esbee Linden (esbee.linden)
+ </text>
<text name="Owner:">
Proprietario:
</text>
+ <text name="Owner Name">
+ Sig.ra Erica &quot;Moose&quot; Linden (erica.linden)
+ </text>
<text name="Group:">
Gruppo:
</text>
@@ -277,7 +285,7 @@
<combo_box.item label="Plastica" name="Plastic"/>
<combo_box.item label="Gomma" name="Rubber"/>
</combo_box>
- <text name="text cut" left_delta="-10" width="170">
+ <text left_delta="-10" name="text cut" width="170">
Riduci una sezione (inizio/fine)
</text>
<spinner label="I" name="cut begin"/>
diff --git a/indra/newview/skins/default/xui/it/floater_voice_controls.xml b/indra/newview/skins/default/xui/it/floater_voice_controls.xml
index 4741d8d32f..0f0467757d 100644
--- a/indra/newview/skins/default/xui/it/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/it/floater_voice_controls.xml
@@ -19,12 +19,12 @@
<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_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_panel>
</layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_web_content.xml b/indra/newview/skins/default/xui/it/floater_web_content.xml
new file mode 100644
index 0000000000..5603e85417
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_web_content.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_web_content" title="">
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button name="back" tool_tip="Naviga indietro"/>
+ <button name="forward" tool_tip="Naviga avanti"/>
+ <button name="stop" tool_tip="Interrompi navigazione"/>
+ <button name="reload" tool_tip="Ricarica pagina"/>
+ <combo_box name="address" tool_tip="Inserisci URL qui"/>
+ <icon name="media_secure_lock_flag" tool_tip="Navigazione sicura"/>
+ <button name="popexternal" tool_tip="Apri URL corrente nel browser del computer"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/inspect_avatar.xml b/indra/newview/skins/default/xui/it/inspect_avatar.xml
index ec5561a5b2..6f52aaef74 100644
--- a/indra/newview/skins/default/xui/it/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/it/inspect_avatar.xml
@@ -10,6 +10,11 @@
<string name="Details">
[SL_PROFILE]
</string>
+ <text name="user_name_small" value="Grumpity ProductEngine con un nome lungo"/>
+ <text name="user_slid" value="james.linden"/>
+ <text name="user_details">
+ Questa è la mia descrizione in second life e penso che sia perfetta. Ma per qualche motivo la mia descrizione è davvero molto lunga, perché mi piace parlare a lungo
+ </text>
<slider name="volume_slider" tool_tip="Volume voce" value="0.5"/>
<button label="Aggiungi amico" name="add_friend_btn"/>
<button label="IM" name="im_btn"/>
diff --git a/indra/newview/skins/default/xui/it/language_settings.xml b/indra/newview/skins/default/xui/it/language_settings.xml
index 312b8e21aa..5f448fa828 100644
--- a/indra/newview/skins/default/xui/it/language_settings.xml
+++ b/indra/newview/skins/default/xui/it/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">italian</string>
+ <string name="MacLocale">it_IT.UTF-8</string>
<string name="DarwinLocale">it_IT.UTF-8</string>
<string name="LinuxLocale">it_IT.UTF-8</string>
diff --git a/indra/newview/skins/default/xui/it/menu_attachment_self.xml b/indra/newview/skins/default/xui/it/menu_attachment_self.xml
index 489d6af1d7..0b841d591f 100644
--- a/indra/newview/skins/default/xui/it/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/it/menu_attachment_self.xml
@@ -5,7 +5,7 @@
<menu_item_call label="Stacca" name="Detach"/>
<menu_item_call label="Siedi" name="Sit Down Here"/>
<menu_item_call label="Alzati" name="Stand Up"/>
- <menu_item_call label="Cambia vestiario" name="Change Outfit"/>
+ <menu_item_call label="Il mio aspetto" name="Change 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..."/>
diff --git a/indra/newview/skins/default/xui/it/menu_avatar_self.xml b/indra/newview/skins/default/xui/it/menu_avatar_self.xml
index 977503dace..a4dafd7b5f 100644
--- a/indra/newview/skins/default/xui/it/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/it/menu_avatar_self.xml
@@ -14,6 +14,7 @@
<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="Fisica" name="Self Physics"/>
<menu_item_call label="Alpha (Trasparenza)" name="Self Alpha"/>
<menu_item_call label="Tutti gli abiti" name="All Clothes"/>
</context_menu>
@@ -21,7 +22,7 @@
<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="Il mio aspetto" 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..."/>
diff --git a/indra/newview/skins/default/xui/it/menu_bottomtray.xml b/indra/newview/skins/default/xui/it/menu_bottomtray.xml
index 8ca5b24b48..ddd6909136 100644
--- a/indra/newview/skins/default/xui/it/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/it/menu_bottomtray.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Pulsante Parla" name="EnableVoiceChat"/>
<menu_item_check label="Tasto Gesture" name="ShowGestureButton"/>
<menu_item_check label="Tasto Movimento" name="ShowMoveButton"/>
<menu_item_check label="Tasto Visuale" name="ShowCameraButton"/>
<menu_item_check label="Tasto Foto" name="ShowSnapshotButton"/>
- <menu_item_check label="Pulsante barra laterale" name="ShowSidebarButton"/>
<menu_item_check label="Pulsante Costruisci" name="ShowBuildButton"/>
<menu_item_check label="Pulsante Cerca" name="ShowSearchButton"/>
<menu_item_check label="Pulsante Mappa" name="ShowWorldMapButton"/>
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
index 22a37d7095..1f10734c4a 100644
--- a/indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
+<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"/>
@@ -11,9 +11,11 @@
<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"/>
-</menu>
+</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
index 8b4ed607e7..4f62ccaa9c 100644
--- a/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml
@@ -1,10 +1,31 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
- <menu_item_call label="Siedi" name="sit_down_here"/>
- <menu_item_call label="Alzati" name="stand_up"/>
- <menu_item_call label="Cambia vestiario" name="change_outfit"/>
- <menu_item_call label="Il mio profilo" name="my_profile"/>
- <menu_item_call label="I miei amici..." name="my_friends"/>
- <menu_item_call label="I miei gruppi" name="my_groups"/>
+<?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..."/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_inventory.xml b/indra/newview/skins/default/xui/it/menu_inventory.xml
index f2eb8b1bf7..f18ddb595c 100644
--- a/indra/newview/skins/default/xui/it/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/it/menu_inventory.xml
@@ -25,6 +25,7 @@
<menu_item_call label="Nuove mutande" name="New Underpants"/>
<menu_item_call label="Nuovo Alfa Mask" name="New Alpha Mask"/>
<menu_item_call label="Nuovo tatuaggio" name="New Tattoo"/>
+ <menu_item_call label="Nuova fisica" name="New Physics"/>
</menu>
<menu label="Nuove parti del corpo" name="New Body Parts">
<menu_item_call label="Nuova forma del corpo" name="New Shape"/>
diff --git a/indra/newview/skins/default/xui/it/menu_inventory_add.xml b/indra/newview/skins/default/xui/it/menu_inventory_add.xml
index 5e61625f84..a2535ce48d 100644
--- a/indra/newview/skins/default/xui/it/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/it/menu_inventory_add.xml
@@ -23,6 +23,7 @@
<menu_item_call label="Nuovi slip" name="New Underpants"/>
<menu_item_call label="Nuovo Alfa (trasparenza)" name="New Alpha"/>
<menu_item_call label="Nuovo tatuaggio" name="New Tattoo"/>
+ <menu_item_call label="Nuova fisica" name="New Physics"/>
</menu>
<menu label="Nuove parti del corpo" name="New Body Parts">
<menu_item_call label="Nuova figura corporea" name="New Shape"/>
diff --git a/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml
index 9f1b413276..3d64e4da4e 100644
--- a/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml
@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_gear_default">
+<toggleable_menu name="menu_gear_default">
<menu_item_call label="Nuova finestra inventario" name="new_window"/>
- <menu_item_call label="Ordina in base al nome" name="sort_by_name"/>
- <menu_item_call label="Mostra prima i più recenti" name="sort_by_recent"/>
+ <menu_item_check label="Ordina in base al nome" name="sort_by_name"/>
+ <menu_item_check label="Mostra prima i più recenti" name="sort_by_recent"/>
+ <menu_item_check label="Ordina le cartelle sempre in base al nome" name="sort_folders_by_name"/>
+ <menu_item_check label="Ordina cartelle di sistema all&apos;inizio" name="sort_system_folders_to_top"/>
<menu_item_call label="Mostra filtri" name="show_filters"/>
<menu_item_call label="Ripristina filtri" name="reset_filters"/>
<menu_item_call label="Chiudi tutte le cartelle" name="close_folders"/>
@@ -12,4 +14,4 @@
<menu_item_call label="Trova originale" name="Find Original"/>
<menu_item_call label="Trova tutti i link" name="Find All Links"/>
<menu_item_call label="Svuota cestino" name="empty_trash"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_login.xml b/indra/newview/skins/default/xui/it/menu_login.xml
index 0a6d803058..bdf7d2094f 100644
--- a/indra/newview/skins/default/xui/it/menu_login.xml
+++ b/indra/newview/skins/default/xui/it/menu_login.xml
@@ -16,7 +16,8 @@
<menu_item_call label="Imposta dimensioni della finestra..." name="Set Window Size..."/>
<menu_item_call label="Mostra i Termini del servizio (TOS)" name="TOS"/>
<menu_item_call label="Mostra messaggio critico" name="Critical"/>
- <menu_item_call label="Test browser Web" name="Web Browser Test"/>
+ <menu_item_call label="Test browser multimedia" name="Web Browser Test"/>
+ <menu_item_call label="Test finestra contenuti Web" name="Web Content Floater Test"/>
<menu_item_check label="Mostra selettore griglia" name="Show Grid Picker"/>
<menu_item_call label="Mostra Console notifiche" name="Show Notifications Console"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_media_ctrl.xml b/indra/newview/skins/default/xui/it/menu_media_ctrl.xml
new file mode 100644
index 0000000000..a0e7370efd
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_media_ctrl.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="media ctrl context menu">
+ <menu_item_call label="Taglia" name="Cut"/>
+ <menu_item_call label="Copia" name="Copy"/>
+ <menu_item_call label="Incolla" name="Paste"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_mini_map.xml b/indra/newview/skins/default/xui/it/menu_mini_map.xml
index ecc2bef06a..561b80e046 100644
--- a/indra/newview/skins/default/xui/it/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/it/menu_mini_map.xml
@@ -3,6 +3,7 @@
<menu_item_call label="Zoom ravvicinato" name="Zoom Close"/>
<menu_item_call label="Zoom Medio" name="Zoom Medium"/>
<menu_item_call label="Zoom Distante" name="Zoom Far"/>
+ <menu_item_call label="Zoom predefinito" name="Zoom Default"/>
<menu_item_check label="Ruota la mappa" name="Rotate Map"/>
<menu_item_check label="Centra automaticamente" name="Auto Center"/>
<menu_item_call label="Ferma il puntamento" name="Stop Tracking"/>
diff --git a/indra/newview/skins/default/xui/it/menu_object.xml b/indra/newview/skins/default/xui/it/menu_object.xml
index 4c7402ea08..a172cf3b26 100644
--- a/indra/newview/skins/default/xui/it/menu_object.xml
+++ b/indra/newview/skins/default/xui/it/menu_object.xml
@@ -16,14 +16,14 @@
<context_menu label="Attacca" name="Object Attach"/>
<context_menu label="Attacca HUD" name="Object Attach HUD"/>
</context_menu>
- <context_menu label="Rimuovi" name="Remove">
+ <context_menu label="Gestisci" name="Remove">
<menu_item_call label="Segnala abuso" name="Report Abuse..."/>
<menu_item_call label="Blocca" name="Object Mute"/>
<menu_item_call label="Restituisci" name="Return..."/>
- <menu_item_call label="Elimina" name="Delete"/>
</context_menu>
<menu_item_call label="Prendi" name="Pie Object Take"/>
<menu_item_call label="Prendi copia" name="Take Copy"/>
<menu_item_call label="Paga" name="Pay..."/>
<menu_item_call label="Acquista" name="Buy..."/>
+ <menu_item_call label="Elimina" name="Delete"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_outfit_gear.xml b/indra/newview/skins/default/xui/it/menu_outfit_gear.xml
index a02d4ad429..09fc867d7c 100644
--- a/indra/newview/skins/default/xui/it/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/it/menu_outfit_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Outfit">
+<toggleable_menu name="Gear Outfit">
<menu_item_call label="Indossa - Sostituisci vestiario attuale" name="wear"/>
<menu_item_call label="Indossa - Aggiungi al vestiario attuale" name="wear_add"/>
<menu_item_call label="Togli - Rimuovi dal vestiario attuale" name="take_off"/>
@@ -14,6 +14,7 @@
<menu_item_call label="Nuova maglietta intima" name="New Undershirt"/>
<menu_item_call label="Nuovi slip" name="New Underpants"/>
<menu_item_call label="Nuovo Alpha (trasparenza)" name="New Alpha"/>
+ <menu_item_call label="Nuova fisica" name="New Physics"/>
<menu_item_call label="Nuovo tatuaggio" name="New Tattoo"/>
</menu>
<menu label="Nuove parti del corpo" name="New Body Parts">
@@ -24,4 +25,4 @@
</menu>
<menu_item_call label="Cambia nome del vestiario" name="rename"/>
<menu_item_call label="Elimina vestito" name="delete_outfit"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/it/menu_places_gear_folder.xml
index 59fbb86ddc..23757d47e0 100644
--- a/indra/newview/skins/default/xui/it/menu_places_gear_folder.xml
+++ b/indra/newview/skins/default/xui/it/menu_places_gear_folder.xml
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
+<toggleable_menu name="menu_folder_gear">
<menu_item_call label="Aggiungi punto di riferimento" name="add_landmark"/>
<menu_item_call label="Aggiungi cartella" name="add_folder"/>
+ <menu_item_call label="Ripristina oggetto" name="restore_item"/>
<menu_item_call label="Taglia" name="cut"/>
<menu_item_call label="Copia" name="copy_folder"/>
<menu_item_call label="Incolla" name="paste"/>
@@ -12,4 +13,4 @@
<menu_item_call label="Apri tutte le cartelle" name="expand_all"/>
<menu_item_call label="Chiudi tutte le cartelle" name="collapse_all"/>
<menu_item_check label="Ordina in base alla data" name="sort_by_date"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml
index 32d7abc259..a458b1a768 100644
--- a/indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml
+++ b/indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml
@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_ladmark_gear">
+<toggleable_menu name="menu_ladmark_gear">
<menu_item_call label="Teleport" name="teleport"/>
<menu_item_call label="Maggiori informazioni" name="more_info"/>
<menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
<menu_item_call label="Aggiungi Punto di riferimento" name="add_landmark"/>
<menu_item_call label="Aggiungi cartella" name="add_folder"/>
+ <menu_item_call label="Ripristina oggetto" name="restore_item"/>
<menu_item_call label="Taglia" name="cut"/>
<menu_item_call label="Copia punto di riferimento" name="copy_landmark"/>
<menu_item_call label="Copia SLurl" name="copy_slurl"/>
@@ -15,4 +16,4 @@
<menu_item_call label="Chiudi tutte le cartelle" name="collapse_all"/>
<menu_item_check label="Ordina in base alla data" name="sort_by_date"/>
<menu_item_call label="Crea Luogo consigliato" name="create_pick"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml
index 72dfbeecb6..6599810a67 100644
--- a/indra/newview/skins/default/xui/it/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/it/menu_viewer.xml
@@ -7,11 +7,17 @@
</menu_item_call>
<menu_item_call label="Compra L$" name="Buy and Sell L$"/>
<menu_item_call label="Il mio profilo" name="Profile"/>
- <menu_item_call label="Cambia vestiario" name="ChangeOutfit"/>
+ <menu_item_call label="Il mio aspetto" name="ChangeOutfit"/>
<menu_item_check label="Il mio inventario" name="Inventory"/>
<menu_item_check label="Il mio inventario" name="ShowSidetrayInventory"/>
<menu_item_check label="Le mie gesture" name="Gestures"/>
<menu_item_check label="La mia voce" name="ShowVoice"/>
+ <menu label="Spostamento" name="Movement">
+ <menu_item_call label="Siedi" name="Sit Down Here"/>
+ <menu_item_check label="Vola" name="Fly"/>
+ <menu_item_check label="Corri sempre" name="Always Run"/>
+ <menu_item_call label="Ferma animazione" name="Stop Animating My Avatar"/>
+ </menu>
<menu label="Il mio stato" name="Status">
<menu_item_call label="Assente" name="Set Away"/>
<menu_item_call label="Non disponibile" name="Set Busy"/>
@@ -29,6 +35,7 @@
<menu label="Mondo" name="World">
<menu_item_check label="Mini mappa" name="Mini-Map"/>
<menu_item_check label="Mappa del mondo" name="World Map"/>
+ <menu_item_check label="Cerca" name="Search"/>
<menu_item_call label="Istantanea" name="Take Snapshot"/>
<menu_item_call label="Crea punto di riferimento per questo luogo" name="Create Landmark Here"/>
<menu label="Profilo del luogo" name="Land">
@@ -47,6 +54,7 @@
<menu_item_check label="Proprietari di terreno" name="Land Owners"/>
<menu_item_check label="Coordinate" name="Coordinates"/>
<menu_item_check label="Proprietà del lotto" name="Parcel Properties"/>
+ <menu_item_check label="Menu Avanzato" name="Show Advanced Menu"/>
</menu>
<menu_item_call label="Teleport a Casa" name="Teleport Home"/>
<menu_item_call label="Imposta come Casa mia" name="Set Home to Here"/>
@@ -85,6 +93,7 @@
<menu_item_call label="Prendi copia" name="Take Copy"/>
<menu_item_call label="Salva nell&apos;inventario" name="Save Object Back to My Inventory"/>
<menu_item_call label="Salva nei contenuti oggetto" name="Save Object Back to Object Contents"/>
+ <menu_item_call label="Restituisci oggetto" name="Return Object back to Owner"/>
</menu>
<menu label="Script" name="Scripts">
<menu_item_call label="Ricompila script (Mono)" name="Mono"/>
@@ -98,6 +107,7 @@
<menu_item_check label="Seleziona solo i miei oggetti" name="Select Only My Objects"/>
<menu_item_check label="Seleziona solo gli oggetti spostabili" name="Select Only Movable Objects"/>
<menu_item_check label="Seleziona circostante" name="Select By Surrounding"/>
+ <menu_item_check label="Mostra contorni selezione" name="Show Selection Outlines"/>
<menu_item_check label="Seleziona mostra nascosti" name="Show Hidden Selection"/>
<menu_item_check label="Seleziona mostra il raggio luminoso per la selezione" name="Show Light Radius for Selection"/>
<menu_item_check label="Mostra il raggio indicatore" name="Show Selection Beam"/>
@@ -112,15 +122,17 @@
<menu_item_call label="Animazione ([COST] L$)..." name="Upload Animation"/>
<menu_item_call label="In blocco ([COST] L$ per file)..." name="Bulk Upload"/>
</menu>
+ <menu_item_call label="Annulla" name="Undo"/>
+ <menu_item_call label="Ripeti" name="Redo"/>
</menu>
<menu label="Aiuto" name="Help">
<menu_item_call label="Aiuto di [SECOND_LIFE]" name="Second Life Help"/>
+ <menu_item_check label="Attiva suggerimenti" name="Enable Hints"/>
<menu_item_call label="Segnala abuso" name="Report Abuse"/>
<menu_item_call label="Segnala bug" name="Report Bug"/>
<menu_item_call label="Informazioni su [APP_NAME]" name="About Second Life"/>
</menu>
<menu label="Avanzate" name="Advanced">
- <menu_item_call label="Ferma animazione" name="Stop Animating My Avatar"/>
<menu_item_call label="Ridisegna le texture" name="Rebake Texture"/>
<menu_item_call label="Imposta dimensioni dell&apos;interfaccia sui valori predefiniti" name="Set UI Size to Default"/>
<menu_item_call label="Imposta dimensioni della finestra..." name="Set Window Size..."/>
@@ -174,8 +186,7 @@
<menu_item_check label="Cerca" name="Search"/>
<menu_item_call label="Rilascia tasti" name="Release Keys"/>
<menu_item_call label="Imposta dimensioni dell&apos;interfaccia sui valori predefiniti" name="Set UI Size to Default"/>
- <menu_item_check label="Corri sempre" name="Always Run"/>
- <menu_item_check label="Vola" name="Fly"/>
+ <menu_item_check label="Mostra menu Avanzato - tasti di scelta rapida esistenti" name="Show Advanced Menu - legacy shortcut"/>
<menu_item_call label="Chiudi finestra" name="Close Window"/>
<menu_item_call label="Chiudi tutte le finestre" name="Close All Windows"/>
<menu_item_call label="Foto su disco" name="Snapshot to Disk"/>
@@ -193,7 +204,6 @@
<menu_item_call label="Zoom avanti" name="Zoom In"/>
<menu_item_call label="Zoom predefinito" name="Zoom Default"/>
<menu_item_call label="Zoom indietro" name="Zoom Out"/>
- <menu_item_check label="Mostra menu Avanzato" name="Show Advanced Menu"/>
</menu>
<menu_item_call label="Mostra impostazioni di debug" name="Debug Settings"/>
<menu_item_check label="Mostra menu sviluppo" name="Debug Mode"/>
@@ -215,7 +225,9 @@
<menu label="Mostra informazioni" name="Display Info">
<menu_item_check label="Mostra orario" name="Show Time"/>
<menu_item_check label="Mostra informazioni di rendering" name="Show Render Info"/>
+ <menu_item_check label="Mostra info sulla texture" name="Show Texture Info"/>
<menu_item_check label="Mostra colore sotto il cursore" name="Show Color Under Cursor"/>
+ <menu_item_check label="Mostra memoria" name="Show Memory"/>
<menu_item_check label="Mostra aggiornamenti agli oggetti" name="Show Updates"/>
</menu>
<menu label="Forza un errore" name="Force Errors">
@@ -233,6 +245,9 @@
<menu_item_check label="Veloc. di visualizzazione casuale" name="Randomize Framerate"/>
<menu_item_check label="Test frame" name="Frame Test"/>
</menu>
+ <menu label="Render Metadata" name="Render Metadata">
+ <menu_item_check label="Aggiorna tipo" name="Update Type"/>
+ </menu>
<menu label="Rendering" name="Rendering">
<menu_item_check label="Assi" name="Axes"/>
<menu_item_check label="Wireframe" name="Wireframe"/>
@@ -261,21 +276,20 @@
<menu_item_call label="Dump della cache oggetti regione" name="Dump Region Object Cache"/>
</menu>
<menu label="Interfaccia utente" name="UI">
- <menu_item_call label="Test browser Web" name="Web Browser Test"/>
+ <menu_item_call label="Test browser multimedia" name="Web Browser Test"/>
+ <menu_item_call label="Browser contenuto Web" name="Web Content Browser"/>
<menu_item_call label="Stampa informazioni oggetto selezionato" name="Print Selected Object Info"/>
<menu_item_call label="Statistiche memoria" name="Memory Stats"/>
- <menu_item_check label="Doppio clic pilota automatico" name="Double-Click Auto-Pilot"/>
- <menu_item_check label="Doppio clic per teleport" name="DoubleClick Teleport"/>
+ <menu_item_check label="Console di debug regione" name="Region Debug Console"/>
<menu_item_check label="Debug clic" name="Debug Clicks"/>
<menu_item_check label="Debug eventi mouse" name="Debug Mouse Events"/>
</menu>
<menu label="XUI" name="XUI">
<menu_item_call label="Ricarica impostazioni colori" name="Reload Color Settings"/>
<menu_item_call label="Test Mostra Font" name="Show Font Test"/>
- <menu_item_call label="Carica da XML" name="Load from XML"/>
- <menu_item_call label="Salva in XML" name="Save to XML"/>
<menu_item_check label="Mostra nomi XUI" name="Show XUI Names"/>
<menu_item_call label="Manda IM di prova" name="Send Test IMs"/>
+ <menu_item_call label="Svuota cache nomi" name="Flush Names Caches"/>
</menu>
<menu label="Avatar" name="Character">
<menu label="Grab Baked Texture" name="Grab Baked Texture">
@@ -299,9 +313,9 @@
</menu>
<menu_item_check label="Texture HTTP" name="HTTP Textures"/>
<menu_item_check label="Finestra Console al prossimo lancio" name="Console Window"/>
- <menu_item_check label="Mostra menu Admin" name="View Admin Options"/>
<menu_item_call label="Richiedi diritti Admin" name="Request Admin Options"/>
<menu_item_call label="Lascia stato Admin" name="Leave Admin Options"/>
+ <menu_item_check label="Mostra menu Admin" name="View Admin Options"/>
</menu>
<menu label="Admin" name="Admin">
<menu label="Object">
@@ -322,4 +336,9 @@
</menu>
<menu_item_call label="Strumenti Admin" name="God Tools"/>
</menu>
+ <menu label="Admin" name="Deprecated">
+ <menu label="Take Off Clothing" name="Take Off Clothing">
+ <menu_item_call label="Fisica" name="Physics"/>
+ </menu>
+ </menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml
index cce5888598..6619260670 100644
--- a/indra/newview/skins/default/xui/it/notifications.xml
+++ b/indra/newview/skins/default/xui/it/notifications.xml
@@ -73,7 +73,7 @@ Dettagli errore: La notifica denominata &apos;[_NAME]&apos; non è stata trovata
</notification>
<notification name="LoginFailedNoNetwork">
Non è possibile collegarsi alla [SECOND_LIFE_GRID].
-&apos;[DIAGNOSTIC]&apos;
+ &apos;[DIAGNOSTIC]&apos;
Accertati che la tua connessione Internet stia funzionando correttamente.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
@@ -109,9 +109,13 @@ Scegli solo un oggetto e riprova.
Chi non è tuo amico non saprà che hai scelto di ignorare le loro chiamate e IM.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="FavoritesOnLogin">
+ Nota: Se attivi questa opzione, chiunque usa questo computer può vedere l&apos;elenco di luoghi preferiti.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="GrantModifyRights">
Quando concedi i diritti di modifica ad un altro residente, gli permetti di modificare, eliminare o prendere QUALSIASI oggetto che possiedi in Second Life. Pertanto ti consigliamo di essere ben sicuro quando concedi questo diritto.
-Vuoi concedere i diritti di modifica a [FIRST_NAME] [LAST_NAME]?
+Vuoi concedere i diritti di modifica a [NAME]?
<usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
</notification>
<notification name="GrantModifyRightsMultiple">
@@ -120,7 +124,7 @@ Vuoi concedere i diritti di modifica ai residenti selezionati?
<usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
</notification>
<notification name="RevokeModifyRights">
- Vuoi revocare i diritti di modifica dati a [FIRST_NAME] [LAST_NAME]?
+ Vuoi revocare i diritti di modifica di [NAME]?
<usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
</notification>
<notification name="RevokeModifyRightsMultiple">
@@ -317,24 +321,17 @@ Superato il limite di oggetti collegati [MAX_ATTACHMENTS]. Per favore prima stac
Non puoi indossare quell&apos;elemento perchè non è ancora stato caricato. Riprova fra un minuto.
</notification>
<notification name="MustHaveAccountToLogIn">
- Qualcosa è rimasto vuoto.
-Devi inserire sia il nome che il cognome del tuo avatar.
+ Spiacenti. Un campo è vuoto.
+Inserisci il Nome utente del tuo avatar.
-Hai bisogno di un account per entrare in [SECOND_LIFE]. Ne vuoi creare uno adesso?
+Devi avere un account per entrare in [SECOND_LIFE]. Vuoi crearne uno adesso?
<url name="url">
https://join.secondlife.com/index.php?lang=it-IT
</url>
<usetemplate name="okcancelbuttons" notext="Riprova" yestext="Crea un nuovo account"/>
</notification>
<notification name="InvalidCredentialFormat">
- Immetti sia il nome che il cognome del tuo avatar nel campo del nome utente, quindi effettua l&apos;accesso.
- </notification>
- <notification name="AddClassified">
- L&apos;inserzione comparirà nella sezione &apos;Annunci&apos; della Ricerca e su [http://secondlife.com/community/classifieds secondlife.com] per una settimana.
-Compila la tua inserzione, quindi clicca &apos;Pubblica...&apos; per aggiungerla all&apos;elenco degli annunci.
-Quando clicchi su Pubblica, ti verrà chiesto di indicare quale prezzo vuoi pagare.
-Pagando di più, il tuo annuncio comparirà più in alto nella lista delle inserzioni, nonché nei risultati delle ricerche in base a parole chiave.
- <usetemplate ignoretext="Come creare una nuova inserzione" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ Immetti il nome utente oppure sia il nome che il cognome del tuo avatar nel campo del nome utente, quindi effettua nuovamente l&apos;accesso.
</notification>
<notification name="DeleteClassified">
Cancella annuncio &apos;[NAME]&apos;?
@@ -388,6 +385,9 @@ Nota: questa operazione cancellerà la cache.
<notification name="ChangeSkin">
La nuova pelle comparirà dopo il riavvio di [APP_NAME].
</notification>
+ <notification name="ChangeLanguage">
+ La modifica della lingua avrà effetto dopo il riavvio di [APP_NAME].
+ </notification>
<notification name="GoToAuctionPage">
Vai alla pagina web [SECOND_LIFE] per vedere i dettagli dell&apos;asta oppure fai un&apos;offerta?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
@@ -598,6 +598,10 @@ Attese [VALIDS]
Impossibile trovare il frammento &apos;data&apos; nell&apos;intestazione WAV:
[FILE]
</notification>
+ <notification name="SoundFileInvalidChunkSize">
+ Dimensione chunk nel file WAV:
+[FILE]
+ </notification>
<notification name="SoundFileInvalidTooLong">
Il file audio è troppo lungo (deve essere al massimo 10 secondi):
[FILE]
@@ -918,12 +922,6 @@ In genere si tratta di un problema temporaneo. Attendi alcuni minuti per modific
Impossibile comprare terreno per il gruppo:
Non hai i permessi per comprare il terreno per il tuo gruppo attivo.
</notification>
- <notification label="Aggiungi Amico" name="AddFriend">
- Gli amici possono autorizzarsi a vedersi l&apos;un l&apos;altro sulla mappa e sapere quando sono collegati.
-
-Offri l&apos;amicizia a [NAME]?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
<notification label="Aggiungi Amico" name="AddFriendWithMessage">
Gli amici possono autorizzarsi a vedersi l&apos;un l&apos;altro sulla mappa e sapere quando sono collegati.
@@ -942,7 +940,7 @@ Offri l&apos;amicizia a [NAME]?
<input name="message">
[DESC] (nuovo)
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Annulla"/>
</form>
</notification>
@@ -952,7 +950,7 @@ Offri l&apos;amicizia a [NAME]?
<input name="message">
[DESC] (nuovo)
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Annulla"/>
</form>
</notification>
@@ -962,12 +960,12 @@ Offri l&apos;amicizia a [NAME]?
<input name="new_name">
[NAME]
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="Annulla"/>
</form>
</notification>
<notification name="RemoveFromFriends">
- Vuoi rimuovere remove [FIRST_NAME] [LAST_NAME] dalla lista dei tuoi amici?
+ Vuoi rimuovere [NAME] dalla lista dei tuoi amici?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="RemoveMultipleFromFriends">
@@ -1089,12 +1087,11 @@ Cedi questo terreno di [AREA] m² al gruppo &apos;[GROUP_NAME]&apos;?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="DeedLandToGroupWithContribution">
- Cedendo questo terreno al gruppo sara richiesto hai componenti di avere e di mantenere il terreno con un credito sufficiente.
-La cessione include un contributo simultaneo di terreno al gruppo da &apos;[FIRST_NAME] [LAST_NAME]&apos;.
-Il prezzo di acquisto del terreno non è rifondibile al proprietario.
-Se una terreno ceduto al gruppo viene venduto, il prezzo di vendita viene diviso in parti uguali fra i membri del gruppo.
+ Completando la cessione del lotto, il gruppo dovrà avere e mantenere crediti sufficienti per l&apos;uso del terreno.
+La cessione includerà un contributo contemporaneo di terreno al gruppo da &apos;[NAME]&apos;.
+Il prezzo di acquisto del terreno non viene rimborsato al proprietario. Se un lotto ceduto viene venduto, il prezzo di vendita viene distribuito in maniera paritetica tra i membri del gruppo.
-Cedi questo terreno di [AREA] m² al gruppo &apos;[GROUP_NAME]&apos;?
+Cedere questi [AREA] m² di terreno al gruppo &apos;[GROUP_NAME]&apos;?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="DisplaySetToSafe">
@@ -1336,6 +1333,48 @@ Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per mig
Scaricare nella cartella Applicazioni?
<usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica l&apos;aggiornamento"/>
</notification>
+ <notification name="FailedUpdateInstall">
+ Si è verificato un errore durante l&apos;aggiornamento del viewer.
+Scarica e installa la versione più recente del viewer da
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FailedRequiredUpdateInstall">
+ Non è stato possibile installare un aggiornamento richiesto.
+Non potrai accedere fino a quando non verrà aggiornato [APP_NAME].
+
+Scarica e installa la versione più recente del viewer da
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="Esci"/>
+ </notification>
+ <notification name="UpdaterServiceNotRunning">
+ È disponibile un aggiornamento obbligatorio per l&apos;installazione di Second Life.
+
+Puoi scaricare questo aggiornamento da http://www.secondlife.com/downloads
+oppure puoi installarlo adesso.
+ <usetemplate name="okcancelbuttons" notext="Esci da Second Life" yestext="Scarica e aggiorna adesso"/>
+ </notification>
+ <notification name="DownloadBackgroundTip">
+ È stato scaricato un aggiornamento dell&apos;installazione di [APP_NAME].
+Versione [VERSION] [[RELEASE_NOTES_FULL_URL] Informazioni su questo aggiornamento]
+ <usetemplate name="okcancelbuttons" notext="Più tardi..." yestext="Installa ora e riavvia [APP_NAME]"/>
+ </notification>
+ <notification name="DownloadBackgroundDialog">
+ È stato scaricato un aggiornamento dell&apos;installazione di [APP_NAME].
+Versione [VERSION] [[RELEASE_NOTES_FULL_URL] Informazioni su questo aggiornamento]
+ <usetemplate name="okcancelbuttons" notext="Più tardi..." yestext="Installa ora e riavvia [APP_NAME]"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedVerboseDialog">
+ È stato scaricato un aggiornamento obbligatorio del software.
+Versione [VERSION]
+
+Per installare l&apos;aggiornamento è necessario riavviare [APP_NAME].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedDialog">
+ Per installare l&apos;aggiornamento è necessario riavviare [APP_NAME].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="DeedObjectToGroup">
La cessione di questo oggetto farà in modo che il gruppo:
* Riceva i L$ pagati all&apos;oggetto
@@ -1466,6 +1505,46 @@ La chat e gli IM verranno nascosti. Gli IM riceveranno la tua risposta di Non di
<button name="Cancel" text="Annulla"/>
</form>
</notification>
+ <notification name="SetDisplayNameSuccess">
+ Ciao [DISPLAY_NAME]!
+
+Come nel modo reale, prima che tutti conoscano il tuo nuovo nome ci vorrà del tempo. Saranno necessari alcuni giorni per [http://wiki.secondlife.com/wiki/Setting_your_display_name l&apos;aggiornamento del nome] in oggetti, script, ricerca, ecc.
+ </notification>
+ <notification name="SetDisplayNameBlocked">
+ Non puoi cambiare il tuo nome visualizzato. Se ritieni che si tratta di un errore, contatta l&apos;assistenza.
+ </notification>
+ <notification name="SetDisplayNameFailedLength">
+ Il nome è troppo lungo. La lunghezza massima dei nomi visualizzati è di [LENGTH] caratteri.
+
+Riprova con un nome più corto.
+ </notification>
+ <notification name="SetDisplayNameFailedGeneric">
+ Non è possibile impostare il tuo nome visualizzato. Riprova più tardi.
+ </notification>
+ <notification name="SetDisplayNameMismatch">
+ I nomi visualizzati inseriti non corrispondono. Inseriscili nuovamente.
+ </notification>
+ <notification name="AgentDisplayNameUpdateThresholdExceeded">
+ Devi aspettare prima di cambiare il nome visualizzato.
+
+Vedi http://wiki.secondlife.com/wiki/Setting_your_display_name
+
+Riprova più tardi.
+ </notification>
+ <notification name="AgentDisplayNameSetBlocked">
+ Non è possibile impostare il nome richiesto perché contiene una parola vietata.
+
+ Riprova con un altro nome.
+ </notification>
+ <notification name="AgentDisplayNameSetInvalidUnicode">
+ Il nome visualizzato scelto contiene caratteri non validi.
+ </notification>
+ <notification name="AgentDisplayNameSetOnlyPunctuation">
+ Il nome visualizzato deve contenere lettere, non solo segni di punteggiatura.
+ </notification>
+ <notification name="DisplayNameUpdate">
+ [OLD_NAME] ([SLID]) ha il nuovo nome [NEW_NAME].
+ </notification>
<notification name="OfferTeleport">
Offri un teleport nel posto dove sei con il seguente messaggio?
<form name="form">
@@ -2164,18 +2243,13 @@ Prova a selezionare una parte di terreno più piccola.
<notification name="NoContentToSearch">
Seleziona almeno un tipo di contenuto per la ricerca (Generale, Moderato o Adulti).
</notification>
- <notification name="GroupVote">
- [NAME] ha proposto di votare su:
-[MESSAGE]
- <form name="form">
- <button name="VoteNow" text="Vota ora"/>
- <button name="Later" text="Successivo"/>
- </form>
- </notification>
<notification name="SystemMessage">
[MESSAGE]
</notification>
- <notification name="PaymentRecived">
+ <notification name="PaymentReceived">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentSent">
[MESSAGE]
</notification>
<notification name="EventNotification">
@@ -2184,7 +2258,7 @@ Prova a selezionare una parte di terreno più piccola.
[NAME]
[DATE]
<form name="form">
- <button name="Details" text="Descrizione"/>
+ <button name="Details" text="Dettagli"/>
<button name="Cancel" text="Cancella"/>
</form>
</notification>
@@ -2220,7 +2294,7 @@ Reinstalla il plugin o contatta il venditore se continui ad avere questi problem
Gli oggetti che possiedi sul terreno selezionato ti sono stati restituiti nell&apos;inventario.
</notification>
<notification name="OtherObjectsReturned">
- Gli oggetti selezionati sul terreno che è di proprietà di [NAME] sono stati restituiti nel suo inventario.
+ Sono stati restituiti all&apos;inventario di &apos;[NAME]&apos; gli oggetti sul lotto di terreno selezionato di sua proprietà.
</notification>
<notification name="OtherObjectsReturned2">
Sono stati restituiti al proprietario gli oggetti selezionati sul lotto nella terra di proprietà del residente &apos;[NAME]&apos;.
@@ -2344,7 +2418,7 @@ Riprova tra qualche istante.
Non è stato trovato nessun territorio valido.
</notification>
<notification name="ObjectGiveItem">
- Un oggetto denominato [OBJECTFROMNAME] di proprietà di [NAME_SLURL] ti ha dato questo [OBJECTTYPE]:
+ Un oggetto denominato &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; di proprietà di [NAME_SLURL] ti ha dato questo [OBJECTTYPE]:
[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Prendi"/>
@@ -2409,9 +2483,9 @@ Riprova tra qualche istante.
Hai offerto l&apos;amicizia a [TO_NAME]
</notification>
<notification name="OfferFriendshipNoMessage">
- [NAME] ti ha offerto la sua amicizia.
+ [NAME_SLURL] ti ha offerto di diventare amici.
-(Di default, potrete vedervi reciprocamente online.)
+(L&apos;impostazione predefinita consente a ciascuno di vedere se l&apos;altro è online.)
<form name="form">
<button name="Accept" text="Accetta"/>
<button name="Decline" text="Rifiuta"/>
@@ -2430,7 +2504,7 @@ Riprova tra qualche istante.
Offerta di amicizia rifiutata.
</notification>
<notification name="OfferCallingCard">
- [NAME] ti offre il suo biglietto da visita.
+ [NOME] ti offre il suo biglietto da visita.
Questo sarà aggiunto nel tuo inventario come segnalibro per consentirti di inviare rapidamente messaggi IM a questo residente.
<form name="form">
<button name="Accept" text="Accetta"/>
@@ -2446,11 +2520,11 @@ Se rimani qui verrai scollegato da Second Life.
Se rimani qui verrai scollegato da Second Life.
</notification>
<notification name="LoadWebPage">
- Caricare pagina web [URL]?
+ Caricare la pagina Web [URL]?
[MESSAGE]
-Dall&apos;oggetto: [OBJECTNAME], di: [NAME]?
+Dall&apos;oggetto: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, proprietario: [NAME]?
<form name="form">
<button name="Gotopage" text="Caricare"/>
<button name="Cancel" text="Annulla"/>
@@ -2466,10 +2540,10 @@ Dall&apos;oggetto: [OBJECTNAME], di: [NAME]?
L&apos;elemento che stai tentando di indossare usa delle caratteristiche che il tuo viewer non può leggere. Aggiorna la versione di [APP_NAME] per poterlo indossare.
</notification>
<notification name="ScriptQuestion">
- &apos;[OBJECTNAME]&apos;, un oggetto di proprietà di &apos;[NAME]&apos;, vorrebbe:
+ &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, un oggetto posseduto da &apos;[NAME]&apos; vorrebbe:
[QUESTIONS]
-Va bene?
+OK?
<form name="form">
<button name="Yes" text="Si"/>
<button name="No" text="No"/>
@@ -2477,7 +2551,7 @@ Va bene?
</form>
</notification>
<notification name="ScriptQuestionCaution">
- Un oggetto di nome &apos;[OBJECTNAME]&apos;, posseduto da &apos;[NAME]&apos; vorrebbe:
+ Un oggetto di nome &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, posseduto da &apos;[NAME]&apos; vorrebbe:
[QUESTIONS]
Se non ti fidi di questo oggetto e del suo ideatore, dovresti rifiutare la richiesta.
@@ -2490,14 +2564,14 @@ Concedi questa richiesta?
</form>
</notification>
<notification name="ScriptDialog">
- [NAME] &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos;
+ &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; di [NAME]
[MESSAGE]
<form name="form">
<button name="Ignore" text="Ignora"/>
</form>
</notification>
<notification name="ScriptDialogGroup">
- [GROUPNAME] &apos;[TITLE]&apos;
+ &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; di [GROUPNAME]
[MESSAGE]
<form name="form">
<button name="Ignore" text="Ignora"/>
@@ -2537,10 +2611,10 @@ Clicca su Accetta per unirti alla chiamata oppure su Declina to declinare l&apos
[NAME] ha ricevuto un IM ed è stato automaticamente sbloccato.
</notification>
<notification name="AutoUnmuteByMoney">
- [NAME] ha ricevuto del denaro e pertanto è stato automaticamente sbloccato.
+ [NAME] ha ricevuto del denaro ed è stato automaticamente sbloccato.
</notification>
<notification name="AutoUnmuteByInventory">
- A [NAME] è stato offerto un elemento dell&apos;Inventario e pertanto è stato automaticamente sbloccato.
+ [NAME] ha ricevuto un&apos;offerta di inventario ed è stato automaticamente sbloccato.
</notification>
<notification name="VoiceInviteGroup">
[NAME] si è aggiunto alla chiamata in chat vocale con il gruppo [GROUP].
@@ -2676,7 +2750,7 @@ Il pulsante verrà visualizzato quando lo spazio sarà sufficiente.
<notification name="ShareItemsConfirmation">
Sei sicuro di volere condividere gli oggetti
-&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
Con i seguenti residenti?
@@ -2725,9 +2799,7 @@ Avatar &apos;[NAME]&apos; ha lasciato la modalità aspetto.
<notification name="NoConnect">
Ci sono problemi di connessione tramite [PROTOCOL] [HOSTID].
Ti consigliamo di controllare le tue impostazioni di rete e della firewall.
- <form name="form">
- <button name="OK" text="OK"/>
- </form>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="NoVoiceConnect">
A causa di problemi di connessione al server vocale
@@ -2736,9 +2808,7 @@ Ti consigliamo di controllare le tue impostazioni di rete e della firewall.
le comunicazioni tramite voce non saranno disponibili.
Ti consigliamo di controllare le tue impostazioni di rete e della firewall.
- <form name="form">
- <button name="OK" text="OK"/>
- </form>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AvatarRezLeftNotification">
( presente da [EXISTENCE] secondi )
@@ -2764,6 +2834,95 @@ uniscono alla chiamata in un secondo momento, anche dopo che tu ti fossi scolleg
Disattiva audio di tutti?
<usetemplate ignoretext="Conferma prima di disattivare l&apos;audio di tutti i partecipanti alla chiamata di gruppo" name="okcancelignore" notext="Annulla" yestext="Ok"/>
</notification>
+ <notification label="Chat" name="HintChat">
+ Per partecipare alla conversazione, digita nel campo chat in basso.
+ </notification>
+ <notification label="Alzati" name="HintSit">
+ Per alzarti ed uscire dalla posizione seduta, clicca sul pulsante Alzati.
+ </notification>
+ <notification label="Parla" name="HintSpeak">
+ Clicca sul pulsante Parla per attivare o disattivare il microfono.
+
+Clicca sul tasto freccia su per visualizzare il pannello di controllo voce.
+
+Se nascondi il tasto Parla viene disattivata la funzione voce.
+ </notification>
+ <notification label="Esplora il mondo" name="HintDestinationGuide">
+ La Guida alle destinazioni contiene migliaia di nuovi luoghi da scoprire. Seleziona una destinazione e scegli Teleport per iniziare a esplorare.
+ </notification>
+ <notification label="Pannello laterale" name="HintSidePanel">
+ Nel pannello laterale puoi acccedere rapidamente all&apos;inventario, ai vestiti, ai profili e ad altro ancora.
+ </notification>
+ <notification label="Movimento" name="HintMove">
+ Per camminare o correre, apri il pannello Sposta e usa le frecce direzionali per spostarti. Puoi anche usare le frecce direzionali sulla tastiera del computer.
+ </notification>
+ <notification label="" name="HintMoveClick">
+ 1. Clicca per camminare
+Clicca dovunque sul terreno per camminare verso quella posizione.
+
+2. Clicca e trascina per ruotare la visuale
+Clicca e trascina dovunque nel mondo per ruotare la visuale
+ </notification>
+ <notification label="Nome visualizzato" name="HintDisplayName">
+ Imposta qui il tuo nome visualizzato personalizzabile. È in aggiunta al tuo nome utente, che non può essere cambiato. Nelle preferenze puoi anche cambiare il modo in cui vedi i nomi degli altri.
+ </notification>
+ <notification label="Visuale" name="HintView">
+ Per cambiare la visuale della fotocamera, usa i controlli Ruota visuale e Panoramica. Ripristina la visuale premendo il tasto Esc o camminando.
+ </notification>
+ <notification label="Inventario" name="HintInventory">
+ Trova oggetti nel tuo inventario. I più recenti si trovano nella scheda Elementi recenti.
+ </notification>
+ <notification label="Hai dollari Linden!" name="HintLindenDollar">
+ Ecco il saldo attuale in L$. Clicca su Acquista L$ per acquistare altri dollari Linden.
+ </notification>
+ <notification name="PopupAttempt">
+ Non è stato possibile aprire una finestra pop-up.
+ <form name="form">
+ <ignore name="ignore" text="Attiva tutti i pop-up"/>
+ <button name="open" text="Apri finestra pop-up"/>
+ </form>
+ </notification>
+ <notification name="AuthRequest">
+ Il sito &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; nel reame &apos;[REALM]&apos; richiede un nome utente e una password.
+ <form name="form">
+ <input name="username" text="Nome utente"/>
+ <input name="password" text="Password"/>
+ <button name="ok" text="Invia"/>
+ <button name="cancel" text="Annulla"/>
+ </form>
+ </notification>
+ <notification label="" name="ModeChange">
+ Per cambiare la modalità è necessario uscire e riavviare.
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="NoClassifieds">
+ La creazione e la modifica degli annunci sono disponibili solo in modalità Avanzata. Uscire e cambiare la modalità? Sulla schermata di accesso si può selezionare la modalità.
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="NoGroupInfo">
+ La creazione e la modifica dei gruppi sono disponibili solo in modalità Avanzata. Uscire e cambiare la modalità? Sulla schermata di accesso si può selezionare la modalità.
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="NoPicks">
+ La creazione e la modifica dei luoghi preferiti sono disponibili solo in modalità Avanzata. Uscire e cambiare la modalità? Sulla schermata di accesso si può selezionare la modalità.
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="NoWorldMap">
+ La visualizzazione della mappa del mondo è disponibile solo in modalità Avanzata. Uscire e cambiare la modalità? Sulla schermata di accesso si può selezionare la modalità.
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="NoVoiceCall">
+ Le chiamate Voce sono disponibili solo in modalità Avanzata. Eseguire il logout e cambiare la modalità?
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="NoAvatarShare">
+ La condivisione è disponibile solo in modalità Avanzata. Eseguire il logout e cambiare la modalità?
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="NoAvatarPay">
+ Il pagamento ad altri residenti è disponibile solo in modalità Avanzata. Eseguire il logout e cambiare la modalità?
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
<global name="UnsupportedCPU">
- La velocità della tua CPU non soddisfa i requisiti minimi.
</global>
diff --git a/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml
index 3e604ca775..ede19b9e5a 100644
--- a/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml
@@ -21,7 +21,7 @@
<string name="FormatYears">
[COUNT] a
</string>
- <text name="avatar_name" value="Sconosciuto"/>
+ <text name="avatar_name" value="(caricamento in corso)"/>
<icon name="permission_edit_theirs_icon" tool_tip="Puoi modificare gli oggetti di questo amico"/>
<icon name="permission_edit_mine_icon" tool_tip="Questo amico può modificare, cancellare o prendere i tuoi oggetti"/>
<icon name="permission_map_icon" tool_tip="Questo amico può identificarti sulla mappa"/>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_alpha.xml b/indra/newview/skins/default/xui/it/panel_edit_alpha.xml
index 286ee626cf..6daa0cf8fd 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_alpha.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_alpha.xml
@@ -1,10 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_alpha_panel">
- <panel name="avatar_alpha_color_panel">
- <texture_picker label="Alpha inferiore" name="Lower Alpha" tool_tip="Clicca per scegliere una fotografia"/>
- <texture_picker label="Alpha superiore" name="Upper Alpha" tool_tip="Clicca per scegliere una fotografia"/>
- <texture_picker label="Alpha della testa" name="Head Alpha" tool_tip="Clicca per scegliere una fotografia"/>
- <texture_picker label="Alpha dell&apos;occhio" name="Eye Alpha" tool_tip="Clicca per scegliere una fotografia"/>
- <texture_picker label="Alpha dei capelli" name="Hair Alpha" tool_tip="Clicca per scegliere una fotografia"/>
- </panel>
+ <scroll_container name="avatar_alpha_color_panel_scroll">
+ <panel name="avatar_alpha_color_panel">
+ <texture_picker label="Alpha inferiore" name="Lower Alpha" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Alpha superiore" name="Upper Alpha" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Alpha della testa" name="Head Alpha" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Alpha dell&apos;occhio" name="Eye Alpha" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Alpha dei capelli" name="Hair Alpha" tool_tip="Clicca per scegliere una fotografia"/>
+ </panel>
+ </scroll_container>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_gloves.xml b/indra/newview/skins/default/xui/it/panel_edit_gloves.xml
index 48024b8095..366a82f7aa 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_gloves.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_gloves.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_gloves_panel">
<panel name="avatar_gloves_color_panel">
- <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_jacket.xml b/indra/newview/skins/default/xui/it/panel_edit_jacket.xml
index d77c1ec763..337720d068 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_jacket.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_jacket_panel">
<panel name="avatar_jacket_color_panel">
- <texture_picker label="Tessuto superiore" name="Upper Fabric" tool_tip="Clicca per scegliere una fotografia"/>
- <texture_picker label="Tessuto inferiore" name="Lower Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture superiore" name="Upper Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture inferiore" name="Lower Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_pants.xml b/indra/newview/skins/default/xui/it/panel_edit_pants.xml
index 83ef274877..21b5b7c026 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_pants.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_pants.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_pants_panel">
<panel name="avatar_pants_color_panel">
- <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_physics.xml b/indra/newview/skins/default/xui/it/panel_edit_physics.xml
new file mode 100644
index 0000000000..669a2c0eab
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_edit_physics.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_physics_panel">
+ <panel label="" name="accordion_panel">
+ <accordion name="physics_accordion">
+ <accordion_tab name="physics_breasts_updown_tab" title="Rimbalzo seno"/>
+ <accordion_tab name="physics_breasts_inout_tab" title="Décolleté"/>
+ <accordion_tab name="physics_breasts_leftright_tab" title="Ondeggiamento seno"/>
+ <accordion_tab name="physics_belly_tab" title="Rimbalzo pancia"/>
+ <accordion_tab name="physics_butt_tab" title="Rimbalzo natiche"/>
+ <accordion_tab name="physics_butt_leftright_tab" title="Ondeggiamento natiche"/>
+ <accordion_tab name="physics_advanced_tab" title="Parametri avanzati"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_profile.xml b/indra/newview/skins/default/xui/it/panel_edit_profile.xml
index 263ae105dc..545e96a8f1 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_profile.xml
@@ -22,6 +22,14 @@
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
<panel name="data_panel">
+ <text name="display_name_label" value="Nome visualizzato:"/>
+ <text name="solo_username_label" value="Nome utente:"/>
+ <button name="set_name" tool_tip="Imposta nome visualizzato"/>
+ <text name="solo_user_name" value="Hamilton Hitchings"/>
+ <text name="user_name" value="Hamilton Hitchings"/>
+ <text name="user_name_small" value="Hamilton Hitchings"/>
+ <text name="user_label" value="Nome utente:"/>
+ <text name="user_slid" value="hamilton.linden"/>
<panel name="lifes_images_panel">
<icon label="" name="2nd_life_edit_icon" tool_tip="Clicca per selezionare un&apos;immagine"/>
</panel>
@@ -38,7 +46,7 @@
<text name="my_account_link" value="[[URL] Go to My Dashboard]"/>
<text name="title_partner_text" value="Il mio partner:"/>
<panel name="partner_data_panel">
- <name_box initial_value="(recupero)" name="partner_text"/>
+ <text initial_value="(recupero)" name="partner_text"/>
</panel>
<text name="partner_edit_link" value="[[URL] Edit]"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_shirt.xml b/indra/newview/skins/default/xui/it/panel_edit_shirt.xml
index 1f41b28348..1777c0147f 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_shirt.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_shirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shirt_panel">
<panel name="avatar_shirt_color_panel">
- <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_shoes.xml b/indra/newview/skins/default/xui/it/panel_edit_shoes.xml
index 7a82c8e99d..c79408b94a 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_shoes.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_shoes.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shoes_panel">
<panel name="avatar_shoes_color_panel">
- <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_skirt.xml b/indra/newview/skins/default/xui/it/panel_edit_skirt.xml
index 7080b65737..87cdd16676 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_skirt.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_skirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skirt_panel">
<panel name="avatar_skirt_color_panel">
- <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_socks.xml b/indra/newview/skins/default/xui/it/panel_edit_socks.xml
index 6731511282..f61a72ed76 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_socks.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_socks.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_socks_panel">
<panel name="avatar_socks_color_panel">
- <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_underpants.xml b/indra/newview/skins/default/xui/it/panel_edit_underpants.xml
index 671eb57551..924344e3c0 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_underpants.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_underpants.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_underpants_panel">
<panel name="avatar_underpants_color_panel">
- <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/it/panel_edit_undershirt.xml
index fccc86f8fc..2f22c03294 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_undershirt.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_undershirt.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_undershirt_panel">
<panel name="avatar_undershirt_color_panel">
- <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Texture" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
<panel name="accordion_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_edit_wearable.xml b/indra/newview/skins/default/xui/it/panel_edit_wearable.xml
index 94bda7b2a6..e54dc26d05 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_wearable.xml
@@ -45,6 +45,9 @@
<string name="edit_tattoo_title">
Modifica del tatuaggio
</string>
+ <string name="edit_physics_title">
+ Modifica fisica
+ </string>
<string name="shape_desc_text">
Figura corporea:
</string>
@@ -90,6 +93,9 @@
<string name="tattoo_desc_text">
Tatuaggio:
</string>
+ <string name="physics_desc_text">
+ Fisica:
+ </string>
<labeled_back_button label="Salva" name="back_btn" tool_tip="Torna alla modifica del vestiario"/>
<text name="edit_wearable_title" value="Modifica della figura corporea"/>
<panel label="Camicia" name="wearable_type_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_group_land_money.xml b/indra/newview/skins/default/xui/it/panel_group_land_money.xml
index 16cc91cd9d..27675a18f5 100644
--- a/indra/newview/skins/default/xui/it/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/it/panel_group_land_money.xml
@@ -24,6 +24,7 @@
<scroll_list.columns label="Regione" name="location"/>
<scroll_list.columns label="Tipo" name="type"/>
<scroll_list.columns label="Superficie" name="area"/>
+ <scroll_list.columns label="Nascosto" name="hidden"/>
</scroll_list>
<text name="total_contributed_land_label">
Contributo totale:
diff --git a/indra/newview/skins/default/xui/it/panel_login.xml b/indra/newview/skins/default/xui/it/panel_login.xml
index 473bcfa88d..f88230ed11 100644
--- a/indra/newview/skins/default/xui/it/panel_login.xml
+++ b/indra/newview/skins/default/xui/it/panel_login.xml
@@ -11,12 +11,19 @@
<text name="username_text">
Nome utente:
</text>
- <line_editor label="Nome utente" name="username_edit" tool_tip="Nome utente [SECOND_LIFE]"/>
+ <combo_box name="username_combo" tool_tip="Il nome utente che hai scelto durante la registrazione, come robby12 o Stella Soleggiato"/>
<text name="password_text">
Password:
</text>
<check_box label="Ricorda password" name="remember_check"/>
<button label="Accedi" name="connect_btn"/>
+ <text name="mode_selection_text">
+ Modalità:
+ </text>
+ <combo_box name="mode_combo" tool_tip="Seleziona la modalità. Seleziona Di base per esplorare facilmente e rapidamente e per la chat. Seleziona Avanzata per accedere ad altre funzionalità.">
+ <combo_box.item label="Di base" name="Basic"/>
+ <combo_box.item label="Avanzate" name="Advanced"/>
+ </combo_box>
<text name="start_location_text">
Inizia da:
</text>
@@ -31,7 +38,7 @@
Iscriviti
</text>
<text name="forgot_password_text">
- Hai dimenticato il nome o la password?
+ Hai dimenticato il nome utente o la password?
</text>
<text name="login_help">
Ti serve aiuto con la fase di accesso?
diff --git a/indra/newview/skins/default/xui/it/panel_my_profile.xml b/indra/newview/skins/default/xui/it/panel_my_profile.xml
index 3e6683beb8..094b97962f 100644
--- a/indra/newview/skins/default/xui/it/panel_my_profile.xml
+++ b/indra/newview/skins/default/xui/it/panel_my_profile.xml
@@ -5,30 +5,27 @@
<string name="RegisterDateFormat">
[REG_DATE] ([AGE])
</string>
+ <string name="name_text_args">
+ [NAME]
+ </string>
+ <string name="display_name_text_args">
+ [DISPLAY_NAME]
+ </string>
<layout_stack name="layout">
<layout_panel name="profile_stack">
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
<panel name="second_life_image_panel">
- <icon label="" name="2nd_life_edit_icon" tool_tip="Clicca sul pulsante Modifica profilo per cambiare l&apos;immagine"/>
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <icon label="" name="real_world_edit_icon" tool_tip="Clicca sul pulsante Modifica profilo per cambiare l&apos;immagine"/>
- <text name="title_rw_descr_text" value="Mondo reale:"/>
- </panel>
- <text name="title_member_text" value="Residente dal:"/>
- <text name="title_acc_status_text" value="Stato account:"/>
- <text name="title_partner_text" value="Partner:"/>
- <panel name="partner_data_panel">
- <name_box initial_value="(recupero)" name="partner_text"/>
+ <text name="display_name_descr_text">
+ Nome utente
+ </text>
+ <text name="name_descr_text">
+ Nome visualizzato
+ </text>
+ <button label="Profilo" name="see_profile_btn" tool_tip="Visualizza profilo per questo avatar"/>
</panel>
- <text name="title_groups_text" value="Gruppi:"/>
</panel>
</scroll_container>
</layout_panel>
</layout_stack>
- <panel name="profile_me_buttons_panel">
- <button label="Modifica profilo" name="edit_profile_btn" tool_tip="Modifica le tue informazioni personali"/>
- </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_nearby_media.xml b/indra/newview/skins/default/xui/it/panel_nearby_media.xml
index 40312f76b4..03421456f9 100644
--- a/indra/newview/skins/default/xui/it/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/it/panel_nearby_media.xml
@@ -19,7 +19,7 @@
<button label="Spegni" name="all_nearby_media_disable_btn" tool_tip="Spegni tutti i media nei dintorni"/>
<button label="Accendi tutto" name="all_nearby_media_enable_btn" tool_tip="Accendi tutti i media nei dintorni"/>
<button name="open_prefs_btn" tool_tip="Accedi alle preferenze del media"/>
- <button label="Più &gt;&gt;" label_selected="Meno &lt;&lt;" name="more_btn" tool_tip="Opzioni avanzate"/>
+ <button label="Più &gt;&gt;" label_selected="&lt;&lt; Meno" name="more_btn" tool_tip="Opzioni avanzate"/>
<button label="Più &gt;&gt;" label_selected="Meno &lt;&lt;" name="less_btn" tool_tip="Opzioni avanzate"/>
</panel>
<panel name="nearby_media_panel">
diff --git a/indra/newview/skins/default/xui/it/panel_notify_textbox.xml b/indra/newview/skins/default/xui/it/panel_notify_textbox.xml
new file mode 100644
index 0000000000..ef27262010
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_notify_textbox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_notify_textbox">
+ <string name="message_max_lines_count" value="7"/>
+ <panel label="info_panel" name="info_panel">
+ <text_editor name="message" value="messaggio"/>
+ </panel>
+ <panel label="control_panel" name="control_panel">
+ <button label="Invia" name="btn_submit"/>
+ <button label="Ignora" name="ignore_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_people.xml b/indra/newview/skins/default/xui/it/panel_people.xml
index a8f60e556e..b24a4055f7 100644
--- a/indra/newview/skins/default/xui/it/panel_people.xml
+++ b/indra/newview/skins/default/xui/it/panel_people.xml
@@ -18,11 +18,13 @@ Stai cercando persone da frequentare? Prova la [secondlife:///app/worldmap Mappa
<string name="groups_filter_label" value="Filtro gruppi"/>
<string name="no_filtered_groups_msg" value="Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/groups/[SEARCH_TERM] Cerca]."/>
<string name="no_groups_msg" value="Stai cercando gruppi di cui far parte? Prova [secondlife:///app/search/groups Cerca]."/>
+ <string name="MiniMapToolTipMsg" value="[REGION](Fai doppio clic per aprire la Mappa, premi il tasto Maiusc e trascina per la panoramica)"/>
+ <string name="AltMiniMapToolTipMsg" value="[REGION](Fai doppio clic per teleportarti, premi il tasto Maiusc e trascina per la panoramica)"/>
<filter_editor label="Filtro" name="filter_input"/>
<tab_container name="tabs">
<panel label="NELLE VICINANZE" name="nearby_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="nearby_view_sort_btn" tool_tip="Opzioni"/>
+ <menu_button name="nearby_view_sort_btn" tool_tip="Opzioni"/>
<button name="add_friend_btn" tool_tip="Aggiungi il residente selezionato alla tua lista degli amici"/>
</panel>
</panel>
@@ -34,27 +36,27 @@ Stai cercando persone da frequentare? Prova la [secondlife:///app/worldmap Mappa
<panel label="bottom_panel" name="bottom_panel">
<layout_stack name="bottom_panel">
<layout_panel name="options_gear_btn_panel">
- <button name="friends_viewsort_btn" tool_tip="Mostra ulteriori opzioni"/>
+ <menu_button name="friends_viewsort_btn" tool_tip="Mostra ulteriori opzioni"/>
</layout_panel>
<layout_panel name="add_btn_panel">
<button name="add_btn" tool_tip="Offri amicizia a un residente"/>
</layout_panel>
<layout_panel name="trash_btn_panel">
- <dnd_button name="trash_btn" tool_tip="Rimuovi la persona selezionata dalla lista degli amici"/>
+ <dnd_button name="del_btn" tool_tip="Rimuovi la persona selezionata dalla lista degli amici"/>
</layout_panel>
</layout_stack>
</panel>
</panel>
<panel label="I MIEI GRUPPI" name="groups_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="groups_viewsort_btn" tool_tip="Opzioni"/>
+ <menu_button name="groups_viewsort_btn" tool_tip="Opzioni"/>
<button name="plus_btn" tool_tip="Aderisci al gruppo/Crea nuovo gruppo"/>
<button name="activate_btn" tool_tip="Attiva il gruppo selezionato"/>
</panel>
</panel>
<panel label="RECENTE" name="recent_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="recent_viewsort_btn" tool_tip="Opzioni"/>
+ <menu_button name="recent_viewsort_btn" tool_tip="Opzioni"/>
<button name="add_friend_btn" tool_tip="Aggiungi il residente selezionato alla tua lista degli amici"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_place_profile.xml b/indra/newview/skins/default/xui/it/panel_place_profile.xml
index eace6c89ce..c4ffe6af85 100644
--- a/indra/newview/skins/default/xui/it/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/it/panel_place_profile.xml
@@ -76,7 +76,7 @@
<text name="region_rating_label" value="Categoria:"/>
<text name="region_rating" value="Adulti"/>
<text name="region_owner_label" value="Proprietario:"/>
- <text name="region_owner" value="moose Van Moose"/>
+ <text name="region_owner" value="moose Van Moose nome lunghissimo moose"/>
<text name="region_group_label" value="Gruppo:"/>
<text name="region_group">
The Mighty Moose of mooseville soundvillemoose
@@ -89,6 +89,7 @@
<text name="estate_name_label" value="Proprietà immobiliare:"/>
<text name="estate_rating_label" value="Categoria:"/>
<text name="estate_owner_label" value="Proprietario:"/>
+ <text name="estate_owner" value="Test nome proprietario con nome molto lungo"/>
<text name="covenant_label" value="Regolamento:"/>
</panel>
</accordion_tab>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml
index 842daaa331..b628a29206 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml
@@ -3,35 +3,16 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
- <panel.string name="middle_mouse">
- Pulsante centrale del mouse
- </panel.string>
- <slider label="Angolo di visuale" name="camera_fov"/>
- <slider label="Distanza" name="camera_offset_scale"/>
- <text name="heading2">
- Posizione automatica per:
- </text>
- <check_box label="Costruire/Modificare" name="edit_camera_movement" tool_tip="Utilizza il posizionamento automatico della fotocamera entrando o uscendo dalla modalità modifica"/>
- <check_box label="Aspetto fisico" name="appearance_camera_movement" tool_tip="Utilizza il posizionamento automatico della camera in modalità modifica"/>
- <check_box initial_value="vero" label="Barra laterale" name="appearance_sidebar_positioning" tool_tip="Utilizza il posizionamento automatico della fotocamera per la barra laterale"/>
- <check_box label="Visualizzami in modalità soggettiva" name="first_person_avatar_visible"/>
- <check_box label="Le frecce di direzione mi fanno sempre spostare" name="arrow_keys_move_avatar_check"/>
- <check_box label="Doppio click e tieni premuto per correre" name="tap_tap_hold_to_run"/>
- <check_box label="Movimento delle labbra dell&apos;avatar quando parla" name="enable_lip_sync"/>
- <check_box label="Chat a bolla" name="bubble_text_chat"/>
- <slider label="Opacità" name="bubble_chat_opacity"/>
- <color_swatch name="background" tool_tip="Scegli il colore delle vignette della chat"/>
<text name="UI Size:">
- Dimensioni interfaccia utente
+ Dimensioni UI:
</text>
<check_box label="Mostra errori dello script in:" name="show_script_errors"/>
<radio_group name="show_location">
<radio_item label="Chat nei dintorni" name="0"/>
<radio_item label="Finestra separata" name="1"/>
</radio_group>
- <check_box label="Attiva/disattiva la funzione parla quando premo:" name="push_to_talk_toggle_check" tool_tip="In modalità &quot;interruttore ON/OFF&quot; premi il tasto una volta per attivare o disattivare il microfono. Quando non usi questa modalità, il microfono è attivo solo se tieni premuto il tasto di comando."/>
- <line_editor label="Pulsante di comando della funzione Premi per parlare" name="modifier_combo"/>
- <button label="Imposta tasto" name="set_voice_hotkey_button"/>
- <button label="Pulsante centrale del mouse" name="set_voice_middlemouse_button" tool_tip="Reimposta sul pulsante centrale del mouse"/>
- <button label="Altri dispositivi" name="joystick_setup_button"/>
+ <check_box label="Consenti più Viewer" name="allow_multiple_viewer_check"/>
+ <check_box label="Mostra selezione griglia all&apos;accesso" name="show_grid_selection_check"/>
+ <check_box label="Mostra menu Avanzato" name="show_advanced_menu_check"/>
+ <check_box label="Mostra menu Sviluppatore" name="show_develop_menu_check"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml
index 208dd5ed28..2834d520d1 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml
@@ -8,44 +8,10 @@
<radio_item label="Media" name="radio2" value="1"/>
<radio_item label="Grande" name="radio3" value="2"/>
</radio_group>
- <text name="font_colors">
- Colori caratteri:
- </text>
- <color_swatch label="Tuo" name="user"/>
- <text name="text_box1">
- Io
- </text>
- <color_swatch label="Altri" name="agent"/>
- <text name="text_box2">
- Altri
- </text>
- <color_swatch label="IM" name="im"/>
- <text name="text_box3">
- IM
- </text>
- <color_swatch label="Sistema" name="system"/>
- <text name="text_box4">
- Sistema
- </text>
- <color_swatch label="Errori script" name="script_error"/>
- <text name="text_box5">
- Errori script
- </text>
- <color_swatch label="Oggetti" name="objects"/>
- <text name="text_box6">
- Oggetti
- </text>
- <color_swatch label="Proprietario" name="owner"/>
- <text name="text_box7">
- Proprietario
- </text>
- <color_swatch label="URLs" name="links"/>
- <text name="text_box9">
- URLs
- </text>
<check_box initial_value="true" label="Simula la battitura tasti quando scrivi" name="play_typing_animation"/>
<check_box label="Quando sono OFF-LINE, spediscimi gli IM in una e-mail" name="send_im_to_email"/>
<check_box label="Attiva IM in testo semplice e cronologia chat" name="plain_text_chat_history"/>
+ <check_box label="Chat a vignetta" name="bubble_text_chat"/>
<text name="show_ims_in_label">
Mostra gli IM in:
</text>
@@ -56,8 +22,17 @@
<radio_item label="Finestre separate" name="radio" value="0"/>
<radio_item label="Schede" name="radio2" value="1"/>
</radio_group>
- <check_box name="translate_chat_checkbox"/>
- <text name="translate_chb_label" >Usa la traduzione meccanica durante le chat (tecnologia Google)</text>
+ <text name="disable_toast_label">
+ Attiva popup per chat in arrivo:
+ </text>
+ <check_box label="Chat di gruppo" name="EnableGroupChatPopups" tool_tip="Seleziona per vedere una finestra popup quando arriva una chat di gruppo"/>
+ <check_box label="Chat IM" name="EnableIMChatPopups" tool_tip="Seleziona per vedere una finestra popup quando arriva un messaggio IM"/>
+ <spinner label="Durata chat vicine:" name="nearby_toasts_lifetime"/>
+ <spinner label="Durata dissolvenza chat vicine:" name="nearby_toasts_fadingtime"/>
+ <check_box label="Use machine translation while chatting (powered by Google)" name="translate_chat_checkbox"/>
+ <text name="translate_chb_label">
+ Usa la traduzione meccanica durante le chat (tecnologia Google)
+ </text>
<text name="translate_language_text" width="110">
Traduci chat in:
</text>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_colors.xml b/indra/newview/skins/default/xui/it/panel_preferences_colors.xml
new file mode 100644
index 0000000000..167de5d028
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_preferences_colors.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Colori" name="colors_panel">
+ <text name="effects_color_textbox">
+ I miei effetti (raggio indicatore):
+ </text>
+ <color_swatch name="effect_color_swatch" tool_tip="Clicca per aprire il selettore dei colori"/>
+ <text name="font_colors">
+ Colori font della chat:
+ </text>
+ <text name="text_box1">
+ Io
+ </text>
+ <text name="text_box2">
+ Altri
+ </text>
+ <text name="text_box3">
+ Oggetti
+ </text>
+ <text name="text_box4">
+ Sistema
+ </text>
+ <text name="text_box5">
+ Errori
+ </text>
+ <text name="text_box7">
+ Proprietario
+ </text>
+ <text name="text_box9">
+ URL
+ </text>
+ <text name="bubble_chat">
+ Colore sfondo etichetta nome (influenza anche Chat a vignetta):
+ </text>
+ <color_swatch name="background" tool_tip="Seleziona colore etichetta nome"/>
+ <slider label="Opacità:" name="bubble_chat_opacity" tool_tip="Seleziona opacità etichetta nome"/>
+ <text name="floater_opacity">
+ Opacità finestra:
+ </text>
+ <slider label="Attiva:" name="active"/>
+ <slider label="Disattivata:" name="inactive"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_general.xml b/indra/newview/skins/default/xui/it/panel_preferences_general.xml
index 95c73f482d..c576b5f9d8 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_general.xml
@@ -44,16 +44,22 @@
<radio_item label="On" name="radio2" value="1"/>
<radio_item label="Mostra brevemente" name="radio3" value="2"/>
</radio_group>
- <check_box label="Mostra il mio nome" name="show_my_name_checkbox1"/>
- <check_box initial_value="true" label="Nome in piccolo" name="small_avatar_names_checkbox"/>
- <check_box label="Mostra titoli del gruppo" name="show_all_title_checkbox1"/>
- <text name="effects_color_textbox">
- I miei effetti:
+ <check_box label="Il mio nome" name="show_my_name_checkbox1"/>
+ <check_box label="Nomi utente" name="show_slids" tool_tip="Mostra il nome utente, come bobsmith123"/>
+ <check_box label="TItoli gruppo" name="show_all_title_checkbox1" tool_tip="Mostra titoli di gruppo, come Funzionario o Membro"/>
+ <check_box label="Evidenzia amici" name="show_friends" tool_tip="Evidenzia le etichette dei nomi dei tuoi amici"/>
+ <check_box label="Mostra nomi visualizzati" name="display_names_check" tool_tip="Seleziona per visualizzare i nomi in chat, IM, etichette, ecc."/>
+ <check_box label="Attiva suggerimenti UI Viewer" name="viewer_hints_check"/>
+ <text name="inworld_typing_rg_label">
+ Premere i tasti lettera:
</text>
+ <radio_group name="inworld_typing_preference">
+ <radio_item label="Avvia chat locale" name="radio_start_chat" value="1"/>
+ <radio_item label="Influenza il movimento (per es. WASD)" name="radio_move" value="0"/>
+ </radio_group>
<text name="title_afk_text">
Pausa assenza:
</text>
- <color_swatch label="" name="effect_color_swatch" tool_tip="Clicca per aprire la tavolozza dei colori"/>
<combo_box label="Pausa assenza:" name="afk">
<combo_box.item label="2 minuti" name="item0"/>
<combo_box.item label="5 minuti" name="item1"/>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml
index 67b3c61a47..7d21b8ccc7 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml
@@ -25,6 +25,7 @@
<text name="ShadersText">
Effetti grafici:
</text>
+ <check_box initial_value="vero" label="Acqua trasparente" name="TransparentWater"/>
<check_box initial_value="true" label="Piccoli rilievi e scintillii" name="BumpShiny"/>
<check_box initial_value="true" label="Effetti grafici base" name="BasicShaders" tool_tip="Disabilitare questa opzione può evitare che qualche scheda grafica vada in crash."/>
<check_box initial_value="true" label="Effetti grafici atmosferici" name="WindLightUseAtmosShaders"/>
@@ -38,6 +39,10 @@
<combo_box.item label="Tutti gli avatar e gli oggetti" name="3"/>
<combo_box.item label="Tutto" name="4"/>
</combo_box>
+ <slider label="Fisica avatar:" name="AvatarPhysicsDetail"/>
+ <text name="AvatarPhysicsDetailText">
+ Basso
+ </text>
<slider label="Distanza di disegno:" name="DrawDistance"/>
<text name="DrawDistanceMeterText2">
m
@@ -76,7 +81,7 @@
Basso
</text>
<text name="AvatarRenderingText">
- Rendering dell&apos;avatar:
+ Rendering avatar :
</text>
<check_box initial_value="true" label="Avatar bidimensionali (Impostor)" name="AvatarImpostors"/>
<check_box initial_value="true" label="Hardware Skinning" name="AvatarVertexProgram"/>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_move.xml b/indra/newview/skins/default/xui/it/panel_preferences_move.xml
new file mode 100644
index 0000000000..56d75bb3e3
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_preferences_move.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Movimento" name="move_panel">
+ <slider label="Angolo di visuale" name="camera_fov"/>
+ <slider label="Distanza" name="camera_offset_scale"/>
+ <text name="heading2">
+ Posizione automatica per:
+ </text>
+ <check_box label="Costruire/Modificare" name="edit_camera_movement" tool_tip="Utilizza il posizionamento automatico della fotocamera entrando o uscendo dalla modalità modifica"/>
+ <check_box label="Aspetto fisico" name="appearance_camera_movement" tool_tip="Utilizza il posizionamento automatico della camera in modalità modifica"/>
+ <check_box initial_value="vero" label="Barra laterale" name="appearance_sidebar_positioning" tool_tip="Utilizza il posizionamento automatico della fotocamera per la barra laterale"/>
+ <check_box label="Mostra in modalità Mouselook" name="first_person_avatar_visible"/>
+ <text name=" Mouse Sensitivity">
+ Sensibilità mouse visuale soggettiva:
+ </text>
+ <check_box label="Inverti" name="invert_mouse"/>
+ <check_box label="Le frecce di direzione mi fanno sempre spostare" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Doppio click e tieni premuto per correre" name="tap_tap_hold_to_run"/>
+ <check_box label="Doppio clic per:" name="double_click_chkbox"/>
+ <radio_group name="double_click_action">
+ <radio_item label="Teleport" name="radio_teleport"/>
+ <radio_item label="Autopilota" name="radio_autopilot"/>
+ </radio_group>
+ <button label="Altri dispositivi" name="joystick_setup_button"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml
index 1002195baf..41e7a59139 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml
@@ -7,21 +7,25 @@
<text name="cache_size_label_l">
(Luoghi, immagini, web, cronologia ricerche)
</text>
+ <check_box label="Mostrami nei risultati della ricerca" name="online_searchresults"/>
<check_box label="Solo amici e gruppi mi vedono online" name="online_visibility"/>
<check_box label="Solo amici e gruppi possono chiamarmi o mandarmi IM" name="voice_call_friends_only_check"/>
<check_box label="Spegnere il microfono alla chiusura delle chiamate" name="auto_disengage_mic_check"/>
- <check_box label="Accetta cookie" name="cookies_enabled"/>
- <check_box label="Consenti riproduzione multimediale automatica" name="autoplay_enabled"/>
+ <check_box label="Mostra i miei punti di riferimento preferiti all&apos;accesso (nel menu a discesa &apos;Inizia da&apos;)" name="favorites_on_login_check"/>
<text name="Logs:">
- Registri:
+ Registri chat:
</text>
<check_box label="Salva i registri delle conversazioni sul mio computer" name="log_nearby_chat"/>
<check_box label="Salva i registri degli IM nel mio computer" name="log_instant_messages"/>
- <check_box label="Riporta data e ora" name="show_timestamps_check_im"/>
- <line_editor left="288" name="log_path_string" right="-20"/>
+ <check_box label="Aggiungi l&apos;orario a ogni riga nel registro chat" name="show_timestamps_check_im"/>
+ <check_box label="Aggiungi la data al nome del file del registro." name="logfile_name_datestamp"/>
<text name="log_path_desc">
Ubicazione dei registri
</text>
+ <line_editor left="288" name="log_path_string" right="-20"/>
<button label="Sfoglia" label_selected="Sfoglia" name="log_path_button" width="130"/>
<button label="Lista dei bloccati" name="block_list"/>
+ <text name="block_list_label">
+ (Persone e/o Oggetti bloccati)
+ </text>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_setup.xml b/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
index 29618485c2..67fa32a960 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
@@ -1,13 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Impostazione" name="Input panel">
- <button bottom_delta="-40" label="Altri dispositivi" name="joystick_setup_button" width="165"/>
- <text name="Mouselook:">
- Soggettiva:
- </text>
- <text name=" Mouse Sensitivity">
- Sensibilità mouse
- </text>
- <check_box label="Inverti" name="invert_mouse"/>
<text name="Network:">
Rete:
</text>
@@ -37,13 +29,21 @@
<radio_item label="Usa il mio browser (IE, Firefox, Safari)" name="external" tool_tip="Utilizza il browser Web predefinito di sistema per l&apos;aiuto, per i link Web e così via. Sconsigliato durante l&apos;esecuzione a tutto schermo." value="1"/>
<radio_item label="Utilizza il browser Web integrato" name="internal" tool_tip="Utilizza il browser Web integrato per l&apos;aiuto, per i link Web e così via. Questo browser si apre in una nuova finestra in [APP_NAME]." value=""/>
</radio_group>
- <check_box label="Abilita plugin" name="browser_plugins_enabled"/>
- <check_box label="Accetta cookie" name="cookies_enabled"/>
- <check_box label="Abilita Javascript" name="browser_javascript_enabled"/>
- <check_box label="Abilita proxy Web" name="web_proxy_enabled"/>
+ <check_box initial_value="true" label="Abilita plugin" name="browser_plugins_enabled"/>
+ <check_box initial_value="true" label="Accetta cookie" name="cookies_enabled"/>
+ <check_box initial_value="true" label="Abilita Javascript" name="browser_javascript_enabled"/>
+ <check_box initial_value="falso" label="Consenti pop-up nel browser media" name="media_popup_enabled"/>
+ <check_box initial_value="false" label="Abilita proxy Web" name="web_proxy_enabled"/>
<text name="Proxy location">
Ubicazione proxy:
</text>
<line_editor name="web_proxy_editor" tool_tip="Il nome o l&apos;indirizzo IP del proxy che preferisci usare"/>
<spinner label="Numero porta:" name="web_proxy_port"/>
+ <text name="Software updates:">
+ Aggiornamenti software:
+ </text>
+ <combo_box name="updater_service_combobox">
+ <combo_box.item label="Installa automaticamente" name="Install_automatically"/>
+ <combo_box.item label="Scarica e installa manualmente gli aggiornamenti" name="Install_manual"/>
+ </combo_box>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_sound.xml b/indra/newview/skins/default/xui/it/panel_preferences_sound.xml
index e2332b63d0..bbfae5e9e8 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_sound.xml
@@ -1,8 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Suoni" name="Preference Media panel">
+ <panel.string name="middle_mouse">
+ Pulsante centrale del mouse
+ </panel.string>
<slider label="Vol. principale" name="System Volume"/>
<check_box initial_value="true" label="" name="mute_when_minimized"/>
- <text name="mute_chb_label">Disatt. se a icona</text>
+ <text name="mute_chb_label">
+ Disatt. audio se minimizzato
+ </text>
<slider label="Pulsanti" name="UI Volume"/>
<slider label="Ambiente" name="Wind Volume"/>
<slider label="Effetti sonori" name="SFX Volume"/>
@@ -24,6 +29,11 @@
<radio_item label="Posizione della fotocamera" name="0"/>
<radio_item label="Posizione dell&apos;avatar" name="1"/>
</radio_group>
+ <check_box label="Muovi le labbra dell&apos;avatar quando parla" name="enable_lip_sync"/>
+ <check_box label="Attiva/disattiva la funzione parla quando premo:" name="push_to_talk_toggle_check" tool_tip="In modalità &quot;interruttore ON/OFF&quot; premi il tasto una volta per attivare o disattivare il microfono. Quando non usi questa modalità, il microfono è attivo solo se tieni premuto il tasto di comando."/>
+ <line_editor label="Pulsante di comando della funzione Premi per parlare" name="modifier_combo"/>
+ <button label="Imposta tasto" name="set_voice_hotkey_button"/>
+ <button name="set_voice_middlemouse_button" tool_tip="Reimposta sul pulsante centrale del mouse"/>
<button label="Dispositivi di Input/Output" name="device_settings_btn" width="165"/>
<panel label="Impostazioni del dispositivo" name="device_settings_panel">
<panel.string name="default_text">
diff --git a/indra/newview/skins/default/xui/it/panel_profile.xml b/indra/newview/skins/default/xui/it/panel_profile.xml
index c11adeda3d..309937c5a0 100644
--- a/indra/newview/skins/default/xui/it/panel_profile.xml
+++ b/indra/newview/skins/default/xui/it/panel_profile.xml
@@ -16,6 +16,12 @@
<string name="RegisterDateFormat">
[REG_DATE] ([AGE])
</string>
+ <string name="name_text_args">
+ [NAME]
+ </string>
+ <string name="display_name_text_args">
+ [DISPLAY_NAME]
+ </string>
<layout_stack name="layout">
<layout_panel name="profile_stack">
<scroll_container name="profile_scroll">
@@ -30,7 +36,7 @@
<text name="title_acc_status_text" value="Stato account:"/>
<text name="title_partner_text" value="Partner:"/>
<panel name="partner_data_panel">
- <name_box initial_value="(recupero)" name="partner_text"/>
+ <text initial_value="(recupero)" name="partner_text"/>
</panel>
<text name="title_groups_text" value="Gruppi:"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_profile_view.xml b/indra/newview/skins/default/xui/it/panel_profile_view.xml
index cf65aabebc..409eb5d1f4 100644
--- a/indra/newview/skins/default/xui/it/panel_profile_view.xml
+++ b/indra/newview/skins/default/xui/it/panel_profile_view.xml
@@ -6,7 +6,14 @@
<string name="status_offline">
Offline
</string>
+ <text name="display_name_label" value="Nome visualizzato:"/>
+ <text name="solo_username_label" value="Nome utente:"/>
<text name="status" value="Online"/>
+ <text name="user_name_small" value="Jack guarda quanto è lungo questo splendido nome"/>
+ <text name="user_name" value="Jack Linden"/>
+ <button name="copy_to_clipboard" tool_tip="Copia negli appunti"/>
+ <text name="user_label" value="Nome utente:"/>
+ <text name="user_slid" value="jack.linden"/>
<tab_container name="tabs">
<panel label="PROFILO" name="panel_profile"/>
<panel label="LUOGHI CONSIGLIATI" name="panel_picks"/>
diff --git a/indra/newview/skins/default/xui/it/panel_script_ed.xml b/indra/newview/skins/default/xui/it/panel_script_ed.xml
index f550aee98e..950dfacf3a 100644
--- a/indra/newview/skins/default/xui/it/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/it/panel_script_ed.xml
@@ -15,11 +15,9 @@
<panel.string name="Title">
Script: [NAME]
</panel.string>
- <text_editor name="Script Editor">
- Caricamento in corso...
- </text_editor>
- <button label="Salva" label_selected="Salva" name="Save_btn"/>
- <combo_box label="Inserisci..." name="Insert..."/>
+ <panel.string name="external_editor_not_set">
+ Seleziona un editor impostando la variabile di ambiente LL_SCRIPT_EDITOR o l&apos;impostazione ExternalEditor.
+ </panel.string>
<menu_bar name="script_menu">
<menu label="File" name="File">
<menu_item_call label="Salva" name="Save"/>
@@ -40,4 +38,10 @@
<menu_item_call label="Aiuto con parole chiave..." name="Keyword Help..."/>
</menu>
</menu_bar>
+ <text_editor name="Script Editor">
+ Caricamento in corso...
+ </text_editor>
+ <combo_box label="Inserisci..." name="Insert..."/>
+ <button label="Salva" label_selected="Salva" name="Save_btn"/>
+ <button label="Modifica..." name="Edit_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/it/panel_scrolling_param_base.xml
new file mode 100644
index 0000000000..fa659040ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_scrolling_param_base.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="LLScrollingPanelParamBase">
+ <slider label="[DESC]" name="param slider"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_status_bar.xml b/indra/newview/skins/default/xui/it/panel_status_bar.xml
index 6b1a8aa71b..4353eb9d50 100644
--- a/indra/newview/skins/default/xui/it/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/it/panel_status_bar.xml
@@ -22,7 +22,7 @@
L$ [AMT]
</panel.string>
<panel name="balance_bg">
- <text name="balance" tool_tip="Il mio saldo" value="L$ 20"/>
+ <text name="balance" tool_tip="Clicca per aggiornare il tuo saldo in L$" value="L$ 20"/>
<button label="ACQUISTA L$" name="buyL" tool_tip="Clicca per acquistare più L$"/>
</panel>
<text name="TimeText" tool_tip="Orario attuale (Pacifico)">
diff --git a/indra/newview/skins/default/xui/it/role_actions.xml b/indra/newview/skins/default/xui/it/role_actions.xml
index e3f95f7f86..300e6cf721 100644
--- a/indra/newview/skins/default/xui/it/role_actions.xml
+++ b/indra/newview/skins/default/xui/it/role_actions.xml
@@ -1,72 +1,73 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<role_actions>
<action_set description="Queste abilità permettono di aggiungere e rimuovere membri dal gruppo e consentono ai nuovi membri di aderire al gruppo senza invito." name="Membership">
- <action description="Invita persone in questo gruppo" longdescription="Invita persone in questo gruppo usando il pulsante Invita nella sezione Ruoli &gt; scheda membri." name="member invite"/>
- <action description="Espelli membri da questo gruppo" longdescription="Espelli membri dal gruppo usando il pulsante Espelli nella sezione Ruoli &gt; scheda membri. Un proprietario può espellere chiunque tranne un altro proprietario. Se non sei un proprietario, un membro può essere espulso da un gruppo soltanto qualora abbia soltanto il ruolo Tutti, e nessun altro ruolo. Per rimuovere membri dai ruoli, devi avere l&apos;Abilità corrispondente." name="member eject"/>
- <action description="Seleziona Iscrizione libera e modifica la Quota d&apos;iscrizione" longdescription="Seleziona Iscrizione libera per permettere ai nuovi membri di aderire senza invito e modifica la quota d&apos;iscrizione nella scheda Generale." name="member options"/>
+ <action description="Invita persone in questo gruppo" longdescription="Invita persone in questo gruppo usando il pulsante Invita nella sezione Ruoli &gt; scheda membri." name="member invite" value="1"/>
+ <action description="Espelli membri da questo gruppo" longdescription="Espelli membri dal gruppo usando il pulsante Espelli nella sezione Ruoli &gt; scheda membri. Un proprietario può espellere chiunque tranne un altro proprietario. Se non sei un proprietario, un membro può essere espulso da un gruppo soltanto qualora abbia soltanto il ruolo Tutti, e nessun altro ruolo. Per rimuovere membri dai ruoli, devi avere l&apos;Abilità corrispondente." name="member eject" value="2"/>
+ <action description="Seleziona Iscrizione libera e modifica la Quota d&apos;iscrizione" longdescription="Seleziona Iscrizione libera per permettere ai nuovi membri di aderire senza invito e modifica la quota d&apos;iscrizione nella scheda Generale." name="member options" value="3"/>
</action_set>
<action_set description="Queste Abilità permettono di aggiungere, rimuovere, cambiare i ruoli del gruppo, aggiungere e rimuovere membri dai ruoli, nonché assegnare abilità ai ruoli." name="Roles">
- <action description="Creare nuovi ruoli" longdescription="Crea nuovi ruoli nella sezione Ruoli &gt; scheda ruoli." name="role create"/>
- <action description="Eliminare ruoli" longdescription="Elimina ruoli nella sezione Ruoli &gt; scheda ruoli." name="role delete"/>
- <action description="Cambia i nomi di ruoli, i titoli, le descrizioni e definisci se i membri in quel ruolo sono resi pubblici" longdescription="Cambia i nomi di ruoli, i titoli, le descrizioni e definisci se i membri in quel ruolo sono resi pubblici Viene fatto nella parte inferiore della sezione Ruoli &gt; scheda Ruoli, dopo avere selezionato un ruolo." name="role properties"/>
- <action description="Assegnare membri a ruoli del responsabile" longdescription="Assegna un ruolo a membri nella lista dei ruoli assegnati (sezione Ruoli &gt; scheda membri). Un utente con questa Abilità può aggiungere membri ad un ruolo nel quale il responsabile è già presente." name="role assign member limited"/>
- <action description="Assegnare membri a qualsiasi ruolo" longdescription="Assegna i membri a qualsiasi ruolo nell&apos;elenco dei ruoli assegnati (sezione Ruoli &gt; scheda membri). *ATTENZIONE* Ogni membro con questo Ruolo e Abilità può assegnarsi -- e assegnare ad altri membri non proprietari -- ruoli con poteri maggiori di quelli normalmente concessi, potenzialmente con poteri analoghi a quelli di proprietario. Sii sicuro della scelta prima di assegnare questa Abilità." name="role assign member"/>
- <action description="Rimuovere membri dai ruoli" longdescription="Rimuovi dai ruoli i membri nell&apos;elenco dei ruoli assegnati (sezione Ruoli &gt; scheda membri). Il proprietario non può essere rimosso." name="role remove member"/>
- <action description="Assegnare e rimuovere abilità nei ruoli" longdescription="Assegna e Rimuovi Abilità per ogni ruolo nell&apos;elenco dei ruoli assegnati (sezione Ruoli &gt; scheda Ruoli). *ATTENZIONE* Ogni membro con questo ruolo e Abilità può assegnarsi -- ed assegnare ad altri membri non proprietari -- tutte le Abilità, che potenzialmente con poteri analoghi a quelli di proprietario. Sii sicuro della scelta prima di assegnare questa Abilità." name="role change actions"/>
+ <action description="Creare nuovi ruoli" longdescription="Crea nuovi ruoli nella sezione Ruoli &gt; scheda ruoli." name="role create" value="4"/>
+ <action description="Eliminare ruoli" longdescription="Elimina ruoli nella sezione Ruoli &gt; scheda ruoli." name="role delete" value="5"/>
+ <action description="Cambia i nomi di ruoli, i titoli, le descrizioni e definisci se i membri in quel ruolo sono resi pubblici" longdescription="Cambia i nomi di ruoli, i titoli, le descrizioni e definisci se i membri in quel ruolo sono resi pubblici Viene fatto nella parte inferiore della sezione Ruoli &gt; scheda Ruoli, dopo avere selezionato un ruolo." name="role properties" value="6"/>
+ <action description="Assegnare membri a ruoli del responsabile" longdescription="Assegna un ruolo a membri nella lista dei ruoli assegnati (sezione Ruoli &gt; scheda membri). Un utente con questa Abilità può aggiungere membri ad un ruolo nel quale il responsabile è già presente." name="role assign member limited" value="7"/>
+ <action description="Assegnare membri a qualsiasi ruolo" longdescription="Assegna i membri a qualsiasi ruolo nell&apos;elenco dei ruoli assegnati (sezione Ruoli &gt; scheda membri). *ATTENZIONE* Ogni membro con questo Ruolo e Abilità può assegnarsi -- e assegnare ad altri membri non proprietari -- ruoli con poteri maggiori di quelli normalmente concessi, potenzialmente con poteri analoghi a quelli di proprietario. Sii sicuro della scelta prima di assegnare questa Abilità." name="role assign member" value="8"/>
+ <action description="Rimuovere membri dai ruoli" longdescription="Rimuovi dai ruoli i membri nell&apos;elenco dei ruoli assegnati (sezione Ruoli &gt; scheda membri). Il proprietario non può essere rimosso." name="role remove member" value="9"/>
+ <action description="Assegnare e rimuovere abilità nei ruoli" longdescription="Assegna e Rimuovi Abilità per ogni ruolo nell&apos;elenco dei ruoli assegnati (sezione Ruoli &gt; scheda Ruoli). *ATTENZIONE* Ogni membro con questo ruolo e Abilità può assegnarsi -- ed assegnare ad altri membri non proprietari -- tutte le Abilità, che potenzialmente con poteri analoghi a quelli di proprietario. Sii sicuro della scelta prima di assegnare questa Abilità." name="role change actions" value="10"/>
</action_set>
<action_set description="Queste abilità autorizzano a modificare l&apos;identità di questo gruppo, come ad esempio la modifica della visibilità pubblica, lo statuto e il logo." name="Group Identity">
- <action description="Cambiare lo statuto, il logo, e &apos;Mostra nella ricerca&apos;" longdescription="Cambia statuto, logo e &apos;Mostra nella ricerca&apos;. Viene fatto nella sezione Generale." name="group change identity"/>
+ <action description="Cambiare lo statuto, il logo, e &apos;Mostra nella ricerca&apos;" longdescription="Cambia statuto, logo e &apos;Mostra nella ricerca&apos;. Viene fatto nella sezione Generale." name="group change identity" value="11"/>
</action_set>
<action_set description="Queste Abilità comprendono il potere di intestare, modificare e vendere terreni di proprietà del gruppo. Per aprire la finestra Informazioni sul terreno, fai clic con il pulsante destro del mouse sul terreno e seleziona Informazioni sul terreno, o clicca sull&apos;icona &apos;i&apos; nella Barra di Navigazione." name="Parcel Management">
- <action description="Cessione di terreno e acquisto di terreno per il gruppo" longdescription="Intesta terreno e acquista terreno per il gruppo. Ciò viene fatto in Informazioni sul terreno &gt; scheda Generale." name="land deed"/>
- <action description="Abbandonare il terreno in favore di Governor Linden" longdescription="Abbandona il terreno in favore di Governor Linden. *ATTENZIONE* Ogni membro con questo ruolo e abilità può abbandonare il terreno di proprietà del gruppo in Informazioni sul terreno &gt; scheda Generale, restituendolo alla proprietà Linden senza effettuare una vendita. Sii sicuro della scelta prima di assegnare questa Abilità." name="land release"/>
- <action description="Informazioni su come impostare il terreno come in vendita" longdescription="Imposta le informazioni per la vendita del terreno. *ATTENZIONE* Ogni Membro con questo ruolo e abilità può vendere il terreno di proprietà del gruppo nella scheda Informazioni sul terreno &gt; scheda Generale. Pertanto sii sicuro della scelta prima di assegnare questa Abilità." name="land set sale info"/>
- <action description="Suddividere e unire lotti" longdescription="Suddividi e unisci lotti. Viene fatto cliccando con il pulsante destro del mouse sul terreno, selezionando Modifica terreno e trascinando il mouse sul terreno per creare una selezione. Per suddividere, seleziona quale parte vuoi dividere e clicca su Suddividi. Per unire, seleziona due o più lotti confinanti e clicca su Unisci." name="land divide join"/>
+ <action description="Cessione di terreno e acquisto di terreno per il gruppo" longdescription="Intesta terreno e acquista terreno per il gruppo. Ciò viene fatto in Informazioni sul terreno &gt; scheda Generale." name="land deed" value="12"/>
+ <action description="Abbandonare il terreno in favore di Governor Linden" longdescription="Abbandona il terreno in favore di Governor Linden. *ATTENZIONE* Ogni membro con questo ruolo e abilità può abbandonare il terreno di proprietà del gruppo in Informazioni sul terreno &gt; scheda Generale, restituendolo alla proprietà Linden senza effettuare una vendita. Sii sicuro della scelta prima di assegnare questa Abilità." name="land release" value="13"/>
+ <action description="Informazioni su come impostare il terreno come in vendita" longdescription="Imposta le informazioni per la vendita del terreno. *ATTENZIONE* Ogni Membro con questo ruolo e abilità può vendere il terreno di proprietà del gruppo nella scheda Informazioni sul terreno &gt; scheda Generale. Pertanto sii sicuro della scelta prima di assegnare questa Abilità." name="land set sale info" value="14"/>
+ <action description="Suddividere e unire lotti" longdescription="Suddividi e unisci lotti. Viene fatto cliccando con il pulsante destro del mouse sul terreno, selezionando Modifica terreno e trascinando il mouse sul terreno per creare una selezione. Per suddividere, seleziona quale parte vuoi dividere e clicca su Suddividi. Per unire, seleziona due o più lotti confinanti e clicca su Unisci." name="land divide join" value="15"/>
</action_set>
<action_set description="Queste abilità permettono di cambiare il nome del lotto, le impostazioni di pubblicazione, la visibilità negli elenchi e il punto di arrivo, nonché opzioni di indirizzamento del Teleport." name="Parcel Identity">
- <action description="Premi Mostra luogo nella ricerca e seleziona una categoria" longdescription="Premi Mostra luogo nella ricerca e seleziona una categoria di lotto in Informazioni sul terreno &gt; scheda Opzioni." name="land find places"/>
- <action description="Cambia il nome del lotto, la descrizione e le impostazioni di Mostra luogo nella ricerca" longdescription="Cambia il nome del lotto, la descrizione e le impostazioni di Mostra luogo nella ricerca. Ciò viene fatto in Informazioni sul terreno &gt; scheda Opzioni." name="land change identity"/>
- <action description="Impostare il punto di arrivo e l&apos;indirizzamento del Teleport" longdescription="In un lotto di proprietà di un gruppo, i membri con questo ruolo e abilità possono impostare un punto di arrivo per i teleport entranti e impostare anche l&apos;indirizzamento del teleport per ulteriore precisione. Viene fatto in Informazioni sul terreno &gt; Opzioni." name="land set landing point"/>
+ <action description="Premi Mostra luogo nella ricerca e seleziona una categoria" longdescription="Premi Mostra luogo nella ricerca e seleziona una categoria di lotto in Informazioni sul terreno &gt; scheda Opzioni." name="land find places" value="17"/>
+ <action description="Cambia il nome del lotto, la descrizione e le impostazioni di Mostra luogo nella ricerca" longdescription="Cambia il nome del lotto, la descrizione e le impostazioni di Mostra luogo nella ricerca. Ciò viene fatto in Informazioni sul terreno &gt; scheda Opzioni." name="land change identity" value="18"/>
+ <action description="Impostare il punto di arrivo e l&apos;indirizzamento del Teleport" longdescription="In un lotto di proprietà di un gruppo, i membri con questo ruolo e abilità possono impostare un punto di arrivo per i teleport entranti e impostare anche l&apos;indirizzamento del teleport per ulteriore precisione. Viene fatto in Informazioni sul terreno &gt; Opzioni." name="land set landing point" value="19"/>
</action_set>
<action_set description="Queste abilità hanno poteri relativi alle opzioni dei lotti, come la creazione di oggetti, la modifica del terreno e le impostazioni per la musica e gli elementi multimediali." name="Parcel Settings">
- <action description="Cambiare impostazioni musica e multimediali" longdescription="Cambia le impostazioni per lo streaming della musica e dei video in Informazioni sul terreno &gt; Media." name="land change media"/>
- <action description="Attiva &apos;Modifica terreno&apos;" longdescription="Attiva &apos;Modifica terreno&apos;. *ATTENZIONE* Informazioni sul terreno &gt; Opzioni &gt; Modifica terreno consente a chiunque di modificare la forma del tuo terreno e di collocare e spostare le piante Linden. Pertanto sii sicuro della scelta prima di assegnare questa Abilità. La funzione di modifica del terreno è attivata in Informazioni sul terreno &gt; Opzioni." name="land edit"/>
- <action description="Attivazione di parametri per Informazioni sul terreno &gt; Opzioni" longdescription="Premi Sicuro (nessun danno), Vola e consenti agli altri residenti di: modificare il terreno, costruire, creare punti di riferimento ed eseguire script nel terreno appartenente ad un gruppo in Informazioni sul terreno &gt; scheda Opzioni." name="land options"/>
+ <action description="Cambiare impostazioni musica e multimediali" longdescription="Cambia le impostazioni per lo streaming della musica e dei video in Informazioni sul terreno &gt; Media." name="land change media" value="20"/>
+ <action description="Attiva &apos;Modifica terreno&apos;" longdescription="Attiva &apos;Modifica terreno&apos;. *ATTENZIONE* Informazioni sul terreno &gt; Opzioni &gt; Modifica terreno consente a chiunque di modificare la forma del tuo terreno e di collocare e spostare le piante Linden. Pertanto sii sicuro della scelta prima di assegnare questa Abilità. La funzione di modifica del terreno è attivata in Informazioni sul terreno &gt; Opzioni." name="land edit" value="21"/>
+ <action description="Attivazione di parametri per Informazioni sul terreno &gt; Opzioni" longdescription="Premi Sicuro (nessun danno), Vola e consenti agli altri residenti di: modificare il terreno, costruire, creare punti di riferimento ed eseguire script nel terreno appartenente ad un gruppo in Informazioni sul terreno &gt; scheda Opzioni." name="land options" value="22"/>
</action_set>
<action_set description="Queste abilità permettono ai membri di non avere restrizioni in un lotto appartenente ad un gruppo." name="Parcel Powers">
- <action description="Consenti sempre la modifica del terreno" longdescription="I membri con questo ruolo e abilità possono modificare il terreno appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow edit land"/>
- <action description="Consenti sempre il volo" longdescription=" I membri con questo ruolo e abilità possono volare in un terreno appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow fly"/>
- <action description="Consenti sempre la creazione di oggetti" longdescription="I membri con questo ruolo e abilità possono creare oggetti in un lotto appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow create"/>
- <action description="Consenti sempre la creazione di punti di riferimento" longdescription="I membri con questo ruolo e abilità possono creare punti di riferimento in un lotto appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow landmark"/>
- <action description="Consenti la funzione &apos;Imposta come Casa mia&apos; in un lotto di gruppo" longdescription="I membri in un ruolo con questa Abilità possono usare il menu Mondo &gt; Punti di riferimento &gt; Imposta come Casa su un lotto ceduto a questo gruppo." name="land allow set home"/>
+ <action description="Consenti sempre la modifica del terreno" longdescription="I membri con questo ruolo e abilità possono modificare il terreno appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow edit land" value="23"/>
+ <action description="Consenti sempre il volo" longdescription=" I membri con questo ruolo e abilità possono volare in un terreno appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow fly" value="24"/>
+ <action description="Consenti sempre la creazione di oggetti" longdescription="I membri con questo ruolo e abilità possono creare oggetti in un lotto appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow create" value="25"/>
+ <action description="Consenti sempre la creazione di punti di riferimento" longdescription="I membri con questo ruolo e abilità possono creare punti di riferimento in un lotto appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow landmark" value="26"/>
+ <action description="Consenti la funzione &apos;Imposta come Casa mia&apos; in un lotto di gruppo" longdescription="I membri in un ruolo con questa Abilità possono usare il menu Mondo &gt; Punti di riferimento &gt; Imposta come Casa su un lotto ceduto a questo gruppo." name="land allow set home" value="28"/>
+ <action description="Consentire &apos;Ospitare un evento&apos; su lotti di gruppo" longdescription="Membri in un ruolo con questa Abilità possono selezionare lotti posseduti da un gruppo come sedi in cui ospitare un evento." name="land allow host event" value="41"/>
</action_set>
<action_set description="Queste Abilità consentono di concedere o limitare l&apos;accesso ad un lotto di un gruppo da parte di residenti, con le azioni Congela ed Espelli." name="Parcel Access">
- <action description="Gestire la lista di accesso al lotto" longdescription="Gestisci la lista di accesso al lotto in Informazioni sul terreno &gt; Accesso." name="land manage allowed"/>
- <action description="Gestire la lista dei residenti espulsi dal lotto" longdescription="Gestisci la lista Espulsi dal lotto in Informazioni sul terreno &gt; scheda Accesso." name="land manage banned"/>
- <action description="Cambia le impostazioni del lotto in Vendi pass a" longdescription="Cambia le impostazioni Vendi pass a in Informazioni sul terreno &gt; scheda Accesso." name="land manage passes"/>
- <action description="Espellere e Congelare i Residenti in un lotto" longdescription="Membri in un ruolo con questa Abilità possono occuparsi di un residente indesiderato in un lotto posseduto da un gruppo, facendo clic sul residente con il pulsante destro del mouse e selezionando Espelli o Congela." name="land admin"/>
+ <action description="Gestire la lista di accesso al lotto" longdescription="Gestisci la lista di accesso al lotto in Informazioni sul terreno &gt; Accesso." name="land manage allowed" value="29"/>
+ <action description="Gestire la lista dei residenti espulsi dal lotto" longdescription="Gestisci la lista Espulsi dal lotto in Informazioni sul terreno &gt; scheda Accesso." name="land manage banned" value="30"/>
+ <action description="Cambia le impostazioni del lotto in Vendi pass a" longdescription="Cambia le impostazioni Vendi pass a in Informazioni sul terreno &gt; scheda Accesso." name="land manage passes" value="31"/>
+ <action description="Espellere e Congelare i Residenti in un lotto" longdescription="Membri in un ruolo con questa Abilità possono occuparsi di un residente indesiderato in un lotto posseduto da un gruppo, facendo clic sul residente con il pulsante destro del mouse e selezionando Espelli o Congela." name="land admin" value="32"/>
</action_set>
<action_set description="Queste abilità consentono ai membri di restituire oggetti, collocare e spostare piante Linden. Questo è utile ai membri per ripulire da oggetti indesiderati e creare paesaggi, ma deve essere utilizzato con cura, perchè la restituzione degli oggetti non può essere annullata." name="Parcel Content">
- <action description="Restituire oggetti di proprietà di un gruppo" longdescription="Restituisci gli oggetti di proprietà di un gruppo in un appezzamento di un gruppo in Informazioni sul terreno &gt; Oggetti." name="land return group owned"/>
- <action description="Restituire oggetti assegnati ad un gruppo" longdescription="Restituisci oggetti assegnati ad un gruppo in un lotto di un gruppo in Informazioni sul terreno &gt; Oggetti." name="land return group set"/>
- <action description="Restituire oggetti estranei al gruppo" longdescription="Restituire oggetti estranei al gruppo in un appezzamento di un gruppo in Informazioni sul terreno &gt; Oggetti." name="land return non group"/>
- <action description="Creare un paesaggio utilizzando le piante Linden" longdescription="Abilità di creare paesaggi e posizionare e spostare alberi, piante, erba Linden. Questi oggetti sono presenti nella Libreria del tuo Inventario &gt; cartella Oggetti, o possono essere creati con il menu Crea." name="land gardening"/>
+ <action description="Restituire oggetti di proprietà di un gruppo" longdescription="Restituisci gli oggetti di proprietà di un gruppo in un appezzamento di un gruppo in Informazioni sul terreno &gt; Oggetti." name="land return group owned" value="48"/>
+ <action description="Restituire oggetti assegnati ad un gruppo" longdescription="Restituisci oggetti assegnati ad un gruppo in un lotto di un gruppo in Informazioni sul terreno &gt; Oggetti." name="land return group set" value="33"/>
+ <action description="Restituire oggetti estranei al gruppo" longdescription="Restituire oggetti estranei al gruppo in un appezzamento di un gruppo in Informazioni sul terreno &gt; Oggetti." name="land return non group" value="34"/>
+ <action description="Creare un paesaggio utilizzando le piante Linden" longdescription="Abilità di creare paesaggi e posizionare e spostare alberi, piante, erba Linden. Questi oggetti sono presenti nella Libreria del tuo Inventario &gt; cartella Oggetti, o possono essere creati con il menu Crea." name="land gardening" value="35"/>
</action_set>
<action_set description="Queste Abilità includono il potere di cedere, modificare e vendere oggetti posseduti dal gruppo. Viene fatto negli strumenti Costruisci &gt; scheda Generale. Clic con il pulsante destro del mouse su un oggetto e Modifica per vedere le impostazioni." name="Object Management">
- <action description="Intestare oggetti ad un gruppo" longdescription="Intesta oggetti ad un gruppo in Strumenti per costruzione &gt; scheda Generale." name="object deed"/>
- <action description="Modificare (sposta, copia, modifica) oggetti di un gruppo" longdescription="Gestisci (sposta, copia, modifica) gli oggetti appartenenti ad un gruppo in Build Tools &gt; tabella Generale." name="object manipulate"/>
- <action description="Mettere in vendita oggetti di un gruppo" longdescription="Metti in vendita oggetti posseduti da un Gruppo in Strumenti per costruzione &gt; scheda Generale." name="object set sale"/>
+ <action description="Intestare oggetti ad un gruppo" longdescription="Intesta oggetti ad un gruppo in Strumenti per costruzione &gt; scheda Generale." name="object deed" value="36"/>
+ <action description="Modificare (sposta, copia, modifica) oggetti di un gruppo" longdescription="Gestisci (sposta, copia, modifica) gli oggetti appartenenti ad un gruppo in Build Tools &gt; tabella Generale." name="object manipulate" value="38"/>
+ <action description="Mettere in vendita oggetti di un gruppo" longdescription="Metti in vendita oggetti posseduti da un Gruppo in Strumenti per costruzione &gt; scheda Generale." name="object set sale" value="39"/>
</action_set>
<action_set description="Queste abilità consentono di richiedere ai membri di pagare le passività del gruppo e di ricevere i dividendi del gruppo, nonché di limitare l&apos;accesso alla cronologia finanziaria del gruppo." name="Accounting">
- <action description="Pagare le passività del gruppo e ricevere i dividendi del gruppo" longdescription="I membri con questo ruolo e abilità pagheranno automaticamente le passività del gruppo e riceveranno i dividendi del gruppo. Questo significa che riceveranno una porzione delle vendite di terreni appartenenti al gruppo (che sono distribuite giornalmente) e contribuiranno fondi a spese come le quote di inserzione del lotto. " name="accounting accountable"/>
+ <action description="Pagare le passività del gruppo e ricevere i dividendi del gruppo" longdescription="I membri con questo ruolo e abilità pagheranno automaticamente le passività del gruppo e riceveranno i dividendi del gruppo. Questo significa che riceveranno una porzione delle vendite di terreni appartenenti al gruppo (che sono distribuite giornalmente) e contribuiranno fondi a spese come le quote di inserzione del lotto. " name="accounting accountable" value="40"/>
</action_set>
<action_set description="Queste abilità consentono ai membri di inviare, ricevere e vedere gli avvisi del gruppo." name="Notices">
- <action description="Invia avvisi" longdescription="Membri in un ruolo con questa Abilità possono inviare avvisi tramite la sezione Gruppo &gt; Avvisi." name="notices send"/>
- <action description="Ricevere avvisi e vedere avvisi precedenti" longdescription="Membri in un ruolo con questa Abilità possono ricevere avvisi e vedere avvisi precedenti nella sezione Gruppo &gt; Avvisi." name="notices receive"/>
+ <action description="Invia avvisi" longdescription="Membri in un ruolo con questa Abilità possono inviare avvisi tramite la sezione Gruppo &gt; Avvisi." name="notices send" value="42"/>
+ <action description="Ricevere avvisi e vedere avvisi precedenti" longdescription="Membri in un ruolo con questa Abilità possono ricevere avvisi e vedere avvisi precedenti nella sezione Gruppo &gt; Avvisi." name="notices receive" value="43"/>
</action_set>
<action_set description="Queste Abilità permettono di concedere o limitare l&apos;accesso alle sessioni di chat e di chat vocale nel gruppo." name="Chat">
- <action description="Partecipare alla Chat di gruppo" longdescription="I membri con questo ruolo e abilità possono partecipare alle sessioni di chat, sia scritte che vocale." name="join group chat"/>
- <action description="Partecipa alla Chat vocale di gruppo" longdescription=" I membri con questo ruolo e abilità possono partecipare alle sessioni di Chat vocale nel gruppo. NOTA: per poter partecipare alla Chat di gruppo è necessario accedere alla sessione di chat vocale." name="join voice chat"/>
- <action description="Moderare la Chat di gruppo" longdescription="I membri con questo ruolo e abilità possono gestire l&apos;accesso e la partecipazione alle sessioni di chat scritta e di chat vocale nel gruppo." name="moderate group chat"/>
+ <action description="Partecipare alla Chat di gruppo" longdescription="I membri con questo ruolo e abilità possono partecipare alle sessioni di chat, sia scritte che vocale." name="join group chat" value="16"/>
+ <action description="Partecipa alla Chat vocale di gruppo" longdescription=" I membri con questo ruolo e abilità possono partecipare alle sessioni di Chat vocale nel gruppo. NOTA: per poter partecipare alla Chat di gruppo è necessario accedere alla sessione di chat vocale." name="join voice chat" value="27"/>
+ <action description="Moderare la Chat di gruppo" longdescription="I membri con questo ruolo e abilità possono gestire l&apos;accesso e la partecipazione alle sessioni di chat scritta e di chat vocale nel gruppo." name="moderate group chat" value="37"/>
</action_set>
</role_actions>
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index 37dc90d056..aa23eef438 100644
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -200,6 +200,9 @@
<string name="TooltipAgentUrl">
Clicca per vedere il profilo di questo residente
</string>
+ <string name="TooltipAgentInspect">
+ Ulteriori informazioni su questo Residente
+ </string>
<string name="TooltipAgentMute">
Clicca per disattivare l&apos;audio di questo residente
</string>
@@ -747,6 +750,12 @@
<string name="Estate / Full Region">
Proprietà immobiliare / Regione completa
</string>
+ <string name="Estate / Homestead">
+ Proprietà immobiliare / Homestead
+ </string>
+ <string name="Mainland / Homestead">
+ Continente / Homestead
+ </string>
<string name="Mainland / Full Region">
Continente / Regione completa
</string>
@@ -852,6 +861,9 @@
<string name="tattoo">
Tatuaggio
</string>
+ <string name="physics">
+ Fisica
+ </string>
<string name="invalid">
non valido
</string>
@@ -891,6 +903,9 @@
<string name="tattoo_not_worn">
Tatuaggio non portato
</string>
+ <string name="physics_not_worn">
+ Fisica non indossata
+ </string>
<string name="invalid_not_worn">
non valido
</string>
@@ -939,6 +954,9 @@
<string name="create_new_tattoo">
Crea un nuovo tatuaggio
</string>
+ <string name="create_new_physics">
+ Crea nuova fisica
+ </string>
<string name="create_new_invalid">
non valido
</string>
@@ -1037,7 +1055,7 @@
</string>
<string name="WornOnAttachmentPoint" value="(indossato su [ATTACHMENT_POINT])"/>
<string name="ActiveGesture" value="[GESLABEL] (attivo)"/>
- <string name="Chat" value="Chat :"/>
+ <string name="Chat Message" value="Chat:"/>
<string name="Sound" value="Suono :"/>
<string name="Wait" value="--- Attendi :"/>
<string name="AnimFlagStop" value="Ferma l&apos;animazione :"/>
@@ -1737,11 +1755,8 @@
<string name="InvOfferGaveYou">
Ti ha offerto
</string>
- <string name="InvOfferYouDecline">
- Rifiuta
- </string>
- <string name="InvOfferFrom">
- da
+ <string name="InvOfferDecline">
+ Non hai accettato [DESC] da &lt;nolink&gt;[NAME]&lt;/nolink&gt;.
</string>
<string name="GroupMoneyTotal">
Totale
@@ -1822,12 +1837,6 @@ Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="accel-win-shift">
Shift+
</string>
- <string name="Esc">
- Esc
- </string>
- <string name="Home">
- Home
- </string>
<string name="FileSaved">
File salvato
</string>
@@ -1945,6 +1954,9 @@ Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="Other">
Altro
</string>
+ <string name="Rental">
+ Affitto
+ </string>
<string name="Any">
Tutti
</string>
@@ -2181,6 +2193,114 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="Bulbous Nose">
Naso bulboso
</string>
+ <string name="Breast Physics Mass">
+ Massa seno
+ </string>
+ <string name="Breast Physics Smoothing">
+ Lisciatura seno
+ </string>
+ <string name="Breast Physics Gravity">
+ Gravità seno
+ </string>
+ <string name="Breast Physics Drag">
+ Resistenza seno
+ </string>
+ <string name="Breast Physics InOut Max Effect">
+ Massimo effetto
+ </string>
+ <string name="Breast Physics InOut Spring">
+ Elasticità
+ </string>
+ <string name="Breast Physics InOut Gain">
+ Guadagno
+ </string>
+ <string name="Breast Physics InOut Damping">
+ Attenuazione
+ </string>
+ <string name="Breast Physics UpDown Max Effect">
+ Massimo effetto
+ </string>
+ <string name="Breast Physics UpDown Spring">
+ Elasticità
+ </string>
+ <string name="Breast Physics UpDown Gain">
+ Guadagno
+ </string>
+ <string name="Breast Physics UpDown Damping">
+ Attenuazione
+ </string>
+ <string name="Breast Physics LeftRight Max Effect">
+ Massimo effetto
+ </string>
+ <string name="Breast Physics LeftRight Spring">
+ Elasticità
+ </string>
+ <string name="Breast Physics LeftRight Gain">
+ Guadagno
+ </string>
+ <string name="Breast Physics LeftRight Damping">
+ Attenuazione
+ </string>
+ <string name="Belly Physics Mass">
+ Massa pancia
+ </string>
+ <string name="Belly Physics Smoothing">
+ Lisciatura pancia
+ </string>
+ <string name="Belly Physics Gravity">
+ Gravità pancia
+ </string>
+ <string name="Belly Physics Drag">
+ Resistenza pancia
+ </string>
+ <string name="Belly Physics UpDown Max Effect">
+ Massimo effetto
+ </string>
+ <string name="Belly Physics UpDown Spring">
+ Elasticità
+ </string>
+ <string name="Belly Physics UpDown Gain">
+ Guadagno
+ </string>
+ <string name="Belly Physics UpDown Damping">
+ Attenuazione
+ </string>
+ <string name="Butt Physics Mass">
+ Massa natiche
+ </string>
+ <string name="Butt Physics Smoothing">
+ Lisciatura natiche
+ </string>
+ <string name="Butt Physics Gravity">
+ Gravità natiche
+ </string>
+ <string name="Butt Physics Drag">
+ Resistenza natiche
+ </string>
+ <string name="Butt Physics UpDown Max Effect">
+ Massimo effetto
+ </string>
+ <string name="Butt Physics UpDown Spring">
+ Elasticità
+ </string>
+ <string name="Butt Physics UpDown Gain">
+ Guadagno
+ </string>
+ <string name="Butt Physics UpDown Damping">
+ Attenuazione
+ </string>
+ <string name="Butt Physics LeftRight Max Effect">
+ Massimo effetto
+ </string>
+ <string name="Butt Physics LeftRight Spring">
+ Elasticità
+ </string>
+ <string name="Butt Physics LeftRight Gain">
+ Guadagno
+ </string>
+ <string name="Butt Physics LeftRight Damping">
+ Attenuazione
+ </string>
<string name="Bushy Eyebrows">
Sopracciglia cespugliose
</string>
@@ -2190,6 +2310,9 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="Butt Size">
Grandezza del sedere
</string>
+ <string name="Butt Gravity">
+ Gravità natiche
+ </string>
<string name="bustle skirt">
Crinolina
</string>
@@ -3478,7 +3601,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Sei l&apos;unico utente di questa sessione.
</string>
<string name="offline_message">
- [NAME] è offline.
+ [NAME] è offline
</string>
<string name="invite_message">
Clicca il tasto [BUTTON NAME] per accettare/connetterti a questa voice chat.
@@ -3547,6 +3670,9 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
http://secondlife.com/landing/voicemorphing
</string>
<string name="paid_you_ldollars">
+ [NAME] ti ha inviato un pagamento di L$[AMOUNT] [REASON].
+ </string>
+ <string name="paid_you_ldollars_no_reason">
[NAME] ti ha inviato un pagamento di L$[AMOUNT].
</string>
<string name="you_paid_ldollars">
@@ -3561,6 +3687,9 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="you_paid_ldollars_no_name">
Hai pagato L$ [AMOUNT] [REASON].
</string>
+ <string name="for item">
+ per [ITEM]
+ </string>
<string name="for a parcel of land">
per un lotto di terreno
</string>
@@ -3579,6 +3708,9 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="to upload">
per caricare
</string>
+ <string name="to publish a classified ad">
+ per pubblicare un annuncio
+ </string>
<string name="giving">
Contributo di L$ [AMOUNT]
</string>
@@ -3656,6 +3788,9 @@ Segnala abuso
<string name="New Tattoo">
Nuovo tatuaggio
</string>
+ <string name="New Physics">
+ Nuova fisica
+ </string>
<string name="Invalid Wearable">
Capo da indossare non valido
</string>
@@ -3855,7 +3990,7 @@ Segnala abuso
<string name="Notices">
Avvisi
</string>
- <string name="Chat">
+ <string name="Chat" value="Chat :">
Chat
</string>
<string name="DeleteItems">
@@ -3867,4 +4002,348 @@ Segnala abuso
<string name="EmptyOutfitText">
Questo vestiario non contiene alcun elemento
</string>
+ <string name="ExternalEditorNotSet">
+ Seleziona un editor usando le impostazioni ExternalEditor.
+ </string>
+ <string name="ExternalEditorNotFound">
+ L&apos;editor esterno specificato non è stato trovato.
+Prova a racchiudere il percorso dell&apos;editor in doppie virgolette.
+(per es. &quot;/percorso per il mio/editor&quot; &quot;%s&quot;)
+ </string>
+ <string name="ExternalEditorCommandParseError">
+ Errore nell&apos;elaborazione del comando dell&apos;editor esterno.
+ </string>
+ <string name="ExternalEditorFailedToRun">
+ L&apos;editor esterno non è stato avviato.
+ </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">
+ 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">
+ Aggiungi
+ </string>
+ <string name="Subtract">
+ Sottrai
+ </string>
+ <string name="Multiply">
+ Moltiplica
+ </string>
+ <string name="Divide">
+ Dividi
+ </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">
+ Visualizzazione marcatori particelle (blu)
+ </string>
+ <string name="BeaconPhysical">
+ Visualizzazione marcatori oggetti fisici (verde)
+ </string>
+ <string name="BeaconScripted">
+ Visualizzazione marcatori oggetti scriptati (rosso)
+ </string>
+ <string name="BeaconScriptedTouch">
+ Visualizzazione marcatori oggetti scriptati con funzione tocco (rosso)
+ </string>
+ <string name="BeaconSound">
+ Visualizzazione marcatori suoni (giallo)
+ </string>
+ <string name="BeaconMedia">
+ Visualizzazione marcatori multimedia (bianco)
+ </string>
+ <string name="ParticleHiding">
+ Particelle nascoste
+ </string>
</strings>
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 eefe71c9a5..2f578862d3 100644
--- a/indra/newview/skins/default/xui/ja/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about_land.xml
@@ -349,6 +349,7 @@
<combo_box.item label="公園と自然" name="item9"/>
<combo_box.item label="住宅用" name="item10"/>
<combo_box.item label="ショッピング" name="item11"/>
+ <combo_box.item label="レンタル" name="item13"/>
<combo_box.item label="その他" name="item12"/>
</combo_box>
<combo_box name="land category">
@@ -363,6 +364,7 @@
<combo_box.item label="公園と自然" name="item9"/>
<combo_box.item label="住宅用" name="item10"/>
<combo_box.item label="ショッピング" name="item11"/>
+ <combo_box.item label="レンタル" name="item13"/>
<combo_box.item label="その他" name="item12"/>
</combo_box>
<check_box label="「Moderate」コンテンツ" name="MatureCheck" tool_tip=""/>
@@ -438,7 +440,7 @@
(エステートに限定)
</panel.string>
<panel.string name="allow_public_access">
- パブリックアクセスを許可 ([MATURITY])
+ パブリックアクセスを許可 ([MATURITY])(注意:このオプションをオフにすると立入禁止ラインが作成されます)
</panel.string>
<panel.string name="estate_override">
1 つ以上のオプションが、不動産レベルで設定されています。
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 7f965e490d..4bd6b4e053 100644
--- a/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/ja/floater_avatar_picker.xml
@@ -24,6 +24,10 @@
名前の一部を入力:
</text>
<button label="検索" label_selected="検索" name="Find"/>
+ <scroll_list name="SearchResults">
+ <columns label="名前" name="name"/>
+ <columns label="ユーザー名" name="username"/>
+ </scroll_list>
</panel>
<panel label="フレンド" name="FriendsPanel">
<text name="InstructSelectFriend">
@@ -39,6 +43,10 @@
メートル
</text>
<button label="リスト更新" label_selected="リスト更新" name="Refresh"/>
+ <scroll_list name="NearMe">
+ <columns label="名前" name="name"/>
+ <columns label="ユーザー名" name="username"/>
+ </scroll_list>
</panel>
</tab_container>
<button label="OK" label_selected="OK" name="ok_btn"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_beacons.xml b/indra/newview/skins/default/xui/ja/floater_beacons.xml
index d2f4798949..a55698e3d0 100644
--- a/indra/newview/skins/default/xui/ja/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/ja/floater_beacons.xml
@@ -17,5 +17,6 @@
<check_box label="触れる" name="touch_only"/>
<check_box label="音源" name="sounds"/>
<check_box label="パーティクル源" name="particles"/>
+ <check_box label="メディア源" name="moapbeacon"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_bumps.xml b/indra/newview/skins/default/xui/ja/floater_bumps.xml
index c7e4dd348f..fd12a9e69a 100644
--- a/indra/newview/skins/default/xui/ja/floater_bumps.xml
+++ b/indra/newview/skins/default/xui/ja/floater_bumps.xml
@@ -4,19 +4,19 @@
検出なし
</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]]
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 f323263699..ce269df6da 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_object.xml
@@ -1,26 +1,29 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="contents" title="オブジェクトのコピーを購入">
- <text name="contents_text">
- 中身:
- </text>
- <text name="buy_text">
- [NAME] から L$[AMOUNT] で購入しますか?
- </text>
- <button label="取消" label_selected="取消" name="cancel_btn"/>
- <button label="購入" label_selected="購入" name="buy_btn"/>
- <text name="title_buy_text">
+ <floater.string name="title_buy_text">
購入
- </text>
- <string name="title_buy_copy_text">
+ </floater.string>
+ <floater.string name="title_buy_copy_text">
次のものを購入
- </string>
- <text name="no_copy_text">
+ </floater.string>
+ <floater.string name="no_copy_text">
(コピー不可)
- </text>
- <text name="no_modify_text">
+ </floater.string>
+ <floater.string name="no_modify_text">
(修正不可)
- </text>
- <text name="no_transfer_text">
+ </floater.string>
+ <floater.string name="no_transfer_text">
(再販・プレゼント不可)
+ </floater.string>
+ <text name="contents_text">
+ 中身:
+ </text>
+ <text name="buy_text">
+ 次の売り手から L$[AMOUNT] で購入:
+ </text>
+ <text name="buy_name_text">
+ [NAME]?
</text>
+ <button label="購入" label_selected="購入" name="buy_btn"/>
+ <button label="取消" label_selected="取消" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_display_name.xml b/indra/newview/skins/default/xui/ja/floater_display_name.xml
new file mode 100644
index 0000000000..cc71b1cd9f
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_display_name.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Display Name" title="表示名を変更">
+ <text name="info_text">
+ アバターにつけた名前があなたの表示名となります。表示名は週一回の頻度で変更することが可能です。
+ </text>
+ <text name="lockout_text">
+ 表示名は次の日付まで変更できません:[TIME]。
+ </text>
+ <text name="set_name_label">
+ 新しい表示名:
+ </text>
+ <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"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_event.xml b/indra/newview/skins/default/xui/ja/floater_event.xml
index 9e99c4a931..ca50ba8ef8 100644
--- a/indra/newview/skins/default/xui/ja/floater_event.xml
+++ b/indra/newview/skins/default/xui/ja/floater_event.xml
@@ -1,40 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- follows="all"
- height="400"
- can_resize="true"
- help_topic="event_details"
- label="Event"
- layout="topleft"
- name="Event"
- save_rect="true"
- save_visibility="false"
- title="EVENT DETAILS"
- width="600">
- <floater.string
- name="loading_text">
+<?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.string name="loading_text">
ローディング...
</floater.string>
- <floater.string
- name="done_text">
- Done
- </floater.string>
- <web_browser
- trusted_content="true"
- follows="left|right|top|bottom"
- layout="topleft"
- left="10"
- name="browser"
- height="365"
- width="580"
- top="0"/>
- <text
- follows="bottom|left"
- height="16"
- layout="topleft"
- left_delta="0"
- name="status_text"
- top_pad="10"
- width="150" />
+ <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"/>
</floater>
-
diff --git a/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml b/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml
index c5a2800e0e..ffafbaf3b6 100644
--- a/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/ja/floater_hardware_settings.xml
@@ -14,6 +14,9 @@
<combo_box.item label="8x" name="8x"/>
<combo_box.item label="16x" name="16x"/>
</combo_box>
+ <text name="antialiasing restart">
+ (ビューワの再起動が必要)
+ </text>
<spinner label="ガンマ:" name="gamma"/>
<text name="(brightness, lower is brighter)">
(0 でデフォルト、低いほど明るい)
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 8e5177d6fe..f152fcd738 100644
--- a/indra/newview/skins/default/xui/ja/floater_incoming_call.xml
+++ b/indra/newview/skins/default/xui/ja/floater_incoming_call.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="incoming call" title="不明のユーザーからのコール">
+<floater name="incoming call" title="着信">
<floater.string name="lifetime">
5
</floater.string>
diff --git a/indra/newview/skins/default/xui/ja/floater_map.xml b/indra/newview/skins/default/xui/ja/floater_map.xml
index 82b49df221..ff5a25fd7b 100644
--- a/indra/newview/skins/default/xui/ja/floater_map.xml
+++ b/indra/newview/skins/default/xui/ja/floater_map.xml
@@ -1,32 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Map" title="">
- <floater.string name="mini_map_north">
- 北
- </floater.string>
- <floater.string name="mini_map_east">
- 東
- </floater.string>
- <floater.string name="mini_map_west">
- 西
- </floater.string>
- <floater.string name="mini_map_south">
- 南
- </floater.string>
- <floater.string name="mini_map_southeast">
- 南東
- </floater.string>
- <floater.string name="mini_map_northeast">
- 北東
- </floater.string>
- <floater.string name="mini_map_southwest">
- 南西
- </floater.string>
- <floater.string name="mini_map_northwest">
- 北西
- </floater.string>
<floater.string name="ToolTipMsg">
[REGION](ダブルクリックで地図を開く。Shift‐ドラッグで水平・垂直移動)
</floater.string>
+ <floater.string name="AltToolTipMsg">
+ [地域](ダブルクリックでテレポート。Shift‐ドラッグで水平・垂直移動)
+ </floater.string>
<floater.string name="mini_map_caption">
ミニマップ
</floater.string>
diff --git a/indra/newview/skins/default/xui/ja/floater_pay.xml b/indra/newview/skins/default/xui/ja/floater_pay.xml
index 83a3c641f9..17965fb60a 100644
--- a/indra/newview/skins/default/xui/ja/floater_pay.xml
+++ b/indra/newview/skins/default/xui/ja/floater_pay.xml
@@ -11,7 +11,7 @@
</text>
<icon name="icon_person" tool_tip="住人"/>
<text name="payee_name">
- Test Name That Is Extremely Long To Check Clipping
+ 非常に長い名前が途中で切れていないかをテストして確認
</text>
<button label="L$1" label_selected="L$1" name="fastpay 1"/>
<button label="L$5" label_selected="L$5" name="fastpay 5"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_preferences.xml b/indra/newview/skins/default/xui/ja/floater_preferences.xml
index 6ba27b71a6..d48a8241ec 100644
--- a/indra/newview/skins/default/xui/ja/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preferences.xml
@@ -5,10 +5,12 @@
<tab_container name="pref core">
<panel label="一般" name="general"/>
<panel label="グラフィック" name="display"/>
- <panel label="プライバシー" name="im"/>
<panel label="サウンドとメディア" name="audio"/>
<panel label="チャット" name="chat"/>
+ <panel label="移動 &amp; 表示" name="move"/>
<panel label="メッセージ" name="msgs"/>
+ <panel label="色" name="colors"/>
+ <panel label="プライバシー" name="im"/>
<panel label="セットアップ" name="input"/>
<panel label="詳細" name="advanced1"/>
</tab_container>
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
new file mode 100644
index 0000000000..4edb4972e4
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_region_debug_console.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="region_debug_console" title="地域デバッグ"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml
index 2272234d7a..211d1c3714 100644
--- a/indra/newview/skins/default/xui/ja/floater_tools.xml
+++ b/indra/newview/skins/default/xui/ja/floater_tools.xml
@@ -64,6 +64,8 @@
<radio_item label="面を選択" name="radio select face"/>
</radio_group>
<check_box label="リンク部分を編集" name="checkbox edit linked parts"/>
+ <button label="リンク" name="link_btn"/>
+ <button label="リンクを外す" name="unlink_btn"/>
<text name="RenderingCost" tool_tip="このオブジェクトにかかるレンダリングコストを表示">
þ: [COUNT]
</text>
@@ -170,9 +172,15 @@
<text name="Creator:">
制作者:
</text>
+ <text name="Creator Name">
+ Mrs. Esbee Linden (esbee.linden)
+ </text>
<text name="Owner:">
所有者:
</text>
+ <text name="Owner Name">
+ Mrs. Erica &quot;Moose&quot; Linden (erica.linden)
+ </text>
<text name="Group:">
グループ:
</text>
diff --git a/indra/newview/skins/default/xui/ja/floater_voice_controls.xml b/indra/newview/skins/default/xui/ja/floater_voice_controls.xml
index 0caca22bc1..f12648f208 100644
--- a/indra/newview/skins/default/xui/ja/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/ja/floater_voice_controls.xml
@@ -19,7 +19,7 @@
<layout_panel name="my_panel">
<text name="user_text" value="マイ アバター:"/>
</layout_panel>
- <layout_panel name="leave_call_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"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_web_content.xml b/indra/newview/skins/default/xui/ja/floater_web_content.xml
new file mode 100644
index 0000000000..48fe8aee78
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_web_content.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_web_content" title="">
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button name="back" tool_tip="前へ"/>
+ <button name="forward" tool_tip="次へ"/>
+ <button name="stop" tool_tip="ナビゲーションを停止"/>
+ <button name="reload" tool_tip="ページを更新"/>
+ <combo_box name="address" tool_tip="ここに URL を入力"/>
+ <icon name="media_secure_lock_flag" tool_tip="安全な閲覧"/>
+ <button name="popexternal" tool_tip="この URL をブラウザで開く"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/inspect_avatar.xml b/indra/newview/skins/default/xui/ja/inspect_avatar.xml
index f3ea794bc7..42b67cd333 100644
--- a/indra/newview/skins/default/xui/ja/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/ja/inspect_avatar.xml
@@ -10,9 +10,11 @@
<string name="Details">
[SL_PROFILE]
</string>
+ <text name="user_name_small" value="Grumpity ProductEngine with a long name"/>
+ <text name="user_slid" value="james.linden"/>
<text name="user_subtitle" value="11 Months, 3 days old"/>
<text name="user_details">
- This is my second life description and I really think it is great.
+ This is my second life description and I really think it is great.But for some reason my description is super extra long because I like to talk a whole lot
</text>
<slider name="volume_slider" tool_tip="ボイス音量" value="0.5"/>
<button label="フレンド登録" name="add_friend_btn"/>
diff --git a/indra/newview/skins/default/xui/ja/language_settings.xml b/indra/newview/skins/default/xui/ja/language_settings.xml
index a6023f9b56..91e8f4be7c 100644
--- a/indra/newview/skins/default/xui/ja/language_settings.xml
+++ b/indra/newview/skins/default/xui/ja/language_settings.xml
@@ -4,6 +4,7 @@
<!-- 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>
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 5d95949189..6036e1075e 100644
--- a/indra/newview/skins/default/xui/ja/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/ja/menu_attachment_self.xml
@@ -5,7 +5,7 @@
<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="Change Outfit"/>
<menu_item_call label="アウトフィットの編集" name="Edit Outfit"/>
<menu_item_call label="シェイプの編集" name="Edit My Shape"/>
<menu_item_call label="フレンド" name="Friends..."/>
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 fc9c8caf51..4709522665 100644
--- a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
@@ -14,6 +14,7 @@
<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"/>
</context_menu>
@@ -21,7 +22,7 @@
<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="Chenge Outfit"/>
<menu_item_call label="アウトフィットを編集" name="Edit Outfit"/>
<menu_item_call label="シェイプを編集" name="Edit My Shape"/>
<menu_item_call label="フレンド" name="Friends..."/>
diff --git a/indra/newview/skins/default/xui/ja/menu_bottomtray.xml b/indra/newview/skins/default/xui/ja/menu_bottomtray.xml
index e5703c559b..7f106c1ab5 100644
--- a/indra/newview/skins/default/xui/ja/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/ja/menu_bottomtray.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="スピーカーボタン" name="EnableVoiceChat"/>
<menu_item_check label="ジェスチャーボタン" name="ShowGestureButton"/>
<menu_item_check label="移動ボタン" name="ShowMoveButton"/>
<menu_item_check label="視界ボタン" name="ShowCameraButton"/>
<menu_item_check label="スナップショットボタン" name="ShowSnapshotButton"/>
- <menu_item_check label="サイドバーボタン" name="ShowSidebarButton"/>
<menu_item_check label="制作ボタン" name="ShowBuildButton"/>
<menu_item_check label="検索ボタン" name="ShowSearchButton"/>
<menu_item_check label="地図ボタン" name="ShowWorldMapButton"/>
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
index 5fdaa9ae6b..9d0d0f10a6 100644
--- a/indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
+<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"/>
@@ -11,9 +11,11 @@
<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"/>
-</menu>
+</toggleable_menu>
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
index 90b3efd144..e3e206f3aa 100644
--- a/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml
@@ -1,10 +1,31 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu name="Gear Menu">
- <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="my_profile"/>
- <menu_item_call label="フレンド" name="my_friends"/>
- <menu_item_call label="グループ" name="my_groups"/>
+<?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..."/>
-</menu>
+</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 6999f9a3f3..f78ec09e5e 100644
--- a/indra/newview/skins/default/xui/ja/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inventory.xml
@@ -25,6 +25,7 @@
<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 Physics"/>
</menu>
<menu label="新しい身体部位" name="New Body Parts">
<menu_item_call label="新しいシェイプ(体型)" name="New Shape"/>
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 42dcd06a07..6c754e5d08 100644
--- a/indra/newview/skins/default/xui/ja/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inventory_add.xml
@@ -23,6 +23,7 @@
<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 Physics"/>
</menu>
<menu label="新しい身体部位" name="New Body Parts">
<menu_item_call label="新しいシェイプ(体型)" name="New Shape"/>
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 f0e5e936ca..1f425df83c 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
@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_gear_default">
+<toggleable_menu name="menu_gear_default">
<menu_item_call label="新しい持ち物ウィンドウ" name="new_window"/>
- <menu_item_call label="名前で並べ替え" name="sort_by_name"/>
- <menu_item_call label="新しい順に並べ替え" name="sort_by_recent"/>
+ <menu_item_check label="名前で並べ替え" name="sort_by_name"/>
+ <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_call label="すべてのフォルダを閉じる" name="close_folders"/>
@@ -12,4 +14,4 @@
<menu_item_call label="オリジナルを表示" name="Find Original"/>
<menu_item_call label="すべてのリンクを表示" name="Find All Links"/>
<menu_item_call label="ごみ箱を空にする" name="empty_trash"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_login.xml b/indra/newview/skins/default/xui/ja/menu_login.xml
index e2a7f39dfd..265f3ebcd0 100644
--- a/indra/newview/skins/default/xui/ja/menu_login.xml
+++ b/indra/newview/skins/default/xui/ja/menu_login.xml
@@ -17,7 +17,8 @@
<menu_item_call label="ウィンドウのサイズを設定..." name="Set Window Size..."/>
<menu_item_call label="利用規約を表示" name="TOS"/>
<menu_item_call label="クリティカルメッセージを表示" name="Critical"/>
- <menu_item_call label="Web ブラウザのテスト" name="Web Browser Test"/>
+ <menu_item_call label="メディアブラウザのテスト" name="Web Browser Test"/>
+ <menu_item_call label="Web コンテンツフローターのテスト" name="Web Content Floater Test"/>
<menu_item_check label="グリッドピッカーを表示する" name="Show Grid Picker"/>
<menu_item_call label="通知コンソールを表示する" name="Show Notifications Console"/>
</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
new file mode 100644
index 0000000000..d155dc17e0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_media_ctrl.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="media ctrl context menu">
+ <menu_item_call label="カット" name="Cut"/>
+ <menu_item_call label="コピー" name="Copy"/>
+ <menu_item_call label="貼り付け" name="Paste"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_mini_map.xml b/indra/newview/skins/default/xui/ja/menu_mini_map.xml
index 12ea6e2299..2e733ee24b 100644
--- a/indra/newview/skins/default/xui/ja/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/ja/menu_mini_map.xml
@@ -3,6 +3,7 @@
<menu_item_call label="ズーム(近)" name="Zoom Close"/>
<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="Auto Center"/>
<menu_item_call label="追跡をやめる" name="Stop Tracking"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_object.xml b/indra/newview/skins/default/xui/ja/menu_object.xml
index c11dc9bb3e..4cee8089ee 100644
--- a/indra/newview/skins/default/xui/ja/menu_object.xml
+++ b/indra/newview/skins/default/xui/ja/menu_object.xml
@@ -16,14 +16,14 @@
<context_menu label="取り付ける" name="Object Attach"/>
<context_menu label="HUD を取り付ける" name="Object Attach HUD"/>
</context_menu>
- <context_menu label="取り外す" name="Remove">
+ <context_menu label="管理" name="Remove">
<menu_item_call label="嫌がらせの報告" name="Report Abuse..."/>
<menu_item_call label="ブロック" name="Object Mute"/>
<menu_item_call label="返却" name="Return..."/>
- <menu_item_call label="削除" name="Delete"/>
</context_menu>
<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="Delete"/>
</context_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 d31b34deeb..2bcbe1915b 100644
--- a/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="Gear Outfit">
+<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"/>
@@ -14,6 +14,7 @@
<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 label="新しい身体部位" name="New Body Parts">
@@ -24,4 +25,4 @@
</menu>
<menu_item_call label="アウトフィットの名前を変更する" name="rename"/>
<menu_item_call label="アウトフィットを削除する" name="delete_outfit"/>
-</menu>
+</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 6f91a3ebf9..e64f97fda5 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,7 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_folder_gear">
+<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_call label="コピー" name="copy_folder"/>
<menu_item_call label="貼り付け" name="paste"/>
@@ -12,4 +13,4 @@
<menu_item_call label="フォルダをすべて開く" name="expand_all"/>
<menu_item_call label="フォルダをすべて閉じる" name="collapse_all"/>
<menu_item_check label="日付で並べ替え" name="sort_by_date"/>
-</menu>
+</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 5a135e5f56..f416b5b1f6 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,10 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="menu_ladmark_gear">
+<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="copy_landmark"/>
<menu_item_call label="SLurl をコピー" name="copy_slurl"/>
@@ -15,4 +16,4 @@
<menu_item_call label="フォルダをすべて閉じる" name="collapse_all"/>
<menu_item_check label="日付で並べ替え" name="sort_by_date"/>
<menu_item_call label="ピックを作成" name="create_pick"/>
-</menu>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml
index 85aaf17256..b8efc20049 100644
--- a/indra/newview/skins/default/xui/ja/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml
@@ -7,11 +7,17 @@
</menu_item_call>
<menu_item_call label="L$ の購入" name="Buy and Sell L$"/>
<menu_item_call label="プロフィール" name="Profile"/>
- <menu_item_call label="アウトフィットを変更" name="ChangeOutfit"/>
+ <menu_item_call label="容姿" name="ChangeOutfit"/>
<menu_item_check label="持ち物" name="Inventory"/>
<menu_item_check label="持ち物" name="ShowSidetrayInventory"/>
<menu_item_check label="ジェスチャー" name="Gestures"/>
<menu_item_check label="マイボイス" name="ShowVoice"/>
+ <menu label="ムーブメント" name="Movement">
+ <menu_item_call label="座る" name="Sit Down Here"/>
+ <menu_item_check label="飛ぶ" name="Fly"/>
+ <menu_item_check label="常に走る" name="Always Run"/>
+ <menu_item_call label="私のアニメーションを停止する" name="Stop Animating My Avatar"/>
+ </menu>
<menu label="ログイン状態" name="Status">
<menu_item_call label="一時退席中" name="Set Away"/>
<menu_item_call label="取り込み中" name="Set Busy"/>
@@ -29,6 +35,7 @@
<menu label="世界" name="World">
<menu_item_check label="ミニマップ" name="Mini-Map"/>
<menu_item_check label="世界地図" name="World Map"/>
+ <menu_item_check label="検索" name="Search"/>
<menu_item_call label="スナップショット" name="Take Snapshot"/>
<menu_item_call label="現在地をランドマーク" name="Create Landmark Here"/>
<menu label="場所のプロフィール" name="Land">
@@ -47,6 +54,7 @@
<menu_item_check label="土地所有者" name="Land Owners"/>
<menu_item_check label="座標" name="Coordinates"/>
<menu_item_check label="区画プロパティ" name="Parcel Properties"/>
+ <menu_item_check label="アドバンスメニュー" name="Show Advanced Menu"/>
</menu>
<menu_item_call label="ホームにテレポート" name="Teleport Home"/>
<menu_item_call label="現在地をホームに設定" name="Set Home to Here"/>
@@ -85,6 +93,7 @@
<menu_item_call label="コピーを取る" name="Take Copy"/>
<menu_item_call label="「持ち物」に保存" name="Save Object Back to My Inventory"/>
<menu_item_call label="オブジェクトの中身に保存" name="Save Object Back to Object Contents"/>
+ <menu_item_call label="オブジェクトを返却する" name="Return Object back to Owner"/>
</menu>
<menu label="スクリプト" name="Scripts">
<menu_item_call label="スクリプトのリコンパイル(Mono)" name="Mono"/>
@@ -98,6 +107,7 @@
<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_check label="隠れた位置の選択も表示する" name="Show Hidden Selection"/>
<menu_item_check label="選択した光の半径範囲を表示する" name="Show Light Radius for Selection"/>
<menu_item_check label="選択ビームを表示する" name="Show Selection Beam"/>
@@ -112,15 +122,17 @@
<menu_item_call label="アニメーション(L$[COST])..." name="Upload Animation"/>
<menu_item_call label="一括 (ファイルにつきL$[COST])..." name="Bulk Upload"/>
</menu>
+ <menu_item_call label="元に戻す" name="Undo"/>
+ <menu_item_call label="やり直し" name="Redo"/>
</menu>
<menu label="ヘルプ" name="Help">
<menu_item_call label="[SECOND_LIFE] ヘルプ" name="Second Life Help"/>
+ <menu_item_check label="ヒントを有効にする" name="Enable Hints"/>
<menu_item_call label="嫌がらせを報告する" name="Report Abuse"/>
<menu_item_call label="バグを報告する" name="Report Bug"/>
<menu_item_call label="[APP_NAME] について" name="About Second Life"/>
</menu>
<menu label="アドバンス" name="Advanced">
- <menu_item_call label="自分のアニメーションを停止する" name="Stop Animating My Avatar"/>
<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..."/>
@@ -175,8 +187,7 @@
<menu_item_check label="検索" name="Search"/>
<menu_item_call label="キーをリリース" name="Release Keys"/>
<menu_item_call label="UI のサイズをデフォルトに設定する" name="Set UI Size to Default"/>
- <menu_item_check label="常に走る" name="Always Run"/>
- <menu_item_check label="飛行する" name="Fly"/>
+ <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_call label="スナップショットをディスクに保存する" name="Snapshot to Disk"/>
@@ -194,7 +205,6 @@
<menu_item_call label="ズームイン" name="Zoom In"/>
<menu_item_call label="ズーム(デフォルト)" name="Zoom Default"/>
<menu_item_call label="ズームアウト" name="Zoom Out"/>
- <menu_item_check label="アドバンスメニューを表示する" name="Show Advanced Menu"/>
</menu>
<menu_item_call label="デバッグ設定を表示する" name="Debug Settings"/>
<menu_item_check label="開発メニューを表示する" name="Debug Mode"/>
@@ -219,8 +229,10 @@
<menu label="情報を表示" name="Display Info">
<menu_item_check label="時間を表示する" name="Show Time"/>
<menu_item_check label="描画情報を表示する" name="Show 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>
<menu label="エラー実行" name="Force Errors">
@@ -245,6 +257,7 @@
<menu_item_check label="シャドウ円錐" name="Shadow Frusta"/>
<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 Priority"/>
<menu_item_check label="テクスチャの範囲" name="Texture Area"/>
@@ -301,7 +314,8 @@
<menu_item_call label="リージョンオブジェクトのキャッシュをダンプする" name="Dump Region Object Cache"/>
</menu>
<menu label="UI" name="UI">
- <menu_item_call label="Web ブラウザのテスト" name="Web Browser Test"/>
+ <menu_item_call label="メディアブラウザのテスト" name="Web Browser Test"/>
+ <menu_item_call label="Web コンテンツブラウザ" name="Web Content Browser"/>
<menu_item_call label="SelectMgr をダンプ" name="Dump SelectMgr"/>
<menu_item_call label="持ち物の出力" name="Dump Inventory"/>
<menu_item_call label="タイマーをダンプ" name="Dump Timers"/>
@@ -309,8 +323,7 @@
<menu_item_call label="選択したオブジェクト情報をプリント" name="Print Selected Object Info"/>
<menu_item_call label="エージェント情報をプリント" name="Print Agent Info"/>
<menu_item_call label="メモリ使用状況" name="Memory Stats"/>
- <menu_item_check label="ダブルクリックで自動追跡を行う" name="Double-Click Auto-Pilot"/>
- <menu_item_check label="ダブルクリックでテレポート" name="DoubleClick Teleport"/>
+ <menu_item_check label="地域デバッグコンソール" name="Region Debug Console"/>
<menu_item_check label="SelectMgr のデバッグ" name="Debug SelectMgr"/>
<menu_item_check label="ダブルクリック" name="Debug Clicks"/>
<menu_item_check label="デバッグ表示" name="Debug Views"/>
@@ -322,10 +335,9 @@
<menu label="XUI" name="XUI">
<menu_item_call label="色の設定を更新する" name="Reload Color Settings"/>
<menu_item_call label="フォントテストを表示する" name="Show Font Test"/>
- <menu_item_call label="XML から読み込む" name="Load from XML"/>
- <menu_item_call label="XML で保存する" name="Save to XML"/>
<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">
@@ -362,9 +374,9 @@
<menu_item_call label="圧縮画像" name="Compress Images"/>
<menu_item_check label="デバッグ用のミニダンプを出力する" name="Output Debug Minidump"/>
<menu_item_check label="次回の起動時にコンソールウィンドウを表示する" name="Console Window"/>
- <menu_item_check label="管理者メニューを表示する" name="View Admin Options"/>
<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>
<menu label="管理者" name="Admin">
<menu label="Object">
@@ -401,6 +413,7 @@
<menu_item_call label="スカート" name="Skirt"/>
<menu_item_call label="アルファ" name="Alpha"/>
<menu_item_call label="タトゥ" name="Tattoo"/>
+ <menu_item_call label="物理作用" name="Physics"/>
<menu_item_call label="すべての衣類" name="All Clothes"/>
</menu>
<menu label="ヘルプ" name="Help">
diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml
index baec8c073c..f93e032ffc 100644
--- a/indra/newview/skins/default/xui/ja/notifications.xml
+++ b/indra/newview/skins/default/xui/ja/notifications.xml
@@ -113,9 +113,13 @@
フレンド以外からのコールやインスタントメッセージを無視する設定にしたことを、相手に知られることはありません。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
+ <notification name="FavoritesOnLogin">
+ 注意:このオプションを有効にすると、このパソコンを使うユーザーは誰でも、あなたのお気に入りの場所を見ることができるようになります。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="GrantModifyRights">
- 他人に修正権限を与えると、権限を与えられた人はあなたが所有するインワールドのオブジェクトを変更、削除、持ち帰ることができます。 この権限を与える際には十分に注意してください。
-[FIRST_NAME] [LAST_NAME] に修正権限を与えますか?
+ 他人に修正権限を与えると、権限を与えられた人はあなたが所有するインワールドのオブジェクトを変更、削除、持ち帰ることができます。この権限を与える際には十分に注意してください。
+[NAME] に修正権限を与えますか?
<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
</notification>
<notification name="GrantModifyRightsMultiple">
@@ -124,7 +128,7 @@
<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
</notification>
<notification name="RevokeModifyRights">
- [FIRST_NAME] [LAST_NAME] に対して変更権限を取り消しますか?
+ [NAME] の修正権限を解約しますか?
<usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
</notification>
<notification name="RevokeModifyRightsMultiple">
@@ -339,24 +343,17 @@ L$ が不足しているのでこのグループに参加することができ
まだ読み込まれていないため、そのアイテムを装着できません。後でやり直してください。
</notification>
<notification name="MustHaveAccountToLogIn">
- おっと!記入漏れがありますよ。
-アバターのファーストネームとラストネームの両方を入力する必要があります。
+ 注意:記入漏れの箇所があります。
+アバターのユーザー名を入力してください。
-[SECOND_LIFE] に入るには、アカウントが必要です。 アカウントを作成しますか?
+[SECOND_LIFE] に入るにはアカウントが必要です。今すぐアカウントを作成しますか?
<url name="url">
https://join.secondlife.com/index.php?lang=ja-JP
</url>
<usetemplate name="okcancelbuttons" notext="もう一度試す" yestext="新しいアカウントを作成"/>
</notification>
<notification name="InvalidCredentialFormat">
- 「ユーザーネーム」欄にアバターのファーストネームとラストネーム両方を入力してからログインしてください。
- </notification>
- <notification name="AddClassified">
- クラシファイド広告は、検索ディレクトリと [http://secondlife.com/community/classifieds secondlife.com] の「クラシファイド広告」セクションに一週間掲載されます。
-広告を記入したら、「掲載...」をクリックしてディレクトリに追加してください。
-「掲載」をクリックすると、支払いたい金額を尋ねられます。
-支払金額が多いほどあなたの広告は一覧とキーワード検索で上位に表示されます。
- <usetemplate ignoretext="新規クラシファイド広告作成方法" name="okcancelignore" notext="取り消し" yestext="OK"/>
+ ユーザー名のフィールドにアバターのユーザー名もしくは氏名を入力してから、再度ログインする必要があります。
</notification>
<notification name="DeleteClassified">
クラシファイド広告 [NAME] を削除しますか?
@@ -410,6 +407,9 @@ L$ が不足しているのでこのグループに参加することができ
<notification name="ChangeSkin">
新しいスキンは [APP_NAME] を再起動後に表示されます。
</notification>
+ <notification name="ChangeLanguage">
+ 言語の変更は [APP_NAME] を再起動後に反映されます。
+ </notification>
<notification name="GoToAuctionPage">
[SECOND_LIFE]の Web ページに移動し、入札あるいはオークションの詳細を確認しますか?
<url name="url">
@@ -623,6 +623,10 @@ L$ が不足しているのでこのグループに参加することができ
WAV ヘッダーにデータチャンクが見つかりません:
[FILE]
</notification>
+ <notification name="SoundFileInvalidChunkSize">
+ WAV ファイルのチャンクサイズが間違っています:
+[FILE]
+ </notification>
<notification name="SoundFileInvalidTooLong">
オーディオファイルが長すぎます。(最大 10 秒):
[FILE]
@@ -950,12 +954,6 @@ L$ は返金されません。
グループ用の土地の購入ができません:
あなたにはアクティブなグループのために土地を購入する権限がありません。
</notification>
- <notification label="フレンド登録" name="AddFriend">
- フレンド登録すると、お互いの現在地の地図への表示許可、オンライン状態の表示設定ができます。
-
-[NAME] にフレンドシップを送りますか?
- <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
- </notification>
<notification label="フレンド登録" name="AddFriendWithMessage">
フレンド登録すると、お互いの現在地の地図への表示許可、オンライン状態の表示設定ができます。
@@ -974,7 +972,7 @@ L$ は返金されません。
<input name="message">
[DESC] (新)
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="キャンセル"/>
</form>
</notification>
@@ -984,7 +982,7 @@ L$ は返金されません。
<input name="message">
[DESC](新規)
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="取り消し"/>
</form>
</notification>
@@ -994,12 +992,12 @@ L$ は返金されません。
<input name="new_name">
[NAME]
</input>
- <button name="Offer" text="OK"/>
+ <button name="OK" text="OK"/>
<button name="Cancel" text="取り消し"/>
</form>
</notification>
<notification name="RemoveFromFriends">
- [FIRST_NAME] [LAST_NAME] をフレンドリストから削除しますか?
+ フレンドリストから [NAME] を削除しますか?
<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
</notification>
<notification name="RemoveMultipleFromFriends">
@@ -1122,14 +1120,11 @@ L$ は返金されません。
<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
</notification>
<notification name="DeedLandToGroupWithContribution">
- この区画の譲渡に際しては、このグループが十分な土地クレジットを保有および維持している必要があります。
-この譲渡により、
-「 [FIRST_NAME] [LAST_NAME] 」から
-グループに対して土地が同時に提供されます。
-土地の購入価格は、所有者には返金されません。
-譲渡された区画が売れると、売上金額はグループメンバーに均等に分配されます。
-
-この [AREA] 平方メートルの土地を、「 [GROUP_NAME] 」に譲渡しますか?
+ この区画が譲渡されると、グループはその土地利用料として十分な残高を維持していく必要があります。
+譲渡には同時に [NAME] からグループへの土地の貢献が含まれます。
+土地の購入価格は所有者に返金されません。譲渡された区画が売却されると、販売価格はグループメンバーの間で均等に分配されます。
+
+この [AREA] m² の土地を [GROUP_NAME] というグループに譲渡しますか?
<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
</notification>
<notification name="DisplaySetToSafe">
@@ -1374,6 +1369,45 @@ SHA1 フィンガープリント: [MD5_DIGEST]
あなたのアプリケーションフォルダにダウンロードしますか?
<usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンロード"/>
</notification>
+ <notification name="FailedUpdateInstall">
+ ビューワのアップデートをインストール中にエラーが発生しました。
+http://secondlife.com/download から最新バージョンをダウンロードしてインストールしてください。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FailedRequiredUpdateInstall">
+ 必要なアップデートをインストールできませんでした。
+[APP_NAME] がアップデートされるまでログインできません。
+
+http://secondlife.com/download から最新バージョンをダウンロードしてインストールしてください。
+ <usetemplate name="okbutton" yestext="終了"/>
+ </notification>
+ <notification name="UpdaterServiceNotRunning">
+ お使いの Second Life に必要なアップデートがインストールされていません。
+
+このアップデートは、http://www.secondlife.com/downloads からダウンロードして、今すぐインストールできます。
+ <usetemplate name="okcancelbuttons" notext="終了" yestext="今すぐダウンロードしてインストール"/>
+ </notification>
+ <notification name="DownloadBackgroundTip">
+ お使いの [APP_NAME] に必要なアップデートをダウンロードしました。
+バージョン [VERSION] [[RELEASE_NOTES_FULL_URL] このアップデートに関する情報]
+ <usetemplate name="okcancelbuttons" notext="後で実行" yestext="今すぐインストールして [APP_NAME] を再起動"/>
+ </notification>
+ <notification name="DownloadBackgroundDialog">
+ お使いの [APP_NAME] に必要なアップデートをダウンロードしました。
+バージョン [VERSION] [[RELEASE_NOTES_FULL_URL] このアップデートに関する情報]
+ <usetemplate name="okcancelbuttons" notext="後で実行" yestext="今すぐインストールして [APP_NAME] を再起動"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedVerboseDialog">
+ 必要なソフトウェアのアップデートをダウンロードしました。
+バージョン [VERSION]
+
+アップデートをインストールするには [APP_NAME] を再起動する必要があります。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedDialog">
+ アップデートをインストールするには [APP_NAME] を再起動する必要があります。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="DeedObjectToGroup">
このオブジェクトを譲渡するとグループは以下のことが可能です:
* オブジェクトに支払われた L$ を受領します。
@@ -1506,6 +1540,46 @@ SHA1 フィンガープリント: [MD5_DIGEST]
<button name="Cancel" text="取り消し"/>
</form>
</notification>
+ <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] 文字までです。
+
+もう少し短い名前をお試しください。
+ </notification>
+ <notification name="SetDisplayNameFailedGeneric">
+ 申し訳ありませんが、表示名を設定できませんでした。あとでもう一度お試しください。
+ </notification>
+ <notification name="SetDisplayNameMismatch">
+ 入力した表示名が一致しません。もう一度入力してください。
+ </notification>
+ <notification name="AgentDisplayNameUpdateThresholdExceeded">
+ しばらくは表示名を変更できません。
+
+http://wiki.secondlife.com/wiki/Setting_your_display_name を参照してください。
+
+あとでもう一度お試しください。
+ </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">
@@ -2082,10 +2156,10 @@ Web ページにリンクすると、他人がこの場所に簡単にアクセ
件名: [SUBJECT]、メッセージ: [MESSAGE]
</notification>
<notification name="FriendOnline">
- [NAME] はオンラインです
+ [NAME] はオンライン中です
</notification>
<notification name="FriendOffline">
- [NAME] はオフラインです
+ [NAME] はオフライン中です
</notification>
<notification name="AddSelfFriend">
残念ながら自分自身をフレンド登録することはできません。
@@ -2212,18 +2286,13 @@ Web ページにリンクすると、他人がこの場所に簡単にアクセ
<notification name="NoContentToSearch">
少なくともどれか一つコンテンツの種類を選択して検索を行ってください。(General、Moderate、Adult)
</notification>
- <notification name="GroupVote">
- [NAME] は投票の申請をしています:
-[MESSAGE]
- <form name="form">
- <button name="VoteNow" text="今すぐ投票する"/>
- <button name="Later" text="あとで"/>
- </form>
- </notification>
<notification name="SystemMessage">
[MESSAGE]
</notification>
- <notification name="PaymentRecived">
+ <notification name="PaymentReceived">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentSent">
[MESSAGE]
</notification>
<notification name="EventNotification">
@@ -2232,7 +2301,7 @@ Web ページにリンクすると、他人がこの場所に簡単にアクセ
[NAME]
[DATE]
<form name="form">
- <button name="Details" text="説明"/>
+ <button name="Details" text="詳細"/>
<button name="Cancel" text="取り消し"/>
</form>
</notification>
@@ -2269,9 +2338,7 @@ Web ページにリンクすると、他人がこの場所に簡単にアクセ
選択した土地の区画上にあったあなたのオブジェクトは、すべてあなたの「持ち物」に返却されました。
</notification>
<notification name="OtherObjectsReturned">
- 選択した土地の区画上にあった
- [NAME]
- が所有するオブジェクトは、すべて所有者の「持ち物」に返却されました。
+ [NAME] が所有する、選択した区画にあるオブジェクトは、所有者の持ち物に返却されました。
</notification>
<notification name="OtherObjectsReturned2">
「 [NAME] 」という名前の住人が所有する、選択した区画上のオブジェクトは、本人に返却されました。
@@ -2398,7 +2465,7 @@ Web ページにリンクすると、他人がこの場所に簡単にアクセ
有効な区画が見つかりませんでした。
</notification>
<notification name="ObjectGiveItem">
- [NAME_SLURL] が所有する [OBJECTFROMNAME] という名前のオブジェクトが、あなたに [OBJECTTYPE] を渡しました:
+ [NAME_SLURL] が所有する &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; という名前のオブジェクトが、あなたに [OBJECTTYPE] を渡しました:
[ITEM_SLURL]
<form name="form">
<button name="Keep" text="受け取る"/>
@@ -2463,10 +2530,9 @@ Web ページにリンクすると、他人がこの場所に簡単にアクセ
[TO_NAME] にフレンド登録を申し出ました。
</notification>
<notification name="OfferFriendshipNoMessage">
- [NAME] は、
-フレンド登録を申し込んでいます。
+ [NAME_SLURL] はフレンド登録を申し込んでいます。
-(デフォルトでお互いのオンライン状態を見ることができるようになります。)
+(デフォルト設定だとお互いのオンライン状態を見ることができます)
<form name="form">
<button name="Accept" text="受け入れる"/>
<button name="Decline" text="拒否"/>
@@ -2486,7 +2552,7 @@ Web ページにリンクすると、他人がこの場所に簡単にアクセ
</notification>
<notification name="OfferCallingCard">
[NAME] がコーリングカードを渡そうとしています。
-あなたの「持ち物」にブックマークが追加され、この住人に素早く IM を送ることができます。
+あなたの持ち物にブックマークが追加され、この住人に素早く IM を送ることができます。
<form name="form">
<button name="Accept" text="受け入れる"/>
<button name="Decline" text="辞退"/>
@@ -2501,11 +2567,11 @@ Web ページにリンクすると、他人がこの場所に簡単にアクセ
このままここにいるとログアウトされます。
</notification>
<notification name="LoadWebPage">
- Web ページ [URL] を読み込みますか?
+ Web ページ [URL] をロードしますか?
[MESSAGE]
-読み込み元のオブジェクト:[OBJECTNAME]、所有者:[NAME]
+送信元のオブジェクト:&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;、所有者:[NAME]?
<form name="form">
<button name="Gotopage" text="ページに移動"/>
<button name="Cancel" text="取り消し"/>
@@ -2521,7 +2587,7 @@ Web ページにリンクすると、他人がこの場所に簡単にアクセ
着用しようとしているアイテムはあなたのビューワでは読み込むことができません。 [APP_NAME] のバージョンをアップグレードしてからこのアイテムを着用してください。
</notification>
<notification name="ScriptQuestion">
- [NAME] が所有するオブジェクト「 [OBJECTNAME] 」を:
+ [NAME] が所有する「&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;」 というオブジェクトが、次のことをしようとしています:
[QUESTIONS]
よろしいですか?
@@ -2532,7 +2598,7 @@ Web ページにリンクすると、他人がこの場所に簡単にアクセ
</form>
</notification>
<notification name="ScriptQuestionCaution">
- [NAME] が所有する「 [OBJECTNAME] 」 というオブジェクトが、次のことをしようとしています:
+ [NAME] が所有する「&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;」 というオブジェクトが、次のことをしようとしています:
[QUESTIONS]
このオブジェクトや制作者を信用できない場合は、このリクエストを拒否してください。
@@ -2545,14 +2611,14 @@ Web ページにリンクすると、他人がこの場所に簡単にアクセ
</form>
</notification>
<notification name="ScriptDialog">
- [NAME] の「 &lt;nolink&gt;[TITLE]&lt;/nolink&gt; 」
+ [NAME] の「&lt;nolink&gt;[TITLE]&lt;/nolink&gt;」
[MESSAGE]
<form name="form">
<button name="Ignore" text="無視する"/>
</form>
</notification>
<notification name="ScriptDialogGroup">
- [GROUPNAME] の「 [TITLE] 」
+ [GROUPNAME] の「&lt;nolink&gt;[TITLE]&lt;/nolink&gt;」
[MESSAGE]
<form name="form">
<button name="Ignore" text="無視する"/>
@@ -2595,7 +2661,7 @@ M キーを押して変更します。
[NAME] はお金を受け取り、自動的にブロックが解除されました。
</notification>
<notification name="AutoUnmuteByInventory">
- [NAME] はアイテムを受け取り、自動的にブロックが解除されました。
+ [NAME] は持ち物を受け取り、自動的にブロックが解除されました。
</notification>
<notification name="VoiceInviteGroup">
[NAME] は [GROUP] のボイスチャットコールに参加しました。
@@ -2726,11 +2792,11 @@ M キーを押して変更します。
共有する住人を選択します。
</notification>
<notification name="ShareItemsConfirmation">
- 次のアイテムを共有しますか:
+ 次のアイテムを共有しますか?
&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
-次の住人と共有しますか:
+次の住人と共有しますか?
[RESIDENTS]
<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
@@ -2777,9 +2843,7 @@ M キーを押して変更します。
<notification name="NoConnect">
[PROTOCOL] [HOSTID]を使って接続できません。
お使いのネットワークやファイアウォールの設定を確認してください。
- <form name="form">
- <button name="OK" text="OK"/>
- </form>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="NoVoiceConnect">
ボイスサーバーに接続できません:
@@ -2788,9 +2852,7 @@ M キーを押して変更します。
ボイスチャットによるコミュニケーションが利用できません。
お使いのネットワークやファイアウォールの設定を確認してください。
- <form name="form">
- <button name="OK" text="OK"/>
- </form>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AvatarRezLeftNotification">
( [EXISTENCE] 秒)
@@ -2816,6 +2878,95 @@ M キーを押して変更します。
全員をミュートしますか?
<usetemplate ignoretext="グループコールの参加者全員をミュートする前の確認" name="okcancelignore" notext="取り消し" yestext="OK"/>
</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="PopupAttempt">
+ ポップアップがブロックされました。
+ <form name="form">
+ <ignore name="ignore" text="全てのポップアップを有効にする"/>
+ <button name="open" text="ポップアップウィンドウを開く"/>
+ </form>
+ </notification>
+ <notification name="AuthRequest">
+ 「[REALM]」にある「&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;」のサイトにはユーザー名とパスワードが必要です。
+ <form name="form">
+ <input name="username" text="ユーザー名"/>
+ <input name="password" text="パスワード"/>
+ <button name="ok" text="送信"/>
+ <button name="cancel" text="取り消し"/>
+ </form>
+ </notification>
+ <notification label="" name="ModeChange">
+ モードを変更するには終了して再起動する必要があります。
+ <usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
+ </notification>
+ <notification label="" name="NoClassifieds">
+ クラシファイド広告の作成と編集はアドバンスモードでのみ利用できます。終了してモードを変更しますか?モードはログイン画面で選択できます。
+ <usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
+ </notification>
+ <notification label="" name="NoGroupInfo">
+ グループの作成と編集はアドバンスモードでのみ利用できます。終了してモードを変更しますか?モードはログイン画面で選択できます。
+ <usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
+ </notification>
+ <notification label="" name="NoPicks">
+ ピックの作成と編集はアドバンスモードでのみ利用できます。終了してモードを変更しますか?モードはログイン画面で選択できます。
+ <usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
+ </notification>
+ <notification label="" name="NoWorldMap">
+ 世界地図の表示はアドバンスモードでのみ利用できます。終了してモードを変更しますか?モードはログイン画面で選択できます。
+ <usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
+ </notification>
+ <notification label="" name="NoVoiceCall">
+ ボイスコールはアドバンスモードでのみ利用できます。ログアウトしてモードを変更しますか?
+ <usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
+ </notification>
+ <notification label="" name="NoAvatarShare">
+ 共有はアドバンスモードでのみ利用できます。ログアウトしてモードを変更しますか?
+ <usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
+ </notification>
+ <notification label="" name="NoAvatarPay">
+ 他の住人への支払いはアドバンスモードでのみ利用できます。ログアウトしてモードを変更しますか?
+ <usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
+ </notification>
<global name="UnsupportedCPU">
- あなたの CPU の速度は必須動作環境の条件を満たしていません。
</global>
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 25864ec629..70d37c3bad 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
@@ -21,7 +21,7 @@
<string name="FormatYears">
[COUNT] 年
</string>
- <text name="avatar_name" value="不明"/>
+ <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="このフレンドは、あなたのオブジェクトを編集・削除・取得することができます"/>
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 f2e3e6e993..7250da69a4 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml
@@ -1,10 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_alpha_panel">
- <panel name="avatar_alpha_color_panel">
- <texture_picker label="アルファ&#10;(下)" name="Lower Alpha" tool_tip="クリックして写真を選択します"/>
- <texture_picker label="アルファ&#10;(上)" name="Upper Alpha" tool_tip="クリックして写真を選択します"/>
- <texture_picker label="頭部のア&#10;ルファ" name="Head Alpha" tool_tip="クリックして写真を選択します"/>
- <texture_picker label="目のアルファ" name="Eye Alpha" tool_tip="クリックして写真を選択します"/>
- <texture_picker label="髪のアルファ" name="Hair Alpha" tool_tip="クリックして写真を選択します"/>
- </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="クリックして写真を選択します"/>
+ </panel>
+ </scroll_container>
</panel>
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 83e9abca85..72eb120c3d 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_gloves.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_gloves.xml
@@ -1,7 +1,7 @@
<?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="クリックして写真を選択します"/>
+ <texture_picker label="テクスチャ" name="Fabric" tool_tip="クリックして写真を選択します"/>
<color_swatch label="色・色彩配合" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
</panel>
<panel name="accordion_panel">
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 fe95061e57..ee39e9435c 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_jacket.xml
@@ -1,8 +1,8 @@
<?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="クリックして写真を選択します"/>
+ <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">
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 9f672337aa..6a1789c9f4 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_pants.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_pants.xml
@@ -1,7 +1,7 @@
<?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="クリックして写真を選択します"/>
+ <texture_picker label="テクスチャ" name="Fabric" tool_tip="クリックして写真を選択します"/>
<color_swatch label="色・色彩配合" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
</panel>
<panel name="accordion_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
new file mode 100644
index 0000000000..6ebf0062dc
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_edit_physics.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_physics_panel">
+ <panel label="" name="accordion_panel">
+ <accordion name="physics_accordion">
+ <accordion_tab name="physics_breasts_updown_tab" title="胸の弾み"/>
+ <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>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_profile.xml b/indra/newview/skins/default/xui/ja/panel_edit_profile.xml
index 334cf54a4d..4cbd7f793b 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_profile.xml
@@ -26,6 +26,14 @@
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
<panel name="data_panel">
+ <text name="display_name_label" value="表示名:"/>
+ <text name="solo_username_label" value="ユーザー名:"/>
+ <button name="set_name" tool_tip="表示名を設定"/>
+ <text name="solo_user_name" value="Hamilton Hitchings"/>
+ <text name="user_name" value="Hamilton Hitchings"/>
+ <text name="user_name_small" value="Hamilton Hitchings"/>
+ <text name="user_label" value="ユーザー名:"/>
+ <text name="user_slid" value="hamilton.linden"/>
<panel name="lifes_images_panel">
<panel name="second_life_image_panel">
<text name="second_life_photo_title_text" value="[SECOND_LIFE]:"/>
@@ -46,7 +54,7 @@
<text name="my_account_link" value="[[URL] マイアカウントに移動]"/>
<text name="title_partner_text" value="マイパートナー:"/>
<panel name="partner_data_panel">
- <name_box initial_value="(取得中)" name="partner_text"/>
+ <text initial_value="(取得中)" name="partner_text"/>
</panel>
<text name="partner_edit_link" value="[[URL] 編集]" width="100"/>
</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 457c0bceb8..f33daa4eba 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_shirt.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_shirt.xml
@@ -1,7 +1,7 @@
<?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="クリックして写真を選択"/>
+ <texture_picker label="テクスチャ" name="Fabric" tool_tip="クリックして写真を選択"/>
<color_swatch label="色・色彩配合" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
</panel>
<panel name="accordion_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 98b4c57fc7..c7626189af 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_shoes.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_shoes.xml
@@ -1,7 +1,7 @@
<?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="クリックして写真を選択します"/>
+ <texture_picker label="テクスチャ" name="Fabric" tool_tip="クリックして写真を選択します"/>
<color_swatch label="色・色彩配合" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
</panel>
<panel name="accordion_panel">
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 b169bab591..6efc4ce99a 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_skirt.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_skirt.xml
@@ -1,7 +1,7 @@
<?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="クリックして写真を選択"/>
+ <texture_picker label="テクスチャ" name="Fabric" tool_tip="クリックして写真を選択"/>
<color_swatch label="色・色彩配合" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
</panel>
<panel name="accordion_panel">
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 b095257a56..71fc7c5682 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_socks.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_socks.xml
@@ -1,7 +1,7 @@
<?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="クリックして写真を選択します"/>
+ <texture_picker label="テクスチャ" name="Fabric" tool_tip="クリックして写真を選択します"/>
<color_swatch label="色・色彩配合" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
</panel>
<panel name="accordion_panel">
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 fec34479c3..f345a81922 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_underpants.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_underpants.xml
@@ -1,7 +1,7 @@
<?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="クリックして写真を選択します"/>
+ <texture_picker label="テクスチャ" name="Fabric" tool_tip="クリックして写真を選択します"/>
<color_swatch label="色・色彩配合" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
</panel>
<panel name="accordion_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 bd47d89947..66b2ffa8ba 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml
@@ -1,7 +1,7 @@
<?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="クリックして写真を選択します"/>
+ <texture_picker label="テクスチャ" name="Fabric" tool_tip="クリックして写真を選択します"/>
<color_swatch label="色・色彩配合" name="Color/Tint" tool_tip="クリックしてカラーピッカーを開きます"/>
</panel>
<panel name="accordion_panel">
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 6cbed88ebc..000dac7b5b 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml
@@ -45,6 +45,9 @@
<string name="edit_tattoo_title">
タトゥーを編集中
</string>
+ <string name="edit_physics_title">
+ 物理作用の編集中
+ </string>
<string name="shape_desc_text">
シェイプ:
</string>
@@ -90,6 +93,9 @@
<string name="tattoo_desc_text">
タトゥ:
</string>
+ <string name="physics_desc_text">
+ 物理作用:
+ </string>
<labeled_back_button label="保存" name="back_btn" tool_tip="アウトフィットの編集に戻る"/>
<text name="edit_wearable_title" value="シェイプを編集中"/>
<panel label="シャツ" name="wearable_type_panel">
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 016dc97ab6..82be58a0fb 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
@@ -24,6 +24,7 @@
<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">
寄付合計:
diff --git a/indra/newview/skins/default/xui/ja/panel_login.xml b/indra/newview/skins/default/xui/ja/panel_login.xml
index 808f19a16d..ac1fe455c7 100644
--- a/indra/newview/skins/default/xui/ja/panel_login.xml
+++ b/indra/newview/skins/default/xui/ja/panel_login.xml
@@ -11,12 +11,19 @@
<text name="username_text">
ユーザーネーム:
</text>
- <line_editor label="ユーザーネーム" name="username_edit" tool_tip="[SECOND_LIFE] ユーザーネーム"/>
+ <combo_box name="username_combo" tool_tip="登録時に自分で選んだユーザー名(例:bobsmith12、Steller Sunshineなど)"/>
<text name="password_text">
パスワード:
</text>
<check_box label="パスワードを記憶" name="remember_check"/>
<button label="ログイン" left_pad="30" name="connect_btn" width="60"/>
+ <text name="mode_selection_text">
+ モード:
+ </text>
+ <combo_box name="mode_combo" tool_tip="モードを選択します。ベーシックモードでは探索やチャットをすばやく簡単に実行でき、アドバンスモードでは、より多くの機能が利用できます。">
+ <combo_box.item label="ベーシック" name="Basic"/>
+ <combo_box.item label="アドバンス" name="Advanced"/>
+ </combo_box>
<text name="start_location_text">
開始地点:
</text>
@@ -31,7 +38,7 @@
お申し込み
</text>
<text name="forgot_password_text">
- 名前またはパスワードをお忘れですか?
+ ユーザー名またはパスワードをお忘れですか?
</text>
<text name="login_help">
ログインの方法
diff --git a/indra/newview/skins/default/xui/ja/panel_my_profile.xml b/indra/newview/skins/default/xui/ja/panel_my_profile.xml
index 94c5a6a4b7..a0d99ba5a8 100644
--- a/indra/newview/skins/default/xui/ja/panel_my_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_my_profile.xml
@@ -16,34 +16,27 @@
<string name="RegisterDateFormat">
[REG_DATE] ([AGE])
</string>
+ <string name="name_text_args">
+ [NAME]
+ </string>
+ <string name="display_name_text_args">
+ [DISPLAY_NAME]
+ </string>
<layout_stack name="layout">
<layout_panel name="profile_stack">
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
<panel name="second_life_image_panel">
- <icon label="" name="2nd_life_edit_icon" tool_tip="下の「プロフィールの編集」ボタンを押して画像を変更します"/>
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <icon label="" name="real_world_edit_icon" tool_tip="下の「プロフィールの編集」ボタンを押して画像を変更します"/>
- <text name="title_rw_descr_text" value="現実世界:"/>
- </panel>
- <text name="title_member_text" value="メンバー登録:"/>
- <text name="title_acc_status_text" value="アカウントの状態:"/>
- <text_editor name="acc_status_text">
- 住人。 支払情報未登録。
- リンデン。
- </text_editor>
- <text name="title_partner_text" value="パートナー:"/>
- <panel name="partner_data_panel">
- <name_box initial_value="(取得中)" name="partner_text"/>
+ <text name="display_name_descr_text">
+ ユーザー名
+ </text>
+ <text name="name_descr_text">
+ 表示名
+ </text>
+ <button label="プロフィール" name="see_profile_btn" tool_tip="このアバターのプロフィールを表示"/>
</panel>
- <text name="title_groups_text" value="グループ:"/>
</panel>
</scroll_container>
</layout_panel>
</layout_stack>
- <panel name="profile_me_buttons_panel">
- <button label="プロフィールの編集" name="edit_profile_btn" tool_tip="個人的な情報を編集します"/>
- </panel>
</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 07293e6c79..c29ec64304 100644
--- a/indra/newview/skins/default/xui/ja/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/ja/panel_nearby_media.xml
@@ -19,7 +19,7 @@
<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="more_btn" tool_tip="アドバンスコントロール"/>
<button label="詳細 &gt;&gt;" label_selected="簡易 &lt;&lt;" name="less_btn" tool_tip="アドバンスコントロール"/>
</panel>
<panel name="nearby_media_panel">
diff --git a/indra/newview/skins/default/xui/ja/panel_notify_textbox.xml b/indra/newview/skins/default/xui/ja/panel_notify_textbox.xml
new file mode 100644
index 0000000000..8e0cf4bc9d
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_notify_textbox.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_notify_textbox">
+ <string name="message_max_lines_count" value="7"/>
+ <panel label="info_panel" name="info_panel">
+ <text_editor name="message" value="メッセージ"/>
+ </panel>
+ <panel label="control_panel" name="control_panel">
+ <button label="送信" name="btn_submit"/>
+ <button label="無視" name="ignore_btn"/>
+ </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 f2ccddc9de..c7f71c6de0 100644
--- a/indra/newview/skins/default/xui/ja/panel_people.xml
+++ b/indra/newview/skins/default/xui/ja/panel_people.xml
@@ -18,11 +18,13 @@
<string name="groups_filter_label" value="グループをフィルター"/>
<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‐ドラッグで水平・垂直移動)"/>
<filter_editor label="フィルター" name="filter_input"/>
<tab_container name="tabs">
<panel label="近く" name="nearby_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="nearby_view_sort_btn" tool_tip="オプション"/>
+ <menu_button name="nearby_view_sort_btn" tool_tip="オプション"/>
<button name="add_friend_btn" tool_tip="選択した住人をフレンドリストに登録"/>
</panel>
</panel>
@@ -34,27 +36,27 @@
<panel label="bottom_panel" name="bottom_panel">
<layout_stack name="bottom_panel">
<layout_panel name="options_gear_btn_panel">
- <button name="friends_viewsort_btn" tool_tip="オプションを表示します"/>
+ <menu_button name="friends_viewsort_btn" tool_tip="オプションを表示します"/>
</layout_panel>
<layout_panel name="add_btn_panel">
<button name="add_btn" tool_tip="フレンド登録を申し出る"/>
</layout_panel>
<layout_panel name="trash_btn_panel">
- <dnd_button name="trash_btn" tool_tip="選択した人をフレンドリストから削除"/>
+ <dnd_button name="del_btn" tool_tip="選択した人をフレンドリストから削除"/>
</layout_panel>
</layout_stack>
</panel>
</panel>
<panel label="マイ グループ" name="groups_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="groups_viewsort_btn" tool_tip="オプション"/>
+ <menu_button name="groups_viewsort_btn" tool_tip="オプション"/>
<button name="plus_btn" tool_tip="グループに参加 / 新規グループを作成します"/>
<button name="activate_btn" tool_tip="選択したグループをアクティブにします"/>
</panel>
</panel>
<panel label="最新" name="recent_panel">
<panel label="bottom_panel" name="bottom_panel">
- <button name="recent_viewsort_btn" tool_tip="オプション"/>
+ <menu_button name="recent_viewsort_btn" tool_tip="オプション"/>
<button name="add_friend_btn" tool_tip="選択した住人をフレンドリストに登録"/>
</panel>
</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 b897e1d748..8a40d7aa5a 100644
--- a/indra/newview/skins/default/xui/ja/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_place_profile.xml
@@ -80,7 +80,7 @@
<text name="region_rating_label" value="レーティング:"/>
<text name="region_rating" value="Adult"/>
<text name="region_owner_label" value="所有者:"/>
- <text name="region_owner" value="moose Van Moose"/>
+ <text name="region_owner" value="moose Van Moose extra long name moose"/>
<text name="region_group_label" value="グループ:"/>
<text name="region_group">
The Mighty Moose of mooseville soundvillemoose
@@ -93,6 +93,7 @@
<text name="estate_name_label" value="エステート:"/>
<text name="estate_rating_label" value="レーティング:"/>
<text name="estate_owner_label" value="所有者:"/>
+ <text name="estate_owner" value="長い所有者の名前をテスト"/>
<text name="covenant_label" value="約款:"/>
</panel>
</accordion_tab>
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 fdf33b5402..ccc5c3908b 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
@@ -3,35 +3,16 @@
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
- <panel.string name="middle_mouse">
- マウスの中央
- </panel.string>
- <slider label="視界角" name="camera_fov"/>
- <slider label="距離" name="camera_offset_scale"/>
- <text name="heading2">
- 自動ポジション:
- </text>
- <check_box label="制作・編集" name="edit_camera_movement" tool_tip="編集モードのオン・オフの切り替えに、自動カメラポジションを使います"/>
- <check_box label="容姿" name="appearance_camera_movement" tool_tip="編集モードに入ったときに、自動カメラポジションを使います"/>
- <check_box initial_value="true" label="サイドバー" name="appearance_sidebar_positioning" tool_tip="サイドバーの切り替え時に自動カメラポジションを使います"/>
- <check_box label="一人称視点で表示する" name="first_person_avatar_visible"/>
- <check_box label="常にキー操作で動くようにする" name="arrow_keys_move_avatar_check"/>
- <check_box label="上矢印キー2度押し+長押しで走る" name="tap_tap_hold_to_run"/>
- <check_box label="話すときにアバターの口を動かす" name="enable_lip_sync"/>
- <check_box label="吹き出しチャット" name="bubble_text_chat"/>
- <slider label="透明度" name="bubble_chat_opacity"/>
- <color_swatch name="background" tool_tip="吹き出しチャットの色を選択します"/>
<text name="UI Size:">
- UI サイズ
+ UI サイズ:
</text>
<check_box label="スクリプトのエラーを表示:" name="show_script_errors"/>
<radio_group name="show_location">
<radio_item label="近くのチャット" name="0"/>
<radio_item label="別々のウィンドウ" name="1"/>
</radio_group>
- <check_box label="ボイスのオン・オフ切り替えに使用するトリガーキー:" name="push_to_talk_toggle_check" tool_tip="トグルモードの時にトリガーキーを 1 度押して放すと、マイクのオン・オフ設定を切り替えます。 トグルモードではないときは、トリガーキーを押した状態の時のみあなたの声が相手に聞こえます。"/>
- <line_editor label="プッシュ・トゥ・スピークのトリガー" name="modifier_combo"/>
- <button label="キー設定" name="set_voice_hotkey_button"/>
- <button label="マウスの中央ボタン" name="set_voice_middlemouse_button" tool_tip="マウスの中央ボタンにリセットします"/>
- <button label="その他のディバイス" name="joystick_setup_button"/>
+ <check_box label="複数のビューワを許可" name="allow_multiple_viewer_check"/>
+ <check_box label="ログイン時にグリッド選択を表示" name="show_grid_selection_check"/>
+ <check_box label="アドバンスメニューを表示" name="show_advanced_menu_check"/>
+ <check_box label="デベロッパーメニューを表示" name="show_develop_menu_check"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
index ce2a0f35e4..5038140ce5 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
@@ -8,44 +8,10 @@
<radio_item label="中" name="radio2" value="1"/>
<radio_item label="大" name="radio3" value="2"/>
</radio_group>
- <text name="font_colors">
- 文字の色:
- </text>
- <color_swatch label="自分" name="user"/>
- <text name="text_box1">
- 自分
- </text>
- <color_swatch label="その他" name="agent"/>
- <text name="text_box2">
- 他人
- </text>
- <color_swatch label="IM" name="im"/>
- <text name="text_box3">
- IM
- </text>
- <color_swatch label="システム" name="system"/>
- <text name="text_box4">
- システム
- </text>
- <color_swatch label="エラー" name="script_error"/>
- <text name="text_box5">
- エラー
- </text>
- <color_swatch label="オブジェクト" name="objects"/>
- <text name="text_box6">
- オブジェクト
- </text>
- <color_swatch label="所有者" name="owner"/>
- <text name="text_box7">
- 所有者
- </text>
- <color_swatch label="URL" name="links"/>
- <text name="text_box9">
- URL
- </text>
<check_box initial_value="true" label="チャット中にタイピング動作のアニメーションを再生" name="play_typing_animation"/>
<check_box label="オフライン時に受け取った IM をメールで受信" name="send_im_to_email"/>
<check_box label="IM とチャット履歴に文字だけ表示する" name="plain_text_chat_history"/>
+ <check_box label="吹き出しチャット" name="bubble_text_chat"/>
<text name="show_ims_in_label">
IM の表示方法:
</text>
@@ -56,8 +22,17 @@
<radio_item label="別々のウィンドウ" name="radio" value="0"/>
<radio_item label="タブ" name="radio2" value="1"/>
</radio_group>
- <check_box name="translate_chat_checkbox"/>
- <text name="translate_chb_label" >チャット中に内容を機械翻訳する(Google翻訳)</text>
+ <text name="disable_toast_label">
+ 受信チャットのポップアップを有効にする
+ </text>
+ <check_box label="グループチャット" name="EnableGroupChatPopups" tool_tip="これを選択すると、グループチャットメッセージを受信した際にポップアップが表示されます"/>
+ <check_box label="IM チャット" name="EnableIMChatPopups" tool_tip="これを選択すると、インスタントメッセージを受信した際にポップアップが表示されます"/>
+ <spinner label="近くのチャットメッセージが表示される長さ:" name="nearby_toasts_lifetime"/>
+ <spinner label="近くのチャットメッセージが消えるまでの長さ:" name="nearby_toasts_fadingtime"/>
+ <check_box label="Use machine translation while chatting (powered by Google)" name="translate_chat_checkbox"/>
+ <text name="translate_chb_label">
+ チャット中に内容を機械翻訳する(Google翻訳)
+ </text>
<text name="translate_language_text">
翻訳する言語:
</text>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_colors.xml b/indra/newview/skins/default/xui/ja/panel_preferences_colors.xml
new file mode 100644
index 0000000000..e1dea89ca0
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_colors.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="色" name="colors_panel">
+ <text name="effects_color_textbox">
+ ビームの色(選択ビーム):
+ </text>
+ <color_swatch name="effect_color_swatch" tool_tip="クリックしてカラーピッカーを開きます"/>
+ <text name="font_colors">
+ チャットの文字の色
+ </text>
+ <text name="text_box1">
+ 自分
+ </text>
+ <text name="text_box2">
+ 他の住人
+ </text>
+ <text name="text_box3">
+ オブジェクト
+ </text>
+ <text name="text_box4">
+ システム
+ </text>
+ <text name="text_box5">
+ エラー
+ </text>
+ <text name="text_box7">
+ 所有者
+ </text>
+ <text name="text_box9">
+ URL
+ </text>
+ <text name="bubble_chat">
+ 名前の表示の背景色(吹き出しチャットにも適用):
+ </text>
+ <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"/>
+</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 751faff1d8..e4091972d6 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
@@ -44,16 +44,22 @@
<radio_item label="オン" name="radio2" value="1"/>
<radio_item label="一時的に表示" name="radio3" value="2"/>
</radio_group>
- <check_box label="自分の名前を表示" name="show_my_name_checkbox1"/>
- <check_box initial_value="true" label="小さいアバター名" name="small_avatar_names_checkbox"/>
- <check_box label="グループタイトルを表示" name="show_all_title_checkbox1"/>
- <text name="effects_color_textbox">
- ビームの色:
+ <check_box label="マイネーム" name="show_my_name_checkbox1"/>
+ <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="ビューワの UI ヒントを有効にする" name="viewer_hints_check"/>
+ <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_group>
<text name="title_afk_text">
一時退席までの時間:
</text>
- <color_swatch label="" name="effect_color_swatch" tool_tip="クリックでカラーピッカーを開きます"/>
<combo_box label="一時退席までの時間:" name="afk">
<combo_box.item label="2 分" name="item0"/>
<combo_box.item label="5 分" name="item1"/>
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 92635182c8..b4430fa39d 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml
@@ -25,6 +25,7 @@
<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="BasicShaders" tool_tip="このオプションを無効にすると、グラフィックカードのドライバの種類によっては、クラッシュするのを防ぎます。"/>
<check_box initial_value="true" label="周囲(大気)シェーダー" name="WindLightUseAtmosShaders"/>
@@ -38,6 +39,10 @@
<combo_box.item label="すべてのアバターとオブジェクト" name="3"/>
<combo_box.item label="すべて" name="4"/>
</combo_box>
+ <slider label="アバターの物理作用:" name="AvatarPhysicsDetail"/>
+ <text name="AvatarPhysicsDetailText">
+ 低
+ </text>
<slider label="描画距離:" name="DrawDistance"/>
<text name="DrawDistanceMeterText2">
m
@@ -76,7 +81,7 @@
</text>
<text name="AvatarRenderingText">
- アバター表示:
+ アバターレンダリング:
</text>
<check_box initial_value="true" label="アバターの描画を簡略化" name="AvatarImpostors"/>
<check_box initial_value="true" label="ハードウェアスキニング" name="AvatarVertexProgram"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_move.xml b/indra/newview/skins/default/xui/ja/panel_preferences_move.xml
new file mode 100644
index 0000000000..806bcfc14a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_move.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="移動" name="move_panel">
+ <slider label="視界角" name="camera_fov"/>
+ <slider label="距離" name="camera_offset_scale"/>
+ <text name="heading2">
+ 自動ポジション:
+ </text>
+ <check_box label="制作・編集" name="edit_camera_movement" tool_tip="編集モードのオン・オフの切り替えに、自動カメラポジションを使います"/>
+ <check_box label="容姿" name="appearance_camera_movement" tool_tip="編集モードに入ったときに、自動カメラポジションを使います"/>
+ <check_box initial_value="true" label="サイドバー" name="appearance_sidebar_positioning" tool_tip="サイドバーに自動カメラポジションを使います"/>
+ <check_box label="一人称視点で表示する" name="first_person_avatar_visible"/>
+ <text name=" Mouse Sensitivity">
+ 一人称視点のマウスの感度:
+ </text>
+ <check_box label="切り替え" name="invert_mouse"/>
+ <check_box label="常にキー操作で動くようにする" name="arrow_keys_move_avatar_check"/>
+ <check_box label="上矢印キー2度押し+長押しで走る" name="tap_tap_hold_to_run"/>
+ <check_box label="ダブルクリックで次の操作:" name="double_click_chkbox"/>
+ <radio_group name="double_click_action">
+ <radio_item label="テレポート" name="radio_teleport"/>
+ <radio_item label="自動追跡" name="radio_autopilot"/>
+ </radio_group>
+ <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 b81889b412..420bbed572 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml
@@ -7,19 +7,24 @@
<text name="cache_size_label_l">
(位置、画像、web、検索履歴)
</text>
+ <check_box label="検索結果に表示" name="online_searchresults"/>
<check_box label="私のオンライン状態を確認できるのは、フレンドとグループだけ" name="online_visibility"/>
<check_box label="フレンドとグループ以外からはコールと IM を受信しない" name="voice_call_friends_only_check"/>
<check_box label="コールが終了したら自動的にマイクのスイッチを切る" name="auto_disengage_mic_check"/>
- <check_box label="Cookie を受け入れる" name="cookies_enabled"/>
+ <check_box label="ログイン時にお気に入りのランドマークを表示(「開始地点」ドロップダウンメニュー経由)" name="favorites_on_login_check"/>
<text name="Logs:">
- ログ:
+ チャットログ:
</text>
<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="show_timestamps_check_im"/>
+ <check_box label="ログファイル名に日付を入れる。" name="logfile_name_datestamp"/>
<text name="log_path_desc">
ログの保存場所:
</text>
<button label="参照" label_selected="参照" name="log_path_button"/>
<button label="ブロックリスト" name="block_list"/>
+ <text name="block_list_label">
+ (あなたがブロックした住人/オブジェクト)
+ </text>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
index 653d9fd3b3..18c41cea38 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
@@ -1,13 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="セットアップ" name="Input panel">
- <button label="その他のディバイス" name="joystick_setup_button"/>
- <text name="Mouselook:">
- 一人称視点:
- </text>
- <text name=" Mouse Sensitivity">
- マウスの感度
- </text>
- <check_box label="切り替え" name="invert_mouse"/>
<text name="Network:">
ネットワーク:
</text>
@@ -40,10 +32,18 @@
<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"/>
+ <check_box initial_value="false" label="メディアブラウザのポップアップを有効にする" name="media_popup_enabled"/>
<check_box initial_value="false" label="Web プロキシを有効にする" name="web_proxy_enabled"/>
<text name="Proxy location">
プロキシ:
</text>
<line_editor name="web_proxy_editor" tool_tip="使用するプロキシのホスト名または IP アドレス"/>
<spinner label="ポート番号:" name="web_proxy_port"/>
+ <text name="Software updates:">
+ ソフトウェアアップデート:
+ </text>
+ <combo_box name="updater_service_combobox">
+ <combo_box.item label="自動的にインストール" name="Install_automatically"/>
+ <combo_box.item label="手動でアップデートをダウンロード&amp;インストール" name="Install_manual"/>
+ </combo_box>
</panel>
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 74696a3b35..c11e636875 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
@@ -1,8 +1,13 @@
<?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" name="mute_when_minimized"/>
- <text name="mute_chb_label">最小化でミュート</text>
+ <check_box initial_value="true" label="Mute when minimized" name="mute_when_minimized"/>
+ <text name="mute_chb_label">
+ 最小化でミュート
+ </text>
<slider label="ボタン" name="UI Volume"/>
<slider label="風" name="Wind Volume"/>
<slider label="効果音" name="SFX Volume"/>
@@ -24,6 +29,11 @@
<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">
<panel.string name="default_text">
diff --git a/indra/newview/skins/default/xui/ja/panel_profile.xml b/indra/newview/skins/default/xui/ja/panel_profile.xml
index c2ffd74ec0..1acad9f81a 100644
--- a/indra/newview/skins/default/xui/ja/panel_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_profile.xml
@@ -16,6 +16,12 @@
<string name="RegisterDateFormat">
[REG_DATE] ([AGE])
</string>
+ <string name="name_text_args">
+ [NAME]
+ </string>
+ <string name="display_name_text_args">
+ [DISPLAY_NAME]
+ </string>
<layout_stack name="layout">
<layout_panel name="profile_stack">
<scroll_container name="profile_scroll">
@@ -34,7 +40,7 @@
</text_editor>
<text name="title_partner_text" value="パートナー:"/>
<panel name="partner_data_panel">
- <name_box initial_value="(取得中)" name="partner_text"/>
+ <text initial_value="(取得中)" name="partner_text"/>
</panel>
<text name="title_groups_text" value="グループ:"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_profile_view.xml b/indra/newview/skins/default/xui/ja/panel_profile_view.xml
index 82807bc8fc..5cb6575773 100644
--- a/indra/newview/skins/default/xui/ja/panel_profile_view.xml
+++ b/indra/newview/skins/default/xui/ja/panel_profile_view.xml
@@ -6,7 +6,14 @@
<string name="status_offline">
オフライン
</string>
+ <text name="display_name_label" value="表示名:"/>
+ <text name="solo_username_label" value="ユーザー名:"/>
<text name="status" value="オンライン"/>
+ <text name="user_name_small" value="Jack oh look at me this is a super duper long name"/>
+ <text name="user_name" value="Jack Linden"/>
+ <button name="copy_to_clipboard" tool_tip="クリップボードにコピー"/>
+ <text name="user_label" value="ユーザー名:"/>
+ <text name="user_slid" value="jack.linden"/>
<tab_container name="tabs">
<panel label="プロフィール" name="panel_profile"/>
<panel label="ピック" name="panel_picks"/>
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 a7305fa763..9fdd16d567 100644
--- a/indra/newview/skins/default/xui/ja/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/ja/panel_script_ed.xml
@@ -15,11 +15,9 @@
<panel.string name="Title">
スクリプト: [NAME]
</panel.string>
- <text_editor name="Script Editor">
- ローディング...
- </text_editor>
- <button label="保存" label_selected="保存" name="Save_btn"/>
- <combo_box label="挿入..." name="Insert..."/>
+ <panel.string name="external_editor_not_set">
+ 環境変数 LL_SCRIPT_EDITOR または ExternalEditor を設定してエディターを選択します。
+ </panel.string>
<menu_bar name="script_menu">
<menu label="ファイル" name="File">
<menu_item_call label="保存" name="Save"/>
@@ -40,4 +38,10 @@
<menu_item_call label="キーワードヘルプ..." name="Keyword Help..."/>
</menu>
</menu_bar>
+ <text_editor name="Script Editor">
+ ローディング...
+ </text_editor>
+ <combo_box label="挿入..." name="Insert..."/>
+ <button label="保存" label_selected="保存" name="Save_btn"/>
+ <button label="編集..." name="Edit_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_scrolling_param_base.xml b/indra/newview/skins/default/xui/ja/panel_scrolling_param_base.xml
new file mode 100644
index 0000000000..fa659040ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_scrolling_param_base.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="LLScrollingPanelParamBase">
+ <slider label="[DESC]" name="param slider"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_status_bar.xml b/indra/newview/skins/default/xui/ja/panel_status_bar.xml
index c3a5127981..163064484b 100644
--- a/indra/newview/skins/default/xui/ja/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_status_bar.xml
@@ -22,7 +22,7 @@
L$ [AMT]
</panel.string>
<panel name="balance_bg">
- <text name="balance" tool_tip="残高" value="L$20"/>
+ <text name="balance" tool_tip="クリックして L$ 残高を更新" value="L$20"/>
<button label="L$ の購入" name="buyL" tool_tip="クリックして L$ を購入します"/>
</panel>
<text name="TimeText" tool_tip="現在時刻(太平洋)">
diff --git a/indra/newview/skins/default/xui/ja/role_actions.xml b/indra/newview/skins/default/xui/ja/role_actions.xml
index 0a63cedf10..c53ad838f7 100644
--- a/indra/newview/skins/default/xui/ja/role_actions.xml
+++ b/indra/newview/skins/default/xui/ja/role_actions.xml
@@ -39,6 +39,7 @@
<action description="常に「オブジェクト作成」を許可" longdescription="この能力を持つ役割のメンバーは、グループ所有の区画上にオブジェクトを作成することができます。その区画が「土地情報」>「オプション」タブでオフになっていても、オブジェクトの作成が可能です。" name="land allow create" value="25"/>
<action description="常に「ランドマークを作成」を許可" longdescription="この能力を持つ役割のメンバーは、グループ所有の区画上にランドマークを作成することができます。その区画が「土地情報」>「オプション」タブでオフになっていても、ランドマークの作成が可能です。" name="land allow landmark" value="26"/>
<action description="グループの土地への「ホーム設定」を許可" longdescription="この「役割」を持つメンバーは、このグループに譲渡された区画上で「世界」メニュー &gt; ランドマーク &gt; 現在地をホームに設定 を使用して、ホームの設定を行うことができます。" 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"/>
@@ -57,20 +58,16 @@
<action description="グループ所有オブジェクトの操作(移動、コピー、修正)" longdescription="「制作ツール」 &gt; 「一般」タブで、グループ所有のオブジェクトを操作(移動、コピー、修正)します。" name="object manipulate" value="38"/>
<action description="グループ所有オブジェクトを販売可能に設定" longdescription="「制作ツール」 &gt; 「一般」タブで、グループ所有のオブジェクトを販売対象に設定します。" name="object set sale" value="39"/>
</action_set>
- <action_set description="これらの能力には、メンバーに、グループの負債の支払いと利子受け取りを要求する権限、グループ口座履歴へのアクセスを制限する権限が含まれます。" name="Accounting"><action description="グループ負債の返済とグループ配当の受領" longdescription="この能力を持つ役割のメンバーについては、グループ負債の支払いとグループ配当の受け取りが自動的に行われます。
- つまり、これらのメンバーは、毎日配当されるグループ所有地の売り上げ金の一部を受け取ると共に、区画の広告費などを負担することになります。" name="accounting accountable" value="40"/>
+ <action_set description="これらの能力には、メンバーに、グループの負債の支払いと利子受け取りを要求する権限、グループ口座履歴へのアクセスを制限する権限が含まれます。" name="Accounting">
+ <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_set>
- <action_set description="これらの能力には、提案の作成と投票、投票履歴の表示をメンバーに許可する権限が含まれます。" name="Proposals">
- <action description="提案を作成" longdescription="この能力を持つ役割のメンバーは、投票の対象となる問題提起を「グループ情報」>「問題提起」タブ上で作成することができます。" name="proposal start" value="44"/>
- <action description="問題提起に投票する" longdescription="この能力を持つ役割のメンバーは、グループ情報>提案タブで提案に投票することができます。" name="proposal vote" value="45"/>
- </action_set>
<action_set description=" これらの能力には、グループチャットセッションやグループボイスチャットへのアクセスの許可や制限の権限が含まれます。 " name="Chat">
- <action description="グループチャットに参加する" longdescription=" この能力を持つ役割のメンバーは、グループチャットセッションにテキストおよびボイスで参加できます。 " name="join group chat"/>
- <action description="グループボイスチャットに参加する" longdescription=" この能力を持つ役割のメンバーは、グループボイスチャットセッションに参加できます。 注: ボイスチャットセッションにアクセスするには、グループチャットに参加する能力が必要です。 " name="join voice chat"/>
- <action description="グループチャットを管理する" longdescription=" この能力を持つ役割のメンバーは、グループボイスチャットセッションおよびグループテキストチャットセッションへのアクセスや参加をコントロールすることができます。 " name="moderate group 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>
</role_actions>
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index 75cb126874..cb248b8b4f 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -206,6 +206,9 @@
<string name="TooltipAgentUrl">
クリックしてこの住人のプロフィールを見ます
</string>
+ <string name="TooltipAgentInspect">
+ この住人の詳細を参照
+ </string>
<string name="TooltipAgentMute">
クリックしてこの住人に対して無視設定をします
</string>
@@ -762,6 +765,12 @@
<string name="Estate / Full Region">
不動産 / フルリージョン
</string>
+ <string name="Estate / Homestead">
+ エステート/ホームステッド
+ </string>
+ <string name="Mainland / Homestead">
+ メインランド/ホームステッド
+ </string>
<string name="Mainland / Full Region">
メインランド / フルリージョン
</string>
@@ -867,6 +876,9 @@
<string name="tattoo">
タトゥ
</string>
+ <string name="physics">
+ 物理作用
+ </string>
<string name="invalid">
無効
</string>
@@ -906,6 +918,9 @@
<string name="tattoo_not_worn">
タトゥー未着用
</string>
+ <string name="physics_not_worn">
+ 物理作用なし
+ </string>
<string name="invalid_not_worn">
無効
</string>
@@ -954,6 +969,9 @@
<string name="create_new_tattoo">
新しいタトゥを作成
</string>
+ <string name="create_new_physics">
+ 新しい物理作用を作成
+ </string>
<string name="create_new_invalid">
無効
</string>
@@ -1058,7 +1076,7 @@
<string name="PermNo">
いいえ
</string>
- <string name="Chat" value=" チャット:"/>
+ <string name="Chat Message" value="チャット:"/>
<string name="Sound" value=" サウンド:"/>
<string name="Wait" value=" --- 待機::"/>
<string name="AnimFlagStop" value=" アニメーションを停止:"/>
@@ -1764,11 +1782,8 @@
<string name="InvOfferGaveYou">
が渡しました
</string>
- <string name="InvOfferYouDecline">
- 拒否:
- </string>
- <string name="InvOfferFrom">
- 送信元:
+ <string name="InvOfferDecline">
+ &lt;nolink&gt;[NAME]&lt;/nolink&gt; からの [DESC] を拒否しました。
</string>
<string name="GroupMoneyTotal">
合計
@@ -1858,12 +1873,6 @@
<string name="accel-win-shift">
Shift+
</string>
- <string name="Esc">
- Esc
- </string>
- <string name="Home">
- ホーム
- </string>
<string name="FileSaved">
ファイルが保存されました
</string>
@@ -1892,7 +1901,7 @@
</string>
<string name="Direction_Back">
- 後ろ
+ 戻る
</string>
<string name="Direction_North">
@@ -1981,6 +1990,9 @@
<string name="Other">
その他
</string>
+ <string name="Rental">
+ レンタル
+ </string>
<string name="Any">
全員
</string>
@@ -2244,6 +2256,114 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
<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>
@@ -2253,6 +2373,9 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
<string name="Butt Size">
お尻の大きさ
</string>
+ <string name="Butt Gravity">
+ お尻の垂れ具合
+ </string>
<string name="bustle skirt">
後ろの膨らみ
</string>
@@ -3574,7 +3697,7 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
このセッションにいるユーザーはあなただけです。
</string>
<string name="offline_message">
- [NAME] はオフラインです。
+ [NAME] はオフライン中です。
</string>
<string name="invite_message">
このボイスチャットに応答・接続する場合は、[BUTTON NAME] をクリックしてください。
@@ -3643,7 +3766,10 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
http://secondlife.com/landing/voicemorphing
</string>
<string name="paid_you_ldollars">
- [NAME] は L$[AMOUNT] 支払いました
+ [NAME] は [REASON] のために L$[AMOUNT] を支払いました。
+ </string>
+ <string name="paid_you_ldollars_no_reason">
+ [NAME] は L$[AMOUNT] を支払いました。
</string>
<string name="you_paid_ldollars">
[NAME] に L$ [AMOUNT] を支払いました:[REASON]
@@ -3657,6 +3783,9 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
<string name="you_paid_ldollars_no_name">
L$ [AMOUNT] を支払いました:[REASON]
</string>
+ <string name="for item">
+ [ITEM] 向け
+ </string>
<string name="for a parcel of land">
土地区画のため
</string>
@@ -3675,6 +3804,9 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
<string name="to upload">
アップロードするため
</string>
+ <string name="to publish a classified ad">
+ クラシファイド広告を掲載する
+ </string>
<string name="giving">
L$[AMOUNT] を渡します
</string>
@@ -3752,6 +3884,9 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
<string name="New Tattoo">
新しいタトゥ
</string>
+ <string name="New Physics">
+ 新規の物理作用
+ </string>
<string name="Invalid Wearable">
無効な着用物
</string>
@@ -3951,7 +4086,7 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
<string name="Notices">
通知
</string>
- <string name="Chat">
+ <string name="Chat" value=" チャット:">
チャット
</string>
<string name="DeleteItems">
@@ -3963,4 +4098,348 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
<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="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="ParticleHiding">
+ パーティクルを非表示
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/nl/language_settings.xml b/indra/newview/skins/default/xui/nl/language_settings.xml
index 53501d5dcb..40f4d9178a 100644
--- a/indra/newview/skins/default/xui/nl/language_settings.xml
+++ b/indra/newview/skins/default/xui/nl/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">dutch</string>
+ <string name="MacLocale">nl_NL.UTF-8</string>
<string name="DarwinLocale">nl_NL.UTF-8</string>
<string name="LinuxLocale">nl_NL.UTF-8</string>
diff --git a/indra/newview/skins/default/xui/pl/language_settings.xml b/indra/newview/skins/default/xui/pl/language_settings.xml
index 681b38e9cf..93051d1317 100644
--- a/indra/newview/skins/default/xui/pl/language_settings.xml
+++ b/indra/newview/skins/default/xui/pl/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">polish</string>
+ <string name="MacLocale">pl_PL.UTF-8</string>
<string name="DarwinLocale">pl_PL.UTF-8</string>
<string name="LinuxLocale">pl_PL.UTF-8</string>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml b/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml
index b134dfeefa..089694608b 100644
--- a/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml
@@ -1,74 +1,74 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="gesture_preview">
- <floater.string name="step_anim">
- Executar animação:
- </floater.string>
- <floater.string name="step_sound">
- Executar som:
- </floater.string>
- <floater.string name="step_chat">
- Executar bate-papo:
- </floater.string>
- <floater.string name="step_wait">
- Pausa
- </floater.string>
- <floater.string name="stop_txt">
- Parar
- </floater.string>
- <floater.string name="preview_txt">
- Prévia
- </floater.string>
- <floater.string name="none_text">
- -- Nenhum --
- </floater.string>
- <floater.string name="Title">
- Gesto: [NAME]
- </floater.string>
- <text name="desc_label">
- Descrição:
- </text>
- <text name="trigger_label">
- Gatilho:
- </text>
- <text name="replace_text" tool_tip="Substituir a(s) palavra(s) de gatilho por estas palavras. Por exemplo, o gatilho &apos;oi&apos; substituído por &apos;olá&apos;, mudará a conversa de &apos;Eu digo oi&apos; para &apos;Eu digo olá&apos; e também executando o gesto!">
- Trocar por:
- </text>
- <line_editor name="replace_editor" tool_tip="Substituir a(s) palavra(s) gatilho por estas palavras. Por exemplo, o gatilho &apos;oi&apos; substituído por &apos;olá&apos;, mudará a conversa de &apos;Eu digo oi&apos; para &apos;Eu digo olá&apos; e também executando o gesto!"/>
- <text name="key_label">
- Atalho:
- </text>
- <combo_box label="Nenhum" name="modifier_combo" width="68"/>
- <combo_box label="Nenhum" name="key_combo" width="48"/>
- <text name="library_label">
- Biblioteca:
- </text>
- <scroll_list name="library_list">
- <scroll_list.rows name="action_animation" value="Animação"/>
- <scroll_list.rows name="action_sound" value="Som"/>
- <scroll_list.rows name="action_chat" value="Bate-papo"/>
- <scroll_list.rows name="action_wait" value="Espere"/>
- </scroll_list>
- <button label="Incluir" name="add_btn"/>
- <text name="steps_label">
- Passos:
- </text>
- <button label="P/ cima" name="up_btn" />
- <button label="P/ baixo" name="down_btn"/>
- <button label="Remover" name="delete_btn"/>
- <text name="options_text">
- (opções)
- </text>
- <radio_group name="animation_trigger_type">
- <radio_item label="Iniciar" name="start"/>
- <radio_item label="Parar" name="stop"/>
- </radio_group>
- <check_box label="até que as animações estejam concluídas" name="wait_anim_check"/>
- <check_box label="segundos:" name="wait_time_check"/>
- <line_editor name="wait_time_editor"/>
- <text name="help_label">
- Se não incluir uma pausa, todas as etapas ocorrem ao mesmo tempo.
- </text>
- <check_box label="Ativar" name="active_check" tool_tip="Gestos podem ser ativados escrevendo suas frases de gatilho no chat ou teclando o atalho. Gestos normalmente ficam inativos quando existe um conflito nas teclas de atalho."/>
- <button label="Prévia" name="preview_btn"/>
- <button label="Salvar" name="save_btn"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="gesture_preview">
+ <floater.string name="step_anim">
+ Executar animação:
+ </floater.string>
+ <floater.string name="step_sound">
+ Executar som:
+ </floater.string>
+ <floater.string name="step_chat">
+ Executar bate-papo:
+ </floater.string>
+ <floater.string name="step_wait">
+ Pausa
+ </floater.string>
+ <floater.string name="stop_txt">
+ Parar
+ </floater.string>
+ <floater.string name="preview_txt">
+ Prévia
+ </floater.string>
+ <floater.string name="none_text">
+ -- Nenhum --
+ </floater.string>
+ <floater.string name="Title">
+ Gesto: [NAME]
+ </floater.string>
+ <text name="desc_label">
+ Descrição:
+ </text>
+ <text name="trigger_label">
+ Gatilho:
+ </text>
+ <text name="replace_text" tool_tip="Substituir a(s) palavra(s) de gatilho por estas palavras. Por exemplo, o gatilho &apos;oi&apos; substituído por &apos;olá&apos;, mudará a conversa de &apos;Eu digo oi&apos; para &apos;Eu digo olá&apos; e também executando o gesto!">
+ Trocar por:
+ </text>
+ <line_editor name="replace_editor" tool_tip="Substituir a(s) palavra(s) gatilho por estas palavras. Por exemplo, o gatilho &apos;oi&apos; substituído por &apos;olá&apos;, mudará a conversa de &apos;Eu digo oi&apos; para &apos;Eu digo olá&apos; e também executando o gesto!"/>
+ <text name="key_label">
+ Atalho:
+ </text>
+ <combo_box label="Nenhum" name="modifier_combo" width="68"/>
+ <combo_box label="Nenhum" name="key_combo" width="48"/>
+ <text name="library_label">
+ Biblioteca:
+ </text>
+ <scroll_list name="library_list">
+ <scroll_list.rows name="action_animation" value="Animação"/>
+ <scroll_list.rows name="action_sound" value="Som"/>
+ <scroll_list.rows name="action_chat" value="Bate-papo"/>
+ <scroll_list.rows name="action_wait" value="Espere"/>
+ </scroll_list>
+ <button label="Incluir" name="add_btn"/>
+ <text name="steps_label">
+ Passos:
+ </text>
+ <button label="P/ cima" name="up_btn" />
+ <button label="P/ baixo" name="down_btn"/>
+ <button label="Remover" name="delete_btn"/>
+ <text name="options_text">
+ (opções)
+ </text>
+ <radio_group name="animation_trigger_type">
+ <radio_item label="Iniciar" name="start"/>
+ <radio_item label="Parar" name="stop"/>
+ </radio_group>
+ <check_box label="até que as animações estejam concluídas" name="wait_anim_check"/>
+ <check_box label="segundos:" name="wait_time_check"/>
+ <line_editor name="wait_time_editor"/>
+ <text name="help_label">
+ Se não incluir uma pausa, todas as etapas ocorrem ao mesmo tempo.
+ </text>
+ <check_box label="Ativar" name="active_check" tool_tip="Gestos podem ser ativados escrevendo suas frases de gatilho no chat ou teclando o atalho. Gestos normalmente ficam inativos quando existe um conflito nas teclas de atalho."/>
+ <button label="Prévia" name="preview_btn"/>
+ <button label="Salvar" name="save_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/language_settings.xml b/indra/newview/skins/default/xui/pt/language_settings.xml
index e1de6ffea7..8799475ace 100644
--- a/indra/newview/skins/default/xui/pt/language_settings.xml
+++ b/indra/newview/skins/default/xui/pt/language_settings.xml
@@ -4,6 +4,7 @@
<!-- Locale Information -->
<string name="MicrosoftLocale">portuguese</string>
+ <string name="MacLocale">pt_PT.UTF-8</string>
<string name="DarwinLocale">pt_PT.UTF-8</string>
<string name="LinuxLocale">pt_PT.UTF-8</string>
diff --git a/indra/newview/skins/minimal/xui/it/floater_camera.xml b/indra/newview/skins/minimal/xui/it/floater_camera.xml
new file mode 100644
index 0000000000..3fdf4f48a2
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/floater_camera.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="camera_floater" title="">
+ <floater.string name="rotate_tooltip">
+ Ruota la telecamera Intorno all&apos;Inquadratura
+ </floater.string>
+ <floater.string name="zoom_tooltip">
+ Avvicina la telecamera nell&apos;inquadratura
+ </floater.string>
+ <floater.string name="move_tooltip">
+ Muovi la telecamera su e giù e a sinistra e destra
+ </floater.string>
+ <floater.string name="camera_modes_title">
+ Modalità della fotocamera
+ </floater.string>
+ <floater.string name="pan_mode_title">
+ Ruota visuale - Ingrandisci - Panoramica
+ </floater.string>
+ <floater.string name="presets_mode_title">
+ Visuali predefinite
+ </floater.string>
+ <floater.string name="free_mode_title">
+ Vedi oggetto
+ </floater.string>
+ <panel name="controls">
+ <panel name="preset_views_list">
+ <panel_camera_item name="front_view">
+ <panel_camera_item.text name="front_view_text">
+ Visuale frontale
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="group_view">
+ <panel_camera_item.text name="side_view_text">
+ Visuale laterale
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="rear_view">
+ <panel_camera_item.text name="rear_view_text">
+ Visuale posteriore
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel name="camera_modes_list">
+ <panel_camera_item name="object_view">
+ <panel_camera_item.text name="object_view_text">
+ Visuale oggetto
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="mouselook_view">
+ <panel_camera_item.text name="mouselook_view_text">
+ Visuale soggettiva
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel name="zoom" tool_tip="Avvicina la telecamera nell&apos;inquadratura">
+ <joystick_rotate name="cam_rotate_stick" tool_tip="Ruota la visuale intorno al punto focale"/>
+ <slider_bar name="zoom_slider" tool_tip="Zoom verso il centro focale"/>
+ <joystick_track name="cam_track_stick" tool_tip="Sposta la visuale in su e in giù, a sinistra e a destra"/>
+ </panel>
+ </panel>
+ <panel name="buttons">
+ <button label="" name="presets_btn" tool_tip="Visuali predefinite"/>
+ <button label="" name="pan_btn" tool_tip="Ruota visuale - Ingrandisci - Panoramica"/>
+ <button label="" name="avatarview_btn" tool_tip="Modalità della fotocamera"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/it/floater_help_browser.xml b/indra/newview/skins/minimal/xui/it/floater_help_browser.xml
new file mode 100644
index 0000000000..18264cdd17
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/floater_help_browser.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_help_browser" title="ISTRUZIONI">
+ <floater.string name="loading_text">
+ Caricamento in corso...
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="external_controls"/>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/it/floater_media_browser.xml b/indra/newview/skins/minimal/xui/it/floater_media_browser.xml
new file mode 100644
index 0000000000..b1e87290d2
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/floater_media_browser.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="BROWSER MULTIMEDIA">
+ <floater.string name="home_page_url">
+ http://www.secondlife.com
+ </floater.string>
+ <floater.string name="support_page_url">
+ http://support.secondlife.com
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button label="Indietro" name="back" width="75"/>
+ <button label="Avanti" left_delta="75" name="forward" width="70"/>
+ <button label="Ricarica" left_delta="75" name="reload"/>
+ <combo_box left_delta="75" name="address" width="510"/>
+ <button label="Vai" left_delta="515" name="go"/>
+ </layout_panel>
+ <layout_panel name="time_controls">
+ <button label="indietro rapido" name="rewind"/>
+ <button label="stop" name="stop"/>
+ <button label="avanti" name="seek"/>
+ </layout_panel>
+ <layout_panel name="parcel_owner_controls">
+ <button label="Invia la pagina attuale al lotto" name="assign"/>
+ </layout_panel>
+ <layout_panel name="external_controls">
+ <button label="Apri nel mio browser Web" name="open_browser"/>
+ <check_box label="Apri sempre nel mio browser Web" name="open_always"/>
+ <button label="Chiudi" name="close"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/it/floater_nearby_chat.xml b/indra/newview/skins/minimal/xui/it/floater_nearby_chat.xml
new file mode 100644
index 0000000000..4c41df8a62
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/floater_nearby_chat.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="nearby_chat" title="CHAT NEI DINTORNI">
+ <check_box label="Traduci chat (tecnologia Google)" name="translate_chat_checkbox"/>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/it/floater_web_content.xml b/indra/newview/skins/minimal/xui/it/floater_web_content.xml
new file mode 100644
index 0000000000..5603e85417
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/floater_web_content.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_web_content" title="">
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button name="back" tool_tip="Naviga indietro"/>
+ <button name="forward" tool_tip="Naviga avanti"/>
+ <button name="stop" tool_tip="Interrompi navigazione"/>
+ <button name="reload" tool_tip="Ricarica pagina"/>
+ <combo_box name="address" tool_tip="Inserisci URL qui"/>
+ <icon name="media_secure_lock_flag" tool_tip="Navigazione sicura"/>
+ <button name="popexternal" tool_tip="Apri URL corrente nel browser del computer"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/it/inspect_avatar.xml b/indra/newview/skins/minimal/xui/it/inspect_avatar.xml
new file mode 100644
index 0000000000..6f52aaef74
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/inspect_avatar.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_avatar">
+ <string name="Subtitle">
+ [AGE]
+ </string>
+ <string name="Details">
+ [SL_PROFILE]
+ </string>
+ <text name="user_name_small" value="Grumpity ProductEngine con un nome lungo"/>
+ <text name="user_slid" value="james.linden"/>
+ <text name="user_details">
+ Questa è la mia descrizione in second life e penso che sia perfetta. Ma per qualche motivo la mia descrizione è davvero molto lunga, perché mi piace parlare a lungo
+ </text>
+ <slider name="volume_slider" tool_tip="Volume voce" value="0.5"/>
+ <button label="Aggiungi amico" name="add_friend_btn"/>
+ <button label="IM" name="im_btn"/>
+ <button label="Profilo" name="view_profile_btn"/>
+ <panel name="moderator_panel">
+ <button label="Disattiva voce" name="disable_voice"/>
+ <button label="Attiva voce" name="enable_voice"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/it/inspect_object.xml b/indra/newview/skins/minimal/xui/it/inspect_object.xml
new file mode 100644
index 0000000000..d8ab10cfda
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/inspect_object.xml
@@ -0,0 +1,41 @@
+<?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">
+ Di [CREATOR]
+ </string>
+ <string name="CreatorAndOwner">
+ Di [CREATOR]
+Proprietario [OWNER]
+ </string>
+ <string name="Price">
+ L$ [AMOUNT]
+ </string>
+ <string name="PriceFree">
+ Gratis!
+ </string>
+ <string name="Touch">
+ Tocca
+ </string>
+ <string name="Sit">
+ Siediti
+ </string>
+ <text name="object_name" value="Nome oggetto di prova che si trova su due righe ed è molto lungo"/>
+ <text name="price_text">
+ L$ 30.000
+ </text>
+ <text name="object_description">
+ Questa è una descrizione di un oggetto che è molto lunga ed è di almeno 80 caratteri, ma potrebbe essere di 120 caratteri a questo punto. Chi lo sa veramente?
+ </text>
+ <button label="Acquista" name="buy_btn"/>
+ <button label="Paga" name="pay_btn"/>
+ <button label="Prendi copia" name="take_free_copy_btn"/>
+ <button label="Tocca" name="touch_btn"/>
+ <button label="Siediti" name="sit_btn"/>
+ <button label="Apri" name="open_btn"/>
+ <icon name="secure_browsing" tool_tip="Browsing sicuro"/>
+ <button label="Altro" name="more_info_btn"/>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/it/menu_add_wearable_gear.xml b/indra/newview/skins/minimal/xui/it/menu_add_wearable_gear.xml
new file mode 100644
index 0000000000..46abd7deed
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_add_wearable_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Add Wearable Gear Menu">
+ <menu_item_check label="Mostra prima i più recenti" name="sort_by_most_recent"/>
+ <menu_item_check label="Ordina in base al nome" name="sort_by_name"/>
+ <menu_item_check label="Ordina in base al tipo" name="sort_by_type"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/it/menu_attachment_other.xml
new file mode 100644
index 0000000000..d4d6fd68d0
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_attachment_other.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_avatar_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Vedi profilo" name="Profile..."/>
+ <menu_item_call label="Aggiungi amico" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="Chiama" name="Call"/>
+ <menu_item_call label="Invita al gruppo" name="Invite..."/>
+ <menu_item_call label="Blocca" name="Avatar Mute"/>
+ <menu_item_call label="Segnala" name="abuse"/>
+ <menu_item_call label="Congela" name="Freeze..."/>
+ <menu_item_call label="Espelli" name="Eject..."/>
+ <menu_item_call label="Debug delle texture" name="Debug..."/>
+ <menu_item_call label="Zoom avanti" name="Zoom In"/>
+ <menu_item_call label="Paga" name="Pay..."/>
+ <menu_item_call label="Profilo dell&apos;oggetto" name="Object Inspect"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_attachment_self.xml b/indra/newview/skins/minimal/xui/it/menu_attachment_self.xml
new file mode 100644
index 0000000000..0b841d591f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_attachment_self.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Attachment Pie">
+ <menu_item_call label="Tocca" name="Attachment Object Touch"/>
+ <menu_item_call label="Modifica" name="Edit..."/>
+ <menu_item_call label="Stacca" name="Detach"/>
+ <menu_item_call label="Siedi" name="Sit Down Here"/>
+ <menu_item_call label="Alzati" name="Stand Up"/>
+ <menu_item_call label="Il mio aspetto" name="Change 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..."/>
+ <menu_item_call label="Lascia" name="Drop"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/it/menu_avatar_icon.xml
new file mode 100644
index 0000000000..b93b695300
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_avatar_icon.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Avatar Icon Menu">
+ <menu_item_call label="Vedi profilo" name="Show Profile"/>
+ <menu_item_call label="Manda IM..." name="Send IM"/>
+ <menu_item_call label="Aggiungi come amico..." name="Add Friend"/>
+ <menu_item_call label="Togli amicizia..." name="Remove Friend"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/it/menu_avatar_other.xml
new file mode 100644
index 0000000000..c2edc32a49
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_avatar_other.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Vedi profilo" name="Profile..."/>
+ <menu_item_call label="Aggiungi amico" name="Add Friend"/>
+ <menu_item_call label="IM" name="Send IM..."/>
+ <menu_item_call label="Chiama" name="Call"/>
+ <menu_item_call label="Invita al gruppo" name="Invite..."/>
+ <menu_item_call label="Blocca" name="Avatar Mute"/>
+ <menu_item_call label="Segnala" name="abuse"/>
+ <menu_item_call label="Congela" name="Freeze..."/>
+ <menu_item_call label="Espelli" name="Eject..."/>
+ <menu_item_call label="Debug delle texture" name="Debug..."/>
+ <menu_item_call label="Zoom avanti" name="Zoom In"/>
+ <menu_item_call label="Paga" name="Pay..."/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_avatar_self.xml b/indra/newview/skins/minimal/xui/it/menu_avatar_self.xml
new file mode 100644
index 0000000000..a4dafd7b5f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_avatar_self.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Self Pie">
+ <menu_item_call label="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="Fisica" name="Self Physics"/>
+ <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="Il mio aspetto" 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..."/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/it/menu_bottomtray.xml
new file mode 100644
index 0000000000..ddd6909136
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_bottomtray.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Pulsante Parla" name="EnableVoiceChat"/>
+ <menu_item_check label="Tasto Gesture" name="ShowGestureButton"/>
+ <menu_item_check label="Tasto Movimento" name="ShowMoveButton"/>
+ <menu_item_check label="Tasto Visuale" name="ShowCameraButton"/>
+ <menu_item_check label="Tasto Foto" name="ShowSnapshotButton"/>
+ <menu_item_check label="Pulsante Costruisci" name="ShowBuildButton"/>
+ <menu_item_check label="Pulsante Cerca" name="ShowSearchButton"/>
+ <menu_item_check label="Pulsante Mappa" name="ShowWorldMapButton"/>
+ <menu_item_check label="Pulsante Mini mappa" name="ShowMiniMapButton"/>
+ <menu_item_call label="Taglia" name="NearbyChatBar_Cut"/>
+ <menu_item_call label="Copia" name="NearbyChatBar_Copy"/>
+ <menu_item_call label="Incolla" name="NearbyChatBar_Paste"/>
+ <menu_item_call label="Elimina" name="NearbyChatBar_Delete"/>
+ <menu_item_call label="Seleziona tutto" name="NearbyChatBar_Select_All"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_cof_attachment.xml b/indra/newview/skins/minimal/xui/it/menu_cof_attachment.xml
new file mode 100644
index 0000000000..699490c8f1
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_cof_attachment.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Attachment">
+ <menu_item_call label="Stacca" name="detach"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_cof_body_part.xml b/indra/newview/skins/minimal/xui/it/menu_cof_body_part.xml
new file mode 100644
index 0000000000..1e3658ef45
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_cof_body_part.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Body">
+ <menu_item_call label="Sostituisci" name="replace"/>
+ <menu_item_call label="Modifica" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_cof_clothing.xml b/indra/newview/skins/minimal/xui/it/menu_cof_clothing.xml
new file mode 100644
index 0000000000..1e16ce8ed1
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_cof_clothing.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Clothing">
+ <menu_item_call label="Togli" name="take_off"/>
+ <menu_item_call label="Modifica" name="edit"/>
+ <menu_item_call label="Sostituisci" name="replace"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_cof_gear.xml b/indra/newview/skins/minimal/xui/it/menu_cof_gear.xml
new file mode 100644
index 0000000000..10524ba92d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_cof_gear.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear COF">
+ <menu label="Nuovi abiti" name="COF.Gear.New_Clothes"/>
+ <menu label="Nuove parti del corpo" name="COF.Geear.New_Body_Parts"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_edit.xml b/indra/newview/skins/minimal/xui/it/menu_edit.xml
new file mode 100644
index 0000000000..ffb20a02e9
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_edit.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu label="Modifica" name="Edit">
+ <menu_item_call label="Annulla" name="Undo"/>
+ <menu_item_call label="Ripeti" name="Redo"/>
+ <menu_item_call label="Taglia" name="Cut"/>
+ <menu_item_call label="Copia" name="Copy"/>
+ <menu_item_call label="Incolla" name="Paste"/>
+ <menu_item_call label="Elimina" name="Delete"/>
+ <menu_item_call label="Duplica" name="Duplicate"/>
+ <menu_item_call label="Seleziona tutto" name="Select All"/>
+ <menu_item_call label="Deseleziona" name="Deselect"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_favorites.xml b/indra/newview/skins/minimal/xui/it/menu_favorites.xml
new file mode 100644
index 0000000000..7813ef44b5
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_favorites.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Teleport" name="Teleport To Landmark"/>
+ <menu_item_call label="Vedi/Modifica punto di riferimento" name="Landmark Open"/>
+ <menu_item_call label="Copia SLurl" name="Copy slurl"/>
+ <menu_item_call label="Mostra sulla mappa" name="Show On Map"/>
+ <menu_item_call label="Copia" name="Landmark Copy"/>
+ <menu_item_call label="Incolla" name="Landmark Paste"/>
+ <menu_item_call label="Elimina" name="Delete"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_gesture_gear.xml b/indra/newview/skins/minimal/xui/it/menu_gesture_gear.xml
new file mode 100644
index 0000000000..7cfcc6287e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_gesture_gear.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gesture_gear">
+ <menu_item_call label="Aggiungi/Rimuovi dai preferiti" name="activate"/>
+ <menu_item_call label="Copia" name="copy_gesture"/>
+ <menu_item_call label="Incolla" name="paste"/>
+ <menu_item_call label="Copia UUID" name="copy_uuid"/>
+ <menu_item_call label="Salva vestiario" name="save_to_outfit"/>
+ <menu_item_call label="Modifica" name="edit_gesture"/>
+ <menu_item_call label="Ispeziona" name="inspect"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_group_plus.xml b/indra/newview/skins/minimal/xui/it/menu_group_plus.xml
new file mode 100644
index 0000000000..3b76fb94a9
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_group_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Aderisci al gruppo..." name="item_join"/>
+ <menu_item_call label="Nuovo gruppo..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/it/menu_hide_navbar.xml
new file mode 100644
index 0000000000..2c2c6c4bc5
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_hide_navbar.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_navbar_menu">
+ <menu_item_check label="Mostra la barra di navigazione" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Mostra la barra dei Preferiti" name="ShowNavbarFavoritesPanel"/>
+ <menu_item_check label="Mostra mini barra del luogo" name="ShowMiniLocationPanel"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_im_well_button.xml b/indra/newview/skins/minimal/xui/it/menu_im_well_button.xml
new file mode 100644
index 0000000000..9e471b771c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_im_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="IM Well Button Context Menu">
+ <menu_item_call label="Chiudi tutto" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/it/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..f78ed8489f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_imchiclet_adhoc.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet AdHoc Menu">
+ <menu_item_call label="Fine sessione" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/it/menu_imchiclet_group.xml
new file mode 100644
index 0000000000..baa4e671b0
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_imchiclet_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet Group Menu">
+ <menu_item_call label="Informazioni sul gruppo" name="Show Profile"/>
+ <menu_item_call label="Mostra sessione" name="Chat"/>
+ <menu_item_call label="Fine sessione" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/it/menu_imchiclet_p2p.xml
new file mode 100644
index 0000000000..2eacbb09ad
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_imchiclet_p2p.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet P2P Menu">
+ <menu_item_call label="Vedi profilo" name="Show Profile"/>
+ <menu_item_call label="Aggiungi amico" name="Add Friend"/>
+ <menu_item_call label="Mostra sessione" name="Send IM"/>
+ <menu_item_call label="Fine sessione" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/it/menu_inspect_avatar_gear.xml
new file mode 100644
index 0000000000..1f10734c4a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_inspect_avatar_gear.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="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/minimal/xui/it/menu_inspect_object_gear.xml b/indra/newview/skins/minimal/xui/it/menu_inspect_object_gear.xml
new file mode 100644
index 0000000000..ede4a507c0
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_inspect_object_gear.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Tocca" name="touch"/>
+ <menu_item_call label="Siediti" name="sit"/>
+ <menu_item_call label="Paga" name="pay"/>
+ <menu_item_call label="Acquista" name="buy"/>
+ <menu_item_call label="Prendi" name="take"/>
+ <menu_item_call label="Prendi copia" name="take_copy"/>
+ <menu_item_call label="Apri" name="open"/>
+ <menu_item_call label="Modifica" name="edit"/>
+ <menu_item_call label="Indossa" name="wear"/>
+ <menu_item_call label="Aggiungi" name="add"/>
+ <menu_item_call label="Segnala" name="report"/>
+ <menu_item_call label="Blocca" name="block"/>
+ <menu_item_call label="Zoom avanti" name="zoom_in"/>
+ <menu_item_call label="Rimuovi" name="remove"/>
+ <menu_item_call label="Maggiori informazioni" name="more_info"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/it/menu_inspect_self_gear.xml
new file mode 100644
index 0000000000..4f62ccaa9c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_inspect_self_gear.xml
@@ -0,0 +1,31 @@
+<?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/minimal/xui/it/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/it/menu_inv_offer_chiclet.xml
new file mode 100644
index 0000000000..471640eff5
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_inv_offer_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="InvOfferChiclet Menu">
+ <menu_item_call label="Chiudi" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_inventory.xml b/indra/newview/skins/minimal/xui/it/menu_inventory.xml
new file mode 100644
index 0000000000..f18ddb595c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_inventory.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Condividi" name="Share"/>
+ <menu_item_call label="Compra" name="Task Buy"/>
+ <menu_item_call label="Apri" name="Task Open"/>
+ <menu_item_call label="Esegui" name="Task Play"/>
+ <menu_item_call label="Proprietà" name="Task Properties"/>
+ <menu_item_call label="Rinomina" name="Task Rename"/>
+ <menu_item_call label="Elimina" name="Task Remove"/>
+ <menu_item_call label="Svuota il Cestino" name="Empty Trash"/>
+ <menu_item_call label="Svuota gli oggetti persi e ritrovati" name="Empty Lost And Found"/>
+ <menu_item_call label="Nuova cartella" name="New Folder"/>
+ <menu_item_call label="Nuovo script" name="New Script"/>
+ <menu_item_call label="Nuovo biglietto" name="New Note"/>
+ <menu_item_call label="Nuova gesture" name="New Gesture"/>
+ <menu label="Maglietta intima" name="New Clothes">
+ <menu_item_call label="Nuova maglietta" name="New Shirt"/>
+ <menu_item_call label="Nuovi pantaloni" name="New Pants"/>
+ <menu_item_call label="Nuove scarpe" name="New Shoes"/>
+ <menu_item_call label="Nuove calze" name="New Socks"/>
+ <menu_item_call label="Nuova giacca" name="New Jacket"/>
+ <menu_item_call label="Nuova gonna" name="New Skirt"/>
+ <menu_item_call label="Nuovi guanti" name="New Gloves"/>
+ <menu_item_call label="Nuova canottiera" name="New Undershirt"/>
+ <menu_item_call label="Nuove mutande" name="New Underpants"/>
+ <menu_item_call label="Nuovo Alfa Mask" name="New Alpha Mask"/>
+ <menu_item_call label="Nuovo tatuaggio" name="New Tattoo"/>
+ <menu_item_call label="Nuova fisica" name="New Physics"/>
+ </menu>
+ <menu label="Nuove parti del corpo" name="New Body Parts">
+ <menu_item_call label="Nuova forma del corpo" name="New Shape"/>
+ <menu_item_call label="Nuova pelle" name="New Skin"/>
+ <menu_item_call label="Nuovi capelli" name="New Hair"/>
+ <menu_item_call label="Nuovi occhi" name="New Eyes"/>
+ </menu>
+ <menu label="Cambia tipo" name="Change Type">
+ <menu_item_call label="Predefinito" name="Default"/>
+ <menu_item_call label="Guanti" name="Gloves"/>
+ <menu_item_call label="Giacca" name="Jacket"/>
+ <menu_item_call label="Pantaloni" name="Pants"/>
+ <menu_item_call label="Figura corporea" name="Shape"/>
+ <menu_item_call label="Scarpe" name="Shoes"/>
+ <menu_item_call label="Camicia" name="Shirt"/>
+ <menu_item_call label="Gonna" name="Skirt"/>
+ <menu_item_call label="Slip" name="Underpants"/>
+ <menu_item_call label="Maglietta intima" name="Undershirt"/>
+ </menu>
+ <menu_item_call label="Teletrasportati" name="Landmark Open"/>
+ <menu_item_call label="Apri" name="Animation Open"/>
+ <menu_item_call label="Apri" name="Sound Open"/>
+ <menu_item_call label="Sostituisci vestiti" name="Replace Outfit"/>
+ <menu_item_call label="Aggiungi al vestiario" name="Add To Outfit"/>
+ <menu_item_call label="Rimuovi dal vestiario attuale" name="Remove From Outfit"/>
+ <menu_item_call label="Trova originale" name="Find Original"/>
+ <menu_item_call label="Elimina oggetto" name="Purge Item"/>
+ <menu_item_call label="Ripristina oggetto" name="Restore Item"/>
+ <menu_item_call label="Apri" name="Open"/>
+ <menu_item_call label="Apri originale" name="Open Original"/>
+ <menu_item_call label="Proprietà" name="Properties"/>
+ <menu_item_call label="Rinomina" name="Rename"/>
+ <menu_item_call label="Copia UUID dell&apos;oggetto" name="Copy Asset UUID"/>
+ <menu_item_call label="Copia" name="Copy"/>
+ <menu_item_call label="Incolla" name="Paste"/>
+ <menu_item_call label="Incolla come link" name="Paste As Link"/>
+ <menu_item_call label="Elimina" name="Remove Link"/>
+ <menu_item_call label="Cancella" name="Delete"/>
+ <menu_item_call label="Elimina la cartella di sistema" name="Delete System Folder"/>
+ <menu_item_call label="Inizia la conferenza chat" name="Conference Chat Folder"/>
+ <menu_item_call label="Esegui" name="Sound Play"/>
+ <menu_item_call label="Informazioni sul punto di riferimento" name="About Landmark"/>
+ <menu_item_call label="Riproduci in Second Life" name="Animation Play"/>
+ <menu_item_call label="Esegui localmente" name="Animation Audition"/>
+ <menu_item_call label="Invia un Instant Message" name="Send Instant Message"/>
+ <menu_item_call label="Offri teletrasporto..." name="Offer Teleport..."/>
+ <menu_item_call label="Inizia una conferenza chat" name="Conference Chat"/>
+ <menu_item_call label="Attiva" name="Activate"/>
+ <menu_item_call label="Disattiva" name="Deactivate"/>
+ <menu_item_call label="Salva con nome" name="Save As"/>
+ <menu_item_call label="Stacca da te" name="Detach From Yourself"/>
+ <menu_item_call label="Indossa" name="Wearable And Object Wear"/>
+ <menu label="Attacca a" name="Attach To"/>
+ <menu label="Attacca all&apos;HUD" name="Attach To HUD"/>
+ <menu_item_call label="Modifica" name="Wearable Edit"/>
+ <menu_item_call label="Aggiungi" name="Wearable Add"/>
+ <menu_item_call label="Togli" name="Take Off"/>
+ <menu_item_call label="--nessuna opzione--" name="--no options--"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/it/menu_inventory_add.xml
new file mode 100644
index 0000000000..a2535ce48d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_inventory_add.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_inventory_add">
+ <menu label="Carica nel server" name="upload">
+ <menu_item_call label="Immagine ([COST]L$)..." name="Upload Image"/>
+ <menu_item_call label="Suono ([COST]L$)..." name="Upload Sound"/>
+ <menu_item_call label="Animazione ([COST]L$)..." name="Upload Animation"/>
+ <menu_item_call label="In blocco ([COST]L$ per file)..." name="Bulk Upload"/>
+ <menu_item_call label="Definisci diritti di caricamento predefiniti" name="perm prefs"/>
+ </menu>
+ <menu_item_call label="Nuova cartella" name="New Folder"/>
+ <menu_item_call label="Nuovo script" name="New Script"/>
+ <menu_item_call label="Nuovo biglietto" name="New Note"/>
+ <menu_item_call label="Nuova gesture" name="New Gesture"/>
+ <menu label="Maglietta intima" name="New Clothes">
+ <menu_item_call label="Nuova camicia" name="New Shirt"/>
+ <menu_item_call label="Nuovi pantaloni" name="New Pants"/>
+ <menu_item_call label="Nuove scarpe" name="New Shoes"/>
+ <menu_item_call label="Nuove calze" name="New Socks"/>
+ <menu_item_call label="Nuova giacca" name="New Jacket"/>
+ <menu_item_call label="Nuova gonna" name="New Skirt"/>
+ <menu_item_call label="Nuovi guanti" name="New Gloves"/>
+ <menu_item_call label="Nuova maglietta intima" name="New Undershirt"/>
+ <menu_item_call label="Nuovi slip" name="New Underpants"/>
+ <menu_item_call label="Nuovo Alfa (trasparenza)" name="New Alpha"/>
+ <menu_item_call label="Nuovo tatuaggio" name="New Tattoo"/>
+ <menu_item_call label="Nuova fisica" name="New Physics"/>
+ </menu>
+ <menu label="Nuove parti del corpo" name="New Body Parts">
+ <menu_item_call label="Nuova figura corporea" name="New Shape"/>
+ <menu_item_call label="Nuova pelle" name="New Skin"/>
+ <menu_item_call label="Nuovi capelli" name="New Hair"/>
+ <menu_item_call label="Nuovi occhi" name="New Eyes"/>
+ </menu>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_inventory_gear_default.xml b/indra/newview/skins/minimal/xui/it/menu_inventory_gear_default.xml
new file mode 100644
index 0000000000..3d64e4da4e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_inventory_gear_default.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_gear_default">
+ <menu_item_call label="Nuova finestra inventario" name="new_window"/>
+ <menu_item_check label="Ordina in base al nome" name="sort_by_name"/>
+ <menu_item_check label="Mostra prima i più recenti" name="sort_by_recent"/>
+ <menu_item_check label="Ordina le cartelle sempre in base al nome" name="sort_folders_by_name"/>
+ <menu_item_check label="Ordina cartelle di sistema all&apos;inizio" name="sort_system_folders_to_top"/>
+ <menu_item_call label="Mostra filtri" name="show_filters"/>
+ <menu_item_call label="Ripristina filtri" name="reset_filters"/>
+ <menu_item_call label="Chiudi tutte le cartelle" name="close_folders"/>
+ <menu_item_call label="Svuota oggetti smarriti" name="empty_lostnfound"/>
+ <menu_item_call label="Salva texture come" name="Save Texture As"/>
+ <menu_item_call label="Condividi" name="Share"/>
+ <menu_item_call label="Trova originale" name="Find Original"/>
+ <menu_item_call label="Trova tutti i link" name="Find All Links"/>
+ <menu_item_call label="Svuota cestino" name="empty_trash"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_land.xml b/indra/newview/skins/minimal/xui/it/menu_land.xml
new file mode 100644
index 0000000000..f510078e14
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_land.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Land Pie">
+ <menu_item_call label="Informazioni sui terreni" name="Place Information..."/>
+ <menu_item_call label="Siediti qui" name="Sit Here"/>
+ <menu_item_call label="Acquista questo terreno" name="Land Buy"/>
+ <menu_item_call label="Acquista Permesso" name="Land Buy Pass"/>
+ <menu_item_call label="Costruisci" name="Create"/>
+ <menu_item_call label="Modifica terreno" name="Edit Terrain"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_landmark.xml b/indra/newview/skins/minimal/xui/it/menu_landmark.xml
new file mode 100644
index 0000000000..b3cddab783
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_landmark.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="landmark_overflow_menu">
+ <menu_item_call label="Copia SLurl" name="copy"/>
+ <menu_item_call label="Elimina" name="delete"/>
+ <menu_item_call label="Crea Luogo consigliato" name="pick"/>
+ <menu_item_call label="Aggiungi alla barra dei Preferiti" name="add_to_favbar"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_login.xml b/indra/newview/skins/minimal/xui/it/menu_login.xml
new file mode 100644
index 0000000000..bdf7d2094f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_login.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_bar name="Login Menu">
+ <menu label="Io" name="File">
+ <menu_item_call label="Preferenze" name="Preferences..."/>
+ <menu_item_call label="Esci da [APP_NAME]" name="Quit"/>
+ </menu>
+ <menu label="Aiuto" name="Help">
+ <menu_item_call label="Aiuto di [SECOND_LIFE]" name="Second Life Help"/>
+ <menu_item_call label="Informazioni su [APP_NAME]" name="About Second Life"/>
+ </menu>
+ <menu_item_check label="Mostra menu Debug" name="Show Debug Menu"/>
+ <menu label="Debug" name="Debug">
+ <menu_item_call label="Mostra impostazioni di debug" name="Debug Settings"/>
+ <menu_item_call label="Impostazioni colori interfaccia" name="UI/Color Settings"/>
+ <menu label="Test interfaccia utente" name="UI Tests"/>
+ <menu_item_call label="Imposta dimensioni della finestra..." name="Set Window Size..."/>
+ <menu_item_call label="Mostra i Termini del servizio (TOS)" name="TOS"/>
+ <menu_item_call label="Mostra messaggio critico" name="Critical"/>
+ <menu_item_call label="Test browser multimedia" name="Web Browser Test"/>
+ <menu_item_call label="Test finestra contenuti Web" name="Web Content Floater Test"/>
+ <menu_item_check label="Mostra selettore griglia" name="Show Grid Picker"/>
+ <menu_item_call label="Mostra Console notifiche" name="Show Notifications Console"/>
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/it/menu_mini_map.xml b/indra/newview/skins/minimal/xui/it/menu_mini_map.xml
new file mode 100644
index 0000000000..561b80e046
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_mini_map.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Zoom ravvicinato" name="Zoom Close"/>
+ <menu_item_call label="Zoom Medio" name="Zoom Medium"/>
+ <menu_item_call label="Zoom Distante" name="Zoom Far"/>
+ <menu_item_call label="Zoom predefinito" name="Zoom Default"/>
+ <menu_item_check label="Ruota la mappa" name="Rotate Map"/>
+ <menu_item_check label="Centra automaticamente" name="Auto Center"/>
+ <menu_item_call label="Ferma il puntamento" name="Stop Tracking"/>
+ <menu_item_call label="Mappa del mondo" name="World Map"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_navbar.xml b/indra/newview/skins/minimal/xui/it/menu_navbar.xml
new file mode 100644
index 0000000000..e42d913a6f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_navbar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Navbar Menu">
+ <menu_item_check label="Mostra le coordinate" name="Show Coordinates"/>
+ <menu_item_check label="Mostra proprietà lotto" name="Show Parcel Properties"/>
+ <menu_item_call label="Punto di riferimento" name="Landmark"/>
+ <menu_item_call label="Taglia" name="Cut"/>
+ <menu_item_call label="Copia" name="Copy"/>
+ <menu_item_call label="Incolla" name="Paste"/>
+ <menu_item_call label="Elimina" name="Delete"/>
+ <menu_item_call label="Seleziona tutto" name="Select All"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/it/menu_nearby_chat.xml
new file mode 100644
index 0000000000..719a6d3261
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="NearBy Chat Menu">
+ <menu_item_call label="Mostra le persone vicine..." name="nearby_people"/>
+ <menu_item_check label="Mostra il testo bloccato" name="muted_text"/>
+ <menu_item_check label="Mostra icone amici" name="show_buddy_icons"/>
+ <menu_item_check label="Mostra nomi" name="show_names"/>
+ <menu_item_check label="Mostra icone e nomi" name="show_icons_and_names"/>
+ <menu_item_call label="Dimensioni caratteri" name="font_size"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_notification_well_button.xml b/indra/newview/skins/minimal/xui/it/menu_notification_well_button.xml
new file mode 100644
index 0000000000..8c82e30f0e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_notification_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Notification Well Button Context Menu">
+ <menu_item_call label="Chiudi tutto" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_object.xml b/indra/newview/skins/minimal/xui/it/menu_object.xml
new file mode 100644
index 0000000000..a172cf3b26
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_object.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Object Pie">
+ <menu_item_call label="Tocca" name="Object Touch">
+ <menu_item_call.on_enable name="EnableTouch" parameter="Tocca"/>
+ </menu_item_call>
+ <menu_item_call label="Modifica" name="Edit..."/>
+ <menu_item_call label="Costruisci" name="Build"/>
+ <menu_item_call label="Apri" name="Open"/>
+ <menu_item_call label="Siediti qui" name="Object Sit"/>
+ <menu_item_call label="Alzati" name="Object Stand Up"/>
+ <menu_item_call label="Profilo dell&apos;oggetto" name="Object Inspect"/>
+ <menu_item_call label="Zoom avanti" name="Zoom In"/>
+ <context_menu label="Metti" name="Put On">
+ <menu_item_call label="Indossa" name="Wear"/>
+ <menu_item_call label="Aggiungi" name="Add"/>
+ <context_menu label="Attacca" name="Object Attach"/>
+ <context_menu label="Attacca HUD" name="Object Attach HUD"/>
+ </context_menu>
+ <context_menu label="Gestisci" name="Remove">
+ <menu_item_call label="Segnala abuso" name="Report Abuse..."/>
+ <menu_item_call label="Blocca" name="Object Mute"/>
+ <menu_item_call label="Restituisci" name="Return..."/>
+ </context_menu>
+ <menu_item_call label="Prendi" name="Pie Object Take"/>
+ <menu_item_call label="Prendi copia" name="Take Copy"/>
+ <menu_item_call label="Paga" name="Pay..."/>
+ <menu_item_call label="Acquista" name="Buy..."/>
+ <menu_item_call label="Elimina" name="Delete"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_object_icon.xml b/indra/newview/skins/minimal/xui/it/menu_object_icon.xml
new file mode 100644
index 0000000000..0f347b1a90
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_object_icon.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Object Icon Menu">
+ <menu_item_call label="Profilo oggetto..." name="Object Profile"/>
+ <menu_item_call label="Blocca..." name="Block"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_outfit_gear.xml b/indra/newview/skins/minimal/xui/it/menu_outfit_gear.xml
new file mode 100644
index 0000000000..09fc867d7c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_outfit_gear.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear Outfit">
+ <menu_item_call label="Indossa - Sostituisci vestiario attuale" name="wear"/>
+ <menu_item_call label="Indossa - Aggiungi al vestiario attuale" name="wear_add"/>
+ <menu_item_call label="Togli - Rimuovi dal vestiario attuale" name="take_off"/>
+ <menu label="Nuovi abiti" name="New Clothes">
+ <menu_item_call label="Nuova camicia" name="New Shirt"/>
+ <menu_item_call label="Nuovi pantaloni" name="New Pants"/>
+ <menu_item_call label="Nuove scarpe" name="New Shoes"/>
+ <menu_item_call label="Nuove calze" name="New Socks"/>
+ <menu_item_call label="Nuova giacca" name="New Jacket"/>
+ <menu_item_call label="Nuova gonna" name="New Skirt"/>
+ <menu_item_call label="Nuovi guanti" name="New Gloves"/>
+ <menu_item_call label="Nuova maglietta intima" name="New Undershirt"/>
+ <menu_item_call label="Nuovi slip" name="New Underpants"/>
+ <menu_item_call label="Nuovo Alpha (trasparenza)" name="New Alpha"/>
+ <menu_item_call label="Nuova fisica" name="New Physics"/>
+ <menu_item_call label="Nuovo tatuaggio" name="New Tattoo"/>
+ </menu>
+ <menu label="Nuove parti del corpo" name="New Body Parts">
+ <menu_item_call label="Nuova figura corporea" name="New Shape"/>
+ <menu_item_call label="Nuova pelle" name="New Skin"/>
+ <menu_item_call label="Nuovi capelli" name="New Hair"/>
+ <menu_item_call label="Nuovi occhi" name="New Eyes"/>
+ </menu>
+ <menu_item_call label="Cambia nome del vestiario" name="rename"/>
+ <menu_item_call label="Elimina vestito" name="delete_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_outfit_tab.xml b/indra/newview/skins/minimal/xui/it/menu_outfit_tab.xml
new file mode 100644
index 0000000000..8166cf20ed
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_outfit_tab.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit">
+ <menu_item_call label="Indossa - Sostituisci vestiario attuale" name="wear_replace"/>
+ <menu_item_call label="Indossa - Aggiungi al vestiario attuale" name="wear_add"/>
+ <menu_item_call label="Togli - Rimuovi dal vestiario attuale" name="take_off"/>
+ <menu_item_call label="Modifica vestiario" name="edit"/>
+ <menu_item_call label="Cambia nome del vestiario" name="rename"/>
+ <menu_item_call label="Elimina vestito" name="delete"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_participant_list.xml b/indra/newview/skins/minimal/xui/it/menu_participant_list.xml
new file mode 100644
index 0000000000..1b057c4077
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_participant_list.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Participant List Context Menu">
+ <menu_item_check label="Ordina in base al nome" name="SortByName"/>
+ <menu_item_check label="Ordina in base a intervenuti recenti" name="SortByRecentSpeakers"/>
+ <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="Condividi" name="Share"/>
+ <menu_item_call label="Paga" name="Pay"/>
+ <menu_item_check label="Icone persone" name="View Icons"/>
+ <menu_item_check label="Blocca voce" name="Block/Unblock"/>
+ <menu_item_check label="Blocca testo" name="MuteText"/>
+ <context_menu label="Opzioni moderatore" name="Moderator Options">
+ <menu_item_check label="Consenti chat di testo" name="AllowTextChat"/>
+ <menu_item_call label="Disattiva audio di questo participante" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="Riattiva audio di questo participante" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="Disattiva audio di tutti" name="ModerateVoiceMute"/>
+ <menu_item_call label="Riattiva audio di tutti" name="ModerateVoiceUnmute"/>
+ </context_menu>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_people_friends_view_sort.xml b/indra/newview/skins/minimal/xui/it/menu_people_friends_view_sort.xml
new file mode 100644
index 0000000000..3a799f44eb
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_people_friends_view_sort.xml
@@ -0,0 +1,8 @@
+<?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/minimal/xui/it/menu_people_groups.xml b/indra/newview/skins/minimal/xui/it/menu_people_groups.xml
new file mode 100644
index 0000000000..30a97a1c72
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_people_groups.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Mostra informazioni" name="View Info"/>
+ <menu_item_call label="Chat" name="Chat"/>
+ <menu_item_call label="Chiama" name="Call"/>
+ <menu_item_call label="Attiva" name="Activate"/>
+ <menu_item_call label="Chiudi" name="Leave"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_people_groups_view_sort.xml b/indra/newview/skins/minimal/xui/it/menu_people_groups_view_sort.xml
new file mode 100644
index 0000000000..d31ddaf1aa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_people_groups_view_sort.xml
@@ -0,0 +1,5 @@
+<?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/minimal/xui/it/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/it/menu_people_nearby.xml
new file mode 100644
index 0000000000..ab06d28c36
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_people_nearby.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Avatar Context Menu">
+ <menu_item_call label="Vedi profilo" name="View Profile"/>
+ <menu_item_call label="Aggiungi come amico" name="Add Friend"/>
+ <menu_item_call label="Rimuovi amico" name="Remove Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Chiama" name="Call"/>
+ <menu_item_call label="Mappa" name="Map"/>
+ <menu_item_call label="Condividi" name="Share"/>
+ <menu_item_call label="Paga" name="Pay"/>
+ <menu_item_check label="Blocca/Sblocca" name="Block/Unblock"/>
+ <menu_item_call label="Offri Teleport" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_people_nearby_multiselect.xml b/indra/newview/skins/minimal/xui/it/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000..e0b9ceb63d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_people_nearby_multiselect.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Multi-Selected People Context Menu">
+ <menu_item_call label="Aggiungi amici" name="Add Friends"/>
+ <menu_item_call label="Rimuovi amici" name="Remove Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="Chiama" name="Call"/>
+ <menu_item_call label="Condividi" name="Share"/>
+ <menu_item_call label="Paga" name="Pay"/>
+ <menu_item_call label="Offri Teleport" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_people_nearby_view_sort.xml b/indra/newview/skins/minimal/xui/it/menu_people_nearby_view_sort.xml
new file mode 100644
index 0000000000..aae2313702
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_people_nearby_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<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_call label="Mostra oggetti e residenti bloccati" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_people_recent_view_sort.xml b/indra/newview/skins/minimal/xui/it/menu_people_recent_view_sort.xml
new file mode 100644
index 0000000000..7fccd1621a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_people_recent_view_sort.xml
@@ -0,0 +1,7 @@
+<?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/minimal/xui/it/menu_picks.xml b/indra/newview/skins/minimal/xui/it/menu_picks.xml
new file mode 100644
index 0000000000..000d219ed0
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_picks.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Picks">
+ <menu_item_call label="Informazioni" name="pick_info"/>
+ <menu_item_call label="Modifica" name="pick_edit"/>
+ <menu_item_call label="Teleport" name="pick_teleport"/>
+ <menu_item_call label="Mappa" name="pick_map"/>
+ <menu_item_call label="Elimina" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_picks_plus.xml b/indra/newview/skins/minimal/xui/it/menu_picks_plus.xml
new file mode 100644
index 0000000000..7fbd5abd57
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_picks_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="picks_plus_menu">
+ <menu_item_call label="Nuovo luogo preferito" name="create_pick"/>
+ <menu_item_call label="Nuovo annuncio" name="create_classified"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_place.xml b/indra/newview/skins/minimal/xui/it/menu_place.xml
new file mode 100644
index 0000000000..5381a4effa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_place.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="place_overflow_menu">
+ <menu_item_call label="Salva come punto di riferimento" name="landmark"/>
+ <menu_item_call label="Crea Luogo consigliato" name="pick"/>
+ <menu_item_call label="Acquista Permesso" name="pass"/>
+ <menu_item_call label="Modifica" name="edit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/it/menu_place_add_button.xml
new file mode 100644
index 0000000000..0e783c0000
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_place_add_button.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Aggiungi cartella" name="add_folder"/>
+ <menu_item_call label="Aggiungi punto di riferimento" name="add_landmark"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_places_gear_folder.xml b/indra/newview/skins/minimal/xui/it/menu_places_gear_folder.xml
new file mode 100644
index 0000000000..23757d47e0
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_places_gear_folder.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_folder_gear">
+ <menu_item_call label="Aggiungi punto di riferimento" name="add_landmark"/>
+ <menu_item_call label="Aggiungi cartella" name="add_folder"/>
+ <menu_item_call label="Ripristina oggetto" name="restore_item"/>
+ <menu_item_call label="Taglia" name="cut"/>
+ <menu_item_call label="Copia" name="copy_folder"/>
+ <menu_item_call label="Incolla" name="paste"/>
+ <menu_item_call label="Modifica nome" name="rename"/>
+ <menu_item_call label="Elimina" name="delete"/>
+ <menu_item_call label="Espandi" name="expand"/>
+ <menu_item_call label="Comprimi" name="collapse"/>
+ <menu_item_call label="Apri tutte le cartelle" name="expand_all"/>
+ <menu_item_call label="Chiudi tutte le cartelle" name="collapse_all"/>
+ <menu_item_check label="Ordina in base alla data" name="sort_by_date"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_places_gear_landmark.xml b/indra/newview/skins/minimal/xui/it/menu_places_gear_landmark.xml
new file mode 100644
index 0000000000..a458b1a768
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_places_gear_landmark.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_ladmark_gear">
+ <menu_item_call label="Teleport" name="teleport"/>
+ <menu_item_call label="Maggiori informazioni" name="more_info"/>
+ <menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
+ <menu_item_call label="Aggiungi Punto di riferimento" name="add_landmark"/>
+ <menu_item_call label="Aggiungi cartella" name="add_folder"/>
+ <menu_item_call label="Ripristina oggetto" name="restore_item"/>
+ <menu_item_call label="Taglia" name="cut"/>
+ <menu_item_call label="Copia punto di riferimento" name="copy_landmark"/>
+ <menu_item_call label="Copia SLurl" name="copy_slurl"/>
+ <menu_item_call label="Incolla" name="paste"/>
+ <menu_item_call label="Modifica nome" name="rename"/>
+ <menu_item_call label="Elimina" name="delete"/>
+ <menu_item_call label="Apri tutte le cartelle" name="expand_all"/>
+ <menu_item_call label="Chiudi tutte le cartelle" name="collapse_all"/>
+ <menu_item_check label="Ordina in base alla data" name="sort_by_date"/>
+ <menu_item_call label="Crea Luogo consigliato" name="create_pick"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_profile_overflow.xml b/indra/newview/skins/minimal/xui/it/menu_profile_overflow.xml
new file mode 100644
index 0000000000..56b695c597
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_profile_overflow.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="Mappa" name="show_on_map"/>
+ <menu_item_call label="Paga" name="pay"/>
+ <menu_item_call label="Condividi" name="share"/>
+ <menu_item_call label="Blocca" name="block"/>
+ <menu_item_call label="Sblocca" name="unblock"/>
+ <menu_item_call label="Espelli" name="kick"/>
+ <menu_item_call label="Congela" name="freeze"/>
+ <menu_item_call label="Scongela" name="unfreeze"/>
+ <menu_item_call label="CSR" name="csr"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_save_outfit.xml b/indra/newview/skins/minimal/xui/it/menu_save_outfit.xml
new file mode 100644
index 0000000000..4882a8ac64
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_save_outfit.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="save_outfit_menu">
+ <menu_item_call label="Salva" name="save_outfit"/>
+ <menu_item_call label="Salva con nome" name="save_as_new_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/it/menu_script_chiclet.xml
new file mode 100644
index 0000000000..604f754ba8
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_script_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="ScriptChiclet Menu">
+ <menu_item_call label="Chiudi" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_slurl.xml b/indra/newview/skins/minimal/xui/it/menu_slurl.xml
new file mode 100644
index 0000000000..be83133efc
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_slurl.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Informazioni sull&apos;indirizzo URL" name="about_url"/>
+ <menu_item_call label="Teleportati all&apos;indirizzo URL" name="teleport_to_url"/>
+ <menu_item_call label="Mappa" name="show_on_map"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_teleport_history_gear.xml b/indra/newview/skins/minimal/xui/it/menu_teleport_history_gear.xml
new file mode 100644
index 0000000000..409a62c31b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_teleport_history_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Teleport History Gear Context Menu">
+ <menu_item_call label="Apri tutte le cartelle" name="Expand all folders"/>
+ <menu_item_call label="Chiudi tutte le cartelle" name="Collapse all folders"/>
+ <menu_item_call label="Cancella la cronologia Teleport" name="Clear Teleport History"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/it/menu_teleport_history_item.xml
new file mode 100644
index 0000000000..81053fbd65
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_teleport_history_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Teleport" name="Teleport"/>
+ <menu_item_call label="Maggiori informazioni" name="More Information"/>
+ <menu_item_call label="Copia negli appunti" name="CopyToClipboard"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_teleport_history_tab.xml b/indra/newview/skins/minimal/xui/it/menu_teleport_history_tab.xml
new file mode 100644
index 0000000000..c221f141a6
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_teleport_history_tab.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Apri" name="TabOpen"/>
+ <menu_item_call label="Chiudi" name="TabClose"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_text_editor.xml b/indra/newview/skins/minimal/xui/it/menu_text_editor.xml
new file mode 100644
index 0000000000..4636ce9929
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_text_editor.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Text editor context menu">
+ <menu_item_call label="Taglia" name="Cut"/>
+ <menu_item_call label="Copia" name="Copy"/>
+ <menu_item_call label="Incolla" name="Paste"/>
+ <menu_item_call label="Elimina" name="Delete"/>
+ <menu_item_call label="Seleziona tutto" name="Select All"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/it/menu_topinfobar.xml
new file mode 100644
index 0000000000..0beb9314de
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_topinfobar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_topinfobar">
+ <menu_item_check label="Mostra le coordinate" name="Show Coordinates"/>
+ <menu_item_check label="Mostra proprietà del lotto" name="Show Parcel Properties"/>
+ <menu_item_call label="Punto di riferimento" name="Landmark"/>
+ <menu_item_call label="Copia" name="Copy"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_url_agent.xml b/indra/newview/skins/minimal/xui/it/menu_url_agent.xml
new file mode 100644
index 0000000000..37755d5749
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_url_agent.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostra profilo residente" name="show_agent"/>
+ <menu_item_call label="Copia nome negli Appunti" name="url_copy_label"/>
+ <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_url_group.xml b/indra/newview/skins/minimal/xui/it/menu_url_group.xml
new file mode 100644
index 0000000000..d9a792ebdf
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_url_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostra informazioni gruppo" name="show_group"/>
+ <menu_item_call label="Copia gruppo negli Appunti" name="url_copy_label"/>
+ <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_url_http.xml b/indra/newview/skins/minimal/xui/it/menu_url_http.xml
new file mode 100644
index 0000000000..e0153d9169
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_url_http.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Apri pagina Web" name="url_open"/>
+ <menu_item_call label="Apri nel browser interno" name="url_open_internal"/>
+ <menu_item_call label="Apri nel browser esterno" name="url_open_external"/>
+ <menu_item_call label="Copia URL negli Appunti" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_url_inventory.xml b/indra/newview/skins/minimal/xui/it/menu_url_inventory.xml
new file mode 100644
index 0000000000..a45a6bbc10
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_url_inventory.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostra oggetto dell&apos;inventario" name="show_item"/>
+ <menu_item_call label="Copia nome negli Appunti" name="url_copy_label"/>
+ <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_url_map.xml b/indra/newview/skins/minimal/xui/it/menu_url_map.xml
new file mode 100644
index 0000000000..cb7935b3ed
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_url_map.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
+ <menu_item_call label="Teleport al luogo" name="teleport_to_location"/>
+ <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_url_objectim.xml b/indra/newview/skins/minimal/xui/it/menu_url_objectim.xml
new file mode 100644
index 0000000000..763e65f17c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_url_objectim.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostra informazioni oggetto" name="show_object"/>
+ <menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
+ <menu_item_call label="Teleport sul luogo dell&apos;oggetto" name="teleport_to_object"/>
+ <menu_item_call label="Copia nome oggetto negli Appunti" name="url_copy_label"/>
+ <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_url_parcel.xml b/indra/newview/skins/minimal/xui/it/menu_url_parcel.xml
new file mode 100644
index 0000000000..a032c33585
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_url_parcel.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostra informazioni lotto" name="show_parcel"/>
+ <menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
+ <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_url_slapp.xml b/indra/newview/skins/minimal/xui/it/menu_url_slapp.xml
new file mode 100644
index 0000000000..b368aa9141
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_url_slapp.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Esegui questo comando" name="run_slapp"/>
+ <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_url_slurl.xml b/indra/newview/skins/minimal/xui/it/menu_url_slurl.xml
new file mode 100644
index 0000000000..355c7dbed9
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_url_slurl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostra informazioni del luogo" name="show_place"/>
+ <menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
+ <menu_item_call label="Teleport al luogo" name="teleport_to_location"/>
+ <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_url_teleport.xml b/indra/newview/skins/minimal/xui/it/menu_url_teleport.xml
new file mode 100644
index 0000000000..c129e61f25
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_url_teleport.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Teleport a questa destinazione" name="teleport"/>
+ <menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
+ <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_viewer.xml b/indra/newview/skins/minimal/xui/it/menu_viewer.xml
new file mode 100644
index 0000000000..8353044f37
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_viewer.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_bar name="Main Menu">
+ <menu label="Aiuto" name="Help">
+ <menu_item_call label="Aiuto di [SECOND_LIFE]" name="Second Life Help"/>
+ </menu>
+ <menu label="Avanzate" name="Advanced">
+ <menu label="Scorciatoie" name="Shortcuts">
+ <menu_item_check label="Vola" name="Fly"/>
+ <menu_item_call label="Chiudi finestra" name="Close Window"/>
+ <menu_item_call label="Chiudi tutte le finestre" name="Close All Windows"/>
+ <menu_item_call label="Reimposta vista" name="Reset View"/>
+ </menu>
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/it/menu_wearable_list_item.xml b/indra/newview/skins/minimal/xui/it/menu_wearable_list_item.xml
new file mode 100644
index 0000000000..c9a02d8a86
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_wearable_list_item.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit Wearable Context Menu">
+ <menu_item_call label="Sostituisci" name="wear_replace"/>
+ <menu_item_call label="Indossa" name="wear_wear"/>
+ <menu_item_call label="Aggiungi" name="wear_add"/>
+ <menu_item_call label="Togli / Stacca" name="take_off_or_detach"/>
+ <menu_item_call label="Stacca" name="detach"/>
+ <context_menu label="Attacca a" name="wearable_attach_to"/>
+ <context_menu label="Attacca a HUD" name="wearable_attach_to_hud"/>
+ <menu_item_call label="Togli" name="take_off"/>
+ <menu_item_call label="Modifica" name="edit"/>
+ <menu_item_call label="Profilo articolo" name="object_profile"/>
+ <menu_item_call label="Mostra originale" name="show_original"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_wearing_gear.xml b/indra/newview/skins/minimal/xui/it/menu_wearing_gear.xml
new file mode 100644
index 0000000000..7c8eef64e5
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_wearing_gear.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear Wearing">
+ <menu_item_call label="Modifica vestiario" name="edit"/>
+ <menu_item_call label="Togli" name="takeoff"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/it/menu_wearing_tab.xml b/indra/newview/skins/minimal/xui/it/menu_wearing_tab.xml
new file mode 100644
index 0000000000..4a5366091f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/menu_wearing_tab.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Wearing">
+ <menu_item_call label="Togli" name="take_off"/>
+ <menu_item_call label="Stacca" name="detach"/>
+ <menu_item_call label="Modifica vestiario" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/it/notifications.xml b/indra/newview/skins/minimal/xui/it/notifications.xml
new file mode 100644
index 0000000000..05e13bc4f3
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/notifications.xml
@@ -0,0 +1,2951 @@
+<?xml version="1.0" encoding="utf-8"?>
+<notifications>
+ <global name="skipnexttime">
+ Non mostrare più la prossima volta
+ </global>
+ <global name="alwayschoose">
+ Scegli sempre questa opzione
+ </global>
+ <global name="implicitclosebutton">
+ Chiudi
+ </global>
+ <template name="okbutton">
+ <form>
+ <button name="OK_okbutton" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okignore">
+ <form>
+ <button name="OK_okignore" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okcancelbuttons">
+ <form>
+ <button name="OK_okcancelbuttons" text="$yestext"/>
+ <button name="Cancel_okcancelbuttons" text="$notext"/>
+ </form>
+ </template>
+ <template name="okcancelignore">
+ <form>
+ <button name="OK_okcancelignore" text="$yestext"/>
+ <button name="Cancel_okcancelignore" text="$notext"/>
+ </form>
+ </template>
+ <template name="okhelpbuttons">
+ <form>
+ <button name="OK_okhelpbuttons" text="$yestext"/>
+ <button name="Help" text="$helptext"/>
+ </form>
+ </template>
+ <template name="yesnocancelbuttons">
+ <form>
+ <button name="Yes" text="$yestext"/>
+ <button name="No" text="$notext"/>
+ <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
+ </form>
+ </template>
+ <notification functor="GenericAcknowledge" label="Messaggio di notifica sconosciuto" name="MissingAlert">
+ La versione di [APP_NAME] non riesce a visualizzare la notifica appena ricevuta. Verifica di avere l&apos;ultima versione del Viewer installata.
+
+Dettagli errore: La notifica denominata &apos;[_NAME]&apos; non è stata trovata in notifications.xml.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FloaterNotFound">
+ Errore visualizzazione finestra: Non trovati i seguenti controlli:
+
+[CONTROLS]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TutorialNotFound">
+ Nessun tutorial disponibile al momento.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GenericAlert">
+ [MESSAGE]
+ </notification>
+ <notification name="GenericAlertYesCancel">
+ [MESSAGE]
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Si"/>
+ </notification>
+ <notification name="BadInstallation">
+ Il programma [APP_NAME] ha riscontrato un&apos;errore durante il tentativo di aggiornamento. [http://get.secondlife.com Scarica l&apos;ultima versione] del Viewer.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="LoginFailedNoNetwork">
+ Non è possibile collegarsi alla [SECOND_LIFE_GRID].
+ &apos;[DIAGNOSTIC]&apos;
+Accertati che la tua connessione Internet stia funzionando correttamente.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MessageTemplateNotFound">
+ Il modello di messaggio [PATH] non è stato trovato.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="WearableSave">
+ Salva i cambiamenti all&apos;attuale parte del corpo/abito?
+ <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Non salvare" yestext="Salva"/>
+ </notification>
+ <notification name="CompileQueueSaveText">
+ C&apos;è stato un problema importando il testo di uno script per la seguente ragione: [REASON]. Riprova più tardi.
+ </notification>
+ <notification name="CompileQueueSaveBytecode">
+ C&apos;è stato un problema importando lo script compilato per la seguente ragione: [REASON]. Riprova più tardi.
+ </notification>
+ <notification name="WriteAnimationFail">
+ C&apos;è stato un problema di scrittura dati dell&apos;animazione. Riprova più tardi.
+ </notification>
+ <notification name="UploadAuctionSnapshotFail">
+ C&apos;è stato un problema importando la fotografia dell&apos;asta per la seguente ragione: [REASON]
+ </notification>
+ <notification name="UnableToViewContentsMoreThanOne">
+ Non è possibile vedere il contenuto di più di un elemento per volta.
+Scegli solo un oggetto e riprova.
+ </notification>
+ <notification name="SaveClothingBodyChanges">
+ Salva tutte le modifiche alle parti del corpo/abiti?
+ <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Non Salvare" yestext="Salva Tutto"/>
+ </notification>
+ <notification name="FriendsAndGroupsOnly">
+ Chi non è tuo amico non saprà che hai scelto di ignorare le loro chiamate e IM.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FavoritesOnLogin">
+ Nota: Se attivi questa opzione, chiunque usa questo computer può vedere l&apos;elenco di luoghi preferiti.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GrantModifyRights">
+ Quando concedi i diritti di modifica ad un altro residente, gli permetti di modificare, eliminare o prendere QUALSIASI oggetto che possiedi in Second Life. Pertanto ti consigliamo di essere ben sicuro quando concedi questo diritto.
+Vuoi concedere i diritti di modifica a [NAME]?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
+ </notification>
+ <notification name="GrantModifyRightsMultiple">
+ Quando concedi i diritti di modifica ad un altro residente, gli permetti di modificare QUALSIASI oggetto che possiedi in Second Life. Pertanto ti consigliamo di essere ben sicuro quando concedi questo diritto.
+Vuoi concedere i diritti di modifica ai residenti selezionati?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
+ </notification>
+ <notification name="RevokeModifyRights">
+ Vuoi revocare i diritti di modifica di [NAME]?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
+ </notification>
+ <notification name="RevokeModifyRightsMultiple">
+ Vuoi revocare i permessi di modifica dati ai residenti selezionati?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
+ </notification>
+ <notification name="UnableToCreateGroup">
+ Non è possibile creare il gruppo.
+[MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PanelGroupApply">
+ [NEEDS_APPLY_MESSAGE]
+[WANT_APPLY_MESSAGE]
+ <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Ignora le modifiche" yestext="Applica le modifiche"/>
+ </notification>
+ <notification name="MustSpecifyGroupNoticeSubject">
+ Devi specificare un oggetto per mandare una notice al gruppo.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AddGroupOwnerWarning">
+ Stai per aggiungere dei membri al ruolo [ROLE_NAME].
+Non si possono rimuovere membri da quel ruolo.
+I membri devono dimettersi volontariamente dal ruolo.
+Confermi l&apos;operazione?
+ <usetemplate ignoretext="Conferma prima di aggiungere un nuovo proprietario del gruppo" name="okcancelignore" notext="No" yestext="Si"/>
+ </notification>
+ <notification name="AssignDangerousActionWarning">
+ Stai per aggiungere il potere &apos;[ACTION_NAME]&apos; al ruolo &apos;[ROLE_NAME]&apos;.
+
+ *ATTENZIONE*
+ Ogni membro di un ruolo con questo potere può assegnare a sè stesso -- e a qualunque altro membro -- ruoli che hanno più poteri di quelli che hanno correntemente, potenzialmente consentendogli di avere quasi i poteri del proprietario. Accertati di sapere quello che stai facendo prima di assegnare questo potere.
+
+Aggiungi questo potere a &apos;[ROLE_NAME]&apos;?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
+ </notification>
+ <notification name="AssignDangerousAbilityWarning">
+ Stai per aggiungere il potere &apos;[ACTION_NAME]&apos; al ruolo &apos;[ROLE_NAME]&apos;.
+
+ *ATTENZIONE*
+ Ogni membro di un ruolo con questo potere può assegnare a sè stesso -- e a qualunque altro membro -- tutti i poteri, elevandosi al livello di quasi proprietario.
+
+Aggiungi questo potere a &apos;[ROLE_NAME]&apos;?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
+ </notification>
+ <notification name="AttachmentDrop">
+ Stai per abbandonare il tuo accessorio.
+ Vuoi continuare?
+ <usetemplate ignoretext="Conferma prima di distaccare gli accessori" name="okcancelignore" notext="No" yestext="Sì"/>
+ </notification>
+ <notification name="JoinGroupCanAfford">
+ Iscriversi a questo gruppo costa [COST]L$.
+Vuoi proseguire?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Iscriviti"/>
+ </notification>
+ <notification name="JoinGroupNoCost">
+ Aderisci al gruppo [NAME].
+Continuare?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Iscriviti"/>
+ </notification>
+ <notification name="JoinGroupCannotAfford">
+ Iscriversi a questo gruppo costa [COST]L$.
+Non hai abbastanza L$ per iscriverti a questo gruppo.
+ </notification>
+ <notification name="CreateGroupCost">
+ La creazione di questo gruppo costerà L$ 100.
+I gruppi devono avere più di un partecipante, o saranno eliminati definitivamente.
+Invita altri partecipanti entro le prossime 48 ore.
+ <usetemplate canceltext="Annulla" name="okcancelbuttons" notext="Annulla" yestext="Crea un gruppo per L$ 100"/>
+ </notification>
+ <notification name="LandBuyPass">
+ Pagando [COST]L$ puoi entrare in questa terra (&apos;[PARCEL_NAME]&apos;) per [TIME] ore. Compri un pass?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="SalePriceRestriction">
+ Il prezzo di vendita deve essere superiore a 0L$ se vendi a tutti.
+Seleziona una vendita individuale per vendere a 0L$.
+ </notification>
+ <notification name="ConfirmLandSaleChange">
+ Il terreno selezionato di [LAND_SIZE] m² sta per essere messo in vendita.
+Il tuo prezzo di vendità è [SALE_PRICE]L$ ed è autorizzato alla vendita a [NAME].
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmLandSaleToAnyoneChange">
+ ATTENZIONE: Quando selezioni &apos;vendi a tutti&apos;, rendi questo terreno disponibile all&apos;intera comunità di [SECOND_LIFE], anche alle persone che non si trovano in questa regione.
+
+Il terrendo selezionato di [LAND_SIZE] m² sta per essere messo in vendita.
+Il prezzo di vendità sarà [SALE_PRICE]L$ e [NAME] viene autorizzato alla vendita.
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsDeededToGroup">
+ Confermi di volere restituire tutti gli oggetti condivisi con il gruppo &apos;[NAME]&apos; di questo terreno agli inventari dei proprietari precedenti?
+
+*ATTENZIONE* Questo cancellerà gli oggetti non trasferibili ceduti al gruppo!
+
+Oggetti: [N]
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsOwnedByUser">
+ Confermi di volere restituire tutti gli oggetti posseduti dal residente &apos;[NAME]&apos; in questo terreno al suo inventario?
+
+Oggetti: [N]
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsOwnedBySelf">
+ Confermi di volere restituire tutti gli oggetti posseduti da te in questo terreno, di nuovo nel tuo inventario?
+
+Oggetti: [N]
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedBySelf">
+ Confermi di volere restituire tutti gli oggetti di cui NON sei proprietario in questo terreno all&apos;inventario dei rispettivi proprietari?
+Gli oggetti trasferibili ceduti al gruppo verranno restituiti ai loro proprietari precedenti.
+
+*ATTENZIONE* Questo cancellerà gli oggetti non trasferibili ceduti al gruppo!
+
+Oggetti: [N]
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedByUser">
+ Confermi di volere restituire tutti gli oggetti NON posseduti da [NAME] in questo terreno nell&apos;inventario dei loro proprietari?
+Gli oggetti trasferibili ceduti al gruppo verranno restituiti ai loro proprietari precedenti.
+
+*ATTENZIONE* Questo cancellerà gli oggetti non trasferibili ceduti al gruppo!
+
+Oggetti: [N]
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ReturnAllTopObjects">
+ Confermi di volere restituire tutti gli oggetti elencati nell&apos;inventario dei loro proprietari?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="DisableAllTopObjects">
+ Confermi di volere disabilitare tutti gli oggetti in questa regione?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedByGroup">
+ Restituisci gli oggetti in questo terreno che NON sono condivisi con il gruppo [NAME] ai loro proprietari?
+
+Oggetti: [N]
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="UnableToDisableOutsideScripts">
+ Non è possibile disabilitare gli script.
+L&apos;intera regione ha l&apos;abilitazione danni.
+Gli script devono essere autorizzati all&apos;esecuzione affinchè le armi funzionino.
+ </notification>
+ <notification name="MultipleFacesSelected">
+ Sono state selezionate più facce.
+Se prosegui con questa azione, sulle diverse facce dell&apos;oggetto verranno definite sessioni multimediali distinte.
+Per collocare il media su una sola faccia, scegli Seleziona faccia, clicca su una faccia e clicca su Aggiungi.
+ <usetemplate ignoretext="Il canale multimediale sarà impostato su più facce selezionate" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="MustBeInParcel">
+ Devi essere dentro il terreno per impostare il suo Punto di Atterraggio.
+ </notification>
+ <notification name="PromptRecipientEmail">
+ Introduci un indirizzo email per il destinatario/i.
+ </notification>
+ <notification name="PromptSelfEmail">
+ Introduci il tuo indirizzo email.
+ </notification>
+ <notification name="PromptMissingSubjMsg">
+ Invia la foto via email con soggetto o messaggio predefinito?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ErrorProcessingSnapshot">
+ Errore nell&apos;elaborazione della fotografia.
+ </notification>
+ <notification name="ErrorEncodingSnapshot">
+ Errore nella codifica della fotografia.
+ </notification>
+ <notification name="ErrorUploadingPostcard">
+ C&apos;è stato un problema inviando la fotografia per il seguente motivo: [REASON]
+ </notification>
+ <notification name="ErrorUploadingReportScreenshot">
+ C&apos;è stato un problema importando la foto del rapporto per il seguente motivo: [REASON]
+ </notification>
+ <notification name="MustAgreeToLogIn">
+ Devi accettare i Termini di Servizio prima di proseguire il collegamento con [SECOND_LIFE].
+ </notification>
+ <notification name="CouldNotPutOnOutfit">
+ Non è stato possibile indossare un equipaggiamento.
+La cartella equipaggiamento non contiene abbigliamento, parti del corpo o attachment.
+ </notification>
+ <notification name="CannotWearTrash">
+ Non puoi indossare abiti e parti del corpo che sono nel cestino
+ </notification>
+ <notification name="MaxAttachmentsOnOutfit">
+ L&apos;oggetto non può essere collegato.
+Superato il limite di oggetti collegati [MAX_ATTACHMENTS]. Per favore prima stacca un altro oggetto.
+ </notification>
+ <notification name="CannotWearInfoNotComplete">
+ Non puoi indossare quell&apos;elemento perchè non è ancora stato caricato. Riprova fra un minuto.
+ </notification>
+ <notification name="MustHaveAccountToLogIn">
+ Spiacenti. Un campo è vuoto.
+Inserisci il Nome utente del tuo avatar.
+
+Devi avere un account per entrare in [SECOND_LIFE]. Vuoi crearne uno adesso?
+ <url name="url">
+ https://join.secondlife.com/index.php?lang=it-IT
+ </url>
+ <usetemplate name="okcancelbuttons" notext="Riprova" yestext="Crea un nuovo account"/>
+ </notification>
+ <notification name="InvalidCredentialFormat">
+ Immetti il nome utente oppure sia il nome che il cognome del tuo avatar nel campo del nome utente, quindi effettua nuovamente l&apos;accesso.
+ </notification>
+ <notification name="DeleteClassified">
+ Cancella annuncio &apos;[NAME]&apos;?
+Non ci sono rimborsi per la tariffa pagata.
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="DeleteMedia">
+ Hai selezionato la cancellazione del media associato a questa faccia.
+Vuoi continuare?
+ <usetemplate ignoretext="Conferma prima di eliminare elementi multimediali dall&apos;oggetto" name="okcancelignore" notext="No" yestext="Sì"/>
+ </notification>
+ <notification name="ClassifiedSave">
+ Salva le modifiche all&apos;annuncio [NAME]?
+ <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Non salvare" yestext="Salva"/>
+ </notification>
+ <notification name="ClassifiedInsufficientFunds">
+ Denaro insufficiente per creare un&apos;inserzione.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="DeleteAvatarPick">
+ Elimina preferito &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="DeleteOutfits">
+ Elimina il vestiario selezionato?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="PromptGoToEventsPage">
+ Vai alla pagina degli eventi di [SECOND_LIFE]?
+ <url name="url">
+ http://secondlife.com/events/?lang=it-IT
+ </url>
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="SelectProposalToView">
+ Scegli una proposta da vedere.
+ </notification>
+ <notification name="SelectHistoryItemToView">
+ Scegli un item storico da vedere.
+ </notification>
+ <notification name="CacheWillClear">
+ La cache verrà cancellata dopo il riavvio di [APP_NAME].
+ </notification>
+ <notification name="CacheWillBeMoved">
+ La cache verrà spostata dopo il riavvio di [APP_NAME].
+Nota: questa operazione cancellerà la cache.
+ </notification>
+ <notification name="ChangeConnectionPort">
+ Le impostazioni della porta avranno effetto dopo il riavvio di [APP_NAME].
+ </notification>
+ <notification name="ChangeSkin">
+ La nuova pelle comparirà dopo il riavvio di [APP_NAME].
+ </notification>
+ <notification name="ChangeLanguage">
+ La modifica della lingua avrà effetto dopo il riavvio di [APP_NAME].
+ </notification>
+ <notification name="GoToAuctionPage">
+ Vai alla pagina web [SECOND_LIFE] per vedere i dettagli dell&apos;asta oppure fai un&apos;offerta?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="SaveChanges">
+ Salva le modifiche?
+ <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Non salvare" yestext="Salva"/>
+ </notification>
+ <notification name="GestureSaveFailedTooManySteps">
+ Il salvataggio della Gesture è fallito.
+La gesture ha troppi passi.
+Prova a togliere qualche passo e quindi risalva.
+ </notification>
+ <notification name="GestureSaveFailedTryAgain">
+ Il salvataggio della gesture è fallito. Riprova fra un minuto.
+ </notification>
+ <notification name="GestureSaveFailedObjectNotFound">
+ Non è possibile salvare la gesture perchè non è stato trovato l&apos;oggetto o l&apos;inventario associato.
+L&apos;oggetto potrebbe essere troppo lontano oppure essere stato cancellato.
+ </notification>
+ <notification name="GestureSaveFailedReason">
+ C&apos;è stato un problema salvando la gesture a causa del seguente motivo: [REASON]. Riprova a salvare la gesture più tardi.
+ </notification>
+ <notification name="SaveNotecardFailObjectNotFound">
+ Non è possibile salvare la notecard perchè non è stato trovato l&apos;oggetto o l&apos;inventario associato.
+L&apos;oggetto potrebbe essere troppo lontano oppure essere stato cancellato.
+ </notification>
+ <notification name="SaveNotecardFailReason">
+ C&apos;è stato un problema salvando la notecard a causa del seguente motivo: [REASON]. Riprova a salvare la notecard più tardi.
+ </notification>
+ <notification name="ScriptCannotUndo">
+ Non è stato possibile annullare tutti i cambiamenti nella tua versione dello script.
+Vuoi ripristinare l&apos;ultima versione salvata sul server?
+(**Attenzione** Questa operazione non è reversibile)
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="SaveScriptFailReason">
+ C&apos;è stato un problema salvando lo script a causa del seguente motivo : [REASON]. Riprova a salvare lo script più tardi.
+ </notification>
+ <notification name="SaveScriptFailObjectNotFound">
+ Non è stato possibile salvare lo script perchè l&apos;oggetto che lo contiene non è stato trovato.
+L&apos;oggetto potrebbe essere troppo lontano oppure essere stato cancellato.
+ </notification>
+ <notification name="SaveBytecodeFailReason">
+ C&apos;è stato un problema salvando lo script compilato a causa del seguente motivo: [REASON]. Riprova a salvare lo script più tardi.
+ </notification>
+ <notification name="StartRegionEmpty">
+ La tua Regione di inizio non è stata definita.
+Per scegliere il luogo dove vuoi trovarti all&apos;accesso, digita il nome della regione nel campo del luogo di partenza oppure scegli La mia ultima Ubicazione o Casa mia.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CouldNotStartStopScript">
+ Non è stato possibile lanciare o fermare lo script perchè l&apos;oggetto che lo contiene non è stato trovato.
+L&apos;oggetto potrebbe essere troppo lontano oppure essere stato cancellato.
+ </notification>
+ <notification name="CannotDownloadFile">
+ Non è stato possibile scaricare il file
+ </notification>
+ <notification name="CannotWriteFile">
+ Non è stato possibile scrivere il file [[FILE]]
+ </notification>
+ <notification name="UnsupportedHardware">
+ Ti informiamo che il tuo computer non dispone dei requisiti minimi di sistema per [APP_NAME]. Il funzionamento può pertanto risultare ridotto. Purtroppo la pagina [SUPPORT_SITE] non può fornire assistenza tecnica in caso di problemi dovuti a configurazioni di sistema non compatibili.
+
+Visitare [_URL] per ulteriori informazioni?
+ <url name="url" option="0">
+ http://secondlife.com/support/sysreqs.php?lang=it
+ </url>
+ <usetemplate ignoretext="L&apos;hardware di questo computer non è compatibile" name="okcancelignore" notext="No" yestext="Si"/>
+ </notification>
+ <notification name="UnknownGPU">
+ Il tuo sistema utilizza una scheda grafica che [APP_NAME] non riconosce.
+Questo succede spesso con un nuovo hardware che non è stato ancora testato con [APP_NAME]. Probabilmente tutto andrà bene, ma devi riconfigurare le tue impostazioni grafiche.
+(Io &gt; Preferenze &gt; Grafica).
+ <form name="form">
+ <ignore name="ignore" text="La tua scheda grafica non è stata riconosciuta"/>
+ </form>
+ </notification>
+ <notification name="DisplaySettingsNoShaders">
+ L&apos;esecuzione di [APP_NAME] si è interrotta durante l&apos;inizializzazione dei driver grafici.
+La qualità grafica verrà impostata a livello basso per evitare alcuni errori comuni di driver. Alcune funzionalità grafiche saranno disattivate.
+Si consiglia di aggiornare i driver della scheda grafica.
+La qualità grafica può essere aumentata in Preferenze &gt; Grafica.
+ </notification>
+ <notification name="RegionNoTerraforming">
+ La regione [REGION] non consente di terraformare.
+ </notification>
+ <notification name="CannotCopyWarning">
+ Non hai l&apos;autorizzazione a copiare i seguenti oggetti:
+[ITEMS]
+e se li dai via, verranno eliminati dal tuo inventario. Sicuro di volere offrire questi oggetti?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
+ </notification>
+ <notification name="CannotGiveItem">
+ Impossibile consegnare l&apos;elemento dell&apos;inventario.
+ </notification>
+ <notification name="TransactionCancelled">
+ La transazione è stata annullata.
+ </notification>
+ <notification name="TooManyItems">
+ Non è possibile dare più di 42 elementi in un singolo trasferimento di inventario.
+ </notification>
+ <notification name="NoItems">
+ Non hai i permessi di trasferimento per gli elementi selezionati.
+ </notification>
+ <notification name="CannotCopyCountItems">
+ Non hai i permessi di copia per copiare [COUNT]
+degli elementi selezionati. Perderai questi elementi dal tuo inventario.
+Vuoi veramente perdere questi elementi?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
+ </notification>
+ <notification name="CannotGiveCategory">
+ Non hai i permessi per trasferire la cartella selezionata.
+ </notification>
+ <notification name="FreezeAvatar">
+ Immobilizza questo avatar?
+Non potrà temporaneamente muoversi, chiacchierare in chat, o interagire con il mondo.
+ <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Smobilizza" yestext="Immobilizza"/>
+ </notification>
+ <notification name="FreezeAvatarFullname">
+ Immobilizza [AVATAR_NAME]?
+Non potrà temporaneamente muoversi, chiacchierare in chat, o interagire con il mondo.
+ <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Smobilizza" yestext="Immobilizza"/>
+ </notification>
+ <notification name="EjectAvatarFullname">
+ Espelli [AVATAR_NAME] dal tuo terreno?
+ <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Espelli e blocca" yestext="Espelli"/>
+ </notification>
+ <notification name="EjectAvatarNoBan">
+ Espelli questo avatar dal tuo terreno?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Espelli"/>
+ </notification>
+ <notification name="EjectAvatarFullnameNoBan">
+ Espelli [AVATAR_NAME] dal tuo terreno?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Espelli"/>
+ </notification>
+ <notification name="EjectAvatarFromGroup">
+ Hai espulso [AVATAR_NAME] dal gruppo [GROUP_NAME]
+ </notification>
+ <notification name="AcquireErrorTooManyObjects">
+ ERRORE DI ACQUISIZIONE: hai selezionato troppi oggetti.
+ </notification>
+ <notification name="AcquireErrorObjectSpan">
+ ERRORE DI ACQUISIZIONE: Gli oggetti sono a cavallo di più di una regione.
+Sposta tutti gli oggetti che vuoi acquisire su una sola regione.
+ </notification>
+ <notification name="PromptGoToCurrencyPage">
+ [EXTRA]
+
+Vai su [_URL] per informazioni sull&apos;acquisto di L$?
+ <url name="url">
+ http://secondlife.com/app/currency/?lang=it-IT
+ </url>
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="UnableToLinkObjects">
+ Impossibile unire questi [COUNT] oggetti.
+Puoi unire al massimo [MAX] oggetti.
+ </notification>
+ <notification name="CannotLinkIncompleteSet">
+ Puoi unire soltanto un insieme completo di oggetti, e devi selezionare più di un oggetto.
+ </notification>
+ <notification name="CannotLinkModify">
+ Impossibile unire perchè non hai il diritto di modifica su tutti gli oggetti.
+
+Accertati che nessuno sia bloccato e che li possiedi tutti.
+ </notification>
+ <notification name="CannotLinkDifferentOwners">
+ Impossibile unire perche non tutti gli oggetti hanno lo stesso proprietario.
+
+Accertati di possedere tutti gli oggetti selezionati.
+ </notification>
+ <notification name="NoFileExtension">
+ Manca l&apos;estensione per il file: &apos;[FILE]&apos;
+
+Accertati che il file abbia una estensione corretta.
+ </notification>
+ <notification name="InvalidFileExtension">
+ L&apos;estensione [EXTENSION] del file non è valida
+Attese [VALIDS]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CannotUploadSoundFile">
+ Impossibile aprire in lettura il file di suono importato:
+[FILE]
+ </notification>
+ <notification name="SoundFileNotRIFF">
+ Il file audio non sembra essere di tipo RIFF WAVE:
+[FILE]
+ </notification>
+ <notification name="SoundFileNotPCM">
+ Il file audio non sembra essere di tipo PCM WAVE:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidChannelCount">
+ Il file ha un numero sbagliato di canali (deve essere mono oppure stereo):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidSampleRate">
+ Il file non sembra essere della frequenza di campionamento supportata (deve essere 44.1k):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidWordSize">
+ Il file non sembra avere una dimensione della parola supportata (deve essere a 8 o a 16 bit):
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidHeader">
+ Impossibile trovare il frammento &apos;data&apos; nell&apos;intestazione WAV:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidChunkSize">
+ Dimensione chunk nel file WAV:
+[FILE]
+ </notification>
+ <notification name="SoundFileInvalidTooLong">
+ Il file audio è troppo lungo (deve essere al massimo 10 secondi):
+[FILE]
+ </notification>
+ <notification name="ProblemWithFile">
+ Problemi con il file [FILE]:
+
+[ERROR]
+ </notification>
+ <notification name="CannotOpenTemporarySoundFile">
+ Impossibile aprire in scrittura il file temporaneamente compresso: [FILE]
+ </notification>
+ <notification name="UnknownVorbisEncodeFailure">
+ Errore di codifica Vorbis sconosciuta per: [FILE]
+ </notification>
+ <notification name="CannotEncodeFile">
+ Impossibile codificare il file: [FILE]
+ </notification>
+ <notification name="CorruptedProtectedDataStore">
+ Impossibile inserire nome utente e password. Ciò può succedere alla modifica delle impostazioni di rete.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CorruptResourceFile">
+ File risorsa corrotto: [FILE]
+ </notification>
+ <notification name="UnknownResourceFileVersion">
+ Versione di risorsa Linden sconosciuta nel file: [FILE]
+ </notification>
+ <notification name="UnableToCreateOutputFile">
+ Impossibile creare il file in uscita: [FILE]
+ </notification>
+ <notification name="DoNotSupportBulkAnimationUpload">
+ [APP_NAME] non supporta ancora il caricamento in blocco di file di animazione.
+ </notification>
+ <notification name="CannotUploadReason">
+ Impossibile importare il file [FILE] a causa del seguente motivo: [REASON]
+Riprova più tardi.
+ </notification>
+ <notification name="LandmarkCreated">
+ Hai aggiunto &quot;[LANDMARK_NAME]&quot; alla tua cartella [FOLDER_NAME].
+ </notification>
+ <notification name="LandmarkAlreadyExists">
+ Hai già il punto di riferimento di questo luogo.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CannotCreateLandmarkNotOwner">
+ Non puoi creare qui un landmark perchè il proprietario di questo terreno non lo consente.
+ </notification>
+ <notification name="CannotRecompileSelectObjectsNoScripts">
+ Impossibile fare la &apos;ricompilazione&apos;.
+Seleziona un oggetto con uno script.
+ </notification>
+ <notification name="CannotRecompileSelectObjectsNoPermission">
+ Impossibile fare la &apos;ricompilazione&apos;.
+
+Seleziona oggetti con script su cui hai i permessi di modifica.
+ </notification>
+ <notification name="CannotResetSelectObjectsNoScripts">
+ Impossibile fare &apos;ripristino&apos;.
+
+Seleziona oggetti con degli script.
+ </notification>
+ <notification name="CannotResetSelectObjectsNoPermission">
+ Impossibile fare &apos;ripristino&apos;.
+
+Seleziona oggetti con script su cui hai i permessi di modifica.
+ </notification>
+ <notification name="CannotOpenScriptObjectNoMod">
+ Impossibile aprire la script dell&apos;oggetto senza i diritti di modifica.
+ </notification>
+ <notification name="CannotSetRunningSelectObjectsNoScripts">
+ Impossibile mettere &apos;in esecuzione&apos; gli script.
+
+Seleziona oggetti con script.
+ </notification>
+ <notification name="CannotSetRunningNotSelectObjectsNoScripts">
+ Impossibile impostare script a &apos;non in esecuzione&apos;.
+
+Seleziona oggetti con script.
+ </notification>
+ <notification name="NoFrontmostFloater">
+ Non c&apos;è nessuna finestra in evidenza (in primo piano) da salvare.
+ </notification>
+ <notification name="SeachFilteredOnShortWords">
+ La tua ricerca è stata modificata.
+Le parole troppo corte sono state rimosse.
+
+Ho cercato: [FINALQUERY]
+ </notification>
+ <notification name="SeachFilteredOnShortWordsEmpty">
+ Le parole che hai usato per la ricerca sono troppo corte e non è stato possibile iniziare la ricerca.
+ </notification>
+ <notification name="CouldNotTeleportReason">
+ Teleport non riuscito.
+[REASON]
+ </notification>
+ <notification name="invalid_tport">
+ C&apos;è stato un problema nell&apos;elaborare la tua richiesta di teleport. Potresti dover effettuare nuovamente l&apos;accesso prima di poter usare il teleport.
+Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE].
+ </notification>
+ <notification name="invalid_region_handoff">
+ Si è verificato un problema nel tentativo di attraversare regioni. È possibile che per potere attraversare le regioni, tu debba effettuare nuovamente l&apos;accesso.
+Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE].
+ </notification>
+ <notification name="blocked_tport">
+ Spiacenti, il teletrasporto è bloccato al momento. Prova di nuovo tra pochi istanti. Se ancora non potrai teletrasportarti, per favore scollegati e ricollegati per risolvere il problema.
+ </notification>
+ <notification name="nolandmark_tport">
+ Spiacenti, ma il sistema non riesce a localizzare la destinazione del landmark
+ </notification>
+ <notification name="timeout_tport">
+ Spiacenti, il sistema non riesce a completare il teletrasporto. Riprova tra un attimo.
+ </notification>
+ <notification name="noaccess_tport">
+ Spiacenti, ma non hai accesso nel luogo di destinazione richiesto.
+ </notification>
+ <notification name="missing_attach_tport">
+ Gli oggetti da te indossati non sono ancoa arrivati. Attendi ancora qualche secondo o scollegati e ricollegati prima di provare a teleportarti.
+ </notification>
+ <notification name="too_many_uploads_tport">
+ Il server della regione è al momento occupato e la tua richiesta di teletrasporto non può essere soddisfatta entro breve tempo. Per favore prova di nuovo tra qualche minuto o spostati in un&apos;area meno affollata.
+ </notification>
+ <notification name="expired_tport">
+ Spiacenti, il sistema non riesce a soddisfare la tua richiesta di teletrasporto entro un tempo ragionevole. Riprova tra qualche minuto.
+ </notification>
+ <notification name="expired_region_handoff">
+ Spiacenti, il sistema non riesce a completare il cambio di regione entro un tempo ragionevole. Riprova tra qualche minuto.
+ </notification>
+ <notification name="no_host">
+ Impossibile trovare la destinazione del teletrasporto; potrebbe essere temporaneamente non accessibile o non esistere più. Riprovaci tra qualche minuto.
+ </notification>
+ <notification name="no_inventory_host">
+ L&apos;inventario è temporaneamente inaccessibile.
+ </notification>
+ <notification name="CannotSetLandOwnerNothingSelected">
+ Impossibile impostare il proprietario del terreno:
+Nessun terreno selezionato.
+ </notification>
+ <notification name="CannotSetLandOwnerMultipleRegions">
+ Impossibile forzare la proprietà del terreno perchè la selezione si estende su diverse regioni. Seleziona una area più piccola e riprova.
+ </notification>
+ <notification name="ForceOwnerAuctionWarning">
+ Questo lotto è all&apos;asta. La designazione di un proprietario determinerà l&apos;annullamento automatico dell&apos;asta e probabilmente può scontentare qualche residente se l&apos;asta è già iniziata.
+Vuoi designare un proprietario?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="CannotContentifyNothingSelected">
+ Impossibile fare la contentificazione:
+Nessun terreno selezionato.
+ </notification>
+ <notification name="CannotContentifyNoRegion">
+ Impossibile fare la contentificazione:
+Nessuna regione selezionata.
+ </notification>
+ <notification name="CannotReleaseLandNothingSelected">
+ Impossibile abbandonare il terreno:
+Nessun terreno selezionato.
+ </notification>
+ <notification name="CannotReleaseLandNoRegion">
+ Impossibile abbandonare il terreno:
+Non riesco a trovare la regione.
+ </notification>
+ <notification name="CannotBuyLandNothingSelected">
+ Impossibile comprare il terreno:
+Nessun terreno selezionato.
+ </notification>
+ <notification name="CannotBuyLandNoRegion">
+ Impossibile comprare il terreno:
+Non riesco a trovare la regione dove è situato il terreno.
+ </notification>
+ <notification name="CannotCloseFloaterBuyLand">
+ Non puoi chiudere la finestra Acquista terreno finché [APP_NAME] non finisce di stimare il prezzo di questa transazione.
+ </notification>
+ <notification name="CannotDeedLandNothingSelected">
+ Impossibile cedere il terreno:
+Nessun terreno selezionato.
+ </notification>
+ <notification name="CannotDeedLandNoGroup">
+ Impossibile cedere il terreno:
+Nessun gruppo selezionato.
+ </notification>
+ <notification name="CannotDeedLandNoRegion">
+ Non è possibile effettuare la cessione del terreno:
+Impossibile trovare la regione in cui si trova il terreno.
+ </notification>
+ <notification name="CannotDeedLandMultipleSelected">
+ Impossibile cedere il terreno:
+Hai selezionato più di un terreno.
+
+Prova a selezionare un solo terreno.
+ </notification>
+ <notification name="CannotDeedLandWaitingForServer">
+ Impossibile cedere il terreno:
+Sto aspettando il server per segnalare la proprietà.
+
+Riprova di nuovo.
+ </notification>
+ <notification name="CannotDeedLandNoTransfer">
+ Impossibile cedere il terreno:
+La regione [REGION] non consente il trasferimento di terreni.
+ </notification>
+ <notification name="CannotReleaseLandWatingForServer">
+ Impossibile abbandonare il terreno:
+Sto aspettando il server per aggiornare le informazioni del terreno.
+
+Riprova fra poco.
+ </notification>
+ <notification name="CannotReleaseLandSelected">
+ Impossibile abbandonare il terreno:
+Non possiedi tutti i terreni selezionati.
+
+Seleziona un solo terreno.
+ </notification>
+ <notification name="CannotReleaseLandDontOwn">
+ Impossibile abbandonare il terreno:
+Non hai i permessi per rilasciare questo terreno.
+I terreni di tua proprietà vengono visualizzati in verde.
+ </notification>
+ <notification name="CannotReleaseLandRegionNotFound">
+ Non è possibile abbandonare il terreno:
+Impossibile trovare la regione in cui si trova il terreno.
+ </notification>
+ <notification name="CannotReleaseLandNoTransfer">
+ Impossibile abbandonare il terreno:
+La regione [REGION] non consente il trasferimento di terreni.
+ </notification>
+ <notification name="CannotReleaseLandPartialSelection">
+ Impossibile abbandonare il terreno:
+Devi selezionare un terreno intero per rilasciarla.
+
+Seleziona un terreno intero, oppure dividi prima il tuo terreno.
+ </notification>
+ <notification name="ReleaseLandWarning">
+ Stai per rilasciare [AREA] m² di terreno.
+Rilasciare questo appezzamento di terreno lo toglierà dalle tue proprietà, ma non ti verranno dati L$.
+
+Rilasciare questo terreno?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="CannotDivideLandNothingSelected">
+ Impossibile dividere il terreno:
+
+Non sono stati selezionati terreni.
+ </notification>
+ <notification name="CannotDivideLandPartialSelection">
+ Impossibile dividere il terreno:
+
+Hai selezionato unintero terreno.
+Prova a selezionare unappezzamento di terreno.
+ </notification>
+ <notification name="LandDivideWarning">
+ La suddivisione di questo terreno lo dividerà in due parti ed ognuna potrà avere le sue impostazioni. Alcune impostazioni verranno reimpostate ai valori iniziali dopo l&apos;operazione.
+
+Dividi il terreno?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="CannotDivideLandNoRegion">
+ Non è possibile suddividere il terreno:
+Impossibile trovare la regione in cui si trova il terreno.
+ </notification>
+ <notification name="CannotJoinLandNoRegion">
+ Non è possibile unire il terreno:
+Impossibile trovare la regione in cui si trova il terreno.
+ </notification>
+ <notification name="CannotJoinLandNothingSelected">
+ Impossibile unire il terreno:
+Non hai selezionato terreno.
+ </notification>
+ <notification name="CannotJoinLandEntireParcelSelected">
+ Impossibile unire il terreno:
+Hai selezionato un solo terreno.
+
+Devi selezionare il terreno comprendendo entrambi gli appezzamenti.
+ </notification>
+ <notification name="CannotJoinLandSelection">
+ Impossibile unire il terreno:
+Devi selezionare più di un terreno.
+
+Devi selezionare il terreno comprendendo entrambi gli appezzamenti.
+ </notification>
+ <notification name="JoinLandWarning">
+ Unire questi appezzamenti creerà un terreno più grande a partire da tutti gli appezzamenti che si intersecano nel rettangolo selezionato.
+Dovrai reimpostare il nome e le opzioni del nuovo terreno.
+
+Unisci il terreno?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmNotecardSave">
+ Questa notecard deve essere salvata prima che l&apos;elemento possa essere copiato o visualizzato. Salva la notecard?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmItemCopy">
+ Copia questo elemento nel tuo inventario?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Copia"/>
+ </notification>
+ <notification name="ResolutionSwitchFail">
+ Non sono riuscito a cambiare la risoluzione al valore [RESX] x [RESY]
+ </notification>
+ <notification name="ErrorUndefinedGrasses">
+ Errore: Erba sconosciuta: [SPECIES]
+ </notification>
+ <notification name="ErrorUndefinedTrees">
+ Errore: Alberi sconosciuti: [SPECIES]
+ </notification>
+ <notification name="CannotSaveWearableOutOfSpace">
+ Impossibile salvare &apos;[NAME]&apos; nel file di oggetti indossabili. Dovrai liberare dello spazio sul tuo computer e salvare di nuovo.
+ </notification>
+ <notification name="CannotSaveToAssetStore">
+ Non è possibile salvare [NAME] nel database centrale degli asset.
+In genere si tratta di un problema temporaneo. Attendi alcuni minuti per modificare e salvare nuovamente gli elementi indossabili.
+ </notification>
+ <notification name="YouHaveBeenLoggedOut">
+ Sei stato scollegato da [SECOND_LIFE].
+ [MESSAGE]
+ <usetemplate name="okcancelbuttons" notext="Esci" yestext="Vedi IM &amp; Chat"/>
+ </notification>
+ <notification name="OnlyOfficerCanBuyLand">
+ Impossibile comprare terreno per il gruppo:
+Non hai i permessi per comprare il terreno per il tuo gruppo attivo.
+ </notification>
+ <notification label="Aggiungi Amico" name="AddFriendWithMessage">
+ Gli amici possono autorizzarsi a vedersi l&apos;un l&apos;altro sulla mappa e sapere quando sono collegati.
+
+Offri l&apos;amicizia a [NAME]?
+ <form name="form">
+ <input name="message">
+ Vorresti essere mio amico?
+ </input>
+ <button name="Offer" text="OK"/>
+ <button name="Cancel" text="Annulla"/>
+ </form>
+ </notification>
+ <notification label="Salva vestiario" name="SaveOutfitAs">
+ Salva gli abiti che indosso come nuovo vestiario:
+ <form name="form">
+ <input name="message">
+ [DESC] (nuovo)
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Annulla"/>
+ </form>
+ </notification>
+ <notification label="Salva capo da indossare" name="SaveWearableAs">
+ Salva oggetto nel mio inventario come:
+ <form name="form">
+ <input name="message">
+ [DESC] (nuovo)
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Annulla"/>
+ </form>
+ </notification>
+ <notification label="Cambia nome del vestiario" name="RenameOutfit">
+ Nuovo nome per il vestiario:
+ <form name="form">
+ <input name="new_name">
+ [NAME]
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Annulla"/>
+ </form>
+ </notification>
+ <notification name="RemoveFromFriends">
+ Vuoi rimuovere [NAME] dalla lista dei tuoi amici?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="RemoveMultipleFromFriends">
+ Vuoi rimuovere gli amici selezionati dalla lista dei tuoi amici?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="GodDeleteAllScriptedPublicObjectsByUser">
+ Confermi di volere cancellare tutti gli oggetti scriptati della proprietà di
+** [AVATAR_NAME] **
+su tutti gli altri terreni di questa sim?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="GodDeleteAllScriptedObjectsByUser">
+ Confermi la CANCELLAZIONE di TUTTI gli oggetti scriptati posseduti da
+** [AVATAR_NAME] **
+su TUTTI I TERRENI di questa sim?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="GodDeleteAllObjectsByUser">
+ Confermi la CANCELLAZIONE di TUTTI gli oggetti (scriptati o no) posseduti da
+** [AVATAR_NAME] **
+su TUTTI I TERRENI di questa sim?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="BlankClassifiedName">
+ Devi specificare un nome per il tuo annuncio.
+ </notification>
+ <notification name="MinClassifiedPrice">
+ Il prezzo da pagare per essere messo in lista deve essere almeno [MIN_PRICE]L$.
+
+Introduci un prezzo più alto.
+ </notification>
+ <notification name="ConfirmItemDeleteHasLinks">
+ Almeno uno degli oggetti selezionati è collegato tramite link ad altri oggetti. Se elimini l&apos;oggetto, i relativi link non funzioneranno più. Pertanto si consiglia vivamente di eliminare prima i link.
+
+Sei sicuro di volere eliminare gli oggetti?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLock">
+ Almeno uno degli elementi selezionati è bloccato.
+
+Confermi di voler cancellare questi elementi?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoCopy">
+ Almeno uno degli elementi selezionati non è copiabile.
+
+Confermi di voler cancellare questi elementi?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoOwn">
+ Non possiedi neanche uno degli oggetti selezionati.
+
+Confermi di voler cancellare questi elementi?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoCopy">
+ Almeno un oggetto è bloccato.
+Almeno un oggetto è non copiabile.
+
+Confermi di voler cancellare questi elementi?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoOwn">
+ Almeno un oggetto è bloccato.
+Non possiedi neanche un oggetto.
+
+Confermi di voler cancellare questi elementi?
+ <usetemplate name="okcancelbuttons" notext="Cancella" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoCopyNoOwn">
+ Almeno un oggetto non è copiabile.
+Non possiedi neanche un oggetto.
+
+Confermi di voler cancellare questi elementi?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
+ Almeno un oggetto è bloccato.
+Almeno un oggetto è non copiabile.
+Non possiedi neanche un oggetto.
+
+Confermi di voler cancellare questi elementi?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectTakeLock">
+ Almeno un oggetto è bloccato.
+
+Confermi di voler prendere questi elementi?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectTakeNoOwn">
+ Non possiedi tutti gli oggetti che stai prendendo.
+Se continui, verranno applicate i permessi per il prossimo proprietario e di conseguenza potrebbero venire ristrette le tue possibilità di modificarli o di copiarli.
+
+Confermi di voler prendere questi elementi?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectTakeLockNoOwn">
+ Almeno un oggetto è bloccato.
+Non possiedi tutti gli oggetti che stai prendendo.
+Se continui, verranno applicate i permessi per il prossimo proprietario e di conseguenza potrebbero venire ristrette le tue possibilità di modificarli o di copiarli.
+Puoi comunque prendere gli oggetti selezionati.
+
+Confermi di voler prendere questi elementi?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="CantBuyLandAcrossMultipleRegions">
+ Impossibile comprare il terreno perchè la selezione comprende più regioni.
+
+Seleziona un&apos;area più piccola e riprova.
+ </notification>
+ <notification name="DeedLandToGroup">
+ Cedendo questo terreno al gruppo sara richiesto ai componenti di avere e di mantenere il terreno con un credito sufficiente.
+Il prezzo di acquisto del terreno non è rifondibile al proprietario.
+Se una terreno ceduto al gruppo viene venduto, il prezzo di vendita verrà diviso in parti uguali fra i membri del gruppo.
+
+Cedi questo terreno di [AREA] m² al gruppo &apos;[GROUP_NAME]&apos;?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="DeedLandToGroupWithContribution">
+ Completando la cessione del lotto, il gruppo dovrà avere e mantenere crediti sufficienti per l&apos;uso del terreno.
+La cessione includerà un contributo contemporaneo di terreno al gruppo da &apos;[NAME]&apos;.
+Il prezzo di acquisto del terreno non viene rimborsato al proprietario. Se un lotto ceduto viene venduto, il prezzo di vendita viene distribuito in maniera paritetica tra i membri del gruppo.
+
+Cedere questi [AREA] m² di terreno al gruppo &apos;[GROUP_NAME]&apos;?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="DisplaySetToSafe">
+ Le impostazioni dello schermo sono state impostate a valori di sicurezza perchè hai specificato l&apos;opzione -safe.
+ </notification>
+ <notification name="DisplaySetToRecommended">
+ Le impostazioni dello schermo sono state impostate a valori ottimali basati sulla tua configurazione di sistema.
+ </notification>
+ <notification name="ErrorMessage">
+ [ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AvatarMovedDesired">
+ L&apos;ubicazione prescelta non è attualmente disponibile.
+Sei stato trasferito in una regione vicina.
+ </notification>
+ <notification name="AvatarMovedLast">
+ La tua ultima posizione non è al momento disponibile.
+Sei stato trasferito in una regione vicina.
+ </notification>
+ <notification name="AvatarMovedHome">
+ L&apos;ubicazione di casa tua non è al momento disponibile.
+Sei stato trasferito in una regione vicina.
+Ti consigliamo di impostare una nuova posizione iniziale.
+ </notification>
+ <notification name="ClothingLoading">
+ Gli abiti sono in corso di scaricamento.
+Puoi comunque usare [SECOND_LIFE] normalmente e gli altri residenti ti vedranno correttamente.
+ <form name="form">
+ <ignore name="ignore" text="Lo scaricamento sta richiedendo parecchio tempo"/>
+ </form>
+ </notification>
+ <notification name="FirstRun">
+ L&apos;installazione di [APP_NAME] è terminata.
+
+Se questa è la prima volta che usi [SECOND_LIFE], devi creare un account prima che tu possa effettuare l&apos;accesso.
+Vuoi tornare a [http://join.secondlife.com secondlife.com] per creare un nuovo account?
+ <usetemplate name="okcancelbuttons" notext="Continua" yestext="Nuovo Account..."/>
+ </notification>
+ <notification name="LoginPacketNeverReceived">
+ Ci sono problemi di connessione. È possibile che ci siano problemi con la tua connessione Internet oppure sulla [SECOND_LIFE_GRID].
+
+Controlla la tua connessione Internet e riprova fra qualche minuto, oppure clicca su Aiuto per visualizzare la pagina [SUPPORT_SITE], oppure clicca su Teleport per tentare il teleport a casa tua.
+ <url name="url">
+ http://it.secondlife.com/support/
+ </url>
+ <form name="form">
+ <button name="OK" text="OK"/>
+ <button name="Help" text="Aiuto"/>
+ <button name="Teleport" text="Teleportati"/>
+ </form>
+ </notification>
+ <notification name="WelcomeChooseSex">
+ Il tuo avatar apparirà fra un attimo.
+
+Usa le frecce per muoverti.
+Premi F1 in qualunque momento per la guida o per apprendere altre cose di [SECOND_LIFE].
+Scegli un avatar maschile o femminile. Puoi sempre cambiare idea più tardi.
+ <usetemplate name="okcancelbuttons" notext="Femminile" yestext="Maschile"/>
+ </notification>
+ <notification name="CantTeleportToGrid">
+ Impossibile effettuare il teleport su [SLURL], in quanto si trova su una griglia ([GRID]) diversa da quella attuale ([CURRENT_GRID]). Chiudi il viewer e prova nuovamente.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GeneralCertificateError">
+ Impossibile collegarsi al server.
+[REASON]
+
+Nome oggetto: [SUBJECT_NAME_STRING]
+Nome emittente: [ISSUER_NAME_STRING]
+Valido da: [VALID_FROM]
+Valido fino a: [VALID_TO]
+Impronta MD5: [SHA1_DIGEST]
+Impronta SHA1: [MD5_DIGEST]
+Uso chiave: [KEYUSAGE]
+Uso chiave estesa: [EXTENDEDKEYUSAGE]
+Identificatore chiave oggetto: [SUBJECTKEYIDENTIFIER]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TrustCertificateError">
+ Autorità di certificazione di questo server sconosciuta.
+
+Informazioni sul certificato:
+Nome oggetto: [SUBJECT_NAME_STRING]
+Nome emittente: [ISSUER_NAME_STRING]
+Valido da: [VALID_FROM]
+Valido fino a: [VALID_TO]
+Impronta MD5: [SHA1_DIGEST]
+Impronta SHA1: [MD5_DIGEST]
+Uso chiave: [KEYUSAGE]
+Uso chiave estesa: [EXTENDEDKEYUSAGE]
+Identificatore chiave oggetto: [SUBJECTKEYIDENTIFIER]
+
+Accettare questa autorità?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Accetta"/>
+ </notification>
+ <notification name="NotEnoughCurrency">
+ [NAME] [PRICE]L$ Non hai abbastanza L$ per farlo.
+ </notification>
+ <notification name="GrantedModifyRights">
+ [NAME] ti ha dato il permesso di modificare i suoi oggetti.
+ </notification>
+ <notification name="RevokedModifyRights">
+ Non sei più autorizzato a modificare gli oggetti di [NAME]
+ </notification>
+ <notification name="FlushMapVisibilityCaches">
+ Questo reinizializzerà la cache della mappa di questa regione.
+Funzione usata solo per il debug.
+(Per la produzione, attendere 5 minuti, dopo di che tutte le mappe di ognuno si aggiorneranno dopo la loro riconnessione)
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="BuyOneObjectOnly">
+ Non è possibile acquistare più di un oggetto alla volta. Riprova selezionando un solo oggetto.
+ </notification>
+ <notification name="OnlyCopyContentsOfSingleItem">
+ Impossibile copiare il contenuto di più di un elemento alla volta.
+Scegli solo un oggetto e riprova.
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="KickUsersFromRegion">
+ Teleporta a casa tutti i residenti in questa regione?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="EstateObjectReturn">
+ Confermi di voler restituire gli oggetti di proprietà di [USER_NAME] ?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="InvalidTerrainBitDepth">
+ Impossibile impostare le texture della regione:
+La texture del terreno [TEXTURE_NUM] ha una profondità di bit pari a [TEXTURE_BIT_DEPTH] non corretta.
+
+Sostituisci la texture [TEXTURE_NUM] con una a 24-bit 512x512 o una immagine più piccola e quindi clicca nuovamente su &apos;Applica&apos;.
+ </notification>
+ <notification name="InvalidTerrainSize">
+ Impossibile impostare le texture di regione:
+La texture del terreno [TEXTURE_NUM] è troppo grande se a [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y].
+
+Sostituisci la texture [TEXTURE_NUM] con una a 24-bit 512x512 oppure con una immagine più piccola e quindi clicca di nuovo &apos;Applica&apos;.
+ </notification>
+ <notification name="RawUploadStarted">
+ Importazione iniziata. Può impiegare fino a due minuti, a seconda della velocità della tua connessione.
+ </notification>
+ <notification name="ConfirmBakeTerrain">
+ Vuoi veramente impostare come base il terreno corrente, impostarlo come riferimento per i limiti dei rialzi/abbassamenti di tutto il territorio ed il suo valore impostato come base per lo strumento &apos;Ripristina&apos;?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="MaxAllowedAgentOnRegion">
+ Puoi avere al massimo [MAX_AGENTS] residenti consentiti.
+ </notification>
+ <notification name="MaxBannedAgentsOnRegion">
+ Puoi avere al massimo [MAX_BANNED] residenti bloccati.
+ </notification>
+ <notification name="MaxAgentOnRegionBatch">
+ E&apos; fallito il tentativo di aggiungere [NUM_ADDED] avatar:
+Eccede il [MAX_AGENTS] [LIST_TYPE] limite di [NUM_EXCESS].
+ </notification>
+ <notification name="MaxAllowedGroupsOnRegion">
+ Puoi avere al massimo [MAX_GROUPS] gruppi.
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Imposta come predefinito"/>
+ </notification>
+ <notification name="MaxManagersOnRegion">
+ Puoi avere al massimo [MAX_MANAGER] manager della proprietà immobiliare.
+ </notification>
+ <notification name="OwnerCanNotBeDenied">
+ Impossibile aggiungere i proprietari della proprietà immobiliare alla lista dei residenti bloccati.
+ </notification>
+ <notification name="CanNotChangeAppearanceUntilLoaded">
+ Impossibile cambiare l&apos;aspetto fisico finchè gli abiti e i vestiti non sono caricati.
+ </notification>
+ <notification name="ClassifiedMustBeAlphanumeric">
+ Il nome del tuo annuncio deve iniziare con una lettera da A a Z oppure con un numero.
+Non sono consentiti caratteri di punteggiatura.
+ </notification>
+ <notification name="CantSetBuyObject">
+ Impossibile impostare &apos;Compra l&apos;oggetto&apos;, perchè l&apos;oggetto non è in vendita.
+Imposta l&apos;oggetto per la vendita e riprova.
+ </notification>
+ <notification name="FinishedRawDownload">
+ Hai terminato di scaricare il file del terreno nella cartella:
+[DOWNLOAD_PATH].
+ </notification>
+ <notification name="DownloadWindowsMandatory">
+ È disponibile una nuova versione di [APP_NAME].
+[MESSAGE]
+Devi scaricare questo aggiornamento per utilizzare [APP_NAME].
+ <usetemplate name="okcancelbuttons" notext="Esci" yestext="Scarica l&apos;aggiornamento"/>
+ </notification>
+ <notification name="DownloadWindows">
+ È disponibile una versione aggiornata di [APP_NAME].
+[MESSAGE]
+Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per migliorare il rendimento e la stabilità.
+ <usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica l&apos;aggiornamento"/>
+ </notification>
+ <notification name="DownloadWindowsReleaseForDownload">
+ È disponibile una versione aggiornata di [APP_NAME].
+[MESSAGE]
+Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per migliorare il rendimento e la stabilità.
+ <usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica l&apos;aggiornamento"/>
+ </notification>
+ <notification name="DownloadLinuxMandatory">
+ È disponibile una nuova versione di [APP_NAME].
+[MESSAGE]
+Devi scaricare questo aggiornamento per utilizzare [APP_NAME].
+ <usetemplate name="okcancelbuttons" notext="Esci" yestext="Scarica"/>
+ </notification>
+ <notification name="DownloadLinux">
+ È disponibile una versione aggiornata di [APP_NAME].
+[MESSAGE]
+Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per migliorare il rendimento e la stabilità.
+ <usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica"/>
+ </notification>
+ <notification name="DownloadLinuxReleaseForDownload">
+ È disponibile una versione aggiornata di [APP_NAME].
+[MESSAGE]
+Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per migliorare il rendimento e la stabilità.
+ <usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica"/>
+ </notification>
+ <notification name="DownloadMacMandatory">
+ È disponibile una nuova versione di [APP_NAME].
+[MESSAGE]
+Devi scaricare questo aggiornamento per utilizzare [APP_NAME].
+
+Scaricare nella cartella Applicazioni?
+ <usetemplate name="okcancelbuttons" notext="Esci" yestext="Scarica l&apos;aggiornamento"/>
+ </notification>
+ <notification name="DownloadMac">
+ È disponibile una versione aggiornata di [APP_NAME].
+[MESSAGE]
+Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per migliorare il rendimento e la stabilità.
+
+Scaricare nella cartella Applicazioni?
+ <usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica l&apos;aggiornamento"/>
+ </notification>
+ <notification name="DownloadMacReleaseForDownload">
+ È disponibile una versione aggiornata di [APP_NAME].
+[MESSAGE]
+Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per migliorare il rendimento e la stabilità.
+
+Scaricare nella cartella Applicazioni?
+ <usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica l&apos;aggiornamento"/>
+ </notification>
+ <notification name="FailedUpdateInstall">
+ Si è verificato un errore durante l&apos;aggiornamento del viewer.
+Scarica e installa la versione più recente del viewer da
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FailedRequiredUpdateInstall">
+ Non è stato possibile installare un aggiornamento richiesto.
+Non potrai accedere fino a quando non verrà aggiornato [APP_NAME].
+
+Scarica e installa la versione più recente del viewer da
+http://secondlife.com/download.
+ <usetemplate name="okbutton" yestext="Esci"/>
+ </notification>
+ <notification name="UpdaterServiceNotRunning">
+ È disponibile un aggiornamento obbligatorio per l&apos;installazione di Second Life.
+
+Puoi scaricare questo aggiornamento da http://www.secondlife.com/downloads
+oppure puoi installarlo adesso.
+ <usetemplate name="okcancelbuttons" notext="Esci da Second Life" yestext="Scarica e aggiorna adesso"/>
+ </notification>
+ <notification name="DownloadBackgroundTip">
+ È stato scaricato un aggiornamento dell&apos;installazione di [APP_NAME].
+Versione [VERSION] [[RELEASE_NOTES_FULL_URL] Informazioni su questo aggiornamento]
+ <usetemplate name="okcancelbuttons" notext="Più tardi..." yestext="Installa ora e riavvia [APP_NAME]"/>
+ </notification>
+ <notification name="DownloadBackgroundDialog">
+ È stato scaricato un aggiornamento dell&apos;installazione di [APP_NAME].
+Versione [VERSION] [[RELEASE_NOTES_FULL_URL] Informazioni su questo aggiornamento]
+ <usetemplate name="okcancelbuttons" notext="Più tardi..." yestext="Installa ora e riavvia [APP_NAME]"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedVerboseDialog">
+ È stato scaricato un aggiornamento obbligatorio del software.
+Versione [VERSION]
+
+Per installare l&apos;aggiornamento è necessario riavviare [APP_NAME].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedDialog">
+ Per installare l&apos;aggiornamento è necessario riavviare [APP_NAME].
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="DeedObjectToGroup">
+ La cessione di questo oggetto farà in modo che il gruppo:
+* Riceva i L$ pagati all&apos;oggetto
+ <usetemplate ignoretext="Conferma la cessione di un oggetto al gruppo" name="okcancelignore" notext="Annulla" yestext="Cedi"/>
+ </notification>
+ <notification name="WebLaunchExternalTarget">
+ Vuoi aprire il browser per vedere questi contenuti?
+ <usetemplate ignoretext="Lancia il browser per consultare una pagina web" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchJoinNow">
+ Vuoi andare su [http://secondlife.com/account/ Dashboard] per gestire il tuo account?
+ <usetemplate ignoretext="Lancia il browser per gestire il mio account" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchSecurityIssues">
+ Visita la Wiki di [SECOND_LIFE] per i dettagli su come segnalare un problema di sicurezza.
+ <usetemplate ignoretext="Lancia il browser per imparare a segnalare un problema di sicurezza" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchQAWiki">
+ Visita il controllo di qualità Wiki [SECOND_LIFE].
+ <usetemplate ignoretext="Lancia il browser per vedere la pagina Wiki sul controllo di qualità" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchPublicIssue">
+ Visita il registro pubblico dei problemi di [SECOND_LIFE], dove puoi segnalare bug ed altri problemi.
+ <usetemplate ignoretext="Lancia il browser per vedere il registro pubblico di monitoraggio dei problemi" name="okcancelignore" notext="Annulla" yestext="Vai alla pagina"/>
+ </notification>
+ <notification name="WebLaunchSupportWiki">
+ Vai al blog ufficiale Linden, per le ultime notizie ed informazioni.
+ <usetemplate ignoretext="Lancia il browser per vedere il blog" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchLSLGuide">
+ Vuoi aprire la Guida per lo scripting per avere aiuto con lo scripting?
+ <usetemplate ignoretext="Lancia il browser per vedere la Guida per lo scripting" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchLSLWiki">
+ Vuoi visitare il Portale LSL per avere aiuto con lo scripting?
+ <usetemplate ignoretext="Lancia il browser per vedere il Portale LSL" name="okcancelignore" notext="Annulla" yestext="Vai alla pagina"/>
+ </notification>
+ <notification name="ReturnToOwner">
+ Confermi di voler restituire gli oggetti selezionati ai loro proprietari? Gli oggetti trasferibili ceduti al gruppo, verranno restituiti ai proprietari precedenti.
+
+*ATTENZIONE* Gli oggetti ceduti non trasferibili verranno cancellati!
+ <usetemplate ignoretext="Conferma prima di restituire gli oggetti ai relativi proprietari" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="GroupLeaveConfirmMember">
+ Sei attualmente un membro del gruppo [GROUP].
+Vuoi lasciare il gruppo?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmKick">
+ Vuoi veramente espellere tutti i residenti dalla griglia?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Espelli tutti i residenti"/>
+ </notification>
+ <notification name="MuteLinden">
+ Spiacenti, non puoi bloccare un Linden.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CannotStartAuctionAlreadyForSale">
+ Non è possibile mettere in vendita all&apos;asta un terreno che è già impostato per la vendita. Disabilita la vendita del terreno, se sei certo di voler avviare una vendita all&apos;asta.
+ </notification>
+ <notification label="Il blocco dell&apos;oggetto in base al nome non è riuscito," name="MuteByNameFailed">
+ hai già bloccato questo nome.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RemoveItemWarn">
+ Sebbene consentita, la cancellazione di contenuti può danneggiare l&apos;oggetto.
+Vuoi cancellare quell&apos;elemento?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="CantOfferCallingCard">
+ Impossibile offrire un biglietto da visita in questo momento. Riprova fra poco.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CantOfferFriendship">
+ Impossibile offrire l&apos;amicizia in questo momento. Riprova fra poco.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="BusyModeSet">
+ È stata impostata la modalità Non disponibile.
+La chat e gli IM verranno nascosti. Gli IM riceveranno la tua risposta di Non disponibile. Tutte le offerte di teleport verranno rifiutate. Tutte le offerte di Inventario andranno nel Cestino.
+ <usetemplate ignoretext="Cambio il mio stato sulla modalità Non disponibile" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="JoinedTooManyGroupsMember">
+ Hai raggiunto il numero massimo di gruppi. Per favore abbandona almeno un gruppo prima di aderire a questo, oppure declina l&apos;offerta.
+[NAME] ti invita ad aderire ad un gruppo.
+ <usetemplate name="okcancelbuttons" notext="Declino" yestext="Unisciti"/>
+ </notification>
+ <notification name="JoinedTooManyGroups">
+ Hai raggiunto il numero massimo di gruppi. Per favore abbandona almeno un gruppo prima di aderire o crearne uno nuovo.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="KickUser">
+ Espelli questo residente con quale messaggio?
+ <form name="form">
+ <input name="message">
+ Un amministratore ti ha disconnesso.
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Annulla"/>
+ </form>
+ </notification>
+ <notification name="KickAllUsers">
+ Espelli tutti quelli che sono sulla griglia con quale messaggio?
+ <form name="form">
+ <input name="message">
+ Un amministratore ti ha disconnesso.
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Annulla"/>
+ </form>
+ </notification>
+ <notification name="FreezeUser">
+ Congela questo residente con quale messaggio?
+ <form name="form">
+ <input name="message">
+ Sei stato immobilizzato. Non puoi muoverti o usare la chat. Un amministratore ti contatterà con un messaggio (IM).
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Annulla"/>
+ </form>
+ </notification>
+ <notification name="UnFreezeUser">
+ Scongela questo residente con quale messaggio?
+ <form name="form">
+ <input name="message">
+ Non sei più immobilizzato.
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Annulla"/>
+ </form>
+ </notification>
+ <notification name="SetDisplayNameSuccess">
+ Ciao [DISPLAY_NAME]!
+
+Come nel modo reale, prima che tutti conoscano il tuo nuovo nome ci vorrà del tempo. Saranno necessari alcuni giorni per [http://wiki.secondlife.com/wiki/Setting_your_display_name l&apos;aggiornamento del nome] in oggetti, script, ricerca, ecc.
+ </notification>
+ <notification name="SetDisplayNameBlocked">
+ Non puoi cambiare il tuo nome visualizzato. Se ritieni che si tratta di un errore, contatta l&apos;assistenza.
+ </notification>
+ <notification name="SetDisplayNameFailedLength">
+ Il nome è troppo lungo. La lunghezza massima dei nomi visualizzati è di [LENGTH] caratteri.
+
+Riprova con un nome più corto.
+ </notification>
+ <notification name="SetDisplayNameFailedGeneric">
+ Non è possibile impostare il tuo nome visualizzato. Riprova più tardi.
+ </notification>
+ <notification name="SetDisplayNameMismatch">
+ I nomi visualizzati inseriti non corrispondono. Inseriscili nuovamente.
+ </notification>
+ <notification name="AgentDisplayNameUpdateThresholdExceeded">
+ Devi aspettare prima di cambiare il nome visualizzato.
+
+Vedi http://wiki.secondlife.com/wiki/Setting_your_display_name
+
+Riprova più tardi.
+ </notification>
+ <notification name="AgentDisplayNameSetBlocked">
+ Non è possibile impostare il nome richiesto perché contiene una parola vietata.
+
+ Riprova con un altro nome.
+ </notification>
+ <notification name="AgentDisplayNameSetInvalidUnicode">
+ Il nome visualizzato scelto contiene caratteri non validi.
+ </notification>
+ <notification name="AgentDisplayNameSetOnlyPunctuation">
+ Il nome visualizzato deve contenere lettere, non solo segni di punteggiatura.
+ </notification>
+ <notification name="DisplayNameUpdate">
+ [OLD_NAME] ([SLID]) ha il nuovo nome [NEW_NAME].
+ </notification>
+ <notification name="OfferTeleport">
+ Offri un teleport nel posto dove sei con il seguente messaggio?
+ <form name="form">
+ <input name="message">
+ Raggiungimi a [REGION]
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Annulla"/>
+ </form>
+ </notification>
+ <notification name="OfferTeleportFromGod">
+ Chiedere, in qualità di Admin, al residente di raggiungerti?
+ <form name="form">
+ <input name="message">
+ Raggiungimi in [REGION]
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Annulla"/>
+ </form>
+ </notification>
+ <notification name="TeleportFromLandmark">
+ Sei sicuro di volere il teleport a &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
+ <usetemplate ignoretext="Conferma il teleport verso un punto di riferimento" name="okcancelignore" notext="Annulla" yestext="Teleportati"/>
+ </notification>
+ <notification name="TeleportToPick">
+ Teleport a [PICK]?
+ <usetemplate ignoretext="Conferma che voglio il teleport verso l&apos;ubicazione nei Luoghi preferiti" name="okcancelignore" notext="Annulla" yestext="Teleport"/>
+ </notification>
+ <notification name="TeleportToClassified">
+ Teleport a [CLASSIFIED]?
+ <usetemplate ignoretext="Conferma il teleport verso questa posizione negli annunci" name="okcancelignore" notext="Annulla" yestext="Teleport"/>
+ </notification>
+ <notification name="TeleportToHistoryEntry">
+ Teleport a [HISTORY_ENTRY]?
+ <usetemplate ignoretext="Conferma il teleport verso un luogo che compare nella cronologia" name="okcancelignore" notext="Annulla" yestext="Teleport"/>
+ </notification>
+ <notification label="Manda un messaggio a tutti nella tua proprietà" name="MessageEstate">
+ Scrivi un annuncio breve che verrà mandato a tutti quelli che sono in questo momento nella tua proprietà.
+ <form name="form">
+ <input name="message"/>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Annulla"/>
+ </form>
+ </notification>
+ <notification label="Cambia la tipologia della proprietà Linden" name="ChangeLindenEstate">
+ Stai per apportare modifiche ad una proprietà che appartiene a Linden (continente, teen grid, orientamento e così via).
+
+Questa è un&apos;operazione da effettuare con molta cautela, in quanto può incidere profondamente sulla vita dei residenti in Second Life. Sul continente, l&apos;azione modificherà migliaia di regioni e creerà un grosso carico sul server.
+
+Vuoi procedere?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification label="Cambia la tipologia Linden di accesso alla proprietà" name="ChangeLindenAccess">
+ Stai per cambiare la lista di accesso per una proprietà Linden (mainland, griglia minorenni, orientamento, ecc.).
+
+Questo è PERICOLOSO e dovrebbe essere fatto soltanto per poter lanciare il programma che consente agli oggetti/L$ di essere trasferiti fra griglie diverse.
+Cambierà migliaia di regioni e produrrà seri problemi ai vari server.
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification label="Seleziona la proprietà" name="EstateAllowedAgentAdd">
+ Aggiungi alla lista di accesso solo per questa proprietà oppure per [ALL_ESTATES]?
+ <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà" yestext="Questa proprietà"/>
+ </notification>
+ <notification label="Seleziona la proprietà" name="EstateAllowedAgentRemove">
+ Rimuovi dalla lista di accesso solo per questa proprietà oppure per [ALL_ESTATES]?
+ <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà" yestext="Questa proprietà"/>
+ </notification>
+ <notification label="Seleziona la proprietà" name="EstateAllowedGroupAdd">
+ Aggiungi al gruppo di accesso solo per questa proprietà oppure per [ALL_ESTATES]?
+ <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà" yestext="Questa proprietà"/>
+ </notification>
+ <notification label="Seleziona la proprietà" name="EstateAllowedGroupRemove">
+ Rimuovi dal gruppo di accesso solo per questa proprietà oppure per [ALL_ESTATES]?
+ <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà" yestext="Questa proprietà"/>
+ </notification>
+ <notification label="Seleziona la proprietà" name="EstateBannedAgentAdd">
+ Rifiuta l&apos;accesso solo a questa proprietà oppure per [ALL_ESTATES]?
+ <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà" yestext="Questa proprietà"/>
+ </notification>
+ <notification label="Seleziona la proprietà" name="EstateBannedAgentRemove">
+ Rimuovi questo residente dalla lista dei residenti bloccati nell&apos;accesso solo a questa proprietà oppure per [ALL_ESTATES]?
+ <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà" yestext="Questa proprietà"/>
+ </notification>
+ <notification label="Seleziona la proprietà" name="EstateManagerAdd">
+ Aggiungi come gestore della proprietà solo a questa proprietà oppure per [ALL_ESTATES]?
+ <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà" yestext="Questa proprietà"/>
+ </notification>
+ <notification label="Seleziona la proprietà" name="EstateManagerRemove">
+ Rimuovi come gestore della proprietà solo per questa proprietà oppure per [ALL_ESTATES]?
+ <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Tutte le proprietà" yestext="Questa proprietà"/>
+ </notification>
+ <notification label="Conferma espulsione" name="EstateKickUser">
+ Espelli [EVIL_USER] da questa proprietà?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="EstateChangeCovenant">
+ Confermi di voler cambiare il Regolamento della proprietà?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked">
+ Non sei ammesso in questa regione a causa della tua categoria di accesso. Questo può risultare da una mancanza di informazioni necessarie per convalidare la tua età.
+
+Verifica di avere installato l&apos;ultima versione del programma e vai alla Knowledge Base per ulteriori informazioni su come accedere nelle zone con tale categoria di accesso.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_KB">
+ Non sei ammesso in questa regione a causa della tua categoria d&apos;accesso.
+
+Vuoi andare alla Knowledge Base per ulteriori informazioni sulle categorie di accesso?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it
+ </url>
+ <usetemplate ignoretext="Non posso entrare in questa regione a causa delle restrizioni della categoria di accesso" name="okcancelignore" notext="Chiudi" yestext="Vai alla Knowledge Base"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_Notify">
+ Non sei ammesso in questa regione a causa della tua categoria d&apos;accesso.
+ </notification>
+ <notification name="RegionEntryAccessBlocked_Change">
+ Non ti è consentito entrare in quella regione a causa della categoria di accesso impostata nelle preferenze.
+
+Per entrare nella regione, dovrai modificare la tua categoria di accesso. Ciò ti consentirà inoltre di effettuare ricerche di contenuti di categoria [REGIONMATURITY]. Per annullare le modifiche in un secondo momento, vai a Io &gt; Preferenze &gt; Generali.
+ <form name="form">
+ <button name="OK" text="Cambia preferenza"/>
+ <button default="true" name="Cancel" text="Chiudi"/>
+ <ignore name="ignore" text="La categoria di accesso impostata mi impedisce di entrare in una regione"/>
+ </form>
+ </notification>
+ <notification name="PreferredMaturityChanged">
+ La tua categoria di accesso attuale è [RATING].
+ </notification>
+ <notification name="LandClaimAccessBlocked">
+ Non puoi prendere possesso di questo terreno a causa della tua categoria di accesso. Questo può essere dovuto ad una mancanza di informazioni valide che confermino la tua età.
+
+Verifica di avere installato l&apos;ultima versione del programma e vai alla Knowledge Base per informazioni sull&apos;accesso ad aree con queste categorie di accesso.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked_KB">
+ Non puoi prendere possesso di questa terra a causa delle preferenze sulle categorie di accesso.
+
+Vuoi andare alla Knowledge Base per maggiori informazioni sulle categorie di accesso?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it
+ </url>
+ <usetemplate ignoretext="Non posso richiedere questo terreno a causa delle restrizioni della categoria di accesso" name="okcancelignore" notext="Chiudi" yestext="Vai alla Knowledge Base"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked_Notify">
+ Non puoi prendere possesso di questa terra a causa della tua categoria di accesso.
+ </notification>
+ <notification name="LandClaimAccessBlocked_Change">
+ Non puoi richiedere questo terreno a causa della tua categoria di accesso.
+
+Puoi cliccare su Cambia preferenze per modificare la categoria di accesso e quindi riuscire ad entrare. Da adesso potrai accedere ai contenuti [REGIONMATURITY] ed effettuare ricerche in questa categoria. Se in seguito tu volessi cambiare di nuovo le tue impostazioni, apri la finestra di dialogo da Io &gt; Preferenze &gt; Generale.
+ <usetemplate ignoretext="Le mie preferenze di categoria di accesso mi impediscono di richiedere terreno" name="okcancelignore" notext="Chiudi" yestext="Cambia le preferenze"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked">
+ Non puoi acquistare questo terreno a causa della tua categoria di accesso. Questo può essere dovuto ad una mancanza di informazioni valide che confermino la tua età.
+
+Verifica di avere installato l&apos;ultima versione del programma e vai alla Knowledge Base per informazioni sull&apos;accesso ad aree con queste categorie di accesso.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked_KB">
+ Non puoi acquistare questo terreno a causa della tua categoria di accesso.
+
+Vuoi andare alla Knowledge Base per maggiori informazioni sulle categorie di accesso?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it
+ </url>
+ <usetemplate ignoretext="Non posso acquistare questo terreno a causa delle restrizioni della categoria di accesso" name="okcancelignore" notext="Chiudi" yestext="Vai alla Knowledge Base"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked_Notify">
+ Non puoi acquistare questa land a causa della tua categoria di accesso.
+ </notification>
+ <notification name="LandBuyAccessBlocked_Change">
+ Non puoi acquistare questo terreno a causa della tua categoria di accesso.
+
+Puoi cliccare su Cambia preferenze per modificare la categoria di accesso e quindi riuscire ad entrare. Da adesso potrai accedere ai contenuti [REGIONMATURITY] ed effettuare ricerche in questa categoria. Se in seguito tu volessi cambiare di nuovo le tue impostazioni, apri la finestra di dialogo da Io &gt; Preferenze &gt; Generale.
+ <usetemplate ignoretext="Le mie Preferenze di accesso mi impediscono di acquistare terreno" name="okcancelignore" notext="Chiudi" yestext="Cambia le preferenze"/>
+ </notification>
+ <notification name="TooManyPrimsSelected">
+ Hai selezionato troppi prim. Seleziona non più di [MAX_PRIM_COUNT] prim e riprova
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ProblemImportingEstateCovenant">
+ Problemi nell&apos;importazione del regolamento della proprietà.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ProblemAddingEstateManager">
+ Si sono riscontrati problemi nell&apos;aggiungere un nuovo manager della proprietà. Una o più proprietà potrebbero avere la lista dei manager piena.
+ </notification>
+ <notification name="ProblemAddingEstateGeneric">
+ Si sono riscontrati problemi nell&apos;aggiunta a questo elenco della proprietà. Una o più proprietà potrebbe avere una lista piena.
+ </notification>
+ <notification name="UnableToLoadNotecardAsset">
+ Impossibile caricare la risorsa della notecard in questo momento.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="NotAllowedToViewNotecard">
+ Permessi insufficienti per vedere la notecard associata con l&apos;asset ID richiesto.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MissingNotecardAssetID">
+ L&apos;asset ID della notecard è mancante dal database.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PublishClassified">
+ Ricorda: le tariffe per gli annunci non sono rimborsabili.
+
+Pubblica questo annuncio adesso per [AMOUNT]L$?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="SetClassifiedMature">
+ Queste inserzioni includono contenuti di tipo Moderato?
+ <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="No" yestext="Si"/>
+ </notification>
+ <notification name="SetGroupMature">
+ Questo gruppo include contenuti di tipo Moderato?
+ <usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="No" yestext="Si"/>
+ </notification>
+ <notification label="Conferma il riavvio" name="ConfirmRestart">
+ Vuoi veramente far ripartire la regione in 2 minuti?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification label="Manda un messaggio a tutti in questa regione" name="MessageRegion">
+ Scrivi un breve annuncio che verrà mandato a tutti in questa regione.
+ <form name="form">
+ <input name="message"/>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Annulla"/>
+ </form>
+ </notification>
+ <notification label="Cambiato il contenuto Moderato" name="RegionMaturityChange">
+ La classificazione di questa regione è stata aggiornata.
+Un periodo di tempo è necessario prima che la modifica venga integrata nella mappa.
+
+Per accedere a regioni per adulti, i residenti devono avere un Account verificato, mediante verifica dell&apos;età oppure mediante verifica della modalità di pagamento.
+ </notification>
+ <notification label="Versione voice non compatibile" name="VoiceVersionMismatch">
+ Questa versione di [APP_NAME] non è compatibile con la funzionalità di chat vocale in questa regione. Affinché la chat vocale funzioni correttamente, dovrai aggiornare [APP_NAME].
+ </notification>
+ <notification label="Impossibile comprare oggetti" name="BuyObjectOneOwner">
+ Impossibile comprare oggetti da proprietari diversi nello stesso momento.
+Seleziona solo un oggetto e riprova.
+ </notification>
+ <notification label="Impossibile comprare il contenuto" name="BuyContentsOneOnly">
+ Impossibile comprare il contenuto di più di un oggetto per volta.
+Seleziona solo un oggetto e riprova.
+ </notification>
+ <notification label="Impossibile comprare il contenuto" name="BuyContentsOneOwner">
+ Impossibile comprare oggetti da proprietari differenti nello stesso momento.
+Scegli un solo oggetto e riprova.
+ </notification>
+ <notification name="BuyOriginal">
+ Compra l&apos;oggetto originale da [OWNER] per [PRICE]L$?
+Diventerai proprietario di questo oggetto.
+Sarai in grado di:
+ Modificare: [MODIFYPERM]
+ Copiare: [COPYPERM]
+ Rivendere o regalare: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="BuyOriginalNoOwner">
+ Compra l&apos;oggetto originale per [PRICE]L$?
+Diventerai proprietario di questo oggetto.
+Sarai in grado di:
+ Modificare: [MODIFYPERM]
+ Copiare: [COPYPERM]
+ Rivendere o regalare: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="BuyCopy">
+ Compra una copia da [OWNER] per [PRICE]L$?
+L&apos;oggetto verrà copiato nel tuo inventario.
+Sarai in grado di:
+ Modificare: [MODIFYPERM]
+ Copiare: [COPYPERM]
+ Rivendere o regalare: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="BuyCopyNoOwner">
+ Compra una copia per [PRICE]L$?
+L&apos;oggetto verrà copiato nel tuo inventario.
+Sarai in grado di:
+ Modificare: [MODIFYPERM]
+ Copiare: [COPYPERM]
+ Rivendere o regalare: [RESELLPERM]
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="BuyContents">
+ Compra il contenuto da [OWNER] per [PRICE]L$?
+Il contenuto verrà copiato nel tuo inventario.
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="BuyContentsNoOwner">
+ Compra il contenuto per [PRICE]L$?
+Il contenuto verrà copiato nel tuo inventario.
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmPurchase">
+ Questa transazione ti permetterà di:
+[ACTION]
+
+Confermi di voler procedere all&apos;acquisto?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmPurchasePassword">
+ Questa transazione farà:
+[ACTION]
+
+Confermi di voler procedere all&apos;acquisto?
+Ridigita la tua password e premi OK.
+ <form name="form">
+ <input name="message"/>
+ <button name="ConfirmPurchase" text="OK"/>
+ <button name="Cancel" text="Annulla"/>
+ </form>
+ </notification>
+ <notification name="SetPickLocation">
+ Nota:
+Hai aggiornato l&apos;ubicazione di questo preferito ma gli altri dettagli conserveranno il loro valore originale.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MoveInventoryFromObject">
+ Hai selezionato elementi dall&apos;inventario &apos;non copiabili&apos;.
+Questi elementi verranno trasferiti nel tuo inventario, ma non copiati.
+
+Trasferisci gli elementi nell&apos;inventario?
+ <usetemplate ignoretext="Avvertimi quando tento di rimuovore elementi per i quali non è consentita la copia da un oggetto" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="MoveInventoryFromScriptedObject">
+ Hai selezionato elementi dell&apos;inventario non copiabili. Questi elementi verranno trasferiti nel tuo inventario, non verranno copiati.
+Dato che questo oggetto è scriptato, il trasferimento di questi elementi nel tuo inventario potrebbe causare un malfunzionamento degli script.
+
+Trasferisci gli elementi nell&apos;inventario?
+ <usetemplate ignoretext="Avvertimi se tento di rimuovore di elementi per i quali non è consentita la copia e che potrebbero danneggiare un oggetto scriptato" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ClickActionNotPayable">
+ Attenzione: l&apos;azione Paga oggetto è stata impostata, ma funzionerà soltanto se inserisci uno script con un evento money().
+ <form name="form">
+ <ignore name="ignore" text="Ho impostato l&apos;azione Paga oggetto costruendo un oggetto senza uno script money()"/>
+ </form>
+ </notification>
+ <notification name="OpenObjectCannotCopy">
+ Non ci sono elementi in questo oggetto che tu possa copiare.
+ </notification>
+ <notification name="WebLaunchAccountHistory">
+ Vai al [http://secondlife.com/account/ Dashboard] per vedere la cronologia del tuo account?
+ <usetemplate ignoretext="Lancia il browser per vedere la cronologia del mio account" name="okcancelignore" notext="Annulla" yestext="Vai alla pagina"/>
+ </notification>
+ <notification name="ConfirmQuit">
+ Confermi di voler uscire?
+ <usetemplate ignoretext="Conferma prima di uscire" name="okcancelignore" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification name="DeleteItems">
+ [QUESTION]
+ <usetemplate ignoretext="Conferma prima di cancellare gli elementi" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="HelpReportAbuseEmailLL">
+ Usa questo strumento per segnalare violazioni a [http://secondlife.com/corporate/tos.php Terms of Service] e [http://secondlife.com/corporate/cs.php Community Standards].
+
+Ogni abuso segnalato verrà esaminato e risolto.
+ </notification>
+ <notification name="HelpReportAbuseSelectCategory">
+ Scegli una categoria per questa segnalazione di abuso.
+Scegliere una categoria, ci aiuta a gestire ed elaborare le segnalazioni di abuso.
+ </notification>
+ <notification name="HelpReportAbuseAbuserNameEmpty">
+ Introduci il nome di chi abusa.
+Introducendo un valore accurato, ci aiuti a gestire ed elaborare le segnalazioni di abuso.
+ </notification>
+ <notification name="HelpReportAbuseAbuserLocationEmpty">
+ Inserisci il luogo dove l&apos;abuso è avvenuto.
+Introducendo un valore accurato, ci aiuti a gestire ed elaborare le segnalazioni di abuso.
+ </notification>
+ <notification name="HelpReportAbuseSummaryEmpty">
+ Inserisci un yiyolo descrittivo dell&apos;abuso che è avvenuto.
+Introducendo un titolo descrittivo accurato, ci aiuti a gestire ed elaborare le segnalazioni di abuso.
+ </notification>
+ <notification name="HelpReportAbuseDetailsEmpty">
+ Inserisci una descrizione dettagliata dell&apos;abuso che è avvenuto.
+Devi essere il più specifico possibile, includendo i nomi e i dettagli dell&apos;incidente che stai segnalando.
+Inserendo una descrizione accurata ci aiuti a gestire ed elaborare le segnalazioni di abuso.
+ </notification>
+ <notification name="HelpReportAbuseContainsCopyright">
+ Gentile residente,
+
+Ci risulta che tu stia segnalando una violazione di proprietà intellettuale. Per segnalare correttamente la violazione:
+
+(1) Definizione di abuso. Puoi inviare una segnalazione di abuso se ritieni che un residente stia sfruttando il sistema di permessi di [SECOND_LIFE], per esempio usando CopyBot o simili strumenti di copia, per rubare i diritti di proprietà intellettuale. L&apos;Ufficio abusi investigherà e deciderà adeguate azioni disciplinari per comportamenti che violano i [http://secondlife.com/corporate/tos.php Termini del servizio] di [SECOND_LIFE] oppure gli [http://secondlife.com/corporate/cs.php Standard della comunità]. Tieni comunque presente che l&apos;Ufficio abusi non gestisce e non risponde alle richieste di rimozione di contenuti da [SECOND_LIFE].
+
+(2) DMCA o rimozione di contenuti. Per richiedere la rimozione di contenuti da [SECOND_LIFE], devi compilare una denuncia valida di violazione come definito nelle nostra [http://secondlife.com/corporate/dmca.php Regole DMCA] (leggi sul copyright).
+
+Per continuare con il procedimento di abuso, chiudi questa finestra e completa la compilazione della segnalazione. È possibile che dovrai specificare la categoria CopyBot o Sfruttamento dei diritti.
+
+Grazie,
+
+Linden Lab
+ </notification>
+ <notification name="FailedRequirementsCheck">
+ I seguenti componenti obbligatori sono mancanti da [FLOATER]:
+[COMPONENTS]
+ </notification>
+ <notification label="Sostituisci gli oggetti indossati" name="ReplaceAttachment">
+ C&apos;è già un oggetto indossato in questo punto del corpo.
+Vuoi sostituirlo con l&apos;oggetto selezionato?
+ <form name="form">
+ <ignore name="ignore" save_option="true" text="Sostituisci un pezzo collegato con l&apos;elemento selezionato"/>
+ <button ignore="Replace Automatically" name="Yes" text="OK"/>
+ <button ignore="Never Replace" name="No" text="Annulla"/>
+ </form>
+ </notification>
+ <notification label="Avviso di &apos;Occupato&apos;" name="BusyModePay">
+ Sei in modalità &apos;Occupato&apos;, ciò significa che non riceverai ciò che attendi per questo pagamento.
+
+Desideri abbandonare la modalità &apos;Occupato&apos; prima di completare questa transazione?
+ <form name="form">
+ <ignore name="ignore" save_option="true" text="Sto per pagare una persona o un oggetto mentro sono in modalià Non disponibile"/>
+ <button ignore="Always leave Busy Mode" name="Yes" text="OK"/>
+ <button ignore="Never leave Busy Mode" name="No" text="Abbandona"/>
+ </form>
+ </notification>
+ <notification name="ConfirmDeleteProtectedCategory">
+ La cartella &apos;[FOLDERNAME]&apos; è una cartella di sistema. L&apos;eliminazione di cartelle di sistema può creare instabilità. Sei sicuro di volerla eliminare?
+ <usetemplate ignoretext="Chiedi conferma prima di eliminare una cartella di sistema" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmEmptyTrash">
+ Vuoi veramente eliminare in modo permanente il contenuto del tuo Cestino?
+ <usetemplate ignoretext="Conferma prima di svuotare la cartella del Cestino inventario" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearBrowserCache">
+ Vuoi veramente eliminare la cronologia viaggi, web e ricerche fatte?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearCookies">
+ Confermi di volere cancellare i tuoi cookie?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Si"/>
+ </notification>
+ <notification name="ConfirmClearMediaUrlList">
+ Confermi di voler cancellare la lista degli URL salvati?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Si"/>
+ </notification>
+ <notification name="ConfirmEmptyLostAndFound">
+ Vuoi veramente eliminare in modo definitivo il contenuto dei tuoi Oggetti smarriti?
+ <usetemplate ignoretext="Conferma prima di svuotare della cartella Oggetti smarriti" name="okcancelignore" notext="No" yestext="Si"/>
+ </notification>
+ <notification name="CopySLURL">
+ Lo SLurl seguente è stato copiato negli Appunti:
+ [SLURL]
+
+Inseriscilo in una pagina web per dare ad altri un accesso facile a questa ubicazione, o provala incollandola nella barra degli indirizzi di un browser web.
+ <form name="form">
+ <ignore name="ignore" text="Lo SLurl è stato copiato negli Appunti"/>
+ </form>
+ </notification>
+ <notification name="WLSavePresetAlert">
+ Vuoi sovrascrivere le preimpostazioni salvate?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
+ </notification>
+ <notification name="WLDeletePresetAlert">
+ Vuoi cancellare [SKY]?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
+ </notification>
+ <notification name="WLNoEditDefault">
+ Non puoi modificare o cancellare una preimpostazione di fabbrica.
+ </notification>
+ <notification name="WLMissingSky">
+ Questo file di ciclo giornaliero fa riferimento ad un file di cielo mancante: [SKY].
+ </notification>
+ <notification name="PPSaveEffectAlert">
+ Effetto di post elaborazione già presente. Vuoi sovrascrivere?
+ <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
+ </notification>
+ <notification name="NewSkyPreset">
+ Fornisci il nome per il nuovo cielo.
+ <form name="form">
+ <input name="message">
+ Nuova preimpostazione
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Annulla"/>
+ </form>
+ </notification>
+ <notification name="ExistsSkyPresetAlert">
+ La preimpostazione esiste già!
+ </notification>
+ <notification name="NewWaterPreset">
+ Fornisci il nome per la nuova preregolazione del livello dell&apos;acqua.
+ <form name="form">
+ <input name="message">
+ Nuova preimpostazione
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="Annulla"/>
+ </form>
+ </notification>
+ <notification name="ExistsWaterPresetAlert">
+ La preimpostazione esiste già!
+ </notification>
+ <notification name="WaterNoEditDefault">
+ Non puoi modificare o cancellare una preimpostazione.
+ </notification>
+ <notification name="ChatterBoxSessionStartError">
+ Impossibile iniziare una nuova sessione di chat con [RECIPIENT].
+[REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ChatterBoxSessionEventError">
+ [EVENT]
+[REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ForceCloseChatterBoxSession">
+ La sessione chat con [NAME] deve chiudere.
+[REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="Cannot_Purchase_an_Attachment">
+ Non puoi comprare un oggetto mentre è unito.
+ </notification>
+ <notification label="Informazioni sulle richieste per il permesso di addebito" name="DebitPermissionDetails">
+ Accettare questa richiesta da allo script il permesso continuativo di prendere Linden dollar (L$) dal tuo account. Per revocare questo permesso, il proprietario dell&apos;oggetto deve cancellare l&apos;oggetto oppure reimpostare gli script nell&apos;oggetto.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AutoWearNewClothing">
+ Vuoi indossare automaticamente gli indumenti che stai per creare?
+ <usetemplate ignoretext="Indossare gli abiti che creo mentre modifico il mio aspetto" name="okcancelignore" notext="No" yestext="Si"/>
+ </notification>
+ <notification name="NotAgeVerified">
+ Per entrare in questa zona, devi avere eseguito la verifica dell&apos;età. Vuoi andare sul sito di [SECOND_LIFE] per verificare la tua età?
+
+[_URL]
+ <url name="url" option="0">
+ https://secondlife.com/account/verification.php?lang=it
+ </url>
+ <usetemplate ignoretext="Non ho verificato la mia età" name="okcancelignore" notext="No" yestext="Si"/>
+ </notification>
+ <notification name="Cannot enter parcel: no payment info on file">
+ Per poter visitare questa zona devi avere devi aver fornito informazioni di pagamento a Linden Lab. Vuoi andare sul sito di [SECOND_LIFE] ed impostarle?
+
+[_URL]
+ <url name="url" option="0">
+ https://secondlife.com/account/index.php?lang=it
+ </url>
+ <usetemplate ignoretext="Manca la registrazione delle informazioni di pagamento" name="okcancelignore" notext="No" yestext="Si"/>
+ </notification>
+ <notification name="MissingString">
+ La stringa [STRING_NAME] non è presente in strings.xml
+ </notification>
+ <notification name="SystemMessageTip">
+ [MESSAGE]
+ </notification>
+ <notification name="IMSystemMessageTip">
+ [MESSAGE]
+ </notification>
+ <notification name="Cancelled">
+ Annullato
+ </notification>
+ <notification name="CancelledSit">
+ Seduta annullata
+ </notification>
+ <notification name="CancelledAttach">
+ Attaccamento annullato
+ </notification>
+ <notification name="ReplacedMissingWearable">
+ Gli abiti/parti del corpo mancanti sono stati sostituiti con quelli di default .
+ </notification>
+ <notification name="GroupNotice">
+ Oggetto: [SUBJECT], Messaggio: [MESSAGE]
+ </notification>
+ <notification name="FriendOnline">
+ [NAME] è Online
+ </notification>
+ <notification name="FriendOffline">
+ [NAME] è Offline
+ </notification>
+ <notification name="AddSelfFriend">
+ Anche se sei molto simpatico, non puoi aggiungere te stesso all&apos;elenco degli amici.
+ </notification>
+ <notification name="UploadingAuctionSnapshot">
+ Sto importando le fotografie per l&apos;uso inworld e per il web...
+(Durata circa 5 minuti.)
+ </notification>
+ <notification name="UploadPayment">
+ Hai pagato [AMOUNT]L$ per il caricamento.
+ </notification>
+ <notification name="UploadWebSnapshotDone">
+ Il caricamento della fotografia nel sito web è andato a buon fine.
+ </notification>
+ <notification name="UploadSnapshotDone">
+ Il caricamento della fotografia inworld è andato a buon fine.
+ </notification>
+ <notification name="TerrainDownloaded">
+ Terrain.raw caricato
+ </notification>
+ <notification name="GestureMissing">
+ Manca la gesture [NAME] dal database.
+ </notification>
+ <notification name="UnableToLoadGesture">
+ Impossibile caricare la gesture [NAME].
+ </notification>
+ <notification name="LandmarkMissing">
+ Landmark non trovato nel database.
+ </notification>
+ <notification name="UnableToLoadLandmark">
+ Impossibile caricare il Landmark di riferimento. Riprova.
+ </notification>
+ <notification name="CapsKeyOn">
+ Hai il blocco delle maiuscole attivato.
+Questo potrebbe incidere sulla tua password.
+ </notification>
+ <notification name="NotecardMissing">
+ Notecard non trovata nel database.
+ </notification>
+ <notification name="NotecardNoPermissions">
+ Non hai il permesso di vedere questo biglietto.
+ </notification>
+ <notification name="RezItemNoPermissions">
+ Permessi insufficienti per creare un oggetto.
+ </notification>
+ <notification name="UnableToLoadNotecard">
+ Impossibile caricare la notecard in questo momento.
+ </notification>
+ <notification name="ScriptMissing">
+ Script non trovato nel database.
+ </notification>
+ <notification name="ScriptNoPermissions">
+ Permessi insufficenti per visualizzare lo script.
+ </notification>
+ <notification name="UnableToLoadScript">
+ Impossibile caricare lo script. Riprova.
+ </notification>
+ <notification name="IncompleteInventory">
+ Il contenuto che stai offrendo per il momento non è localmente disponibile. Prova a rioffrire gli oggetti fra un minuto.
+ </notification>
+ <notification name="CannotModifyProtectedCategories">
+ Non è possibile modificare le categorie protette.
+ </notification>
+ <notification name="CannotRemoveProtectedCategories">
+ Non è possibile rimuovere le categorie protette.
+ </notification>
+ <notification name="UnableToBuyWhileDownloading">
+ Impossibile acquistare l&apos;oggetto durante il download dei dati.
+Riprova.
+ </notification>
+ <notification name="UnableToLinkWhileDownloading">
+ Impossibile collegare l&apos;oggetto durante il download dei dati.
+Riprova.
+ </notification>
+ <notification name="CannotBuyObjectsFromDifferentOwners">
+ Puoi acquistare oggetti soltanto da un proprietario per volta.
+Seleziona solo un oggetto.
+ </notification>
+ <notification name="ObjectNotForSale">
+ Questo oggetto non è in vendita.
+ </notification>
+ <notification name="EnteringGodMode">
+ Entra in modalità divina, livello [LEVEL]
+ </notification>
+ <notification name="LeavingGodMode">
+ Esci dalla modalità divina, livello [LEVEL]
+ </notification>
+ <notification name="CopyFailed">
+ Non hai l&apos;autorizzazione a copiare.
+ </notification>
+ <notification name="InventoryAccepted">
+ [NAME] ha ricevuto la tua offerta di inventario.
+ </notification>
+ <notification name="InventoryDeclined">
+ [NAME] non ha accettato la tua offerta dall&apos;inventario.
+ </notification>
+ <notification name="ObjectMessage">
+ [NAME]: [MESSAGE]
+ </notification>
+ <notification name="CallingCardAccepted">
+ Il tuo biglietto da visita è stato accettato.
+ </notification>
+ <notification name="CallingCardDeclined">
+ Il tuo biglietto da visita non è stato accettato.
+ </notification>
+ <notification name="TeleportToLandmark">
+ Puoi teleportarti alle ubicazioni come &apos;[NAME]&apos; aprendo il pannello Luoghi sul lato destro dello schermo, quindi selezionare la scheda Punti di riferimento.
+Clicca su un punto di riferimento per selezionarlo, quindi clicca su Teleport sul lato inferiore del pannello.
+(Puoi anche fare doppio clic sul punto di riferimento oppure cliccare su di esso con il tasto destro del mouse e scegliere Teleport.)
+ </notification>
+ <notification name="TeleportToPerson">
+ Puoi contattare il residente &apos;[NAME]&apos; aprendo il pannello Persone nel lato destro del tuo schermo.
+Seleziona il residente dall&apos;elenco, clicca su &apos;IM&apos; in basso nel pannello.
+(Puoi anche fare doppio clic sul nome nell&apos;elenco oppure fare clic con il pulsante destro del mouse e selezionare &apos;IM&apos;).
+ </notification>
+ <notification name="CantSelectLandFromMultipleRegions">
+ Non è possibile selezionare il terreno attraverso i confini del server.
+Prova a selezionare una parte di terreno più piccola.
+ </notification>
+ <notification name="SearchWordBanned">
+ Alcuni termini della ricerca sono stati esclusi a causa delle restrizioni di contenuto come esposto negli Standard della comunità.
+ </notification>
+ <notification name="NoContentToSearch">
+ Seleziona almeno un tipo di contenuto per la ricerca (Generale, Moderato o Adulti).
+ </notification>
+ <notification name="SystemMessage">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentReceived">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentSent">
+ [MESSAGE]
+ </notification>
+ <notification name="EventNotification">
+ Notifica eventi:
+
+[NAME]
+[DATE]
+ <form name="form">
+ <button name="Details" text="Dettagli"/>
+ <button name="Cancel" text="Cancella"/>
+ </form>
+ </notification>
+ <notification name="TransferObjectsHighlighted">
+ Tutti gli oggetti presenti sul terreno, che saranno trasferiti al compratore di questa terra, saranno ora evidenziati.
+
+* Gli alberi e l&apos;erba che cederai non saranno evidenziati.
+ <form name="form">
+ <button name="Done" text="Fatto"/>
+ </form>
+ </notification>
+ <notification name="DeactivatedGesturesTrigger">
+ Usa lo stesso tasto per disattivare la gesture:
+[NAMES]
+ </notification>
+ <notification name="NoQuickTime">
+ Il software QuickTime di Apple sembra non essere installato sul tuo computer.
+Se vuoi vedere contenuto multimediale in streaming sui lotti che lo supportano, vai alla pagina [http://www.apple.com/quicktime QuickTime] e installa il Player QuickTime.
+ </notification>
+ <notification name="NoPlugin">
+ Non è stato trovato alcun plugin multimediale per gestire il tipo mime [MIME_TYPE]. Il media di questo tipo non è disponibile.
+ </notification>
+ <notification name="MediaPluginFailed">
+ Questo plugin multimediale non funziona:
+ [PLUGIN]
+
+Reinstalla il plugin o contatta il venditore se continui ad avere questi problemi.
+ <form name="form">
+ <ignore name="ignore" text="Mancato funzionamento del plugin multimediale"/>
+ </form>
+ </notification>
+ <notification name="OwnedObjectsReturned">
+ Gli oggetti che possiedi sul terreno selezionato ti sono stati restituiti nell&apos;inventario.
+ </notification>
+ <notification name="OtherObjectsReturned">
+ Sono stati restituiti all&apos;inventario di &apos;[NAME]&apos; gli oggetti sul lotto di terreno selezionato di sua proprietà.
+ </notification>
+ <notification name="OtherObjectsReturned2">
+ Sono stati restituiti al proprietario gli oggetti selezionati sul lotto nella terra di proprietà del residente &apos;[NAME]&apos;.
+ </notification>
+ <notification name="GroupObjectsReturned">
+ Gli oggetti selezionati sul terreno e condivisi con il gruppo [GROUPNAME] sono stati restituiti nell&apos;inventario dei propietari.
+Gli oggetti trasferibili ceduti sono stati restituiti ai proprietari precedenti.
+Gli oggetti non trasferibili che erano stati ceduti al gruppo sono stati cancellati.
+ </notification>
+ <notification name="UnOwnedObjectsReturned">
+ Gli oggetti selezionati sul terreno che non sono di tua proprietà sono stati restituiti ai loro proprietari.
+ </notification>
+ <notification name="ServerObjectMessage">
+ Messaggio da [NAME]:
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
+ </notification>
+ <notification name="NotSafe">
+ Su questo terreno sono abilitati i danni.
+Qui potresti essere ferito. Se dovessi morire verrai teleportato a casa tua.
+ </notification>
+ <notification name="NoFly">
+ In questa zona è proibito il volo.
+Qui non puoi volare.
+ </notification>
+ <notification name="PushRestricted">
+ Questa zona non consente le spinte. Non puoi spingere gli altri a meno che tu non sia il proprietario del terreno.
+ </notification>
+ <notification name="NoVoice">
+ Questa zona ha la chat vocale disattivata. Non puoi sentire nessuno parlare.
+ </notification>
+ <notification name="NoBuild">
+ In questa zona è proibita la costruzione. Qui non puoi costruire né rezzare oggetti.
+ </notification>
+ <notification name="ScriptsStopped">
+ Un amministratore ha temporaneamente disabilitato gli script in questa regione.
+ </notification>
+ <notification name="ScriptsNotRunning">
+ In questa terra nessuno script è attivo.
+ </notification>
+ <notification name="NoOutsideScripts">
+ Questo terreno non consente script esterni.
+
+Qui funzionano soltanto gli script del proprietario del terreno.
+ </notification>
+ <notification name="ClaimPublicLand">
+ Puoi solo richiedere terreni pubblici nella regione in cui sei posizionato.
+ </notification>
+ <notification name="RegionTPAccessBlocked">
+ Non puoi entrare in quella regione a causa della tua categoria di accesso. Può essere necessario validare l&apos;età e/o installare l&apos;ultima versione del programma.
+
+Visita la Knowledge Base per informazioni sull&apos;accesso alle aree con queste categorie di accesso.
+ </notification>
+ <notification name="URBannedFromRegion">
+ Tu hai l&apos;accesso bloccato a questa regione.
+ </notification>
+ <notification name="NoTeenGridAccess">
+ Il tuo account non può connettersi a questa regione della griglia per Teenager.
+ </notification>
+ <notification name="ImproperPaymentStatus">
+ Non hai una impostazioni di pagamento corrette per entrare in questa regione.
+ </notification>
+ <notification name="MustGetAgeParcel">
+ Devi essere di età verificata per entrare in questa terra.
+ </notification>
+ <notification name="NoDestRegion">
+ Non è stata trovata nessuna regione di destinazione.
+ </notification>
+ <notification name="NotAllowedInDest">
+ Non hai il permesso di accedere alla regione di destinazione.
+ </notification>
+ <notification name="RegionParcelBan">
+ Non puoi attraversare la regione passando su un terreno ad accesso interdetto. Prova in un altro modo.
+ </notification>
+ <notification name="TelehubRedirect">
+ Sei stato rediretto ad un punto di snodo di teletrasporto.
+ </notification>
+ <notification name="CouldntTPCloser">
+ Non è stato possibile teleportarti più vicino al luogo di destinazione.
+ </notification>
+ <notification name="TPCancelled">
+ Teletrasporto annullato.
+ </notification>
+ <notification name="FullRegionTryAgain">
+ La regione in cui stai tentando di accedere è attualmente piena.
+Riprova tra qualche istante.
+ </notification>
+ <notification name="GeneralFailure">
+ Fallimento generale.
+ </notification>
+ <notification name="RoutedWrongRegion">
+ Sei stato instradato verso la regione sbagliata. Riprova.
+ </notification>
+ <notification name="NoValidAgentID">
+ Nessun ID valido.
+ </notification>
+ <notification name="NoValidSession">
+ Nessun ID valido.
+ </notification>
+ <notification name="NoValidCircuit">
+ Nessun codice circuito valido.
+ </notification>
+ <notification name="NoValidTimestamp">
+ Nessuna data/timestamp valido.
+ </notification>
+ <notification name="NoPendingConnection">
+ Impossibile creare la connessione in sospeso.
+ </notification>
+ <notification name="InternalUsherError">
+ Si è verificato un errore interno durante il tentativo di trasportarti alla destinazione. Potrebbero esserci problemi in [SECOND_LIFE] al momento.
+ </notification>
+ <notification name="NoGoodTPDestination">
+ Impossibile trovare una buona destinazione per il teletrasporto in questa regione.
+ </notification>
+ <notification name="InternalErrorRegionResolver">
+ Si è verificato un errore interno durante il tentativo di risolvere le coordinate per la richiesta di teletrasporto. Può darsi che ci siano problemi in [SECOND_LIFE] al momento.
+ </notification>
+ <notification name="NoValidLanding">
+ Non è stato trovato un punto di atterraggio valido.
+ </notification>
+ <notification name="NoValidParcel">
+ Non è stato trovato nessun territorio valido.
+ </notification>
+ <notification name="ObjectGiveItem">
+ Un oggetto denominato &lt;nolink&gt;[OBJECTFROMNAME]&lt;/nolink&gt; di proprietà di [NAME_SLURL] ti ha offerto [ITEM_SLURL]: Per usare questo oggetto è necessario passare alla modalità Avanzata e cercarlo nell&apos;Inventario. Per passare alla modalità Avanzata, esci e riavvia l&apos;applicazione e cambia le impostazioni della modalità nella schermata di accesso.
+ <form name="form">
+ <button name="Keep" text="Mantieni oggetto"/>
+ <button name="Discard" text="Rifiuta oggetto"/>
+ <button name="Mute" text="Blocca oggetto"/>
+ </form>
+ </notification>
+ <notification name="UserGiveItem">
+ [NAME_SLURL] ti ha offerto [ITEM_SLURL]. Per usare questo oggetto è necessario passare alla modalità Avanzata e cercarlo nell&apos;Inventario. Per passare alla modalità Avanzata, esci e riavvia l&apos;applicazione e cambia le impostazioni della modalità nella schermata di accesso.
+ <form name="form">
+ <button name="Show" text="Mantieni oggetto"/>
+ <button name="Discard" text="Rifiuta oggetto"/>
+ <button name="Mute" text="Blocca utente"/>
+ </form>
+ </notification>
+ <notification name="GodMessage">
+ [NAME]
+
+[MESSAGE]
+ </notification>
+ <notification name="JoinGroup">
+ [MESSAGE]
+ <form name="form">
+ <button name="Join" text="Iscriviti"/>
+ <button name="Decline" text="Rifiuta"/>
+ <button name="Info" text="Info"/>
+ </form>
+ </notification>
+ <notification name="TeleportOffered">
+ [NAME_SLURL] ti ha offerto il teleport alla sua ubicazione:
+
+[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
+ <form name="form">
+ <button name="Teleport" text="Teleport"/>
+ <button name="Cancel" text="Cancella"/>
+ </form>
+ </notification>
+ <notification name="TeleportOfferSent">
+ Offerta di Teleport inviata a [TO_NAME]
+ </notification>
+ <notification name="GotoURL">
+ [MESSAGE]
+[URL]
+ <form name="form">
+ <button name="Later" text="Successivo"/>
+ <button name="GoNow..." text="Vai ora..."/>
+ </form>
+ </notification>
+ <notification name="OfferFriendship">
+ [NAME_SLURL] ti ha offerto di diventare amici.
+
+[MESSAGE]
+
+(L&apos;impostazione predefinita consente a ciascuno di vedere se l&apos;altro è online.)
+ <form name="form">
+ <button name="Accept" text="Accetta"/>
+ <button name="Decline" text="Rifiuta"/>
+ </form>
+ </notification>
+ <notification name="FriendshipOffered">
+ Hai offerto l&apos;amicizia a [TO_NAME]
+ </notification>
+ <notification name="OfferFriendshipNoMessage">
+ [NAME_SLURL] ti ha offerto di diventare amici.
+
+(L&apos;impostazione predefinita consente a ciascuno di vedere se l&apos;altro è online.)
+ <form name="form">
+ <button name="Accept" text="Accetta"/>
+ <button name="Decline" text="Rifiuta"/>
+ </form>
+ </notification>
+ <notification name="FriendshipAccepted">
+ [NAME] ha accettato la tua offerta di amicizia.
+ </notification>
+ <notification name="FriendshipDeclined">
+ [NAME] ha rifiutato la tua offerta di amicizia.
+ </notification>
+ <notification name="FriendshipAcceptedByMe">
+ Offerta di amicizia accettata.
+ </notification>
+ <notification name="FriendshipDeclinedByMe">
+ Offerta di amicizia rifiutata.
+ </notification>
+ <notification name="OfferCallingCard">
+ [NOME] ti offre il suo biglietto da visita.
+Questo sarà aggiunto nel tuo inventario come segnalibro per consentirti di inviare rapidamente messaggi IM a questo residente.
+ <form name="form">
+ <button name="Accept" text="Accetta"/>
+ <button name="Decline" text="Rifiuta"/>
+ </form>
+ </notification>
+ <notification name="RegionRestartMinutes">
+ Questa regione verrà riavviata fra [MINUTES] minuti.
+Se rimani qui verrai scollegato da Second Life.
+ </notification>
+ <notification name="RegionRestartSeconds">
+ Questa regione verrà riavviata fra [SECONDS] secondi.
+Se rimani qui verrai scollegato da Second Life.
+ </notification>
+ <notification name="LoadWebPage">
+ Caricare la pagina Web [URL]?
+
+[MESSAGE]
+
+Dall&apos;oggetto: &lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;, proprietario: [NAME]?
+ <form name="form">
+ <button name="Gotopage" text="Caricare"/>
+ <button name="Cancel" text="Annulla"/>
+ </form>
+ </notification>
+ <notification name="FailedToFindWearableUnnamed">
+ Impossibile trovare [TYPE] nel database.
+ </notification>
+ <notification name="FailedToFindWearable">
+ Impossibile trovare [TYPE] chiamato [DESC] nel database.
+ </notification>
+ <notification name="InvalidWearable">
+ L&apos;elemento che stai tentando di indossare usa delle caratteristiche che il tuo viewer non può leggere. Aggiorna la versione di [APP_NAME] per poterlo indossare.
+ </notification>
+ <notification name="ScriptQuestion">
+ &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, un oggetto posseduto da &apos;[NAME]&apos; vorrebbe:
+
+[QUESTIONS]
+OK?
+ <form name="form">
+ <button name="Yes" text="Si"/>
+ <button name="No" text="No"/>
+ <button name="Mute" text="Blocca"/>
+ </form>
+ </notification>
+ <notification name="ScriptQuestionCaution">
+ Un oggetto di nome &apos;&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;&apos;, posseduto da &apos;[NAME]&apos; vorrebbe:
+
+[QUESTIONS]
+Se non ti fidi di questo oggetto e del suo ideatore, dovresti rifiutare la richiesta.
+
+Concedi questa richiesta?
+ <form name="form">
+ <button name="Grant" text="Accetta"/>
+ <button name="Deny" text="Nega"/>
+ <button name="Details" text="Dettagli..."/>
+ </form>
+ </notification>
+ <notification name="ScriptDialog">
+ &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; di [NAME]
+[MESSAGE]
+ <form name="form">
+ <button name="Ignore" text="Ignora"/>
+ </form>
+ </notification>
+ <notification name="ScriptDialogGroup">
+ &apos;&lt;nolink&gt;[TITLE]&lt;/nolink&gt;&apos; di [GROUPNAME]
+[MESSAGE]
+ <form name="form">
+ <button name="Ignore" text="Ignora"/>
+ </form>
+ </notification>
+ <notification name="BuyLindenDollarSuccess">
+ Grazie per aver inviato il pagamento.
+
+Il tuo saldo in L$ sarà aggiornato al termine dell&apos;elaborazione. Se l&apos;elaborazione dovesse impiegare più di 20 minuti, la transazione verrà annullata. In quel caso l&apos;ammontare dell&apos;acquisto verrà accreditato sul tuo saldo in US$.
+
+Potrai controllare lo stato del pagamento nella pagina della cronologia delle transazioni nel tuo [http://secondlife.com/account/ Dashboard]
+ </notification>
+ <notification name="FirstOverrideKeys">
+ I tuoi movimenti della tastiera vengono ora gestiti da un oggetto.
+Prova i tasti freccia o AWSD per vedere quello che fanno.
+Alcuni oggetti (come pistole) richiedono di andare in mouselook per il loro utilizzo.
+Premi &apos;M&apos; per farlo.
+ </notification>
+ <notification name="FirstSandbox">
+ Questa è una Sandbox, serve ai residenti per imparare a costruire.
+
+Gli oggetti che costruisci qui verranno eliminati dopo che te ne sei andato, perciò non dimenticare di cliccare sulle tue creazioni col tasto destro del mouse e scegliere Prendi per trasferirle nel tuo Inventario.
+ </notification>
+ <notification name="MaxListSelectMessage">
+ È possibile selezionare solo fino a [MAX_SELECT] oggetti da questa lista.
+ </notification>
+ <notification name="VoiceInviteP2P">
+ [NAME] ti sta invitando ad una chiamata in chat vocale.
+Clicca su Accetta per unirti alla chiamata oppure su Declina to declinare l&apos;invito. Clicca su Blocca per bloccare questo chiamante.
+ <form name="form">
+ <button name="Accept" text="Accetta"/>
+ <button name="Decline" text="Rifiuta"/>
+ <button name="Mute" text="Blocca"/>
+ </form>
+ </notification>
+ <notification name="AutoUnmuteByIM">
+ [NAME] ha ricevuto un IM ed è stato automaticamente sbloccato.
+ </notification>
+ <notification name="AutoUnmuteByMoney">
+ [NAME] ha ricevuto del denaro ed è stato automaticamente sbloccato.
+ </notification>
+ <notification name="AutoUnmuteByInventory">
+ [NAME] ha ricevuto un&apos;offerta di inventario ed è stato automaticamente sbloccato.
+ </notification>
+ <notification name="VoiceInviteGroup">
+ [NAME] si è aggiunto alla chiamata in chat vocale con il gruppo [GROUP].
+Clicca su Accetta per unirti alla chiamata oppure su Declina to declinare l&apos;invito. Clicca su Blocca per bloccare questo chiamante.
+ <form name="form">
+ <button name="Accept" text="Accetta"/>
+ <button name="Decline" text="Rifiuta"/>
+ <button name="Mute" text="Blocca"/>
+ </form>
+ </notification>
+ <notification name="VoiceInviteAdHoc">
+ [NAME] si è aggiunto alla chiamata in chat vocale con una conferenza.
+Clicca su Accetta per unirti alla chiamata oppure su Declina to declinare l&apos;invito. Clicca su Blocca per bloccare questo chiamante.
+ <form name="form">
+ <button name="Accept" text="Accetta"/>
+ <button name="Decline" text="Rifiuta"/>
+ <button name="Mute" text="Blocca"/>
+ </form>
+ </notification>
+ <notification name="InviteAdHoc">
+ [NAME] ti sta invitando ad una conferenza in chat.
+Clicca su Accetta per unirti alla chat oppure su Declina per declinare l&apos;invito. Clicca su Blocca per bloccare questo chiamante.
+ <form name="form">
+ <button name="Accept" text="Accetta"/>
+ <button name="Decline" text="Rifiuta"/>
+ <button name="Mute" text="Blocca"/>
+ </form>
+ </notification>
+ <notification name="VoiceChannelFull">
+ La chiamata vocale a cui si sta cercando di unirsi, [VOICE_CHANNEL_NAME], ha raggiunto la capacità massima. Si prega di riprovare più tardi.
+ </notification>
+ <notification name="ProximalVoiceChannelFull">
+ Siamo spiacenti. Questa area ha raggiunto la capacità massima per le chiamate voice. Si prega di provare ad usare il voice in un&apos;altra area.
+ </notification>
+ <notification name="VoiceChannelDisconnected">
+ Sei stato scollegato da [VOICE_CHANNEL_NAME]. Verrai ora ricollegato alla chat vocale nei dintorni.
+ </notification>
+ <notification name="VoiceChannelDisconnectedP2P">
+ [VOICE_CHANNEL_NAME] ha chiuso la chiamata. Verrai ora ricollegato alla chat vocale nei dintorni.
+ </notification>
+ <notification name="P2PCallDeclined">
+ [VOICE_CHANNEL_NAME] ha declinato la tua chiamata. Verrai ora ricollegato alla chat vocale nei dintorni.
+ </notification>
+ <notification name="P2PCallNoAnswer">
+ [VOICE_CHANNEL_NAME] non è disponibile per la tua chiamata. Verrai ora ricollegato alla chat vocale nei dintorni.
+ </notification>
+ <notification name="VoiceChannelJoinFailed">
+ Collegamento a [VOICE_CHANNEL_NAME] non riuscito, riprova più tardi. Verrai ora ricollegato alla chat vocale nei dintorni.
+ </notification>
+ <notification name="VoiceLoginRetry">
+ Stiamo creando una canale voice per te. Questo può richiedere fino a un minuto.
+ </notification>
+ <notification name="VoiceEffectsExpired">
+ Almeno una delle manipolazioni vocali alle quali sei iscritto è scaduta.
+[[URL] Fai clic qui] per rinnovare l&apos;abbonamento.
+ </notification>
+ <notification name="VoiceEffectsExpiredInUse">
+ Poiché la manipolazione vocale attiva è scaduta, sono state applicate le tue impostazioni normali.
+[[URL] Fai clic qui] per rinnovare l&apos;abbonamento.
+ </notification>
+ <notification name="VoiceEffectsWillExpire">
+ Almeno una delle tue manipolazioni vocali scadrà tra meno di [INTERVAL] giorni.
+[[URL] Fai clic qui] per rinnovare l&apos;abbonamento.
+ </notification>
+ <notification name="VoiceEffectsNew">
+ Sono disponibili nuove manipolazioni vocali.
+ </notification>
+ <notification name="Cannot enter parcel: not a group member">
+ Soltanto i membri di un determinato gruppo possono visitare questa zona.
+ </notification>
+ <notification name="Cannot enter parcel: banned">
+ Non puoi entrare nel terreno, sei stato bloccato.
+ </notification>
+ <notification name="Cannot enter parcel: not on access list">
+ Non puoi entrare nel terreno, non fai parte della lista di accesso.
+ </notification>
+ <notification name="VoiceNotAllowed">
+ Non hai il permesso di collegarti ad una voice chat con [VOICE_CHANNEL_NAME].
+ </notification>
+ <notification name="VoiceCallGenericError">
+ Si è verificato un errore durante il tentativo di collegarti a una voice chat con [VOICE_CHANNEL_NAME]. Riprova più tardi.
+ </notification>
+ <notification name="UnsupportedCommandSLURL">
+ Lo SLurl su cui hai cliccato non è valido.
+ </notification>
+ <notification name="BlockedSLURL">
+ Uno SLurl è stato ricevuto da un browser sconosciuto o non sicuro e, per sicurezza, è stato bloccato.
+ </notification>
+ <notification name="ThrottledSLURL">
+ Sono stati ricevuti più SLurl da un browser sconosciuto o non sicuro in un breve periodo di tempo.
+Per sicurezza, verranno bloccati per alcuni secondi.
+ </notification>
+ <notification name="IMToast">
+ [MESSAGE]
+ <form name="form">
+ <button name="respondbutton" text="Rispondi"/>
+ </form>
+ </notification>
+ <notification name="ConfirmCloseAll">
+ Sicuro di voler chiudere tutti gli IM?
+ <usetemplate ignoretext="Conferma prima della chiusura di tutti gli IM" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="AttachmentSaved">
+ L&apos;elemento da collegare è stato salvato.
+ </notification>
+ <notification name="UnableToFindHelpTopic">
+ Impossibile trovare l&apos;argomento nell&apos;aiuto per questo elemento.
+ </notification>
+ <notification name="ObjectMediaFailure">
+ Errore del server: mancato aggiornamento o ottenimento del media.
+&apos;[ERROR]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TextChatIsMutedByModerator">
+ La tua chat di testo è stata interrotta dal moderatore.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="VoiceIsMutedByModerator">
+ La tua voce è stata interrotta dal moderatore.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearTeleportHistory">
+ Sei sicuro di volere cancellare la cronologia dei tuoi teleport?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
+ <notification name="BottomTrayButtonCanNotBeShown">
+ Il pulsante selezionato non può essere visualizzato in questo momento.
+Il pulsante verrà visualizzato quando lo spazio sarà sufficiente.
+ </notification>
+ <notification name="ShareNotification">
+ Scegli i residenti con i quali condividere.
+ </notification>
+ <notification name="ShareItemsConfirmation">
+ Sei sicuro di volere condividere gli oggetti
+
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
+
+Con i seguenti residenti?
+
+[RESIDENTS]
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Ok"/>
+ </notification>
+ <notification name="ItemsShared">
+ Gli oggetti sono stati condivisi.
+ </notification>
+ <notification name="DeedToGroupFail">
+ Cessione al gruppo non riuscita.
+ </notification>
+ <notification name="AvatarRezNotification">
+ ( in esistenza da [EXISTENCE] secondi )
+Nuvola avatar &apos;[NAME]&apos; dileguata dopo [TIME] secondi.
+ </notification>
+ <notification name="AvatarRezSelfBakedDoneNotification">
+ ( in esistenza da [EXISTENCE] secondi )
+Baking dei vestiti terminato dopo [TIME] secondi.
+ </notification>
+ <notification name="AvatarRezSelfBakedUpdateNotification">
+ ( in esistenza da [EXISTENCE] secondi )
+Hai inviato un aggiornamento al tuo aspetto dopo [TIME] secondi.
+[STATUS]
+ </notification>
+ <notification name="AvatarRezCloudNotification">
+ ( presente da [EXISTENCE] secondi )
+Avatar &apos;[NAME]&apos; trasformato in nuvola.
+ </notification>
+ <notification name="AvatarRezArrivedNotification">
+ ( presente da [EXISTENCE] secondi )
+È comparso l&apos;avatar &apos;[NAME]&apos;.
+ </notification>
+ <notification name="AvatarRezLeftCloudNotification">
+ ( presente da [EXISTENCE] secondi )
+Avatar &apos;[NAME]&apos; partito dopo [TIME] secondi sotto forma di nuvola.
+ </notification>
+ <notification name="AvatarRezEnteredAppearanceNotification">
+ ( presente da [EXISTENCE] secondi )
+Avatar &apos;[NAME]&apos; è entrato nella modalità aspetto.
+ </notification>
+ <notification name="AvatarRezLeftAppearanceNotification">
+ ( presente da [EXISTENCE] secondi )
+Avatar &apos;[NAME]&apos; ha lasciato la modalità aspetto.
+ </notification>
+ <notification name="NoConnect">
+ Ci sono problemi di connessione tramite [PROTOCOL] [HOSTID].
+Ti consigliamo di controllare le tue impostazioni di rete e della firewall.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="NoVoiceConnect">
+ A causa di problemi di connessione al server vocale
+
+[HOSTID]
+
+le comunicazioni tramite voce non saranno disponibili.
+Ti consigliamo di controllare le tue impostazioni di rete e della firewall.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AvatarRezLeftNotification">
+ ( presente da [EXISTENCE] secondi )
+Avatar &apos;[NAME]&apos; è partito completamente caricato.
+ </notification>
+ <notification name="AvatarRezSelfBakedTextureUploadNotification">
+ ( In esistenza da [EXISTENCE] secondi)
+Hai caricato una texture [RESOLUTION] completata per &apos;[BODYREGION]&apos; dopo [TIME] secondi.
+ </notification>
+ <notification name="AvatarRezSelfBakedTextureUpdateNotification">
+ ( In esistenza da [EXISTENCE] secondi)
+Hai aggiornato localmente una texture [RESOLUTION] completata per &apos;[BODYREGION]&apos; dopo [TIME] secondi.
+ </notification>
+ <notification name="ConfirmLeaveCall">
+ Sei sicuro di volere uscire dalla chiamata?
+ <usetemplate ignoretext="Conferma prima di uscire dalla chiamata" name="okcancelignore" notext="No" yestext="Sì"/>
+ </notification>
+ <notification name="ConfirmMuteAll">
+ Hai scelto di disattivare l&apos;audio di tutti i partecipanti alla chiamata di gruppo.
+In questo modo verrà disattivato l&apos;audio anche di tutti i residenti che si
+uniscono alla chiamata in un secondo momento, anche dopo che tu ti fossi scollegato.
+
+Disattiva audio di tutti?
+ <usetemplate ignoretext="Conferma prima di disattivare l&apos;audio di tutti i partecipanti alla chiamata di gruppo" name="okcancelignore" notext="Annulla" yestext="Ok"/>
+ </notification>
+ <notification label="Chat" name="HintChat">
+ Per partecipare alla conversazione, digita nel campo chat in basso.
+ </notification>
+ <notification label="Alzati" name="HintSit">
+ Per alzarti ed uscire dalla posizione seduta, clicca sul pulsante Alzati.
+ </notification>
+ <notification label="Parla" name="HintSpeak">
+ Clicca sul pulsante Parla per attivare o disattivare il microfono.
+
+Clicca sul tasto freccia su per visualizzare il pannello di controllo voce.
+
+Se nascondi il tasto Parla viene disattivata la funzione voce.
+ </notification>
+ <notification label="Esplora il mondo" name="HintDestinationGuide">
+ La Guida alle destinazioni contiene migliaia di nuovi luoghi da scoprire. Seleziona una destinazione e scegli Teleport per iniziare a esplorare.
+ </notification>
+ <notification label="Pannello laterale" name="HintSidePanel">
+ Nel pannello laterale puoi acccedere rapidamente all&apos;inventario, ai vestiti, ai profili e ad altro ancora.
+ </notification>
+ <notification label="Movimento" name="HintMove">
+ Per camminare o correre, apri il pannello Sposta e usa le frecce direzionali per spostarti. Puoi anche usare le frecce direzionali sulla tastiera del computer.
+ </notification>
+ <notification label="" name="HintMoveClick">
+ 1. Clicca per camminare
+Clicca dovunque sul terreno per camminare verso quella posizione.
+
+2. Clicca e trascina per ruotare la visuale
+Clicca e trascina dovunque nel mondo per ruotare la visuale
+ </notification>
+ <notification label="Nome visualizzato" name="HintDisplayName">
+ Imposta qui il tuo nome visualizzato personalizzabile. È in aggiunta al tuo nome utente, che non può essere cambiato. Nelle preferenze puoi anche cambiare il modo in cui vedi i nomi degli altri.
+ </notification>
+ <notification label="Visuale" name="HintView">
+ Per cambiare la visuale della fotocamera, usa i controlli Ruota visuale e Panoramica. Ripristina la visuale premendo il tasto Esc o camminando.
+ </notification>
+ <notification label="Inventario" name="HintInventory">
+ Trova oggetti nel tuo inventario. I più recenti si trovano nella scheda Elementi recenti.
+ </notification>
+ <notification label="Hai dollari Linden!" name="HintLindenDollar">
+ Ecco il saldo attuale in L$. Clicca su Acquista L$ per acquistare altri dollari Linden.
+ </notification>
+ <notification name="PopupAttempt">
+ Non è stato possibile aprire una finestra pop-up.
+ <form name="form">
+ <ignore name="ignore" text="Attiva tutti i pop-up"/>
+ <button name="open" text="Apri finestra pop-up"/>
+ </form>
+ </notification>
+ <notification name="AuthRequest">
+ Il sito &apos;&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;&apos; nel reame &apos;[REALM]&apos; richiede un nome utente e una password.
+ <form name="form">
+ <input name="username" text="Nome utente"/>
+ <input name="password" text="Password"/>
+ <button name="ok" text="Invia"/>
+ <button name="cancel" text="Annulla"/>
+ </form>
+ </notification>
+ <notification label="" name="ModeChange">
+ Per cambiare la modalità è necessario uscire e riavviare.
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="NoClassifieds">
+ La creazione e la modifica degli annunci sono disponibili solo in modalità Avanzata. Uscire e cambiare la modalità? Sulla schermata di accesso si può selezionare la modalità.
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="NoGroupInfo">
+ La creazione e la modifica dei gruppi sono disponibili solo in modalità Avanzata. Uscire e cambiare la modalità? Sulla schermata di accesso si può selezionare la modalità.
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="NoPicks">
+ La creazione e la modifica dei luoghi preferiti sono disponibili solo in modalità Avanzata. Uscire e cambiare la modalità? Sulla schermata di accesso si può selezionare la modalità.
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="NoWorldMap">
+ La visualizzazione della mappa del mondo è disponibile solo in modalità Avanzata. Uscire e cambiare la modalità? Sulla schermata di accesso si può selezionare la modalità.
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="NoVoiceCall">
+ Le chiamate Voce sono disponibili solo in modalità Avanzata. Eseguire il logout e cambiare la modalità?
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="NoAvatarShare">
+ La condivisione è disponibile solo in modalità Avanzata. Eseguire il logout e cambiare la modalità?
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <notification label="" name="NoAvatarPay">
+ Il pagamento ad altri residenti è disponibile solo in modalità Avanzata. Eseguire il logout e cambiare la modalità?
+ <usetemplate name="okcancelbuttons" notext="Non uscire" yestext="Esci"/>
+ </notification>
+ <global name="UnsupportedCPU">
+ - La velocità della tua CPU non soddisfa i requisiti minimi.
+ </global>
+ <global name="UnsupportedGLRequirements">
+ Non sembra che tu abbia i requisiti hardware adeguati per [APP_NAME]. [APP_NAME] richiede una scheda grafica OpenGL con supporto multitexture. Se ne hai una in dotazione, accertati di avere i driver, i service pack e i patch più recenti per la scheda grafica e per il sistema operativo.
+
+Se continui ad avere problemi, visita la pagina [SUPPORT_SITE].
+ </global>
+ <global name="UnsupportedCPUAmount">
+ 796
+ </global>
+ <global name="UnsupportedRAMAmount">
+ 510
+ </global>
+ <global name="UnsupportedGPU">
+ - La tua scheda grafica non soddisfa i requisiti minimi.
+ </global>
+ <global name="UnsupportedRAM">
+ - La memoria del tuo sistema non soddisfa i requisiti minimi.
+ </global>
+ <global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
+ Se sei proprietario di un appezzamento di terreno, puoi definirlo come la tua posizione iniziale.
+In alternativa, puoi guardare sulla mappa e trovare luoghi segnalati come &quot;Infohub&quot;.
+ </global>
+ <global name="You died and have been teleported to your home location">
+ Sei deceduto e sei stato teleportato a casa tua.
+ </global>
+</notifications>
diff --git a/indra/newview/skins/minimal/xui/it/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/it/panel_adhoc_control_panel.xml
new file mode 100644
index 0000000000..be001d09f8
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/panel_adhoc_control_panel.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="call_btn_panel">
+ <button label="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/minimal/xui/it/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/it/panel_bottomtray.xml
new file mode 100644
index 0000000000..0eb0d0ee22
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/panel_bottomtray.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray">
+ <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/>
+ <string name="SpeakBtnToolTip" value="Accende o spegne il microfono"/>
+ <string name="VoiceControlBtnToolTip" value="Mostra o nasconde il pannello di regolazione voce"/>
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="Gesture" name="Gesture" tool_tip="Mostra o nasconde le gesture"/>
+ </layout_panel>
+ <layout_panel name="cam_panel">
+ <bottomtray_button label="Visuale" name="camera_btn" tool_tip="Mostra o nasconde le regolazioni della visuale"/>
+ </layout_panel>
+ <layout_panel name="avatar_and_destinations_panel">
+ <bottomtray_button label="Destinazioni" name="destination_btn" tool_tip="Mostra finestra persone"/>
+ </layout_panel>
+ <layout_panel name="avatar_and_destinations_panel">
+ <bottomtray_button label="Il mio avatar" name="avatar_btn"/>
+ </layout_panel>
+ <layout_panel name="people_panel">
+ <bottomtray_button label="Persone" name="show_people_button" tool_tip="Mostra finestra persone"/>
+ </layout_panel>
+ <layout_panel name="profile_panel">
+ <bottomtray_button label="Profilo" name="show_profile_btn" tool_tip="Mostra finestra profilo"/>
+ </layout_panel>
+ <layout_panel name="howto_panel">
+ <bottomtray_button label="Istruzioni" name="show_help_btn" tool_tip="Apri le Istruzioni Second Life"/>
+ </layout_panel>
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Conversazioni"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Notifiche"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/it/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/it/panel_group_control_panel.xml
new file mode 100644
index 0000000000..2d17e4a0cd
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/panel_group_control_panel.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="group_info_btn_panel">
+ <button label="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/minimal/xui/it/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/it/panel_im_control_panel.xml
new file mode 100644
index 0000000000..76b28eab24
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/panel_im_control_panel.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="button_stack">
+ <layout_panel name="view_profile_btn_panel">
+ <button label="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/minimal/xui/it/panel_login.xml b/indra/newview/skins/minimal/xui/it/panel_login.xml
new file mode 100644
index 0000000000..f88230ed11
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/panel_login.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_login">
+ <panel.string name="create_account_url">
+ http://join.secondlife.com/
+ </panel.string>
+ <panel.string name="forgot_password_url">
+ http://secondlife.com/account/request.php?lang=it
+ </panel.string>
+ <layout_stack name="login_widgets">
+ <layout_panel name="login">
+ <text name="username_text">
+ Nome utente:
+ </text>
+ <combo_box name="username_combo" tool_tip="Il nome utente che hai scelto durante la registrazione, come robby12 o Stella Soleggiato"/>
+ <text name="password_text">
+ Password:
+ </text>
+ <check_box label="Ricorda password" name="remember_check"/>
+ <button label="Accedi" name="connect_btn"/>
+ <text name="mode_selection_text">
+ Modalità:
+ </text>
+ <combo_box name="mode_combo" tool_tip="Seleziona la modalità. Seleziona Di base per esplorare facilmente e rapidamente e per la chat. Seleziona Avanzata per accedere ad altre funzionalità.">
+ <combo_box.item label="Di base" name="Basic"/>
+ <combo_box.item label="Avanzate" name="Advanced"/>
+ </combo_box>
+ <text name="start_location_text">
+ Inizia da:
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="La mia ultima ubicazione" name="MyLastLocation"/>
+ <combo_box.item label="Casa mia" name="MyHome"/>
+ <combo_box.item label="&lt;Scrivi nome regione&gt;" name="Typeregionname"/>
+ </combo_box>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_new_account_text">
+ Iscriviti
+ </text>
+ <text name="forgot_password_text">
+ Hai dimenticato il nome utente o la password?
+ </text>
+ <text name="login_help">
+ Ti serve aiuto con la fase di accesso?
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/it/panel_navigation_bar.xml b/indra/newview/skins/minimal/xui/it/panel_navigation_bar.xml
new file mode 100644
index 0000000000..8e72167759
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/panel_navigation_bar.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="navigation_bar">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="Torna al luogo precedente"/>
+ <pull_button name="forward_btn" tool_tip="Procedi un luogo in avanti"/>
+ <button name="home_btn" tool_tip="Teleport a casa"/>
+ <location_input label="Posizione" name="location_combo"/>
+ <search_combo_box label="Cerca" name="search_combo_box" tool_tip="Cerca">
+ <combo_editor label="Cerca [SECOND_LIFE]" name="search_combo_editor"/>
+ </search_combo_box>
+ </panel>
+ <favorites_bar name="favorite" tool_tip="Trascina qui i punti di riferimento per un accesso rapido ai tuoi posti preferiti in Second Life.">
+ <label name="favorites_bar_label" tool_tip="Trascina qui i punti di riferimento per un accesso rapido ai tuoi posti preferiti in Second Life.">
+ Barra dei Preferiti
+ </label>
+ <chevron_button name="&gt;&gt;" tool_tip="Mostra altri Preferiti"/>
+ </favorites_bar>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/it/panel_people.xml b/indra/newview/skins/minimal/xui/it/panel_people.xml
new file mode 100644
index 0000000000..068c8bb808
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/panel_people.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray panel -->
+<panel label="Persone" name="people_panel">
+ <string name="no_recent_people" value="Nessuna persona recente. Stai cercando persone da frequentare? Prova il pulsante Destinazioni in basso."/>
+ <string name="no_filtered_recent_people" value="Nessuna persona recente con quel nome."/>
+ <string name="no_one_near" value="Nessuno vicino. Stai cercando persone da frequentare? Prova il pulsante Destinazioni in basso."/>
+ <string name="no_one_filtered_near" value="Nessuno vicino con quel nome."/>
+ <string name="no_friends_online" value="Nessun amico online"/>
+ <string name="no_friends" value="Nessun amico"/>
+ <string name="no_friends_msg">
+ Clicca con il pulsante destro su un Residente per aggiungerlo come amico.
+Stai cercando persone da frequentare? Prova il pulsante Destinazioni in basso.
+ </string>
+ <string name="no_filtered_friends_msg">
+ Non riesci a trovare quello che cerchi? Prova il pulsante Destinazioni in basso.
+ </string>
+ <string name="people_filter_label" value="Filtro persone"/>
+ <string name="groups_filter_label" value="Filtro gruppi"/>
+ <string name="no_filtered_groups_msg" value="Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/groups/[SEARCH_TERM] Cerca]."/>
+ <string name="no_groups_msg" value="Stai cercando gruppi di cui far parte? Prova [secondlife:///app/search/groups Cerca]."/>
+ <string name="MiniMapToolTipMsg" value="[REGION](Fai doppio clic per aprire la Mappa, premi il tasto Maiusc e trascina per la panoramica)"/>
+ <string name="AltMiniMapToolTipMsg" value="[REGION](Fai doppio clic per teleportarti, premi il tasto Maiusc e trascina per la panoramica)"/>
+ <filter_editor label="Filtro" name="filter_input"/>
+ <tab_container name="tabs">
+ <panel label="NELLE VICINANZE" name="nearby_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="nearby_view_sort_btn" tool_tip="Opzioni"/>
+ <button name="add_friend_btn" tool_tip="Aggiungi il residente selezionato alla tua lista degli amici"/>
+ </panel>
+ </panel>
+ <panel label="I MIEI AMICI" name="friends_panel">
+ <accordion name="friends_accordion">
+ <accordion_tab name="tab_online" title="Online"/>
+ <accordion_tab name="tab_all" title="Tutto"/>
+ </accordion>
+ <panel label="bottom_panel" name="bottom_panel">
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <menu_button name="friends_viewsort_btn" tool_tip="Mostra ulteriori opzioni"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="Offri amicizia a un residente"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="del_btn" tool_tip="Rimuovi la persona selezionata dalla lista degli amici"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+ <panel label="I MIEI GRUPPI" name="groups_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="groups_viewsort_btn" tool_tip="Opzioni"/>
+ <button name="plus_btn" tool_tip="Aderisci al gruppo/Crea nuovo gruppo"/>
+ <button name="activate_btn" tool_tip="Attiva il gruppo selezionato"/>
+ </panel>
+ </panel>
+ <panel label="RECENTE" name="recent_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="recent_viewsort_btn" tool_tip="Opzioni"/>
+ <button name="add_friend_btn" tool_tip="Aggiungi il residente selezionato alla tua lista degli amici"/>
+ </panel>
+ </panel>
+ </tab_container>
+ <panel name="button_bar">
+ <layout_stack name="bottom_bar_ls">
+ <layout_panel name="view_profile_btn_lp">
+ <button label="Profilo" name="view_profile_btn" tool_tip="Mostra immagine, gruppi e altre informazioni del residente"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="IM" name="im_btn" tool_tip="Apri una sessione messaggio istantaneo"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Chiama" name="call_btn" tool_tip="Chiama questo residente"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Condividi" name="share_btn" tool_tip="Condividi un oggetto dell&apos;inventario"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Teleport" name="teleport_btn" tool_tip="Offri teleport"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_ls1">
+ <layout_panel name="group_info_btn_lp">
+ <button label="Profilo del gruppo" name="group_info_btn" tool_tip="Mostra informazioni gruppo"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="Chat di gruppo" name="chat_btn" tool_tip="Apri sessione chat"/>
+ </layout_panel>
+ <layout_panel name="group_call_btn_lp">
+ <button label="Chiamata al gruppo" name="group_call_btn" tool_tip="Chiama questo gruppo"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/it/panel_side_tray_tab_caption.xml b/indra/newview/skins/minimal/xui/it/panel_side_tray_tab_caption.xml
new file mode 100644
index 0000000000..3c7874e093
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/panel_side_tray_tab_caption.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="sidetray_tab_panel">
+ <text name="sidetray_tab_title" value="Pannello laterale"/>
+ <button name="undock" tool_tip="Disàncora"/>
+ <button name="dock" tool_tip="Àncora"/>
+ <button name="show_help" tool_tip="Mostra Aiuto"/>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/it/panel_status_bar.xml b/indra/newview/skins/minimal/xui/it/panel_status_bar.xml
new file mode 100644
index 0000000000..4353eb9d50
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/it/panel_status_bar.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="status">
+ <panel.string name="StatBarDaysOfWeek">
+ Domenica:Lunedì:Martedì:Mercoledì:Giovedì:Venerdì:Sabato
+ </panel.string>
+ <panel.string name="StatBarMonthsOfYear">
+ Gennaio:Febbraio:Marzo:Aprile:Maggio:Giugno:Luglio:Agosto:Settembre:Ottobre:Novembre:Dicembre
+ </panel.string>
+ <panel.string name="packet_loss_tooltip">
+ Perdita di pacchetti
+ </panel.string>
+ <panel.string name="bandwidth_tooltip">
+ Larghezza di banda
+ </panel.string>
+ <panel.string name="time">
+ [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+ </panel.string>
+ <panel.string name="timeTooltip">
+ [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+ </panel.string>
+ <panel.string name="buycurrencylabel">
+ L$ [AMT]
+ </panel.string>
+ <panel name="balance_bg">
+ <text name="balance" tool_tip="Clicca per aggiornare il tuo saldo in L$" value="L$ 20"/>
+ <button label="ACQUISTA L$" name="buyL" tool_tip="Clicca per acquistare più L$"/>
+ </panel>
+ <text name="TimeText" tool_tip="Orario attuale (Pacifico)">
+ 24:00, ora del Pacifico
+ </text>
+ <button name="media_toggle_btn" tool_tip="Attiva/ferma tutti i media (musica, video, pagine Web)"/>
+ <button name="volume_btn" tool_tip="Regolazione del volume globale"/>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/ja/floater_camera.xml b/indra/newview/skins/minimal/xui/ja/floater_camera.xml
new file mode 100644
index 0000000000..71a20c8e18
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/floater_camera.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="camera_floater">
+ <floater.string name="rotate_tooltip">
+ フォーカスを中心にカメラを回転
+ </floater.string>
+ <floater.string name="zoom_tooltip">
+ フォーカスに向けてカメラをズーム
+ </floater.string>
+ <floater.string name="move_tooltip">
+ カメラを上下左右に移動
+ </floater.string>
+ <floater.string name="camera_modes_title">
+ カメラモード
+ </floater.string>
+ <floater.string name="pan_mode_title">
+ 旋回 - ズーム - 水平・垂直移動
+ </floater.string>
+ <floater.string name="presets_mode_title">
+ 事前設定の視野
+ </floater.string>
+ <floater.string name="free_mode_title">
+ オブジェクトを見る
+ </floater.string>
+ <panel name="controls">
+ <panel name="preset_views_list">
+ <panel_camera_item name="front_view">
+ <panel_camera_item.text name="front_view_text">
+ 前方視界
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="group_view">
+ <panel_camera_item.text name="side_view_text">
+ グループ視界
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="rear_view">
+ <panel_camera_item.text name="rear_view_text">
+ 後方視界
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel name="camera_modes_list">
+ <panel_camera_item name="object_view">
+ <panel_camera_item.text name="object_view_text">
+ オブジェクト視点
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item name="mouselook_view">
+ <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>
+ </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>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/ja/floater_help_browser.xml b/indra/newview/skins/minimal/xui/ja/floater_help_browser.xml
new file mode 100644
index 0000000000..1322343903
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/floater_help_browser.xml
@@ -0,0 +1,9 @@
+<?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"/>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/ja/floater_media_browser.xml b/indra/newview/skins/minimal/xui/ja/floater_media_browser.xml
new file mode 100644
index 0000000000..439c36dbe9
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/floater_media_browser.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_about" title="メディアブラウザ">
+ <floater.string name="home_page_url">
+ http://jp.secondlife.com
+ </floater.string>
+ <floater.string name="support_page_url">
+ http://jp.secondlife.com/support
+ </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="go"/>
+ </layout_panel>
+ <layout_panel name="time_controls">
+ <button label="巻き戻し" name="rewind"/>
+ <button label="停止" name="stop"/>
+ <button label="早送り" name="seek"/>
+ </layout_panel>
+ <layout_panel name="parcel_owner_controls">
+ <button label="現在のページを区画に送る" name="assign"/>
+ </layout_panel>
+ <layout_panel name="external_controls">
+ <button label="Web ブラウザで開く" name="open_browser"/>
+ <check_box label="常に Web ブラウザで開く" name="open_always"/>
+ <button label="閉じる" name="close"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/ja/floater_nearby_chat.xml b/indra/newview/skins/minimal/xui/ja/floater_nearby_chat.xml
new file mode 100644
index 0000000000..a29c6a0630
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/floater_nearby_chat.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="nearby_chat" title="近くのチャット">
+ <check_box label="チャットを翻訳(Google翻訳)" name="translate_chat_checkbox"/>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/ja/floater_web_content.xml b/indra/newview/skins/minimal/xui/ja/floater_web_content.xml
new file mode 100644
index 0000000000..48fe8aee78
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/floater_web_content.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_web_content" title="">
+ <layout_stack name="stack1">
+ <layout_panel name="nav_controls">
+ <button name="back" tool_tip="前へ"/>
+ <button name="forward" tool_tip="次へ"/>
+ <button name="stop" tool_tip="ナビゲーションを停止"/>
+ <button name="reload" tool_tip="ページを更新"/>
+ <combo_box name="address" tool_tip="ここに URL を入力"/>
+ <icon name="media_secure_lock_flag" tool_tip="安全な閲覧"/>
+ <button name="popexternal" tool_tip="この URL をブラウザで開く"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/ja/inspect_avatar.xml b/indra/newview/skins/minimal/xui/ja/inspect_avatar.xml
new file mode 100644
index 0000000000..42b67cd333
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/inspect_avatar.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_avatar">
+ <string name="Subtitle">
+ [AGE]
+ </string>
+ <string name="Details">
+ [SL_PROFILE]
+ </string>
+ <text name="user_name_small" value="Grumpity ProductEngine with a long name"/>
+ <text name="user_slid" value="james.linden"/>
+ <text name="user_subtitle" value="11 Months, 3 days old"/>
+ <text name="user_details">
+ This is my second life description and I really think it is great.But for some reason my description is super extra long because I like to talk a whole lot
+ </text>
+ <slider name="volume_slider" tool_tip="ボイス音量" 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>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/ja/inspect_object.xml b/indra/newview/skins/minimal/xui/ja/inspect_object.xml
new file mode 100644
index 0000000000..e6999ac9b1
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/inspect_object.xml
@@ -0,0 +1,48 @@
+<?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]
+ </string>
+ <string name="CreatorAndOwner">
+ [CREATOR]によるチェック
+[OWNER]によるチェック
+ </string>
+ <string name="Price">
+ L$[AMOUNT]
+ </string>
+ <string name="PriceFree">
+ 無料です!
+ </string>
+ <string name="Touch">
+ 触る
+ </string>
+ <string name="Sit">
+ 座る
+ </string>
+ <text name="object_name" value="二行にわたる長いオブジェクト名をテスト"/>
+ <text name="object_creator">
+ by secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+owner secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+ </text>
+ <text name="price_text">
+ L$30,000
+ </text>
+ <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?
+ </text>
+ <text name="object_media_url">
+ http://www.superdupertest.com
+ </text>
+ <button label="買う" name="buy_btn"/>
+ <button label="支払う" name="pay_btn"/>
+ <button label="コピーを取る" name="take_free_copy_btn"/>
+ <button label="触る" name="touch_btn"/>
+ <button label="座る" name="sit_btn"/>
+ <button label="開く" name="open_btn"/>
+ <icon name="secure_browsing" tool_tip="安全な閲覧"/>
+ <button label="詳細" name="more_info_btn"/>
+</floater>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_add_wearable_gear.xml b/indra/newview/skins/minimal/xui/ja/menu_add_wearable_gear.xml
new file mode 100644
index 0000000000..982a03c6a8
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_add_wearable_gear.xml
@@ -0,0 +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_name"/>
+ <menu_item_check label="タイプによる並べ替え" name="sort_by_type"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_attachment_other.xml b/indra/newview/skins/minimal/xui/ja/menu_attachment_other.xml
new file mode 100644
index 0000000000..5adf0b3745
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_attachment_other.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_avatar_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="プロフィールの表示" 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="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="ズームイン" name="Zoom In"/>
+ <menu_item_call label="支払う" name="Pay..."/>
+ <menu_item_call label="オブジェクトのプロフィール" name="Object Inspect"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_attachment_self.xml b/indra/newview/skins/minimal/xui/ja/menu_attachment_self.xml
new file mode 100644
index 0000000000..830ddc9f63
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_attachment_self.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Attachment Pie">
+ <menu_item_call label="タッチ" name="Attachment Object Touch"/>
+ <menu_item_call label="編集" name="Edit..."/>
+ <menu_item_call label="取り外す" name="Detach"/>
+ <menu_item_call label="座る" name="Sit Down Here"/>
+ <menu_item_call label="立ち上がる" name="Stand Up"/>
+ <menu_item_call label="容姿" name="Change 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..."/>
+ <menu_item_call label="下に落とす" name="Drop"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_avatar_icon.xml b/indra/newview/skins/minimal/xui/ja/menu_avatar_icon.xml
new file mode 100644
index 0000000000..b04f602134
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_avatar_icon.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Avatar Icon Menu">
+ <menu_item_call label="プロフィールの表示" name="Show Profile"/>
+ <menu_item_call label="IMを送信..." name="Send IM"/>
+ <menu_item_call label="フレンドを追加..." name="Add Friend"/>
+ <menu_item_call label="フレンドを削除..." name="Remove Friend"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_avatar_other.xml b/indra/newview/skins/minimal/xui/ja/menu_avatar_other.xml
new file mode 100644
index 0000000000..54dd96f5ef
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_avatar_other.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="プロフィールの表示" 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="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="ズームイン" name="Zoom In"/>
+ <menu_item_call label="支払う" name="Pay..."/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_avatar_self.xml b/indra/newview/skins/minimal/xui/ja/menu_avatar_self.xml
new file mode 100644
index 0000000000..4709522665
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_avatar_self.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Self Pie">
+ <menu_item_call label="座る" name="Sit Down Here"/>
+ <menu_item_call label="立ち上がる" name="Stand Up"/>
+ <context_menu label="取り外す" name="Take Off &gt;">
+ <context_menu label="衣類" 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_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..."/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_bottomtray.xml b/indra/newview/skins/minimal/xui/ja/menu_bottomtray.xml
new file mode 100644
index 0000000000..7f106c1ab5
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_bottomtray.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="スピーカーボタン" name="EnableVoiceChat"/>
+ <menu_item_check label="ジェスチャーボタン" name="ShowGestureButton"/>
+ <menu_item_check label="移動ボタン" name="ShowMoveButton"/>
+ <menu_item_check label="視界ボタン" name="ShowCameraButton"/>
+ <menu_item_check label="スナップショットボタン" name="ShowSnapshotButton"/>
+ <menu_item_check label="制作ボタン" name="ShowBuildButton"/>
+ <menu_item_check label="検索ボタン" name="ShowSearchButton"/>
+ <menu_item_check label="地図ボタン" name="ShowWorldMapButton"/>
+ <menu_item_check label="ミニマップボタン" name="ShowMiniMapButton"/>
+ <menu_item_call label="切り取り" name="NearbyChatBar_Cut"/>
+ <menu_item_call label="コピー" name="NearbyChatBar_Copy"/>
+ <menu_item_call label="貼り付け" name="NearbyChatBar_Paste"/>
+ <menu_item_call label="削除" name="NearbyChatBar_Delete"/>
+ <menu_item_call label="すべて選択" name="NearbyChatBar_Select_All"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_cof_attachment.xml b/indra/newview/skins/minimal/xui/ja/menu_cof_attachment.xml
new file mode 100644
index 0000000000..e786d02e40
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_cof_attachment.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Attachment">
+ <menu_item_call label="取り外す" name="detach"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_cof_body_part.xml b/indra/newview/skins/minimal/xui/ja/menu_cof_body_part.xml
new file mode 100644
index 0000000000..eb5faa2545
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_cof_body_part.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Body">
+ <menu_item_call label="交換" name="replace"/>
+ <menu_item_call label="編集" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_cof_clothing.xml b/indra/newview/skins/minimal/xui/ja/menu_cof_clothing.xml
new file mode 100644
index 0000000000..d984342896
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_cof_clothing.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Clothing">
+ <menu_item_call label="取り外す" name="take_off"/>
+ <menu_item_call label="編集" name="edit"/>
+ <menu_item_call label="交換" name="replace"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_cof_gear.xml b/indra/newview/skins/minimal/xui/ja/menu_cof_gear.xml
new file mode 100644
index 0000000000..a071abbd2e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_cof_gear.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear COF">
+ <menu label="衣類" name="COF.Gear.New_Clothes"/>
+ <menu label="新しい身体部位" name="COF.Geear.New_Body_Parts"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_edit.xml b/indra/newview/skins/minimal/xui/ja/menu_edit.xml
new file mode 100644
index 0000000000..c2ef0179b2
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_edit.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu label="編集" name="Edit">
+ <menu_item_call label="元に戻す" name="Undo"/>
+ <menu_item_call label="やり直し" name="Redo"/>
+ <menu_item_call label="切り取り" name="Cut"/>
+ <menu_item_call label="コピー" name="Copy"/>
+ <menu_item_call label="貼り付け" name="Paste"/>
+ <menu_item_call label="削除" name="Delete"/>
+ <menu_item_call label="複製" name="Duplicate"/>
+ <menu_item_call label="すべて選択" name="Select All"/>
+ <menu_item_call label="選択解除" name="Deselect"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_favorites.xml b/indra/newview/skins/minimal/xui/ja/menu_favorites.xml
new file mode 100644
index 0000000000..4708b1446c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_favorites.xml
@@ -0,0 +1,10 @@
+<?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 Copy"/>
+ <menu_item_call label="貼り付け" name="Landmark Paste"/>
+ <menu_item_call label="削除" name="Delete"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_gesture_gear.xml b/indra/newview/skins/minimal/xui/ja/menu_gesture_gear.xml
new file mode 100644
index 0000000000..abf490a247
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_gesture_gear.xml
@@ -0,0 +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="copy_gesture"/>
+ <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"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_group_plus.xml b/indra/newview/skins/minimal/xui/ja/menu_group_plus.xml
new file mode 100644
index 0000000000..3787f7d645
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_group_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="グループに参加..." name="item_join"/>
+ <menu_item_call label="新しいグループ..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_hide_navbar.xml b/indra/newview/skins/minimal/xui/ja/menu_hide_navbar.xml
new file mode 100644
index 0000000000..3a1ae49700
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_hide_navbar.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_navbar_menu">
+ <menu_item_check label="ナビゲーションバーを表示" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="お気に入りバーを表示" name="ShowNavbarFavoritesPanel"/>
+ <menu_item_check label="「場所」のミニフィールドを表示" name="ShowMiniLocationPanel"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_im_well_button.xml b/indra/newview/skins/minimal/xui/ja/menu_im_well_button.xml
new file mode 100644
index 0000000000..3397004bd7
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_im_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="IM Well Button Context Menu">
+ <menu_item_call label="すべて閉じる" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_imchiclet_adhoc.xml b/indra/newview/skins/minimal/xui/ja/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..8cd6fa4a27
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_imchiclet_adhoc.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet AdHoc Menu">
+ <menu_item_call label="セッション終了" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_imchiclet_group.xml b/indra/newview/skins/minimal/xui/ja/menu_imchiclet_group.xml
new file mode 100644
index 0000000000..5bcb96f083
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_imchiclet_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet Group Menu">
+ <menu_item_call label="グループ情報" name="Show Profile"/>
+ <menu_item_call label="セッションを表示" name="Chat"/>
+ <menu_item_call label="セッション終了" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_imchiclet_p2p.xml b/indra/newview/skins/minimal/xui/ja/menu_imchiclet_p2p.xml
new file mode 100644
index 0000000000..5453f998fa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_imchiclet_p2p.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet P2P Menu">
+ <menu_item_call label="プロフィールの表示" name="Show Profile"/>
+ <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/minimal/xui/ja/menu_inspect_avatar_gear.xml b/indra/newview/skins/minimal/xui/ja/menu_inspect_avatar_gear.xml
new file mode 100644
index 0000000000..9d0d0f10a6
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_inspect_avatar_gear.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<toggleable_menu name="Gear Menu">
+ <menu_item_call label="プロフィールの表示" 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/minimal/xui/ja/menu_inspect_object_gear.xml b/indra/newview/skins/minimal/xui/ja/menu_inspect_object_gear.xml
new file mode 100644
index 0000000000..2edade70bf
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_inspect_object_gear.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="触る" name="touch"/>
+ <menu_item_call label="座る" name="sit"/>
+ <menu_item_call label="支払う" name="pay"/>
+ <menu_item_call label="買う" name="buy"/>
+ <menu_item_call label="取る" name="take"/>
+ <menu_item_call label="コピーを取る" name="take_copy"/>
+ <menu_item_call label="開く" name="open"/>
+ <menu_item_call label="編集" name="edit"/>
+ <menu_item_call label="装着" name="wear"/>
+ <menu_item_call label="追加" name="add"/>
+ <menu_item_call label="報告" name="report"/>
+ <menu_item_call label="ブロック" name="block"/>
+ <menu_item_call label="ズームイン" name="zoom_in"/>
+ <menu_item_call label="削除" name="remove"/>
+ <menu_item_call label="詳細" name="more_info"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_inspect_self_gear.xml b/indra/newview/skins/minimal/xui/ja/menu_inspect_self_gear.xml
new file mode 100644
index 0000000000..e3e206f3aa
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_inspect_self_gear.xml
@@ -0,0 +1,31 @@
+<?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/minimal/xui/ja/menu_inv_offer_chiclet.xml b/indra/newview/skins/minimal/xui/ja/menu_inv_offer_chiclet.xml
new file mode 100644
index 0000000000..9a4a8138f5
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_inv_offer_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="InvOfferChiclet Menu">
+ <menu_item_call label="閉じる" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_inventory.xml b/indra/newview/skins/minimal/xui/ja/menu_inventory.xml
new file mode 100644
index 0000000000..f78ec09e5e
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_inventory.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="共有" name="Share"/>
+ <menu_item_call label="購入" name="Task Buy"/>
+ <menu_item_call label="開く" 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="New Folder"/>
+ <menu_item_call label="新しいスクリプト" name="New Script"/>
+ <menu_item_call label="新しいノートカード" name="New Note"/>
+ <menu_item_call label="新しいジェスチャー" name="New Gesture"/>
+ <menu label="新しい衣類" name="New Clothes">
+ <menu_item_call label="新しいシャツ" name="New Shirt"/>
+ <menu_item_call label="新しいズボン" name="New Pants"/>
+ <menu_item_call label="新しい靴" name="New Shoes"/>
+ <menu_item_call label="新しい靴下" name="New Socks"/>
+ <menu_item_call label="新しいジャケット" name="New Jacket"/>
+ <menu_item_call label="新しいスカート" name="New Skirt"/>
+ <menu_item_call label="新しい手袋" name="New Gloves"/>
+ <menu_item_call label="新しい下着" name="New Undershirt"/>
+ <menu_item_call label="新しいパンツ" name="New Underpants"/>
+ <menu_item_call label="新しいアルファマスク" name="New Alpha Mask"/>
+ <menu_item_call label="新しいタトゥ" name="New Tattoo"/>
+ <menu_item_call label="新規の物理作用" name="New Physics"/>
+ </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>
+ <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="Shape"/>
+ <menu_item_call label="靴" name="Shoes"/>
+ <menu_item_call label="シャツ" name="Shirt"/>
+ <menu_item_call label="スカート" name="Skirt"/>
+ <menu_item_call label="下着パンツ" name="Underpants"/>
+ <menu_item_call label="下着シャツ" name="Undershirt"/>
+ </menu>
+ <menu_item_call label="テレポート" 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="Find Original"/>
+ <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="Properties"/>
+ <menu_item_call label="名前を変更する" name="Rename"/>
+ <menu_item_call label="UUID をコピーする" name="Copy Asset UUID"/>
+ <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="Remove Link"/>
+ <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="ランドマークの情報" name="About Landmark"/>
+ <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="Wearable And Object Wear"/>
+ <menu label="装着先" name="Attach To"/>
+ <menu label="HUD 装着先" name="Attach To HUD"/>
+ <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="--no options--"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_inventory_add.xml b/indra/newview/skins/minimal/xui/ja/menu_inventory_add.xml
new file mode 100644
index 0000000000..6c754e5d08
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_inventory_add.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_inventory_add">
+ <menu label="アップロード" name="upload">
+ <menu_item_call label="画像 (L$ [COST] )..." name="Upload Image"/>
+ <menu_item_call label="サウンド (L$[COST] )..." name="Upload Sound"/>
+ <menu_item_call label="アニメーション (L$ [COST] )..." name="Upload Animation"/>
+ <menu_item_call label="一括 (ファイルにつき L$[COST] )..." name="Bulk Upload"/>
+ <menu_item_call label="デフォルトのアップロード権限を設定" name="perm prefs"/>
+ </menu>
+ <menu_item_call label="新規フォルダ" name="New Folder"/>
+ <menu_item_call label="新規スクリプト" name="New Script"/>
+ <menu_item_call label="新しいノートカード" name="New Note"/>
+ <menu_item_call label="新規ジェスチャー" name="New Gesture"/>
+ <menu label="新しい衣類" name="New Clothes">
+ <menu_item_call label="新しいシャツ" name="New Shirt"/>
+ <menu_item_call label="新しいパンツ" name="New Pants"/>
+ <menu_item_call label="新しい靴" name="New Shoes"/>
+ <menu_item_call label="新しい靴下" name="New Socks"/>
+ <menu_item_call label="新しいジャケット" name="New Jacket"/>
+ <menu_item_call label="新しいスカート" name="New Skirt"/>
+ <menu_item_call label="新しい手袋" name="New Gloves"/>
+ <menu_item_call label="新しい下着(上)" name="New Undershirt"/>
+ <menu_item_call label="新しい下着(下)" name="New Underpants"/>
+ <menu_item_call label="新しいアルファ" name="New Alpha"/>
+ <menu_item_call label="新しいタトゥー" name="New Tattoo"/>
+ <menu_item_call label="新規の物理作用" name="New Physics"/>
+ </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>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_inventory_gear_default.xml b/indra/newview/skins/minimal/xui/ja/menu_inventory_gear_default.xml
new file mode 100644
index 0000000000..1f425df83c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_inventory_gear_default.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_gear_default">
+ <menu_item_call label="新しい持ち物ウィンドウ" name="new_window"/>
+ <menu_item_check label="名前で並べ替え" name="sort_by_name"/>
+ <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_call label="すべてのフォルダを閉じる" name="close_folders"/>
+ <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="empty_trash"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_land.xml b/indra/newview/skins/minimal/xui/ja/menu_land.xml
new file mode 100644
index 0000000000..89c122f14f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_land.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Land Pie">
+ <menu_item_call label="土地情報" name="Place Information..."/>
+ <menu_item_call label="ここに座る" name="Sit Here"/>
+ <menu_item_call label="この土地を購入" name="Land Buy"/>
+ <menu_item_call label="入場許可を購入" name="Land Buy Pass"/>
+ <menu_item_call label="制作" name="Create"/>
+ <menu_item_call label="地形を編集" name="Edit Terrain"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_landmark.xml b/indra/newview/skins/minimal/xui/ja/menu_landmark.xml
new file mode 100644
index 0000000000..c134422955
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_landmark.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="landmark_overflow_menu">
+ <menu_item_call label="SLurl をコピー" name="copy"/>
+ <menu_item_call label="削除" name="delete"/>
+ <menu_item_call label="ピックを作成" name="pick"/>
+ <menu_item_call label="お気に入りバーに追加" name="add_to_favbar"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_login.xml b/indra/newview/skins/minimal/xui/ja/menu_login.xml
new file mode 100644
index 0000000000..265f3ebcd0
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_login.xml
@@ -0,0 +1,25 @@
+<?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_item_call label="[APP_NAME] を終了" name="Quit"/>
+ </menu>
+ <menu label="ヘルプ" name="Help">
+ <menu_item_call label="[SECOND_LIFE] ヘルプ" name="Second Life Help"/>
+ <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="UI/色の設定" name="UI/Color Settings"/>
+ <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="TOS"/>
+ <menu_item_call label="クリティカルメッセージを表示" name="Critical"/>
+ <menu_item_call label="メディアブラウザのテスト" name="Web Browser Test"/>
+ <menu_item_call label="Web コンテンツフローターのテスト" name="Web Content Floater Test"/>
+ <menu_item_check label="グリッドピッカーを表示する" name="Show Grid Picker"/>
+ <menu_item_call label="通知コンソールを表示する" name="Show Notifications Console"/>
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_mini_map.xml b/indra/newview/skins/minimal/xui/ja/menu_mini_map.xml
new file mode 100644
index 0000000000..2e733ee24b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_mini_map.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="ズーム(近)" name="Zoom Close"/>
+ <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="Auto Center"/>
+ <menu_item_call label="追跡をやめる" name="Stop Tracking"/>
+ <menu_item_call label="世界地図" name="World Map"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_navbar.xml b/indra/newview/skins/minimal/xui/ja/menu_navbar.xml
new file mode 100644
index 0000000000..9ae2e58198
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_navbar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Navbar Menu">
+ <menu_item_check label="座標を表示" name="Show Coordinates"/>
+ <menu_item_check label="区画のプロパティを表示" name="Show Parcel Properties"/>
+ <menu_item_call label="ランドマーク" name="Landmark"/>
+ <menu_item_call label="切り取り" name="Cut"/>
+ <menu_item_call label="コピー" name="Copy"/>
+ <menu_item_call label="貼り付け" name="Paste"/>
+ <menu_item_call label="削除" name="Delete"/>
+ <menu_item_call label="すべて選択" name="Select All"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_nearby_chat.xml b/indra/newview/skins/minimal/xui/ja/menu_nearby_chat.xml
new file mode 100644
index 0000000000..c2e4a27686
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="NearBy Chat Menu">
+ <menu_item_call label="近くの人を表示する..." name="nearby_people"/>
+ <menu_item_check label="ブロックされた文字を表示" name="muted_text"/>
+ <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_call label="文字の大きさ" name="font_size"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_notification_well_button.xml b/indra/newview/skins/minimal/xui/ja/menu_notification_well_button.xml
new file mode 100644
index 0000000000..913bae8958
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_notification_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Notification Well Button Context Menu">
+ <menu_item_call label="すべて閉じる" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_object.xml b/indra/newview/skins/minimal/xui/ja/menu_object.xml
new file mode 100644
index 0000000000..4cee8089ee
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_object.xml
@@ -0,0 +1,29 @@
+<?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="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="Zoom In"/>
+ <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>
+ <context_menu label="管理" name="Remove">
+ <menu_item_call label="嫌がらせの報告" name="Report Abuse..."/>
+ <menu_item_call label="ブロック" name="Object Mute"/>
+ <menu_item_call label="返却" name="Return..."/>
+ </context_menu>
+ <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="Delete"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_object_icon.xml b/indra/newview/skins/minimal/xui/ja/menu_object_icon.xml
new file mode 100644
index 0000000000..8c4f328661
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_object_icon.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Object Icon Menu">
+ <menu_item_call label="オブジェクトのプロフィール..." name="Object Profile"/>
+ <menu_item_call label="ブロック..." name="Block"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_outfit_gear.xml b/indra/newview/skins/minimal/xui/ja/menu_outfit_gear.xml
new file mode 100644
index 0000000000..2bcbe1915b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_outfit_gear.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="Gear Outfit">
+ <menu_item_call label="着る - 着用中のアウトフィットを入れ替える" name="wear"/>
+ <menu_item_call label="着る - 着用中のアウトフィットに追加する" name="wear_add"/>
+ <menu_item_call label="取り外す - 着用中のアウトフィットから取り除く" name="take_off"/>
+ <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 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_call label="アウトフィットの名前を変更する" name="rename"/>
+ <menu_item_call label="アウトフィットを削除する" name="delete_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_outfit_tab.xml b/indra/newview/skins/minimal/xui/ja/menu_outfit_tab.xml
new file mode 100644
index 0000000000..9491c22f31
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_outfit_tab.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit">
+ <menu_item_call label="着る - 着用中のアウトフィットを入れ替える" 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"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_participant_list.xml b/indra/newview/skins/minimal/xui/ja/menu_participant_list.xml
new file mode 100644
index 0000000000..64d8ded722
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_participant_list.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Participant List Context Menu">
+ <menu_item_check label="名前で並べ替え" name="SortByName"/>
+ <menu_item_check label="最近の発言者で並べ替え" 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="コール" 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_check label="文字をブロック" name="MuteText"/>
+ <context_menu label="モデレーターのオプション" name="Moderator Options">
+ <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="ModerateVoiceUnmute"/>
+ </context_menu>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_people_friends_view_sort.xml b/indra/newview/skins/minimal/xui/ja/menu_people_friends_view_sort.xml
new file mode 100644
index 0000000000..76340e4d76
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_people_friends_view_sort.xml
@@ -0,0 +1,8 @@
+<?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/minimal/xui/ja/menu_people_groups.xml b/indra/newview/skins/minimal/xui/ja/menu_people_groups.xml
new file mode 100644
index 0000000000..842d79dc4b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_people_groups.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="情報を表示" name="View Info"/>
+ <menu_item_call label="チャット" name="Chat"/>
+ <menu_item_call label="コール" name="Call"/>
+ <menu_item_call label="アクティブ" name="Activate"/>
+ <menu_item_call label="脱退" name="Leave"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_people_groups_view_sort.xml b/indra/newview/skins/minimal/xui/ja/menu_people_groups_view_sort.xml
new file mode 100644
index 0000000000..bfc7d15017
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_people_groups_view_sort.xml
@@ -0,0 +1,5 @@
+<?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/minimal/xui/ja/menu_people_nearby.xml b/indra/newview/skins/minimal/xui/ja/menu_people_nearby.xml
new file mode 100644
index 0000000000..8d84b0e521
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_people_nearby.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Avatar Context Menu">
+ <menu_item_call label="プロフィールの表示" name="View Profile"/>
+ <menu_item_call label="フレンド登録" name="Add Friend"/>
+ <menu_item_call label="フレンドを削除" name="Remove Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="コール" name="Call"/>
+ <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="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_people_nearby_multiselect.xml b/indra/newview/skins/minimal/xui/ja/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000..3f20e5d3ab
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_people_nearby_multiselect.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Multi-Selected People Context Menu">
+ <menu_item_call label="フレンド登録" name="Add Friends"/>
+ <menu_item_call label="フレンドを削除" name="Remove Friend"/>
+ <menu_item_call label="IM" name="IM"/>
+ <menu_item_call label="コール" name="Call"/>
+ <menu_item_call label="共有" name="Share"/>
+ <menu_item_call label="支払う" name="Pay"/>
+ <menu_item_call label="テレポートを送る" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_people_nearby_view_sort.xml b/indra/newview/skins/minimal/xui/ja/menu_people_nearby_view_sort.xml
new file mode 100644
index 0000000000..a31480158a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_people_nearby_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<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_call label="ブロックされた住人とオブジェクトを表示" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_people_recent_view_sort.xml b/indra/newview/skins/minimal/xui/ja/menu_people_recent_view_sort.xml
new file mode 100644
index 0000000000..b4f177a068
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_people_recent_view_sort.xml
@@ -0,0 +1,7 @@
+<?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/minimal/xui/ja/menu_picks.xml b/indra/newview/skins/minimal/xui/ja/menu_picks.xml
new file mode 100644
index 0000000000..011d3d2526
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_picks.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Picks">
+ <menu_item_call label="情報" name="pick_info"/>
+ <menu_item_call label="編集" name="pick_edit"/>
+ <menu_item_call label="テレポート" name="pick_teleport"/>
+ <menu_item_call label="地図" name="pick_map"/>
+ <menu_item_call label="削除" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_picks_plus.xml b/indra/newview/skins/minimal/xui/ja/menu_picks_plus.xml
new file mode 100644
index 0000000000..84bf90fea0
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_picks_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="picks_plus_menu">
+ <menu_item_call label="新しいピック" name="create_pick"/>
+ <menu_item_call label="新しいクラシファイド広告" name="create_classified"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_place.xml b/indra/newview/skins/minimal/xui/ja/menu_place.xml
new file mode 100644
index 0000000000..a9f05e126d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_place.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<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/minimal/xui/ja/menu_place_add_button.xml b/indra/newview/skins/minimal/xui/ja/menu_place_add_button.xml
new file mode 100644
index 0000000000..d5ce88b055
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_place_add_button.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="フォルダを追加" name="add_folder"/>
+ <menu_item_call label="ランドマークを追加" name="add_landmark"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_places_gear_folder.xml b/indra/newview/skins/minimal/xui/ja/menu_places_gear_folder.xml
new file mode 100644
index 0000000000..e64f97fda5
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_places_gear_folder.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_folder_gear">
+ <menu_item_call label="ランドマークを追加" 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="copy_folder"/>
+ <menu_item_call label="貼り付け" name="paste"/>
+ <menu_item_call label="名前の変更" name="rename"/>
+ <menu_item_call label="削除" name="delete"/>
+ <menu_item_call label="拡大" name="expand"/>
+ <menu_item_call label="戻す" name="collapse"/>
+ <menu_item_call label="フォルダをすべて開く" name="expand_all"/>
+ <menu_item_call label="フォルダをすべて閉じる" name="collapse_all"/>
+ <menu_item_check label="日付で並べ替え" name="sort_by_date"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_places_gear_landmark.xml b/indra/newview/skins/minimal/xui/ja/menu_places_gear_landmark.xml
new file mode 100644
index 0000000000..f416b5b1f6
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_places_gear_landmark.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="menu_ladmark_gear">
+ <menu_item_call label="テレポート" 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="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="expand_all"/>
+ <menu_item_call label="フォルダをすべて閉じる" name="collapse_all"/>
+ <menu_item_check label="日付で並べ替え" name="sort_by_date"/>
+ <menu_item_call label="ピックを作成" name="create_pick"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_profile_overflow.xml b/indra/newview/skins/minimal/xui/ja/menu_profile_overflow.xml
new file mode 100644
index 0000000000..9d3a5dda1c
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_profile_overflow.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="地図" name="show_on_map"/>
+ <menu_item_call label="支払う" name="pay"/>
+ <menu_item_call label="共有" name="share"/>
+ <menu_item_call label="ブロック" name="block"/>
+ <menu_item_call label="ブロック解除" name="unblock"/>
+ <menu_item_call label="追放" name="kick"/>
+ <menu_item_call label="フリーズ" name="freeze"/>
+ <menu_item_call label="フリーズ解除" name="unfreeze"/>
+ <menu_item_call label="CSR" name="csr"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_save_outfit.xml b/indra/newview/skins/minimal/xui/ja/menu_save_outfit.xml
new file mode 100644
index 0000000000..6513d9264a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_save_outfit.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="save_outfit_menu">
+ <menu_item_call label="保存" name="save_outfit"/>
+ <menu_item_call label="別名で保存" name="save_as_new_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/ja/menu_script_chiclet.xml
new file mode 100644
index 0000000000..a89dd0bcbe
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_script_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="ScriptChiclet Menu">
+ <menu_item_call label="閉じる" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_slurl.xml b/indra/newview/skins/minimal/xui/ja/menu_slurl.xml
new file mode 100644
index 0000000000..61ba3085d9
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_slurl.xml
@@ -0,0 +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>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_teleport_history_gear.xml b/indra/newview/skins/minimal/xui/ja/menu_teleport_history_gear.xml
new file mode 100644
index 0000000000..901eab9166
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_teleport_history_gear.xml
@@ -0,0 +1,6 @@
+<?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_call label="テレポートの履歴をクリア" name="Clear Teleport History"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_teleport_history_item.xml b/indra/newview/skins/minimal/xui/ja/menu_teleport_history_item.xml
new file mode 100644
index 0000000000..66bc32214f
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_teleport_history_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="テレポート" name="Teleport"/>
+ <menu_item_call label="もっと詳しく" name="More Information"/>
+ <menu_item_call label="クリップボードにコピー" name="CopyToClipboard"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_teleport_history_tab.xml b/indra/newview/skins/minimal/xui/ja/menu_teleport_history_tab.xml
new file mode 100644
index 0000000000..4dd44d2ec8
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_teleport_history_tab.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="開く" name="TabOpen"/>
+ <menu_item_call label="閉じる" name="TabClose"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_text_editor.xml b/indra/newview/skins/minimal/xui/ja/menu_text_editor.xml
new file mode 100644
index 0000000000..fcb1038a6a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_text_editor.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Text editor context menu">
+ <menu_item_call label="切り取り" name="Cut"/>
+ <menu_item_call label="コピー" name="Copy"/>
+ <menu_item_call label="貼り付け" name="Paste"/>
+ <menu_item_call label="削除" name="Delete"/>
+ <menu_item_call label="すべて選択" name="Select All"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_topinfobar.xml b/indra/newview/skins/minimal/xui/ja/menu_topinfobar.xml
new file mode 100644
index 0000000000..1a67a2a8f7
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_topinfobar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_topinfobar">
+ <menu_item_check label="座標を表示" name="Show Coordinates"/>
+ <menu_item_check label="区画のプロパティを表示" name="Show Parcel Properties"/>
+ <menu_item_call label="ランドマーク" name="Landmark"/>
+ <menu_item_call label="コピー" name="Copy"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_url_agent.xml b/indra/newview/skins/minimal/xui/ja/menu_url_agent.xml
new file mode 100644
index 0000000000..92d118a5ae
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_url_agent.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="住人のプロフィールを表示" name="show_agent"/>
+ <menu_item_call label="名前をクリップボードにコピー" name="url_copy_label"/>
+ <menu_item_call label="SLurl をクリップボードにコピー" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_url_group.xml b/indra/newview/skins/minimal/xui/ja/menu_url_group.xml
new file mode 100644
index 0000000000..1dd3d79438
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_url_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="グループ情報を表示" name="show_group"/>
+ <menu_item_call label="グループをクリップボードにコピー" name="url_copy_label"/>
+ <menu_item_call label="SLurl をクリップボードにコピー" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_url_http.xml b/indra/newview/skins/minimal/xui/ja/menu_url_http.xml
new file mode 100644
index 0000000000..c3da8a8686
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_url_http.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="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"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_url_inventory.xml b/indra/newview/skins/minimal/xui/ja/menu_url_inventory.xml
new file mode 100644
index 0000000000..7af2f9e2cd
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_url_inventory.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="持ち物アイテムを表示" name="show_item"/>
+ <menu_item_call label="名前をクリップボードにコピー" name="url_copy_label"/>
+ <menu_item_call label="SLurl をクリップボードにコピー" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_url_map.xml b/indra/newview/skins/minimal/xui/ja/menu_url_map.xml
new file mode 100644
index 0000000000..8d41e1a571
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_url_map.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="地図に表示" name="show_on_map"/>
+ <menu_item_call label="現地にテレポート" name="teleport_to_location"/>
+ <menu_item_call label="SLurl をクリップボードにコピー" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_url_objectim.xml b/indra/newview/skins/minimal/xui/ja/menu_url_objectim.xml
new file mode 100644
index 0000000000..d6a048dcfc
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_url_objectim.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="オブジェクトの情報を表示" name="show_object"/>
+ <menu_item_call label="地図に表示" name="show_on_map"/>
+ <menu_item_call label="オブジェクトの場所にテレポート" name="teleport_to_object"/>
+ <menu_item_call label="オブジェクト名をクリップボードにコピー" name="url_copy_label"/>
+ <menu_item_call label="SLurl をクリップボードにコピー" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_url_parcel.xml b/indra/newview/skins/minimal/xui/ja/menu_url_parcel.xml
new file mode 100644
index 0000000000..8d264059d3
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_url_parcel.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="区画情報を表示" name="show_parcel"/>
+ <menu_item_call label="地図に表示" name="show_on_map"/>
+ <menu_item_call label="SLurl をクリップボードにコピー" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_url_slapp.xml b/indra/newview/skins/minimal/xui/ja/menu_url_slapp.xml
new file mode 100644
index 0000000000..a516c5a075
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_url_slapp.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="このコマンドを実行" name="run_slapp"/>
+ <menu_item_call label="SLurl をクリップボードにコピー" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_url_slurl.xml b/indra/newview/skins/minimal/xui/ja/menu_url_slurl.xml
new file mode 100644
index 0000000000..2c857ec915
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_url_slurl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="場所の情報を表示" name="show_place"/>
+ <menu_item_call label="地図に表示" name="show_on_map"/>
+ <menu_item_call label="現地にテレポート" name="teleport_to_location"/>
+ <menu_item_call label="SLurl をクリップボードにコピー" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_url_teleport.xml b/indra/newview/skins/minimal/xui/ja/menu_url_teleport.xml
new file mode 100644
index 0000000000..c3507a9a33
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_url_teleport.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="この場所にテレポート" name="teleport"/>
+ <menu_item_call label="地図に表示" name="show_on_map"/>
+ <menu_item_call label="SLurl をクリップボードにコピー" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_viewer.xml b/indra/newview/skins/minimal/xui/ja/menu_viewer.xml
new file mode 100644
index 0000000000..52dec2b282
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_viewer.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu_bar name="Main Menu">
+ <menu label="ヘルプ" name="Help">
+ <menu_item_call label="[SECOND_LIFE] ヘルプ" name="Second Life Help"/>
+ </menu>
+ <menu label="アドバンス" name="Advanced">
+ <menu label="ショートカット" name="Shortcuts">
+ <menu_item_check label="飛ぶ" name="Fly"/>
+ <menu_item_call label="ウィンドウを閉じる" name="Close Window"/>
+ <menu_item_call label="全てのウィンドウを閉じる" name="Close All Windows"/>
+ <menu_item_call label="表示をリセットする" name="Reset View"/>
+ </menu>
+ </menu>
+</menu_bar>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_wearable_list_item.xml b/indra/newview/skins/minimal/xui/ja/menu_wearable_list_item.xml
new file mode 100644
index 0000000000..c402fa0b6d
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_wearable_list_item.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit Wearable Context Menu">
+ <menu_item_call label="交換" name="wear_replace"/>
+ <menu_item_call label="装着" name="wear_wear"/>
+ <menu_item_call label="追加" name="wear_add"/>
+ <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"/>
+ <menu_item_call label="取り外す" name="take_off"/>
+ <menu_item_call label="編集" name="edit"/>
+ <menu_item_call label="アイテムのプロフィール" name="object_profile"/>
+ <menu_item_call label="オリジナルを表示" name="show_original"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_wearing_gear.xml b/indra/newview/skins/minimal/xui/ja/menu_wearing_gear.xml
new file mode 100644
index 0000000000..7a97538117
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_wearing_gear.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear Wearing">
+ <menu_item_call label="アウトフットの編集" name="edit"/>
+ <menu_item_call label="取り外す" name="takeoff"/>
+</menu>
diff --git a/indra/newview/skins/minimal/xui/ja/menu_wearing_tab.xml b/indra/newview/skins/minimal/xui/ja/menu_wearing_tab.xml
new file mode 100644
index 0000000000..9effed1f42
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/menu_wearing_tab.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Wearing">
+ <menu_item_call label="取り外す" name="take_off"/>
+ <menu_item_call label="取り外す" name="detach"/>
+ <menu_item_call label="アウトフットの編集" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/minimal/xui/ja/notifications.xml b/indra/newview/skins/minimal/xui/ja/notifications.xml
new file mode 100644
index 0000000000..6ad0ed1ac6
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/notifications.xml
@@ -0,0 +1,2995 @@
+<?xml version="1.0" encoding="utf-8"?>
+<notifications>
+ <global name="skipnexttime">
+ 今後は表示しない
+ </global>
+ <global name="alwayschoose">
+ 常にこのオプションを選択
+ </global>
+ <global name="implicitclosebutton">
+ 閉じる
+ </global>
+ <template name="okbutton">
+ <form>
+ <button name="OK_okbutton" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okignore">
+ <form>
+ <button name="OK_okignore" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okcancelbuttons">
+ <form>
+ <button name="OK_okcancelbuttons" text="$yestext"/>
+ <button name="Cancel_okcancelbuttons" text="$notext"/>
+ </form>
+ </template>
+ <template name="okcancelignore">
+ <form>
+ <button name="OK_okcancelignore" text="$yestext"/>
+ <button name="Cancel_okcancelignore" text="$notext"/>
+ </form>
+ </template>
+ <template name="okhelpbuttons">
+ <form>
+ <button name="OK_okhelpbuttons" text="$yestext"/>
+ <button name="Help" text="$helptext"/>
+ </form>
+ </template>
+ <template name="yesnocancelbuttons">
+ <form>
+ <button name="Yes" text="$yestext"/>
+ <button name="No" text="$notext"/>
+ <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
+ </form>
+ </template>
+ <notification functor="GenericAcknowledge" label="不明の通知メッセージ" name="MissingAlert">
+ あなたの [APP_NAME] のバージョンでは今受け取った通知メッセージを表示することができません。 最新ビューワがインストールされているかご確認ください。
+
+エラー詳細: 「 [_NAME] 」という通知は notifications.xml にありませんでした。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <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">
+ [MESSAGE]
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="はい"/>
+ </notification>
+ <notification name="BadInstallation">
+ [APP_NAME] をアップデート中にエラーが発生しました。 ビューワの [http://get.secondlife.com 最新バージョンをダウンロード] してください。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="LoginFailedNoNetwork">
+ [SECOND_LIFE_GRID] に接続できませんでした。
+「[DIAGNOSTIC]」
+インターネット接続が正常かご確認ください。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MessageTemplateNotFound">
+ メッセージテンプレート [PATH] がありませんでした。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="WearableSave">
+ 現在の衣類、身体部位の変更を保存しますか?
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="保存しない" yestext="保存"/>
+ </notification>
+ <notification name="CompileQueueSaveText">
+ 次の理由で、スクリプト用テキストのアップロード時に問題が起こりました。
+[REASON]
+後でもう一度お試しください。
+ </notification>
+ <notification name="CompileQueueSaveBytecode">
+ 次の理由で、コンパイルしたスクリプトのアップロード時に問題が起こりました。
+[REASON]
+後でもう一度お試しください。
+ </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="GrantModifyRights">
+ 他人に修正権限を与えると、権限を与えられた人はあなたが所有するインワールドのオブジェクトを変更、削除、持ち帰ることができます。この権限を与える際には十分に注意してください。
+[NAME] に修正権限を与えますか?
+ <usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+ </notification>
+ <notification name="GrantModifyRightsMultiple">
+ 他人に修正権限を与えると、権限を与えられた人はあなたが所有するインワールドのオブジェクトを変更することができます。 この権限を与える際には十分に注意してください。
+選択した住人に修正権限を与えますか?
+ <usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+ </notification>
+ <notification name="RevokeModifyRights">
+ [NAME] の修正権限を解約しますか?
+ <usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+ </notification>
+ <notification name="RevokeModifyRightsMultiple">
+ 選択した住人から変更権限を取り下げますか?
+ <usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+ </notification>
+ <notification name="UnableToCreateGroup">
+ グループを作成できません。
+[MESSAGE]
+ <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] の役割にメンバーを与えようとしています。
+任命されたメンバーが自ら退任しない限り、
+役柄から削除できません。
+操作を続行しますか?
+ <usetemplate ignoretext="グループオーナーを新しく追加する前の確認" name="okcancelignore" notext="いいえ" yestext="はい"/>
+ </notification>
+ <notification name="AssignDangerousActionWarning">
+ あなたは [ROLE_NAME] に [ACTION_NAME] の能力を
+与えようとしています。
+
+ *警告*
+この能力を持つ役割のメンバーは、
+自分と他のメンバーに現在より強力な権限を割り当て、
+自分をオーナーとほぼ同様の立場に任命することもできるようになります。
+この行為の意味をよく理解してから実行してください。
+
+この能力を [ROLE_NAME] に割り当てますか?
+ <usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+ </notification>
+ <notification name="AssignDangerousAbilityWarning">
+ あなたは [ROLE_NAME] に [ACTION_NAME] の能力を
+与えようとしています。
+
+ *警告*
+この能力をもつ役割のメンバーは、
+自分と他のメンバーにすべての能力を割り当て、
+自分をオーナーとほぼ同様の立場に任命できます。
+
+この能力を [ROLE_NAME] に割り当てますか?
+ <usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+ </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">
+ [NAME] というグループに入ろうとしています。
+続けますか?
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="参加"/>
+ </notification>
+ <notification name="JoinGroupCannotAfford">
+ このグループに加入するには、L$ [COST] 必要です。
+L$ が不足しているのでこのグループに参加することができません。
+ </notification>
+ <notification name="CreateGroupCost">
+ このグループを作るには L$ 100 かかります。
+一人ではグループにならないので、永久に削除されてしまいます。
+48 時間以内にメンバーを勧誘し、入会してもらってください。
+ <usetemplate canceltext="キャンセル" name="okcancelbuttons" notext="キャンセル" yestext="L$100 でグループを作成"/>
+ </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">
+ この区画のグループ [NAME] 共有のすべてのオブジェクトを、以前の所有者の「持ち物」に戻そうとしています。
+操作を続行しますか?
+
+*警告* これにより、
+グループに譲渡された「再販・プレゼント不可」のオブジェクトは削除されます!
+オブジェクト: [N]
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsOwnedByUser">
+ この区画で、
+住人 [NAME] が所有する全てのオブジェクトを
+本人の「持ち物」に本当に返却してもよいですか?
+
+オブジェクト: [N]
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsOwnedBySelf">
+ この土地区画内にある、あなたが所有するすべてのオブジェクトを、
+あなたの「持ち物」に戻そうとしています。続けますか?
+
+オブジェクト: [N]
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="ReturnObjectsNotOwnedBySelf">
+ この土地区画内にある、あなた以外が所有するすべてのオブジェクトを、
+それぞれの所有者の「持ち物」に戻そうとしています。
+操作を続行しますか?
+グループに譲渡された「再販・プレゼント可」のオブジェクトは、以前の所有者に返却されます。
+
+*警告* これにより、
+グループに譲渡された「再販・プレゼント不可」のオブジェクトは削除されます!
+オブジェクト: [N]
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
+ <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">
+ この土地の区画上のオブジェクトのうち、グループ [NAME] との間で共有していないオブジェクトを所有者に返却しますか?
+
+オブジェクト: [N]
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="UnableToDisableOutsideScripts">
+ スクリプトを無効にできません。
+このリージョン(地域)全体が「ダメージ有効」に設定されています。
+武器を使用するにはスクリプトの実行を許可する必要があります。
+ </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="ErrorUploadingPostcard">
+ 次の理由で、スナップショットの送信時に問題が起こりました: [REASON]
+ </notification>
+ <notification name="ErrorUploadingReportScreenshot">
+ 次の理由で、レポートのスクリーンショットのアップロード時に問題が起こりました。 [REASON]
+ </notification>
+ <notification name="MustAgreeToLogIn">
+ [SECOND_LIFE] へのログインを続けるには、利用規約に同意してください。
+ </notification>
+ <notification name="CouldNotPutOnOutfit">
+ アウトフィットを装着できません。
+アウトフィットフォルダに衣類、身体部位、アタッチメントがありません。
+ </notification>
+ <notification name="CannotWearTrash">
+ ごみ箱にある衣類や身体部位の着用はできません。
+ </notification>
+ <notification name="MaxAttachmentsOnOutfit">
+ オブジェクトを付けられませんでした。
+最大数の [MAX_ATTACHMENTS] 個を越えています。 どれか取り外してからお試しください。
+ </notification>
+ <notification name="CannotWearInfoNotComplete">
+ まだ読み込まれていないため、そのアイテムを装着できません。後でやり直してください。
+ </notification>
+ <notification name="MustHaveAccountToLogIn">
+ 注意:記入漏れの箇所があります。
+アバターのユーザー名を入力してください。
+
+[SECOND_LIFE] に入るにはアカウントが必要です。今すぐアカウントを作成しますか?
+ <url name="url">
+ https://join.secondlife.com/index.php?lang=ja-JP
+ </url>
+ <usetemplate name="okcancelbuttons" notext="もう一度試す" yestext="新しいアカウントを作成"/>
+ </notification>
+ <notification name="InvalidCredentialFormat">
+ ユーザー名のフィールドにアバターのユーザー名もしくは氏名を入力してから、再度ログインする必要があります。
+ </notification>
+ <notification name="DeleteClassified">
+ クラシファイド広告 [NAME] を削除しますか?
+支払い済みの料金は返金されません。
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="DeleteMedia">
+ この面にあるメディアを削除する選択をしました。
+続けますか?
+ <usetemplate ignoretext="オブジェクトからメディアを削除する前の確認" name="okcancelignore" notext="いいえ" yestext="はい"/>
+ </notification>
+ <notification name="ClassifiedSave">
+ クラシファイド広告 [NAME] への変更を保存しますか?
+ <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="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="GestureSaveFailedTooManySteps">
+ ジェスチャーの保存に失敗しました。
+ステップが多すぎます。
+ステップをいくつか削除してから再保存してください
+ </notification>
+ <notification name="GestureSaveFailedTryAgain">
+ ジェスチャーの保存に失敗しました。少し待ってからもう一度試してください。
+ </notification>
+ <notification name="GestureSaveFailedObjectNotFound">
+ ジェスチャーの保存に失敗しました。オブジェクト、または関連するオブジェクト持ち物が見つかりません。
+オブジェクトが範囲内に存在しないか、または削除された可能性があります。
+ </notification>
+ <notification name="GestureSaveFailedReason">
+ 次の理由で、ジェスチャーの保存時に問題が起こりました。 [REASON]。 後でもう一度試してください。
+ </notification>
+ <notification name="SaveNotecardFailObjectNotFound">
+ ノートカードの保存に失敗しました。オブジェクト、または関連するオブジェクト持ち物が見つかりません。
+オブジェクトが範囲内に存在しないか、または削除された可能性があります。
+ </notification>
+ <notification name="SaveNotecardFailReason">
+ 次の理由で、ノートカードの保存時に問題が起こりました。 [REASON]。 後でもう一度試してください。
+ </notification>
+ <notification name="ScriptCannotUndo">
+ あなたのスクリプトのバージョンでは、変更を元に戻すことはできませんでした。
+サーバーの最新保存バージョンをロードしますか?
+(**警告**:この操作後元に戻すことはできません)
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="SaveScriptFailReason">
+ 次の理由で、スクリプトの保存に問題が起こりました。 [REASON]。 後でもう一度試してください。
+ </notification>
+ <notification name="SaveScriptFailObjectNotFound">
+ スクリプトの保存に失敗しました。スクリプトが入ったオブジェクトが見つかりません。
+オブジェクトは範囲外か、または削除されているかもしれません。
+ </notification>
+ <notification name="SaveBytecodeFailReason">
+ 次の理由で、コンパイルしたスクリプトの保存時に問題が起こりました。 [REASON]。 後でもう一度試してください。
+ </notification>
+ <notification name="StartRegionEmpty">
+ ログイン位置が指定されていません。
+ログイン位置の欄にリージョン名を入力するか、「最後にログアウトした場所」か「ホーム」を選択してください。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CouldNotStartStopScript">
+ スクリプトの起動または停止に失敗しました。スクリプトが格納されているオブジェクトが見つかりません。
+オブジェクトが範囲内に存在しないか、または削除された可能性があります。
+ </notification>
+ <notification name="CannotDownloadFile">
+ ファイルをダウンロードできません。
+ </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>
+ <usetemplate ignoretext="使用中のコンピューターのハードウェアがサポートされていないとき" name="okcancelignore" notext="いいえ" yestext="はい"/>
+ </notification>
+ <notification name="UnknownGPU">
+ お使いのシステムには、[APP_NAME] が認識できないグラフィックカードが搭載されています。
+[APP_NAME] でまだテストされていない最新ハードウェアのためだと考えられます。 問題ないとは思いますが、グラフィックの設定を調整する必要があるかもしれません。
+(ミー > 環境設定 > グラフィック)
+ <form name="form">
+ <ignore name="ignore" text="使用中のグラフックカードが認識されないとき"/>
+ </form>
+ </notification>
+ <notification name="DisplaySettingsNoShaders">
+ グラフィックドライバを初期化中に [APP_NAME] がクラッシュしました。
+ドライバの一般的なエラーを防ぐために、画質が低に設定されます。 そのため、一部のグラフィック特性に制限が出ます。
+お使いのグラフィックカードのドライバをアップデートするようおすすめします。
+画質は、環境設定 > グラフィック で設定できます。
+ </notification>
+ <notification name="RegionNoTerraforming">
+ [REGION] では、地形の変更ができません。
+ </notification>
+ <notification name="CannotCopyWarning">
+ あなたには[ITEMS]というアイテムをコピーする許可がありません。他の住人に提供すると、そのアイテムはあなたの「持ち物」から削除されます。本当にこれらのアイテムを譲りますか?
+ <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] 個のアイテムののコピーを許されていません。
+これらのアイテムはあなたの「持ち物」から失われます。
+本当にアイテムを渡したいですか?
+ <usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+ </notification>
+ <notification name="CannotGiveCategory">
+ 選択したフォルダを渡す権限がありません
+ </notification>
+ <notification name="FreezeAvatar">
+ このアバターをフリーズしますか?
+アバターは一時的に動けなくなり、チャットを含めインワールドで何もできなくなります。
+ <usetemplate canceltext="取り消し" name="yesnocancelbuttons" notext="解除" yestext="フリーズ"/>
+ </notification>
+ <notification name="FreezeAvatarFullname">
+ [AVATAR_NAME]をフリーズしますか?
+フリーズされた人は一時的に動けなくなり、チャットなど、この世界に対する関わりを持つことができなくなります。
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="解除" yestext="フリーズ"/>
+ </notification>
+ <notification name="EjectAvatarFullname">
+ あなたの土地から [AVATAR_NAME] を追放しますか?
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="追放と禁止" yestext="追放"/>
+ </notification>
+ <notification name="EjectAvatarNoBan">
+ このアバターをあなたの土地から追放しますか?
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="追放"/>
+ </notification>
+ <notification name="EjectAvatarFullnameNoBan">
+ [AVATAR_NAME] をあなたの土地から追放しますか?
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="追放"/>
+ </notification>
+ <notification name="EjectAvatarFromGroup">
+ [GROUP_NAME] から [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="UnableToLinkObjects">
+ [COUNT] 個のオブジェクトをリンクできません。
+リンクできるのは最大 [MAX] 個です。
+ </notification>
+ <notification name="CannotLinkIncompleteSet">
+ セットで揃っているオブジェクトのみリンクできます。
+複数のオブジェクトを選択してください。
+ </notification>
+ <notification name="CannotLinkModify">
+ すべてのオブジェクトの修正許可がないためリンクできません。
+
+どのオブジェクトもロックされておらず、あなたのものであることを確認してください。
+ </notification>
+ <notification name="CannotLinkDifferentOwners">
+ 所有者が異なるため、オブジェクトをリンクできません。
+
+自分が所有しているオブジェクトだけを選択してください。
+ </notification>
+ <notification name="NoFileExtension">
+ 「 [FILE] 」の拡張子が無効です。
+
+このファイルの拡張子が正しいかどうかを確認してください。
+ </notification>
+ <notification name="InvalidFileExtension">
+ [EXTENSION] は無効です。
+正しい拡張子:[VALIDS]
+ <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] では、アニメーションの一括アップロードはサポートされていません。
+ </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>
+ <notification name="CannotResetSelectObjectsNoScripts">
+ 「再設定」ができません。
+
+スクリプトのオブジェクトを選択してください。
+ </notification>
+ <notification name="CannotResetSelectObjectsNoPermission">
+ 「再設定」ができません。
+
+修正権限のあるスクリプトのオブジェクトを選択してください。
+ </notification>
+ <notification name="CannotOpenScriptObjectNoMod">
+ 修正権限のないオブジェクトのスクリプトは開くことはできません。
+ </notification>
+ <notification name="CannotSetRunningSelectObjectsNoScripts">
+ スクリプトの「実行」ができません。
+
+スクリプトのオブジェクトを選択してください。
+ </notification>
+ <notification name="CannotSetRunningNotSelectObjectsNoScripts">
+ スクリプトを「実行しない」設定にできません。
+
+スクリプトのオブジェクトを選択してください。
+ </notification>
+ <notification name="NoFrontmostFloater">
+ 保存する frontmost フロータがありません。
+ </notification>
+ <notification name="SeachFilteredOnShortWords">
+ 指定した検索クエリは変更され、短すぎる語句は取り除かれています。
+
+検索語句: [FINALQUERY]
+ </notification>
+ <notification name="SeachFilteredOnShortWordsEmpty">
+ 指定した検索語句が短すぎたため、検索は行われませんでした。
+ </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>
+ <notification name="timeout_tport">
+ 申し訳ございません。システムによるテレポート接続が完了できませんでした。
+しばらくしてから再度お試しください。
+ </notification>
+ <notification name="noaccess_tport">
+ 残念ながら、目的地へアクセスが許可されていないため、テレポートできません。
+ </notification>
+ <notification name="missing_attach_tport">
+ 添付物がまだ届いていません。テレポートをする前にあと数秒間お待ちいただくか、いったんログアウトし、再度ログインしてください。
+ </notification>
+ <notification name="too_many_uploads_tport">
+ このリージョンのアセットキューが現在混み合っているため、テレポートのリクエストをすぐに処理することが難しい状況です。
+数分後にやり直すか、混雑していない他のリージョンでお試しください。
+ </notification>
+ <notification name="expired_tport">
+ 申し訳ございません。システムはテレポートのリクエストを時間どおりに完了できませんでした。数分後にやり直してください。
+ </notification>
+ <notification name="expired_region_handoff">
+ 申し訳ございません。システムはリージョン間の移動を時間どおりに完了できませんでした。
+数分後にやり直してください。
+ </notification>
+ <notification name="no_host">
+ テレポート目的地を見つけられません。目的地が一時的に利用できない状態か、すでに消滅している可能性があります。数分後にやり直してください。
+ </notification>
+ <notification name="no_inventory_host">
+ 持ち物システムは現在利用できません。
+ </notification>
+ <notification name="CannotSetLandOwnerNothingSelected">
+ 土地所有者設定ができません:
+区画が選定されていません。
+ </notification>
+ <notification name="CannotSetLandOwnerMultipleRegions">
+ 複数のリージョンが選択されたため、土地の所有権を取得できません。
+選択する面積を小さくして、もう一度お試しください。
+ </notification>
+ <notification name="ForceOwnerAuctionWarning">
+ この区画はオークションに出されています。 所有権を変更するとオークションはキャンセルとなり、既にオークションに参加している住人がいればその人に迷惑をかけてしまいます。
+所有権を変更しますか?
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="CannotContentifyNothingSelected">
+ コンテンツ化は不可能です:
+区画が選定されていません。
+ </notification>
+ <notification name="CannotContentifyNoRegion">
+ コンテンツ化は不可能です:
+土地が選択されていません。
+ </notification>
+ <notification name="CannotReleaseLandNothingSelected">
+ 土地を破棄できません:
+区画が選定されていません。
+ </notification>
+ <notification name="CannotReleaseLandNoRegion">
+ 土地を破棄できません:
+リージョンが見つかりません。
+ </notification>
+ <notification name="CannotBuyLandNothingSelected">
+ 土地を購入できません:
+区画が選定されていません。
+ </notification>
+ <notification name="CannotBuyLandNoRegion">
+ 土地を購入できません:
+この土地があるリージョンを見つけることができません
+ </notification>
+ <notification name="CannotCloseFloaterBuyLand">
+ [APP_NAME] がこの取引価格を見積もるまでは、土地の購入ウィンドウを閉じることはできません。
+ </notification>
+ <notification name="CannotDeedLandNothingSelected">
+ 土地を譲渡できません:
+区画が選定されていません。
+ </notification>
+ <notification name="CannotDeedLandNoGroup">
+ 土地を譲渡できません:
+グループが選択されていません。
+ </notification>
+ <notification name="CannotDeedLandNoRegion">
+ 土地を譲渡できません:
+この土地があるリージョンが見つかりません。
+ </notification>
+ <notification name="CannotDeedLandMultipleSelected">
+ 土地を譲渡できません:
+複数の区画が選択されています。
+
+区画を 1 つ選択してください。
+ </notification>
+ <notification name="CannotDeedLandWaitingForServer">
+ 土地を譲渡できません:
+サーバーからの所有権情報を待っています。
+
+再度、試みてください。
+ </notification>
+ <notification name="CannotDeedLandNoTransfer">
+ 土地を譲渡できません:
+[REGION] では土地の譲渡が許されていません。
+ </notification>
+ <notification name="CannotReleaseLandWatingForServer">
+ 土地を破棄できません:
+サーバーが区画情報を更新するのを待っています。
+
+もう少し後でやり直してください。
+ </notification>
+ <notification name="CannotReleaseLandSelected">
+ 土地を破棄できません:
+あなたは、選択した区画のすべてを所有していません。
+
+区画を 1 つ選択してください。
+ </notification>
+ <notification name="CannotReleaseLandDontOwn">
+ 土地を破棄できません:
+あなたはこの土地を手放すことを許可されていません。
+あなたの区画は緑色で表示されています。
+ </notification>
+ <notification name="CannotReleaseLandRegionNotFound">
+ 土地を放棄できません:
+この土地があるリージョンが見つかりません。
+ </notification>
+ <notification name="CannotReleaseLandNoTransfer">
+ 土地を破棄できません:
+[REGION] では土地の譲渡が許されていません。
+ </notification>
+ <notification name="CannotReleaseLandPartialSelection">
+ 土地を破棄できません:
+区画全体を選択して破棄する必要があります。
+
+区画全体を選択するか、または、まず最初に区画を分割してください。
+ </notification>
+ <notification name="ReleaseLandWarning">
+ あなたは、[AREA] 平方メートルの土地を破棄しようとしています。
+この区画を破棄するとあなたの土地ではなくなりますが、
+L$ は返金されません。
+
+土地を破棄しますか?
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="CannotDivideLandNothingSelected">
+ 土地を分割できません:
+
+区画が選定されていません。
+ </notification>
+ <notification name="CannotDivideLandPartialSelection">
+ 土地を分割できません:
+
+区画全体が選択されています。
+区画の一部を選択してください。
+ </notification>
+ <notification name="LandDivideWarning">
+ この土地を分割すると、2 つの区画に別れます。
+区画ごとの設定が可能になります。 この操作を行うと、一部の設定がデフォルトにリセットされます。
+
+土地の分割操作を続行しますか?
+ <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 つ作成されます。
+新しい区画の名前とオプションを再設定する必要があります。
+
+土地を統合しますか?
+ <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とチャットを表示"/>
+ </notification>
+ <notification name="OnlyOfficerCanBuyLand">
+ グループ用の土地の購入ができません:
+あなたにはアクティブなグループのために土地を購入する権限がありません。
+ </notification>
+ <notification label="フレンド登録" name="AddFriendWithMessage">
+ フレンド登録すると、お互いの現在地の地図への表示許可、オンライン状態の表示設定ができます。
+
+[NAME] にフレンドシップを申し出ますか?
+ <form name="form">
+ <input name="message">
+ フレンド登録してくれますか?
+ </input>
+ <button name="Offer" text="OK"/>
+ <button name="Cancel" text="キャンセル"/>
+ </form>
+ </notification>
+ <notification label="アウトフィットを保存する" name="SaveOutfitAs">
+ 着用中のアウトフィットを新しいアウトフットとして保存:
+ <form name="form">
+ <input name="message">
+ [DESC] (新)
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="キャンセル"/>
+ </form>
+ </notification>
+ <notification label="着用物を保存" name="SaveWearableAs">
+ アイテムを別名で持ち物に保存:
+ <form name="form">
+ <input name="message">
+ [DESC](新規)
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="取り消し"/>
+ </form>
+ </notification>
+ <notification label="アウトフィットの名前を変更する" name="RenameOutfit">
+ 新しいアウトフィットの名前:
+ <form name="form">
+ <input name="new_name">
+ [NAME]
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="取り消し"/>
+ </form>
+ </notification>
+ <notification name="RemoveFromFriends">
+ フレンドリストから [NAME] を削除しますか?
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="RemoveMultipleFromFriends">
+ フレンドリストから複数のフレンドを削除しますか?
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="GodDeleteAllScriptedPublicObjectsByUser">
+ **[AVATAR_NAME]**
+所有のすべてのスクリプトオブジェクトをこのシム内の他のすべての土地から削除しようとしています。操作を続行しますか?
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="GodDeleteAllScriptedObjectsByUser">
+ **[AVATAR_NAME]**
+所有のすべてのスクリプトオブジェクトをこのシム内のすべての土地から削除しようとしています。操作を続行しますか?
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="GodDeleteAllObjectsByUser">
+ **[AVATAR_NAME]**
+所有のすべてのオブジェクト(スクリプトオブジェクトと非スクリプトオブジェクト)を
+このシム内のすべての土地から削除しようとしています。操作を続行しますか?
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="BlankClassifiedName">
+ クラシファイドの名前を指定してください。
+ </notification>
+ <notification name="MinClassifiedPrice">
+ 広告料は最低 L$ [MIN_PRICE] 必要です。
+
+金額を増やしてください。
+ </notification>
+ <notification name="ConfirmItemDeleteHasLinks">
+ ここにリンクされたアイテムが少なくとも1つあります。 このアイテムを削除するとここにリンクされたものが機能しなくなります。 リンクを先に削除することを強くお勧めします。
+
+これらのアイテムを削除しますか?
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLock">
+ 選択したアイテムのうち、少なくとも 1 つがロックされています。
+
+本当に削除しますか?
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoCopy">
+ 選択したアイテムのうち、少なくとも 1 つがコピーできません。
+
+本当に削除しますか?
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoOwn">
+ 選択したアイテムのうち、少なくとも 1 つがあなたの所有物ではありません。
+
+本当に削除しますか?
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoCopy">
+ 少なくとも 1 つのオブジェクトがロックされています。
+少なくとも 1 つのオブジェクトがコピーできません。
+
+本当に削除しますか?
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoOwn">
+ 少なくとも 1 つのオブジェクトがロックされています。
+少なくとも 1 つのオブジェクトが、あなたの所有物ではありません。
+
+本当に削除しますか?
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteNoCopyNoOwn">
+ 少なくとも 1 つのオブジェクトがコピーできません。
+少なくとも 1 つのオブジェクトが、あなたの所有物ではありません。
+
+本当に削除しますか?
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
+ 少なくとも 1 つのオブジェクトがロックされています。
+少なくとも 1 つのオブジェクトがコピーできません。
+少なくとも 1 つのオブジェクトが、あなたの所有物ではありません。
+
+本当に削除しますか?
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectTakeLock">
+ 少なくとも 1 つのオブジェクトがロックされています。
+
+本当にこのまま取得を続けますか?
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectTakeNoOwn">
+ 取得しようとしているオブジェクトには、あなたの所有物ではないオブジェクトが含まれています。
+あなたの所有物ではないオブジェクトを取得すると、次の所有者の権限がそのオブジェクトに適用されます。
+そのため、将来、修正やコピーの能力が制限される可能性があります。
+
+本当にこのまま取得を続けますか?
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmObjectTakeLockNoOwn">
+ 少なくとも 1 つのオブジェクトがロックされています。
+取得しようとしているオブジェクトには、あなたの所有物ではないオブジェクトが含まれています。
+あなたの所有物ではないオブジェクトを取得すると、次の所有者の権限がそのオブジェクトに適用されます。
+そのため、将来、編集やコピーの能力が制限される可能性があります。
+この選択内容のままで続行することは可能ですが、
+
+本当にこのまま取得を続けますか?
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="CantBuyLandAcrossMultipleRegions">
+ 複数のリージョンが選択されたため、土地を購入できません。
+
+選択する面積を小さくしてもう一度試してください。
+ </notification>
+ <notification name="DeedLandToGroup">
+ この区画の譲渡に際しては、
+このグループが十分な土地クレジットを保有および維持している必要があります。
+土地の購入価格は、所有者に返金されません。譲渡された区画が売れると、売上金額はグループメンバーに均等に分配されます。
+
+この [AREA] 平方メートルの土地を、グループ
+「 [GROUP_NAME] 」に譲渡しますか?
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="DeedLandToGroupWithContribution">
+ この区画が譲渡されると、グループはその土地利用料として十分な残高を維持していく必要があります。
+譲渡には同時に [NAME] からグループへの土地の貢献が含まれます。
+土地の購入価格は所有者に返金されません。譲渡された区画が売却されると、販売価格はグループメンバーの間で均等に分配されます。
+
+この [AREA] m² の土地を [GROUP_NAME] というグループに譲渡しますか?
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="DisplaySetToSafe">
+ -safe オプションを指定したので、
+表示設定はセーフレベルに設定されています。
+ </notification>
+ <notification name="DisplaySetToRecommended">
+ 表示設定は、あなたのシステム構成に基づいて推奨されたレベルに設定されています。
+ </notification>
+ <notification name="ErrorMessage">
+ [ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AvatarMovedDesired">
+ 目的地は現在ご利用いただけません。
+近くのリージョンに移動しました。
+ </notification>
+ <notification name="AvatarMovedLast">
+ 前回いた場所は現在ご利用いただけません。
+近くのリージョンに移動しました。
+ </notification>
+ <notification name="AvatarMovedHome">
+ ホームロケーションは現在ご利用いただけません。
+近くのリージョンに移動しました。
+新たにホームを設定し直す必要があるかもしれません。
+ </notification>
+ <notification name="ClothingLoading">
+ 現在衣類をダウンロード中です。
+このまま [SECOND_LIFE] を通常通りご使用いただけます。他人からはあなたは正しく表示されます。
+ <form name="form">
+ <ignore name="ignore" text="衣類がダウンロードされるまで時間がかかっているとき"/>
+ </form>
+ </notification>
+ <notification name="FirstRun">
+ [APP_NAME] のインストールが完了しました。
+
+[SECOND_LIFE] を使ったことがない場合は、ログインする前にアカウントの作成を行ってください。
+[http://join.secondlife.com/?lang=ja-JP] で新しいアカウントを作成しますか?
+ <usetemplate name="okcancelbuttons" notext="続行" yestext="新規アカウント..."/>
+ </notification>
+ <notification name="LoginPacketNeverReceived">
+ 接続がなかなかできません。 お使いのインターネット接続か、[SECOND_LIFE_GRID] の問題と考えられます。
+
+インターネット接続を確認してから数分後に再接続するか、ヘルプをクリックして [SUPPORT_SITE] をご覧になるか、テレポートをクリックしてホームに移動してみてください。
+ <url name="url">
+ http://jp.secondlife.com/support/
+ </url>
+ <form name="form">
+ <button name="OK" text="OK"/>
+ <button name="Help" text="ヘルプ"/>
+ <button name="Teleport" text="テレポート"/>
+ </form>
+ </notification>
+ <notification name="WelcomeChooseSex">
+ まもなくあなたのアバターが表示されます。
+
+矢印キーを使用して歩きます。
+ヘルプが必要なときや [SECOND_LIFE] について知りたいときは、
+F1 キーを押してください。
+男性あるいは女性のアバターを選択してください。
+あなたの決定は後で変更できます。
+ <usetemplate name="okcancelbuttons" notext="女性" yestext="男性"/>
+ </notification>
+ <notification name="CantTeleportToGrid">
+ 現在のグリッド([CURRENT_GRID])とはグリッド([GRID])が異なるため、[SLURL] にテレポートできませんでした。 ビューワを閉じてからもう一度お試しください。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GeneralCertificateError">
+ サーバーに接続できませんでした。
+[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"/>
+ </notification>
+ <notification name="TrustCertificateError">
+ このサーバーの認証機関は不明です。
+
+認証情報:
+サブジェクト名: [SUBJECT_NAME_STRING]
+発行元: [ISSUER_NAME_STRING]
+有効日: [VALID_FROM]
+次の更新日: [VALID_TO]
+MD5 フィンガープリント: [SHA1_DIGEST]
+SHA1 フィンガープリント: [MD5_DIGEST]
+キー使用法: [KEYUSAGE]
+拡張キー使用法: [EXTENDEDKEYUSAGE]
+サブジェクトキー認識別子: [SUBJECTKEYIDENTIFIER]
+
+この認証局を信頼しますか?
+ <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="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="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="CanNotChangeAppearanceUntilLoaded">
+ 衣類およびシェイプが読み込まれるまでは、容姿の変更はできません。
+ </notification>
+ <notification name="ClassifiedMustBeAlphanumeric">
+ クラシファイド広告の名前は、アルファベットか数字で始めます。句読点では始められません。
+ </notification>
+ <notification name="CantSetBuyObject">
+ オブジェクトが販売対象ではないため、オブジェクトの購入ができません。
+販売対象のオブジェクトを指定してもう一度試してください。
+ </notification>
+ <notification name="FinishedRawDownload">
+ 未加工の地形ファイルをダウンロードしました:
+[DOWNLOAD_PATH]
+ </notification>
+ <notification name="DownloadWindowsMandatory">
+ [APP_NAME] の最新バージョンがご利用可能です。
+[MESSAGE]
+[APP_NAME] をご利用になるにはこのアップデートは必須です。
+ <usetemplate name="okcancelbuttons" notext="終了" yestext="ダウンロード"/>
+ </notification>
+ <notification name="DownloadWindows">
+ [APP_NAME] のアップデートバージョンがご利用可能です。
+[MESSAGE]
+このアップデートは必須ではありませんが、パフォーマンス向上のためにインストールをおすすめします。
+ <usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンロード"/>
+ </notification>
+ <notification name="DownloadWindowsReleaseForDownload">
+ [APP_NAME] のアップデートバージョンがご利用可能です。
+[MESSAGE]
+このアップデートは必須ではありませんが、パフォーマンス向上のためにインストールをおすすめします。
+ <usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンロード"/>
+ </notification>
+ <notification name="DownloadLinuxMandatory">
+ [APP_NAME] の最新バージョンがご利用可能です。
+[MESSAGE]
+[APP_NAME] をご利用になるにはこのアップデートは必須です。
+ <usetemplate name="okcancelbuttons" notext="終了" yestext="ダウンロード"/>
+ </notification>
+ <notification name="DownloadLinux">
+ [APP_NAME] のアップデートバージョンがご利用可能です。
+[MESSAGE]
+このアップデートは必須ではありませんが、パフォーマンス向上のためにインストールをおすすめします。
+ <usetemplate name="okcancelbuttons" notext="続ける" yestext="ダウンロード"/>
+ </notification>
+ <notification name="DownloadLinuxReleaseForDownload">
+ [APP_NAME] のアップデートバージョンがご利用可能です。
+[MESSAGE]
+このアップデートは必須ではありませんが、パフォーマンス向上のためにインストールをおすすめします。
+ <usetemplate name="okcancelbuttons" notext="続ける" yestext="ダウンロード"/>
+ </notification>
+ <notification name="DownloadMacMandatory">
+ [APP_NAME] の最新バージョンがご利用可能です。
+[MESSAGE]
+[APP_NAME] をご利用になるにはこのアップデートは必須です。
+
+あなたのアプリケーションフォルダにダウンロードしますか?
+ <usetemplate name="okcancelbuttons" notext="終了" yestext="ダウンロード"/>
+ </notification>
+ <notification name="DownloadMac">
+ [APP_NAME] のアップデートバージョンがご利用可能です。
+[MESSAGE]
+このアップデートは必須ではありませんが、パフォーマンス向上のためにインストールをおすすめします。
+
+あなたのアプリケーションフォルダにダウンロードしますか?
+ <usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンロード"/>
+ </notification>
+ <notification name="DownloadMacReleaseForDownload">
+ [APP_NAME] のアップデートバージョンがご利用可能です。
+[MESSAGE]
+このアップデートは必須ではありませんが、パフォーマンス向上のためにインストールをおすすめします。
+
+あなたのアプリケーションフォルダにダウンロードしますか?
+ <usetemplate name="okcancelbuttons" notext="続行" yestext="ダウンロード"/>
+ </notification>
+ <notification name="FailedUpdateInstall">
+ ビューワのアップデートをインストール中にエラーが発生しました。
+http://secondlife.com/download から最新バージョンをダウンロードしてインストールしてください。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="FailedRequiredUpdateInstall">
+ 必要なアップデートをインストールできませんでした。
+[APP_NAME] がアップデートされるまでログインできません。
+
+http://secondlife.com/download から最新バージョンをダウンロードしてインストールしてください。
+ <usetemplate name="okbutton" yestext="終了"/>
+ </notification>
+ <notification name="UpdaterServiceNotRunning">
+ お使いの Second Life に必要なアップデートがインストールされていません。
+
+このアップデートは、http://www.secondlife.com/downloads からダウンロードして、今すぐインストールできます。
+ <usetemplate name="okcancelbuttons" notext="終了" yestext="今すぐダウンロードしてインストール"/>
+ </notification>
+ <notification name="DownloadBackgroundTip">
+ お使いの [APP_NAME] に必要なアップデートをダウンロードしました。
+バージョン [VERSION] [[RELEASE_NOTES_FULL_URL] このアップデートに関する情報]
+ <usetemplate name="okcancelbuttons" notext="後で実行" yestext="今すぐインストールして [APP_NAME] を再起動"/>
+ </notification>
+ <notification name="DownloadBackgroundDialog">
+ お使いの [APP_NAME] に必要なアップデートをダウンロードしました。
+バージョン [VERSION] [[RELEASE_NOTES_FULL_URL] このアップデートに関する情報]
+ <usetemplate name="okcancelbuttons" notext="後で実行" yestext="今すぐインストールして [APP_NAME] を再起動"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedVerboseDialog">
+ 必要なソフトウェアのアップデートをダウンロードしました。
+バージョン [VERSION]
+
+アップデートをインストールするには [APP_NAME] を再起動する必要があります。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RequiredUpdateDownloadedDialog">
+ アップデートをインストールするには [APP_NAME] を再起動する必要があります。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="DeedObjectToGroup">
+ このオブジェクトを譲渡するとグループは以下のことが可能です:
+* オブジェクトに支払われた L$ を受領します。
+ <usetemplate ignoretext="オブジェクトをグループに譲渡する前の確認" name="okcancelignore" notext="取り消し" yestext="譲渡"/>
+ </notification>
+ <notification name="WebLaunchExternalTarget">
+ Web ブラウザを開いてこのコンテンツを表示しますか?
+ <usetemplate ignoretext="ブラウザを起動して Web ページを見るとき" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchJoinNow">
+ [http://jp.secondlife.com/account/ マイアカウント] ページに移動してアカウントを管理しますか?
+ <usetemplate ignoretext="ブラウザを起動してアカウントを管理するとき" name="okcancelignore" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchSecurityIssues">
+ [SECOND_LIFE] Wiki で、セキュリティ問題を報告する方法をご覧ください。
+ <usetemplate ignoretext="ブラウザを起動してセキュリティ問題の報告の仕方を確認するとき" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchQAWiki">
+ [SECOND_LIFE] 品質保証関連 Wiki をご覧ください。
+ <usetemplate ignoretext="ブラウザを起動して QA Wiki を見るとき" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchPublicIssue">
+ [SECOND_LIFE] のパブリック問題トラッカーで、
+バグやその他の問題を報告できます。
+ <usetemplate ignoretext="ブラウザを起動してパブリック問題トラッカーを使用するとき" name="okcancelignore" notext="キャンセル" yestext="ページへ行く"/>
+ </notification>
+ <notification name="WebLaunchSupportWiki">
+ Linden 公式ブログで、最新のニュースや情報を入手してください。
+ <usetemplate ignoretext="ブラウザを起動して公式ブログを見るとき" name="okcancelignore" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchLSLGuide">
+ スクリプトガイドを開きますか?
+ <usetemplate ignoretext="ブラウザを起動してスクリプトガイドを見るとき" name="okcancelignore" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="WebLaunchLSLWiki">
+ LSL ポータルでスクリプトに関する情報を確認しますか?
+ <usetemplate ignoretext="ブラウザを起動して LSL ポータルを見るとき" name="okcancelignore" notext="取り消し" yestext="ページに移動"/>
+ </notification>
+ <notification name="ReturnToOwner">
+ 選択したオブジェクトを、所有者に返却しますか?
+「再販・プレゼント可」の譲渡されたオブジェクトは、以前の所有者に返却されます。
+
+*警告* 「再販・プレゼント不可」の譲渡されたオブジェクトは、削除されます!
+ <usetemplate ignoretext="オブジェクトを所有者に返却する前の確認" name="okcancelignore" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="GroupLeaveConfirmMember">
+ 現在あなたは [GROUP] のメンバーです。
+このグループを抜けますか?
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmKick">
+ 本当に住人全員をグリッドから追い出しますか?
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="住人全員を追い出す"/>
+ </notification>
+ <notification name="MuteLinden">
+ リンデンをブロックすることはできません。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CannotStartAuctionAlreadyForSale">
+ 既に売り出し中の区画なのでオークションにかけることはできません。 オークションにかけたい場合は売り出し設定を解除してから行ってください。
+ </notification>
+ <notification label="名前でのオブジェクトのブロックに失敗しました" name="MuteByNameFailed">
+ この名前は既にブロック済みです。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RemoveItemWarn">
+ コンテンツを削除すると、許可があってもオブジェクトに損傷を与えることがあります。
+削除を続けますか?
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="CantOfferCallingCard">
+ 現在コーリングカードを送れません。数分後にもう一度お試しください。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="CantOfferFriendship">
+ 現在フレンドシップを送れません。数分後にもう一度お試しください。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="BusyModeSet">
+ 取り込み中モードになりました。
+チャットとインスタントメッセージは表示されません。 受信するインスタントメッセージには取り込み中返答メッセージが表示されます。 テレポートのオファーは受け取り拒否となります。 アイテムのオファーはすべてごみ箱に入ります。
+ <usetemplate ignoretext="ログイン状態を取り込み中モードに変更するとき" name="okignore" yestext="OK"/>
+ </notification>
+ <notification name="JoinedTooManyGroupsMember">
+ 加入できるグループの最大限に達しました。 このグループに加入するために他のグループを脱退するか、この申し入れを断ってください。
+[NAME] があなたをグループのメンバーとして勧誘しています。
+ <usetemplate name="okcancelbuttons" notext="辞退" yestext="参加"/>
+ </notification>
+ <notification name="JoinedTooManyGroups">
+ 加入できるグループの最大限に達しました。 新しくグループに参加、または作成する前に、どれかグループから抜けてください。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="KickUser">
+ どのようなメッセージを添えてこの住人を追い出しますか?
+ <form name="form">
+ <input name="message">
+ あなたは管理者によりログオフされました。
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="取り消し"/>
+ </form>
+ </notification>
+ <notification name="KickAllUsers">
+ どのようなメッセージをつけてグリッドにいる全員を追い出しますか?
+ <form name="form">
+ <input name="message">
+ あなたは管理者によりログオフされました。
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="取り消し"/>
+ </form>
+ </notification>
+ <notification name="FreezeUser">
+ どのようなメッセージを添えてこの住人をフリーズしますか?
+ <form name="form">
+ <input name="message">
+ あなたはフリーズされています。 動くこともチャットすることもできません。 管理者が IM であなたに連絡します。
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="取り消し"/>
+ </form>
+ </notification>
+ <notification name="UnFreezeUser">
+ どのようなメッセージを添えてこの住人のフリーズを解除しますか?
+ <form name="form">
+ <input name="message">
+ もうフリーズされていません。
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="取り消し"/>
+ </form>
+ </notification>
+ <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] 文字までです。
+
+もう少し短い名前をお試しください。
+ </notification>
+ <notification name="SetDisplayNameFailedGeneric">
+ 申し訳ありませんが、表示名を設定できませんでした。あとでもう一度お試しください。
+ </notification>
+ <notification name="SetDisplayNameMismatch">
+ 入力した表示名が一致しません。もう一度入力してください。
+ </notification>
+ <notification name="AgentDisplayNameUpdateThresholdExceeded">
+ しばらくは表示名を変更できません。
+
+http://wiki.secondlife.com/wiki/Setting_your_display_name を参照してください。
+
+あとでもう一度お試しください。
+ </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>
+ </notification>
+ <notification name="OfferTeleportFromGod">
+ 現在地に住人をゴッドサモンしますか?
+ <form name="form">
+ <input name="message">
+ [REGION] に来ませんか?
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="取り消し"/>
+ </form>
+ </notification>
+ <notification name="TeleportFromLandmark">
+ このまま &lt;nolink&gt;[LOCATION]&lt;/nolink&gt; にテレポートしますか?
+ <usetemplate ignoretext="ランドマークにテレポートしたいかどうかの確認" name="okcancelignore" notext="キャンセル" yestext="テレポート"/>
+ </notification>
+ <notification name="TeleportToPick">
+ [PICK] にテレポートしますか?
+ <usetemplate ignoretext="ピックの場所にテレポートしたいかどうかの確認" name="okcancelignore" notext="キャンセル" yestext="テレポート"/>
+ </notification>
+ <notification name="TeleportToClassified">
+ [CLASSIFIED] にテレポートしますか?
+ <usetemplate ignoretext="クラシファイド広告の場所にテレポートしたいかどうかの確認" name="okcancelignore" notext="キャンセル" yestext="テレポート"/>
+ </notification>
+ <notification name="TeleportToHistoryEntry">
+ [HISTORY_ENTRY] にテレポートしますか?
+ <usetemplate ignoretext="履歴の場所にテレポートしたいかどうかの確認" name="okcancelignore" notext="キャンセル" yestext="テレポート"/>
+ </notification>
+ <notification label="あなたの不動産内の全員にメッセージを送信" name="MessageEstate">
+ 今あなたの不動産にいる人全員に送る、短いメッセージを入力してください。
+ <form name="form">
+ <input name="message"/>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="取り消し"/>
+ </form>
+ </notification>
+ <notification label="Lindenの不動産を変更" name="ChangeLindenEstate">
+ リンデンが所有するエステート(メインランド、ティーングリッド、オリエンテーションなど)を変更しようとしています。
+
+住人の体験に根本的に影響を与えるため、非常に危険な行為です。 メインランドでは、何千というリージョンが変更による影響を受け、そのためスペースサーバーに負担をかけることになります。
+
+それでも続けますか?
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
+ <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="EstateKickUser">
+ この不動産から [EVIL_USER] を追い出しますか?
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="EstateChangeCovenant">
+ 不動産約款を変更しようとしています。続けますか?
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked">
+ あなたのレーティング区分により、そのリージョン(地域)へは入ることができません。 年齢を確認する際の情報に不足があったためと考えられます。
+
+最新ビューワがインストールされているかをご確認ください。このレーティング区分でのアクセスに関する詳細はナレッジベースをご覧ください。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_KB">
+ あなたのレーティング区分により、そのリージョン(地域)へは入ることができません。
+
+ナレッジベースを開きレーティング区分について学びますか?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/ja
+ </url>
+ <usetemplate ignoretext="レーティング区分の制限のため、リージョンに入ることができないとき" name="okcancelignore" notext="閉じる" yestext="ナレッジベースを開く"/>
+ </notification>
+ <notification name="RegionEntryAccessBlocked_Notify">
+ あなたのレーティング区分により、そのリージョン(地域)へは入ることができません。
+ </notification>
+ <notification name="RegionEntryAccessBlocked_Change">
+ レーティング区分に関する設定により、その地域(リージョン)には立ち入れません。
+
+その地域に入るには、あなたのレーティング区分の設定を変更してください。変更すると、[REGIONMATURITY]のコンテンツの検索やアクセスが可能になります。変更内容を元に戻すには、ミー &gt; 環境設定 &gt; 一般を選択してください。
+ <form name="form">
+ <button name="OK" text="環境設定の変更"/>
+ <button default="true" name="Cancel" text="閉じる"/>
+ <ignore name="ignore" text="選択したレーティング区分が原因で、リージョンに入れないとき"/>
+ </form>
+ </notification>
+ <notification name="PreferredMaturityChanged">
+ あなたのレーティング区分設定は現在 [RATING] です。
+ </notification>
+ <notification name="LandClaimAccessBlocked">
+ あなたのレーティング区分により、この土地を取得することはできません。 年齢を確認する際の情報に不足があったためと考えられます。
+
+最新ビューワがインストールされているかをご確認ください。このレーティング区分でのアクセスに関する詳細はナレッジベースをご覧ください。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked_KB">
+ あなたのレーティング区分により、この土地を取得することはできません。
+
+ナレッジベースを開きレーティング区分について学びますか?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/ja
+ </url>
+ <usetemplate ignoretext="レーティング区分の制限のため、この土地を取得できません" name="okcancelignore" notext="閉じる" yestext="ナレッジベースを開く"/>
+ </notification>
+ <notification name="LandClaimAccessBlocked_Notify">
+ あなたのレーティング区分により、この土地を取得することはできません。
+ </notification>
+ <notification name="LandClaimAccessBlocked_Change">
+ あなたのレーティング区分設定により、この土地を取得することはできません。
+
+「設定を変更」をクリックしてあなたのレーティング区分を上げると、入れるようになります。 あなたは今後 [REGIONMATURITY] コンテンツの検索及びアクセスが可能となります。 あとで設定を元に戻したい場合は、「編集」>「環境設定」をご覧ください。
+ <usetemplate ignoretext="選択したレーティング区分が原因で、土地を取得できないとき" name="okcancelignore" notext="閉じる" yestext="設定の変更"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked">
+ あなたのレーティング区分により、この土地を購入することはできません。 年齢を確認する際の情報に不足があったためと考えられます。
+
+最新ビューワがインストールされているかをご確認ください。このレーティング区分でのアクセスに関する詳細はナレッジベースをご覧ください。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked_KB">
+ あなたのレーティング区分により、この土地を購入することはできません。
+
+ナレッジベースを開きレーティング区分について学びますか?
+ <url name="url">
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/ja
+ </url>
+ <usetemplate ignoretext="レーティング区分の制限のため、この土地を購入できません" name="okcancelignore" notext="閉じる" yestext="ナレッジベースを開く"/>
+ </notification>
+ <notification name="LandBuyAccessBlocked_Notify">
+ あなたのレーティング区分により、この土地を購入することはできません。
+ </notification>
+ <notification name="LandBuyAccessBlocked_Change">
+ あなたのレーティング区分設定により、この土地を購入することができません。
+
+「設定を変更」をクリックしてあなたのレーティング区分を上げると、入れるようになります。 あなたは今後 [REGIONMATURITY] コンテンツの検索及びアクセスが可能となります。 あとで設定を元に戻したい場合は、「編集」>「環境設定」をご覧ください。
+ <usetemplate ignoretext="選択したレーティング区分が原因で、土地を購入できないとき" name="okcancelignore" notext="閉じる" yestext="設定の変更"/>
+ </notification>
+ <notification name="TooManyPrimsSelected">
+ 選択したプリムが多すぎます。 [MAX_PRIM_COUNT] 個選択するか、プリム数を減らしてもう一度お試しください。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ProblemImportingEstateCovenant">
+ 不動産約款のインポート時に問題が発生しました。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ProblemAddingEstateManager">
+ 新しい不動産マネージャーの追加に関する問題:
+いずれかの不動産のマネージャーリストが満杯になっています。
+ </notification>
+ <notification name="ProblemAddingEstateGeneric">
+ 不動産リストの追加に関する問題:
+いずれかの不動産のリストが満杯になっています。
+ </notification>
+ <notification name="UnableToLoadNotecardAsset">
+ 現在ノートカードのアセット ID を読み込むことができません。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="NotAllowedToViewNotecard">
+ 要求したアセット ID に関するノートカードを閲覧するには、権限が不十分です。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MissingNotecardAssetID">
+ ノートカード用のアセット ID がデータベースに登録されていません。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="PublishClassified">
+ 注意:クラシファイド広告の料金は払い戻しされません。
+
+L$ [AMOUNT] で、このクラシファイド広告を今すぐ公開しますか?
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="SetClassifiedMature">
+ この広告に「Moderate」コンテンツは含まれていますか?
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="いいえ" yestext="はい"/>
+ </notification>
+ <notification name="SetGroupMature">
+ このグループに「Moderate」コンテンツが含まれていますか?
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="いいえ" yestext="はい"/>
+ </notification>
+ <notification label="再起動を確認" name="ConfirmRestart">
+ このリージョンを 2 分後に再起動しようとしています。
+続けますか?
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification label="このリージョンにメッセージを送信" name="MessageRegion">
+ このリージョンにいる人全員に送る短いメッセージを入力してください。
+ <form name="form">
+ <input name="message"/>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="取り消し"/>
+ </form>
+ </notification>
+ <notification label="地域のレーティング区分指定変更済み" name="RegionMaturityChange">
+ このリージョン(地域)のレーティング区分がアップデートされました。
+地図に変更が反映されるまで数分かかることがあります。
+
+Adult 専用リージョンに入るには、住人のアカウントが年齢確認か支払方法のいずれかで「確認済み」でなければなりません。
+ </notification>
+ <notification label="ボイスバージョンの不一致" name="VoiceVersionMismatch">
+ [APP_NAME] のこのバージョンは、このリージョンにおけるボイスチャットの互換性がありません。 ボイスチャットを正常に行うためには、[APP_NAME] のアップデートが必要です。
+ </notification>
+ <notification label="オブジェクトを購入できません" name="BuyObjectOneOwner">
+ 複数の所有者から同時にオブジェクトを購入することはできません。
+単一のオブジェクトを選択し、もう一度試してください。
+ </notification>
+ <notification label="コンテンツを購入できません" name="BuyContentsOneOnly">
+ 一度に複数のオブジェクトのコンテンツは購入できません。
+選択するオブジェクトを1つだけにして、もう一度試してください。
+ </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">
+ この取引は以下のとおり行われます:
+[ACTION]
+
+購入を続けますか?
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmPurchasePassword">
+ この取引は以下のとおり行われます:
+[ACTION]
+
+購入を続けますか?
+パスワードを再入力し、「 OK 」をクリックしてください。
+ <form name="form">
+ <input name="message"/>
+ <button name="ConfirmPurchase" text="OK"/>
+ <button name="Cancel" text="取り消し"/>
+ </form>
+ </notification>
+ <notification name="SetPickLocation">
+ メモ:
+本ピックの位置を更新しましたが、
+他の詳細は元の値のままになります。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="MoveInventoryFromObject">
+ 「コピー不可」の持ち物アイテムを選択しました。
+これらのアイテムはコピーされないまま、あなたの「持ち物」に移動されます。
+
+
+アイテムを動かしますか?
+ <usetemplate ignoretext="「コピー不可」のアイテムをオブジェクトから動かす前の警告" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="MoveInventoryFromScriptedObject">
+ 「コピー不可」の持ち物アイテムを選択しました。
+これらのアイテムはコピーされずに、あなたの「持ち物」に移動されます。
+このオブジェクトはスクリプト付きなので、「持ち物」に移動させると
+スクリプトに誤動作が起きる可能性があります。
+
+持ち物アイテムを移動しますか?
+ <usetemplate ignoretext="スクリプト入りのオブジェクトを壊す恐れのある「コピー不可」のアイテムを動かす前の警告" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ClickActionNotPayable">
+ 警告: クリックで「オブジェクトに支払う」設定をしました。スクリプトに money()イベントが追加されると動作します。
+ <form name="form">
+ <ignore name="ignore" text="オブジェクトを作成中に、money() スクリプトを入れずに「オブジェクトに支払う」アクションを設定したとき"/>
+ </form>
+ </notification>
+ <notification name="OpenObjectCannotCopy">
+ このオブジェクトには、あなたがコピーできるアイテムはありません。
+ </notification>
+ <notification name="WebLaunchAccountHistory">
+ [http://jp.secondlife.com/account/ マイアカウント] ページに移動してアカウント履歴を確認しますか?
+ <usetemplate ignoretext="ブラウザを起動してアカウント履歴を見るとき" name="okcancelignore" notext="取り消し" yestext="ページに移動"/>
+ </notification>
+ <notification name="ConfirmQuit">
+ 終了しようとしています。続けますか?
+ <usetemplate ignoretext="終了時の確認" name="okcancelignore" notext="終了しない" yestext="終了"/>
+ </notification>
+ <notification name="DeleteItems">
+ [QUESTION]
+ <usetemplate ignoretext="アイテムを削除する前の確認" name="okcancelignore" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="HelpReportAbuseEmailLL">
+ このツールを利用して [http://secondlife.com/corporate/tos.php 利用規約] や [http://jp.secondlife.com/corporate/cs.php コミュニティスタンダード] の違反を報告してください。
+
+報告された嫌がらせはすべて調査・解決されます。
+ </notification>
+ <notification name="HelpReportAbuseSelectCategory">
+ 嫌がらせ報告のカテゴリを選択してください。
+カテゴリを選択することにより、嫌がらせ報告の処理や保管に大変役立ちます。
+ </notification>
+ <notification name="HelpReportAbuseAbuserNameEmpty">
+ 嫌がらせ行為をした人の名前を入力してください。
+正確な情報の入力により、嫌がらせ報告の処理や保管に大変役立ちます。
+ </notification>
+ <notification name="HelpReportAbuseAbuserLocationEmpty">
+ 嫌がらせがあった場所を入力してください。
+正確な情報の入力により、嫌がらせ報告の処理や保管に大変役立ちます。
+ </notification>
+ <notification name="HelpReportAbuseSummaryEmpty">
+ 嫌がらせの概要を入力してください。
+正確な概要の入力により、
+嫌がらせ報告の処理や保管に大変役立ちます。
+ </notification>
+ <notification name="HelpReportAbuseDetailsEmpty">
+ 嫌がらせの詳細な説明を入力してください。
+名前や嫌がらせの詳細を、できるだけ具体的に入力してください。
+
+正確な説明の入力により、
+嫌がらせ報告の処理や保管に大変役立ちます。
+ </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] の世界からコンテンツを削除して欲しいというリクエストには応じません。
+
+(2) DMCA またはコンテンツの撤去の手順 コンテンツを [SECOND_LIFE] から削除して欲しいというリクエストをするには、弊社 [http://secondlife.com/corporate/dmca.php DMCA ポリシー] で提示されているとおり、有効な侵害の通知を提出しなければなりません。.
+
+このまま嫌がらせの報告を続けたい場合は、このウィンドウを閉じて報告を送ってください。 「コピー Bot 及び権限の悪用」のカテゴリを選んだ方が適切の場合があります。
+
+ご協力ありがとうございます。
+
+Linden Lab
+ </notification>
+ <notification name="FailedRequirementsCheck">
+ 以下の必要なコンポーネントが、[FLOATER] から抜け落ちています
+[COMPONENTS]
+ </notification>
+ <notification label="既存の付属品を置換" name="ReplaceAttachment">
+ 体のこの部位には既にオブジェクトが装着されています。
+選択されたオブジェクトと置き換えますか?
+ <form name="form">
+ <ignore name="ignore" save_option="true" text="装着しているアイテムと選択したアイテムを入れ替えるとき"/>
+ <button ignore="自動的に交換" name="Yes" text="OK"/>
+ <button ignore="交換しない" name="No" text="キャンセル"/>
+ </form>
+ </notification>
+ <notification label="取り込み中の警告" name="BusyModePay">
+ 現在、「取り込み中」モードのため、支払いと引き換えにアイテムを受け取ることができません。
+
+この取引を行うために「取り込み中」の設定を解除しますか?
+ <form name="form">
+ <ignore name="ignore" save_option="true" 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="ConfirmEmptyTrash">
+ ごみ箱の中身をすべて削除しますか?
+ <usetemplate ignoretext="持ち物のごみ箱フォルダを空にする前の確認" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearBrowserCache">
+ トラベル、Web、検索の履歴をすべて削除しますか?
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearCookies">
+ 本当にクッキーをクリアしますか?
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="はい"/>
+ </notification>
+ <notification name="ConfirmClearMediaUrlList">
+ 保存された URL のリストを消去します。よろしいですか?
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="はい"/>
+ </notification>
+ <notification name="ConfirmEmptyLostAndFound">
+ 紛失物の中身をすべて削除しますか?
+ <usetemplate ignoretext="紛失物フォルダを空にする前の確認" name="okcancelignore" notext="いいえ" yestext="はい"/>
+ </notification>
+ <notification name="CopySLURL">
+ 次の SLurl がクリップボードにコピーされました:
+ [SLURL]
+
+Web ページにリンクすると、他人がこの場所に簡単にアクセスできます。Web ブラウザのアドレスバーに貼り付けて試してみてください。
+ <form name="form">
+ <ignore name="ignore" text="クリップボードに SLurl をコピーするとき"/>
+ </form>
+ </notification>
+ <notification name="WLSavePresetAlert">
+ 保存された事前設定を上書きしますか?
+ <usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+ </notification>
+ <notification name="WLDeletePresetAlert">
+ 「 [SKY] 」を削除しますか?
+ <usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+ </notification>
+ <notification name="WLNoEditDefault">
+ デフォルトの設定を編集したり削除したりすることはできません。
+ </notification>
+ <notification name="WLMissingSky">
+ このデイサイクルのファイルは次の存在しない「空」ファイルを参照しています: [SKY]。
+ </notification>
+ <notification name="PPSaveEffectAlert">
+ ポストプロセス効果が存在します。 上書きしますか?
+ <usetemplate name="okcancelbuttons" notext="いいえ" yestext="はい"/>
+ </notification>
+ <notification name="NewSkyPreset">
+ 新しい空の名前を指定してください。
+ <form name="form">
+ <input name="message">
+ 新しい事前設定
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="キャンセル"/>
+ </form>
+ </notification>
+ <notification name="ExistsSkyPresetAlert">
+ 事前設定がすでに存在します!
+ </notification>
+ <notification name="NewWaterPreset">
+ 新しい水の事前設定の名前を指定してください。
+ <form name="form">
+ <input name="message">
+ 新しい事前設定
+ </input>
+ <button name="OK" text="OK"/>
+ <button name="Cancel" text="キャンセル"/>
+ </form>
+ </notification>
+ <notification name="ExistsWaterPresetAlert">
+ 事前設定がすでに存在します!
+ </notification>
+ <notification name="WaterNoEditDefault">
+ デフォルトの設定を編集したり削除したりすることはできません。
+ </notification>
+ <notification name="ChatterBoxSessionStartError">
+ [RECIPIENT] と新しいチャットを開始することができません。
+[REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ChatterBoxSessionEventError">
+ [EVENT]
+[REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ForceCloseChatterBoxSession">
+ [NAME] とのチャットセッションを閉じます。
+[REASON]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="Cannot_Purchase_an_Attachment">
+ オブジェクトが取り付けられているままでは購入できません。
+ </notification>
+ <notification label="引き出し許可のリクエストについて" name="DebitPermissionDetails">
+ このリクエストを許可すると、スクリプトであなたのアカウントからリンデンドルを引き出せるようになります。
+この許可を取り消すには、オブジェクトの所有者がオブジェクトを削除するか、オブジェクトのスクリプトをリセットしなければなりません。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AutoWearNewClothing">
+ 作成する衣類を自動的に装着しますか?
+ <usetemplate ignoretext="「容姿」を編集中に、作成する衣類を装着するとき" name="okcancelignore" notext="いいえ" yestext="はい"/>
+ </notification>
+ <notification name="NotAgeVerified">
+ 年齢確認を済ませていないとこの区画を訪れることができません。 [SECOND_LIFE] サイトで年齢の確認を行いますか?
+
+[_URL]
+ <url name="url" option="0">
+ https://secondlife.com/account/verification.php?lang=ja
+ </url>
+ <usetemplate ignoretext="年齢の確認を済ませていないとき" name="okcancelignore" notext="いいえ" yestext="はい"/>
+ </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="CancelledSit">
+ 座るのをやめました。
+ </notification>
+ <notification name="CancelledAttach">
+ 添付が取り消されました。
+ </notification>
+ <notification name="ReplacedMissingWearable">
+ 欠落している衣類や身体部位をデフォルトに置き換えます。
+ </notification>
+ <notification name="GroupNotice">
+ 件名: [SUBJECT]、メッセージ: [MESSAGE]
+ </notification>
+ <notification name="FriendOnline">
+ [NAME] はオンライン中です
+ </notification>
+ <notification name="FriendOffline">
+ [NAME] はオフライン中です
+ </notification>
+ <notification name="AddSelfFriend">
+ 残念ながら自分自身をフレンド登録することはできません。
+ </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="UnableToLoadNotecard">
+ ノートカードを読み込めません。あとで再度お試しください。
+ </notification>
+ <notification name="ScriptMissing">
+ データベースにスクリプトがありません。
+ </notification>
+ <notification name="ScriptNoPermissions">
+ スクリプトを閲覧するには権限が不十分です。
+ </notification>
+ <notification name="UnableToLoadScript">
+ スクリプトをロードできません。 もう一度試してください。
+ </notification>
+ <notification name="IncompleteInventory">
+ あなたの提供するコンテンツは、ローカルではまだ全部揃っていません。
+しばらくしてからもう一度お試しください。
+ </notification>
+ <notification name="CannotModifyProtectedCategories">
+ 保護されたカテゴリは修正できません。
+ </notification>
+ <notification name="CannotRemoveProtectedCategories">
+ 保護されたカテゴリは削除できません。
+ </notification>
+ <notification name="UnableToBuyWhileDownloading">
+ オブジェクトデータのダウンロード中は購入できません。
+もう一度お試しください。
+ </notification>
+ <notification name="UnableToLinkWhileDownloading">
+ オブジェクトデータのウンロード中はリンクできません。
+もう一度お試しください。
+ </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] といった場所にテレポートできます。
+好きなランドマークをクリックして選び、次にパネル下の「テレポート」をクリックします。
+(ランドマークをダブルクリック、または右クリックして「テレポート」を選んでも同じです。)
+ </notification>
+ <notification name="TeleportToPerson">
+ 画面右の「人」パネルを開いて、[NAME] といった住人に連絡を取ることができます。
+リストから住人を選択して、パネル下の「IM」をクリックします。
+(リストの名前をダブルクリック、または右クリックして「IM」を選んでも同じです。)
+ </notification>
+ <notification name="CantSelectLandFromMultipleRegions">
+ サーバーの境界を越えて土地を選択することできません。
+もっと小さな土地を選択してください。
+ </notification>
+ <notification name="SearchWordBanned">
+ コミュニティスタンダードに明記されているコンテンツ制限により、あなたの検索語の一部が除外されました。
+ </notification>
+ <notification name="NoContentToSearch">
+ 少なくともどれか一つコンテンツの種類を選択して検索を行ってください。(General、Moderate、Adult)
+ </notification>
+ <notification name="SystemMessage">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentReceived">
+ [MESSAGE]
+ </notification>
+ <notification name="PaymentSent">
+ [MESSAGE]
+ </notification>
+ <notification name="EventNotification">
+ イベント通知:
+
+[NAME]
+[DATE]
+ <form name="form">
+ <button name="Details" text="詳細"/>
+ <button name="Cancel" text="取り消し"/>
+ </form>
+ </notification>
+ <notification name="TransferObjectsHighlighted">
+ この区画の購入者に受け渡されるオブジェクトは、すべて区画上で強調表示されています。
+
+
+*受け渡される樹木や植物は、強調表示されていません。
+ <form name="form">
+ <button name="Done" text="完了"/>
+ </form>
+ </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]
+
+プラグインをインストールしなおすか、問題が解決しない場合はメーカーにお問い合わせください。
+ <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">
+ 選択した区画上の、[GROUPNAME] というグループと共有していたオブジェクトは、それぞれの所有者の「持ち物」に返却されました。
+譲渡されていた「再販・プレゼント可」のオブジェクトは、以前の所有者に返却されました。
+グループに譲渡されていた「再販・プレゼント不可」のオブジェクトは、削除されました。
+ </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="ScriptsStopped">
+ 管理者がこのリージョンのスクリプトを一時停止しました。
+ </notification>
+ <notification name="ScriptsNotRunning">
+ このリージョンではスクリプトの使用が禁止されています。
+ </notification>
+ <notification name="NoOutsideScripts">
+ この土地では、外部のスクリプトが禁止されています。
+
+土地所有者のもの以外はスクリプトが実行されません。
+ </notification>
+ <notification name="ClaimPublicLand">
+ そのリージョンにいないと公共の土地を取得することはできません。
+ </notification>
+ <notification name="RegionTPAccessBlocked">
+ あなたのレーティング区分によりそのリージョンへは入ることができません。 年齢確認を行うか、最新ビューワをインストールしてください。
+
+現在のレーティング区分でアクセス可能なエリアに関する詳細はナレッジベースを参照してください。
+ </notification>
+ <notification name="URBannedFromRegion">
+ あなたはリージョンへの立入が禁止されています。
+ </notification>
+ <notification name="NoTeenGridAccess">
+ あなたのアカウントではティーングリッドに接続できません。
+ </notification>
+ <notification name="ImproperPaymentStatus">
+ このリージョンに入るために適した支払いステータスがありません。
+ </notification>
+ <notification name="MustGetAgeRgion">
+ このリージョンに入るためには、年齢確認を済ませる必要があります。
+ </notification>
+ <notification name="MustGetAgeParcel">
+ この区画に入るためには、年齢確認を済ませる必要があります。
+ </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>
+ <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="NoValidTimestamp">
+ タイムスタンプが無効です。
+ </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; という名前のオブジェクトが、あなたに [ITEM_SLURL] を渡そうとしています。このアイテムを使うにはアドバンスモードへの切り替えが必要です。アドバンスモードでログインしなおすと、あなたの持ち物にこのアイテムが見つかります。アドバンスモードに切り替えるには、このアプリケーションを終了して再起動し、ログイン画面でモード設定を変更してください。
+ <form name="form">
+ <button name="Keep" text="アイテムを受け取る"/>
+ <button name="Discard" text="アイテムを拒否する"/>
+ <button name="Mute" text="オブジェクトをブロックする"/>
+ </form>
+ </notification>
+ <notification name="UserGiveItem">
+ [NAME_SLURL] は [ITEM_SLURL] を渡そうとしています。このアイテムを使うにはアドバンスモードへの切り替えが必要です。アドバンスモードでログインしなおすと、あなたの持ち物にこのアイテムが見つかります。アドバンスモードに切り替えるには、このアプリケーションを終了して再起動し、ログイン画面でモード設定を変更してください。
+ <form name="form">
+ <button name="Show" text="アイテムを受け取る"/>
+ <button name="Discard" text="アイテムを拒否する"/>
+ <button name="Mute" text="ユーザーをブロックする"/>
+ </form>
+ </notification>
+ <notification name="GodMessage">
+ [NAME]
+
+[MESSAGE]
+ </notification>
+ <notification name="JoinGroup">
+ [MESSAGE]
+ <form name="form">
+ <button name="Join" text="参加"/>
+ <button name="Decline" text="辞退"/>
+ <button name="Info" text="情報"/>
+ </form>
+ </notification>
+ <notification name="TeleportOffered">
+ [NAME_SLURL] はテレポートであなたを呼んでいます。
+
+[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
+ <form name="form">
+ <button name="Teleport" text="テレポート"/>
+ <button name="Cancel" text="取り消し"/>
+ </form>
+ </notification>
+ <notification name="TeleportOfferSent">
+ [TO_NAME] にテレポートを送りました。
+ </notification>
+ <notification name="GotoURL">
+ [MESSAGE]
+[URL]
+ <form name="form">
+ <button name="Later" text="あとで"/>
+ <button name="GoNow..." text="今すぐ行く"/>
+ </form>
+ </notification>
+ <notification name="OfferFriendship">
+ [NAME_SLURL] はフレンド登録を申し込んでいます。
+
+[MESSAGE]
+
+(デフォルト設定だとお互いのオンライン状態を見ることができます)
+ <form name="form">
+ <button name="Accept" text="受け入れる"/>
+ <button name="Decline" text="辞退"/>
+ </form>
+ </notification>
+ <notification name="FriendshipOffered">
+ [TO_NAME] にフレンド登録を申し出ました。
+ </notification>
+ <notification name="OfferFriendshipNoMessage">
+ [NAME_SLURL] はフレンド登録を申し込んでいます。
+
+(デフォルト設定だとお互いのオンライン状態を見ることができます)
+ <form name="form">
+ <button name="Accept" text="受け入れる"/>
+ <button name="Decline" text="拒否"/>
+ </form>
+ </notification>
+ <notification name="FriendshipAccepted">
+ [NAME]は、フレンド登録を受け入れました。
+ </notification>
+ <notification name="FriendshipDeclined">
+ [NAME]は、フレンド登録を断りました。
+ </notification>
+ <notification name="FriendshipAcceptedByMe">
+ フレンドの登録依頼が承認されました。
+ </notification>
+ <notification name="FriendshipDeclinedByMe">
+ フレンドの登録依頼が拒否されました。
+ </notification>
+ <notification name="OfferCallingCard">
+ [NAME] がコーリングカードを渡そうとしています。
+あなたの持ち物にブックマークが追加され、この住人に素早く IM を送ることができます。
+ <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] をロードしますか?
+
+[MESSAGE]
+
+送信元のオブジェクト:&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;、所有者:[NAME]?
+ <form name="form">
+ <button name="Gotopage" 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;」 というオブジェクトが、次のことをしようとしています:
+
+[QUESTIONS]
+よろしいですか?
+ <form name="form">
+ <button name="Yes" text="はい"/>
+ <button name="No" text="いいえ"/>
+ <button name="Mute" text="ブロック"/>
+ </form>
+ </notification>
+ <notification name="ScriptQuestionCaution">
+ [NAME] が所有する「&lt;nolink&gt;[OBJECTNAME]&lt;/nolink&gt;」 というオブジェクトが、次のことをしようとしています:
+
+[QUESTIONS]
+このオブジェクトや制作者を信用できない場合は、このリクエストを拒否してください。
+
+リクエストを受けますか?
+ <form name="form">
+ <button name="Grant" text="許可"/>
+ <button name="Deny" text="拒否"/>
+ <button name="Details" text="詳細..."/>
+ </form>
+ </notification>
+ <notification name="ScriptDialog">
+ [NAME] の「&lt;nolink&gt;[TITLE]&lt;/nolink&gt;」
+[MESSAGE]
+ <form name="form">
+ <button name="Ignore" text="無視する"/>
+ </form>
+ </notification>
+ <notification name="ScriptDialogGroup">
+ [GROUPNAME] の「&lt;nolink&gt;[TITLE]&lt;/nolink&gt;」
+[MESSAGE]
+ <form name="form">
+ <button name="Ignore" text="無視する"/>
+ </form>
+ </notification>
+ <notification name="BuyLindenDollarSuccess">
+ お支払ありがとうございます。
+
+あなたの L$ 残高は、処理が完了するとアップデートされます。 処理に 20 分以上かかった場合、お取り引きがキャンセルされることがあります。 その場合は、購入金額はあなたの US$ 残高に追加されます。
+
+[http://secondlife.com/account/ マイアカウント] の取引履歴ページで、支払状況を確認できます。
+ </notification>
+ <notification name="FirstOverrideKeys">
+ あなたの移動キーをオブジェクトが操作しています。
+矢印か AWSD のキーで動作を確認してください。
+銃などのオブジェクトだと、一人称視点に変更する必要があります。
+M キーを押して変更します。
+ </notification>
+ <notification name="FirstSandbox">
+ ここはサンドボックスエリアです。住人が制作を学ぶことができます。
+
+ここで制作されたものは時間が経つと削除されます。制作したアイテムを右クリックして「取る」を選び、持ち物に入れてお持ち帰りするのをお忘れなく。
+ </notification>
+ <notification name="MaxListSelectMessage">
+ このリストから [MAX_SELECT] 個までのアイテムを選択できます。
+ </notification>
+ <notification name="VoiceInviteP2P">
+ [NAME] があなたをボイスチャットコールに招待しています。
+受け入れるをクリックするか、断る場合は拒否をクリックしてください。 ブロックをクリックすると、この発信者をブロックします。
+ <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] は [GROUP] のボイスチャットコールに参加しました。
+受け入れるをクリックするか、断る場合は拒否をクリックしてください。 ブロックをクリックすると、この発信者をブロックします。
+ <form name="form">
+ <button name="Accept" text="受け入れる"/>
+ <button name="Decline" text="拒否"/>
+ <button name="Mute" text="ブロック"/>
+ </form>
+ </notification>
+ <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] があなたをコンファレンスチャットに招待しています。
+受け入れるをクリックするか、断る場合は拒否をクリックしてください。 ブロックをクリックすると、この発信者をブロックします。
+ <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="VoiceLoginRetry">
+ ボイスチャンネルを作成しています。1 分ほどかかります。
+ </notification>
+ <notification name="VoiceEffectsExpired">
+ ボイスモーフィング効果の1つまたは複数の有効期限が終了しました。期限を延長・更新するには[[URL]こちらをクリック]してください。
+ </notification>
+ <notification name="VoiceEffectsExpiredInUse">
+ ボイスモーフィング効果の有効期限が終了したため、あなたの通常のボイス設定が適用されました。期限を延長・更新するには[[URL]こちらをクリック]してください。
+ </notification>
+ <notification name="VoiceEffectsWillExpire">
+ ボイスモーフィング効果の1つまたは複数の有効期限が[INTERVAL]日以内に終了します。期限を延長・更新するには[[URL]こちらをクリック]してください。
+ </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]
+ <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="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="ConfirmClearTeleportHistory">
+ テレポート履歴を削除しますか?
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
+ <notification name="BottomTrayButtonCanNotBeShown">
+ 選択したボタンを現在表示することができません。
+じゅうぶんなスペースができればボタンは表示されます。
+ </notification>
+ <notification name="ShareNotification">
+ 共有する住人を選択します。
+ </notification>
+ <notification name="ShareItemsConfirmation">
+ 次のアイテムを共有しますか?
+
+&lt;nolink&gt;[ITEMS]&lt;/nolink&gt;
+
+次の住人と共有しますか?
+
+[RESIDENTS]
+ <usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
+ </notification>
+ <notification name="ItemsShared">
+ アイテムが共有されました。
+ </notification>
+ <notification name="DeedToGroupFail">
+ グループへの譲渡に失敗しました。
+ </notification>
+ <notification name="AvatarRezNotification">
+ (作成後[EXISTENCE]秒経過)
+&apos;[NAME]&apos;というアバターは[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"/>
+ </notification>
+ <notification name="NoVoiceConnect">
+ ボイスサーバーに接続できません:
+
+[HOSTID]
+
+ボイスチャットによるコミュニケーションが利用できません。
+お使いのネットワークやファイアウォールの設定を確認してください。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AvatarRezLeftNotification">
+ ( [EXISTENCE] 秒)
+アバター「 NAME 」が完全に読み込まれました。
+ </notification>
+ <notification name="AvatarRezSelfBakedTextureUploadNotification">
+ ( 作成後[EXISTENCE]秒経過)
+&apos;[BODYREGION]&apos;の[RESOLUTION]のベークドテクスチャは[TIME]秒後にアップロードされました。
+ </notification>
+ <notification name="AvatarRezSelfBakedTextureUpdateNotification">
+ ( 作成後[EXISTENCE]秒経過)
+&apos;[BODYREGION]&apos;の[RESOLUTION]のベークドテクスチャは[TIME]秒後にローカルに更新されました。
+ </notification>
+ <notification name="ConfirmLeaveCall">
+ このコールから抜けますか?
+ <usetemplate ignoretext="コールから抜ける前の確認" name="okcancelignore" notext="いいえ" yestext="はい"/>
+ </notification>
+ <notification name="ConfirmMuteAll">
+ グループコールの参加者全員をミュートしました。
+あとからこのコールに参加する住人も
+ミュートされます。あなたがコールを終了しても他の参加者のミュート状態が続きます。
+
+全員をミュートしますか?
+ <usetemplate ignoretext="グループコールの参加者全員をミュートする前の確認" name="okcancelignore" notext="取り消し" yestext="OK"/>
+ </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="PopupAttempt">
+ ポップアップがブロックされました。
+ <form name="form">
+ <ignore name="ignore" text="全てのポップアップを有効にする"/>
+ <button name="open" text="ポップアップウィンドウを開く"/>
+ </form>
+ </notification>
+ <notification name="AuthRequest">
+ 「[REALM]」にある「&lt;nolink&gt;[HOST_NAME]&lt;/nolink&gt;」のサイトにはユーザー名とパスワードが必要です。
+ <form name="form">
+ <input name="username" text="ユーザー名"/>
+ <input name="password" text="パスワード"/>
+ <button name="ok" text="送信"/>
+ <button name="cancel" text="取り消し"/>
+ </form>
+ </notification>
+ <notification label="" name="ModeChange">
+ モードを変更するには終了して再起動する必要があります。
+ <usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
+ </notification>
+ <notification label="" name="NoClassifieds">
+ クラシファイド広告の作成と編集はアドバンスモードでのみ利用できます。終了してモードを変更しますか?モードはログイン画面で選択できます。
+ <usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
+ </notification>
+ <notification label="" name="NoGroupInfo">
+ グループの作成と編集はアドバンスモードでのみ利用できます。終了してモードを変更しますか?モードはログイン画面で選択できます。
+ <usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
+ </notification>
+ <notification label="" name="NoPicks">
+ ピックの作成と編集はアドバンスモードでのみ利用できます。終了してモードを変更しますか?モードはログイン画面で選択できます。
+ <usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
+ </notification>
+ <notification label="" name="NoWorldMap">
+ 世界地図の表示はアドバンスモードでのみ利用できます。終了してモードを変更しますか?モードはログイン画面で選択できます。
+ <usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
+ </notification>
+ <notification label="" name="NoVoiceCall">
+ ボイスコールはアドバンスモードでのみ利用できます。ログアウトしてモードを変更しますか?
+ <usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
+ </notification>
+ <notification label="" name="NoAvatarShare">
+ 共有はアドバンスモードでのみ利用できます。ログアウトしてモードを変更しますか?
+ <usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
+ </notification>
+ <notification label="" name="NoAvatarPay">
+ 他の住人への支払いはアドバンスモードでのみ利用できます。ログアウトしてモードを変更しますか?
+ <usetemplate name="okcancelbuttons" notext="終了しない" yestext="終了"/>
+ </notification>
+ <global name="UnsupportedCPU">
+ - あなたの CPU の速度は必須動作環境の条件を満たしていません。
+ </global>
+ <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 &apos;Home Location&apos; on your land or at a mainland Infohub.">
+ 自分の土地をお持ちの場合、「ホーム」に設定できます。
+お持ちでない場合は、地図で「インフォハブ」をお探しください。
+ </global>
+ <global name="You died and have been teleported to your home location">
+ 死んでしまったので、ホームにテレポートされました。
+ </global>
+</notifications>
diff --git a/indra/newview/skins/minimal/xui/ja/panel_adhoc_control_panel.xml b/indra/newview/skins/minimal/xui/ja/panel_adhoc_control_panel.xml
new file mode 100644
index 0000000000..17e1283d24
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/panel_adhoc_control_panel.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="call_btn_panel">
+ <button label="コール" 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/minimal/xui/ja/panel_bottomtray.xml b/indra/newview/skins/minimal/xui/ja/panel_bottomtray.xml
new file mode 100644
index 0000000000..fe81ec47f8
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/panel_bottomtray.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray">
+ <string name="DragIndicationImageName" value="Accordion_ArrowOpened_Off"/>
+ <string name="SpeakBtnToolTip" value="マイクのオン・オフ"/>
+ <string name="VoiceControlBtnToolTip" value="ボイスコントロールパネルの表示・非表示"/>
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="ジェスチャー" name="Gesture" tool_tip="ジェスチャーの表示・非表示"/>
+ </layout_panel>
+ <layout_panel name="cam_panel">
+ <bottomtray_button label="視界" name="camera_btn" tool_tip="カメラコントロールの表示・非表示"/>
+ </layout_panel>
+ <layout_panel name="avatar_and_destinations_panel">
+ <bottomtray_button label="行き先" name="destination_btn" tool_tip="人ウインドウを表示"/>
+ </layout_panel>
+ <layout_panel name="avatar_and_destinations_panel">
+ <bottomtray_button label="マイ アバター" name="avatar_btn"/>
+ </layout_panel>
+ <layout_panel name="people_panel">
+ <bottomtray_button label="人" name="show_people_button" tool_tip="人ウインドウを表示"/>
+ </layout_panel>
+ <layout_panel name="profile_panel">
+ <bottomtray_button label="プロフィール" name="show_profile_btn" tool_tip="プロフィールウインドウを表示"/>
+ </layout_panel>
+ <layout_panel name="howto_panel">
+ <bottomtray_button label="ハウツー" name="show_help_btn" tool_tip="Second Lifeのハウツートピックを開く"/>
+ </layout_panel>
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="会話"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="通知"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/ja/panel_group_control_panel.xml b/indra/newview/skins/minimal/xui/ja/panel_group_control_panel.xml
new file mode 100644
index 0000000000..f7f575206a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/panel_group_control_panel.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="group_info_btn_panel">
+ <button label="グループ情報" 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/minimal/xui/ja/panel_im_control_panel.xml b/indra/newview/skins/minimal/xui/ja/panel_im_control_panel.xml
new file mode 100644
index 0000000000..f2429ac12a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/panel_im_control_panel.xml
@@ -0,0 +1,30 @@
+<?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/minimal/xui/ja/panel_login.xml b/indra/newview/skins/minimal/xui/ja/panel_login.xml
new file mode 100644
index 0000000000..ac1fe455c7
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/panel_login.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_login">
+ <panel.string name="create_account_url">
+ http://jp.secondlife.com/registration/
+ </panel.string>
+ <panel.string name="forgot_password_url">
+ http://secondlife.com/account/request.php?lang=ja
+ </panel.string>
+ <layout_stack name="login_widgets">
+ <layout_panel name="login">
+ <text name="username_text">
+ ユーザーネーム:
+ </text>
+ <combo_box name="username_combo" tool_tip="登録時に自分で選んだユーザー名(例:bobsmith12、Steller Sunshineなど)"/>
+ <text name="password_text">
+ パスワード:
+ </text>
+ <check_box label="パスワードを記憶" name="remember_check"/>
+ <button label="ログイン" left_pad="30" name="connect_btn" width="60"/>
+ <text name="mode_selection_text">
+ モード:
+ </text>
+ <combo_box name="mode_combo" tool_tip="モードを選択します。ベーシックモードでは探索やチャットをすばやく簡単に実行でき、アドバンスモードでは、より多くの機能が利用できます。">
+ <combo_box.item label="ベーシック" name="Basic"/>
+ <combo_box.item label="アドバンス" name="Advanced"/>
+ </combo_box>
+ <text name="start_location_text">
+ 開始地点:
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="最後にログアウトした場所" name="MyLastLocation"/>
+ <combo_box.item label="ホーム" name="MyHome"/>
+ <combo_box.item label="<地域名を入力>" name="Typeregionname"/>
+ </combo_box>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_new_account_text">
+ お申し込み
+ </text>
+ <text name="forgot_password_text">
+ ユーザー名またはパスワードをお忘れですか?
+ </text>
+ <text name="login_help">
+ ログインの方法
+ </text>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/ja/panel_navigation_bar.xml b/indra/newview/skins/minimal/xui/ja/panel_navigation_bar.xml
new file mode 100644
index 0000000000..0426c4fe9a
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/panel_navigation_bar.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="navigation_bar">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="前の場所へ戻ります"/>
+ <pull_button name="forward_btn" tool_tip="次の場所へ進みます"/>
+ <button name="home_btn" tool_tip="「ホーム」にテレポート"/>
+ <location_input label="場所" name="location_combo"/>
+ <search_combo_box label="検索" name="search_combo_box" tool_tip="検索">
+ <combo_editor label="[SECOND_LIFE] を検索:" name="search_combo_editor"/>
+ </search_combo_box>
+ </panel>
+ <favorites_bar name="favorite" tool_tip="ランドマークをここにドラッグして、Second Lifeのお気に入りの場所に素早くアクセス!">
+ <label name="favorites_bar_label" tool_tip="ランドマークをここにドラッグして、Second Lifeのお気に入りの場所に素早くアクセス!">
+ お気に入りバー
+ </label>
+ <chevron_button name="&gt;&gt;" tool_tip="お気に入りをもっと表示"/>
+ </favorites_bar>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/ja/panel_people.xml b/indra/newview/skins/minimal/xui/ja/panel_people.xml
new file mode 100644
index 0000000000..9eb45d9a80
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/panel_people.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray panel -->
+<panel label="人" name="people_panel">
+ <string name="no_recent_people" value="最近交流した人はいません。一緒に何かする仲間をお探しですか?下の「行き先ガイド」ボタンをクリックしてください。"/>
+ <string name="no_filtered_recent_people" value="その名前で最近交流した人はいません。"/>
+ <string name="no_one_near" value="近くに誰もいません。一緒に何かする仲間をお探しですか?下の「行き先ガイド」ボタンをクリックしてください。"/>
+ <string name="no_one_filtered_near" value="その名前の人は近くにいません。"/>
+ <string name="no_friends_online" value="オンラインのフレンドはいません"/>
+ <string name="no_friends" value="フレンドはいません"/>
+ <string name="no_friends_msg">
+ 住人を右クリックすると、フレンド登録できます。
+一緒に何かする仲間をお探しですか?下の「行き先ガイド」ボタンをクリックしてください。
+ </string>
+ <string name="no_filtered_friends_msg">
+ お探しのものは見つかりましたか?下の「行き先ガイド」ボタンをクリックしてください。
+ </string>
+ <string name="people_filter_label" value="人をフィルター"/>
+ <string name="groups_filter_label" value="グループをフィルター"/>
+ <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‐ドラッグで水平・垂直移動)"/>
+ <filter_editor label="フィルター" name="filter_input"/>
+ <tab_container name="tabs">
+ <panel label="近く" name="nearby_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="nearby_view_sort_btn" tool_tip="オプション"/>
+ <button name="add_friend_btn" tool_tip="選択した住人をフレンドリストに登録"/>
+ </panel>
+ </panel>
+ <panel label="マイ フレンド" name="friends_panel">
+ <accordion name="friends_accordion">
+ <accordion_tab name="tab_online" title="オンライン"/>
+ <accordion_tab name="tab_all" title="全員"/>
+ </accordion>
+ <panel label="bottom_panel" name="bottom_panel">
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <menu_button name="friends_viewsort_btn" tool_tip="オプションを表示します"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="フレンド登録を申し出る"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="del_btn" tool_tip="選択した人をフレンドリストから削除"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+ <panel label="マイ グループ" name="groups_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="groups_viewsort_btn" tool_tip="オプション"/>
+ <button name="plus_btn" tool_tip="グループに参加 / 新規グループを作成します"/>
+ <button name="activate_btn" tool_tip="選択したグループをアクティブにします"/>
+ </panel>
+ </panel>
+ <panel label="最新" name="recent_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="recent_viewsort_btn" tool_tip="オプション"/>
+ <button name="add_friend_btn" tool_tip="選択した住人をフレンドリストに登録"/>
+ </panel>
+ </panel>
+ </tab_container>
+ <panel name="button_bar">
+ <layout_stack name="bottom_bar_ls">
+ <layout_panel name="view_profile_btn_lp">
+ <button label="プロフィール" name="view_profile_btn" tool_tip="写真、グループ、その他住人情報を表示"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="IM" name="im_btn" tool_tip="インスタントメッセージを開きます"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="コール" name="call_btn" tool_tip="この住人にコールする"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="共有" name="share_btn" tool_tip="「持ち物」のアイテムを共有する"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="テレポート" name="teleport_btn" tool_tip="テレポートを送ります"/>
+ </layout_panel>
+ </layout_stack>
+ <layout_stack name="bottom_bar_ls1">
+ <layout_panel name="group_info_btn_lp">
+ <button label="グループ情報" name="group_info_btn" tool_tip="グループ情報を表示します"/>
+ </layout_panel>
+ <layout_panel name="chat_btn_lp">
+ <button label="グループチャット" name="chat_btn" tool_tip="チャットを開始します"/>
+ </layout_panel>
+ <layout_panel name="group_call_btn_lp">
+ <button label="グループコール" name="group_call_btn" tool_tip="このグループにコールする"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/ja/panel_side_tray_tab_caption.xml b/indra/newview/skins/minimal/xui/ja/panel_side_tray_tab_caption.xml
new file mode 100644
index 0000000000..d06db8ccb1
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/panel_side_tray_tab_caption.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="sidetray_tab_panel">
+ <text name="sidetray_tab_title" value="サイドパネル"/>
+ <button name="undock" tool_tip="切り離す"/>
+ <button name="dock" tool_tip="ドッキング"/>
+ <button name="show_help" tool_tip="ヘルプを表示"/>
+</panel>
diff --git a/indra/newview/skins/minimal/xui/ja/panel_status_bar.xml b/indra/newview/skins/minimal/xui/ja/panel_status_bar.xml
new file mode 100644
index 0000000000..163064484b
--- /dev/null
+++ b/indra/newview/skins/minimal/xui/ja/panel_status_bar.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="status">
+ <panel.string name="StatBarDaysOfWeek">
+ 日曜日:月曜日:火曜日:水曜日:木曜日:金曜日:土曜日
+ </panel.string>
+ <panel.string name="StatBarMonthsOfYear">
+ 1月:2月:3月:4月:5月:6月:7月:8月:9月:10月:11月:12月
+ </panel.string>
+ <panel.string name="packet_loss_tooltip">
+ パケット損失
+ </panel.string>
+ <panel.string name="bandwidth_tooltip">
+ 帯域幅
+ </panel.string>
+ <panel.string name="time">
+ [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+ </panel.string>
+ <panel.string name="timeTooltip">
+ [year, datetime, slt] [month, datetime, slt] [day, datetime, slt] ([weekday, datetime, slt])
+ </panel.string>
+ <panel.string name="buycurrencylabel">
+ L$ [AMT]
+ </panel.string>
+ <panel name="balance_bg">
+ <text name="balance" tool_tip="クリックして L$ 残高を更新" value="L$20"/>
+ <button label="L$ の購入" name="buyL" tool_tip="クリックして L$ を購入します"/>
+ </panel>
+ <text name="TimeText" tool_tip="現在時刻(太平洋)">
+ 24:00 AM PST
+ </text>
+ <button name="media_toggle_btn" tool_tip="すべてのメディアを開始・停止(音楽、ビデオ、Web ページ)"/>
+ <button name="volume_btn" tool_tip="グローバル音量設定"/>
+</panel>