Modernize and improve upon LLFloaterReporter to fix Issue 822: Report Abuse does not populate Region Name or screenshot correctly

Cleans up related bits in xmls/translations
This commit is contained in:
Inusaito Sayori
2013-05-20 09:09:03 -04:00
parent 6048c2405b
commit 5c9286f460
12 changed files with 290 additions and 978 deletions

View File

@@ -1,12 +1,11 @@
/** /**
* @file llfloaterreporter.cpp * @file llfloaterreporter.cpp
* @brief Bug and abuse reports. * @brief Abuse reports.
* *
* $LicenseInfo:firstyear=2002&license=viewergpl$ * $LicenseInfo:firstyear=2002&license=viewergpl$
* * Second Life Viewer Source Code
* Copyright (c) 2002-2009, Linden Research, Inc. * Copyright (c) 2002-2009, Linden Research, Inc.
* *
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab * 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 * to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement * ("GPL"), unless you have obtained a separate licensing agreement
@@ -39,30 +38,23 @@
// linden library includes // linden library includes
#include "llassetstorage.h" #include "llassetstorage.h"
#include "llavatarnamecache.h"
#include "llcachename.h" #include "llcachename.h"
#include "llfontgl.h" #include "llfontgl.h"
#include "llgl.h" // for renderer
#include "llimagej2c.h" #include "llimagej2c.h"
#include "llinventory.h" #include "llinventory.h"
#include "llnotificationsutil.h" #include "llnotificationsutil.h"
#include "llstring.h" #include "llstring.h"
#include "llsys.h" #include "llsys.h"
#include "sgversion.h"
#include "message.h" #include "message.h"
#include "v3math.h" #include "v3math.h"
// viewer project includes // viewer project includes
#include "llagent.h" #include "llagent.h"
#include "llbutton.h" #include "llbutton.h"
#include "llcheckboxctrl.h"
#include "llinventorypanel.h"
#include "lllineeditor.h"
#include "lltexturectrl.h" #include "lltexturectrl.h"
#include "llscrolllistctrl.h" #include "llscrolllistctrl.h"
#include "llimview.h"
#include "lltextbox.h"
#include "lldispatcher.h" #include "lldispatcher.h"
#include "llviewertexteditor.h"
#include "llviewerobject.h" #include "llviewerobject.h"
#include "llviewerregion.h" #include "llviewerregion.h"
#include "llcombobox.h" #include "llcombobox.h"
@@ -80,7 +72,7 @@
#include "llfloateravatarpicker.h" #include "llfloateravatarpicker.h"
#include "lldir.h" #include "lldir.h"
#include "llselectmgr.h" #include "llselectmgr.h"
#include "llviewerbuild.h" #include "sgversion.h"
#include "lluictrlfactory.h" #include "lluictrlfactory.h"
#include "llviewernetwork.h" #include "llviewernetwork.h"
@@ -88,10 +80,6 @@
#include "lltrans.h" #include "lltrans.h"
// [RLVa:KB]
#include "rlvhandler.h"
// [/RLVa:KB]
const U32 INCLUDE_SCREENSHOT = 0x01 << 0; const U32 INCLUDE_SCREENSHOT = 0x01 << 0;
class AIHTTPTimeoutPolicy; class AIHTTPTimeoutPolicy;
@@ -101,125 +89,23 @@ extern AIHTTPTimeoutPolicy userReportResponder_timeout;
// Globals // Globals
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// this map keeps track of current reporter instances
// there can only be one instance of each reporter type
LLMap< EReportType, LLFloaterReporter* > gReporterInstances;
// keeps track of where email is going to - global to avoid a pile
// of static/non-static access outside my control
namespace {
static BOOL gDialogVisible = FALSE;
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Member functions // Member functions
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
LLFloaterReporter::LLFloaterReporter( LLFloaterReporter::LLFloaterReporter()
const std::string& name, : LLFloater(),
const LLRect& rect, mReportType(COMPLAINT_REPORT),
const std::string& title,
EReportType report_type)
:
LLFloater(name, rect, title),
mReportType(report_type),
mObjectID(), mObjectID(),
mScreenID(), mScreenID(),
mAbuserID(), mAbuserID(),
mOwnerName(),
mDeselectOnClose( FALSE ), mDeselectOnClose( FALSE ),
mPicking( FALSE), mPicking( FALSE),
mPosition(), mPosition(),
mCopyrightWarningSeen( FALSE ), mCopyrightWarningSeen( FALSE ),
mResourceDatap(new LLResourceData()) mResourceDatap(new LLResourceData())
{ {
if (report_type == BUG_REPORT) LLUICtrlFactory::getInstance()->buildFloater(this, "floater_report_abuse.xml");
{
LLUICtrlFactory::getInstance()->buildFloater(this, "floater_report_bug.xml");
}
else
{
LLUICtrlFactory::getInstance()->buildFloater(this, "floater_report_abuse.xml");
}
childSetText("abuse_location_edit", gAgent.getSLURL() );
// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) | Modified: RLVa-1.0.0a
if (rlv_handler_t::isEnabled())
{
// Can't filter these since they get sent as part of the report so just hide them instead
if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC))
{
childSetVisible("abuse_location_edit", false);
childSetVisible("pos_field", false);
}
if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
{
childSetVisible("owner_name", false);
childSetVisible("abuser_name_edit", false);
}
}
// [/RLVa:KB]
LLButton* pick_btn = getChild<LLButton>("pick_btn");
if (pick_btn)
{
// XUI: Why aren't these in viewerart.ini?
pick_btn->setImages( std::string("UIImgFaceUUID"),
std::string("UIImgFaceSelectedUUID") );
childSetAction("pick_btn", onClickObjPicker, this);
}
if (report_type != BUG_REPORT)
{
// abuser name is selected from a list
LLLineEditor* le = getChild<LLLineEditor>("abuser_name_edit");
le->setEnabled( FALSE );
}
childSetAction("select_abuser", onClickSelectAbuser, this);
childSetAction("send_btn", onClickSend, this);
childSetAction("cancel_btn", onClickCancel, this);
enableControls(TRUE);
// convert the position to a string
LLVector3d pos = gAgent.getPositionGlobal();
LLViewerRegion *regionp = gAgent.getRegion();
if (regionp)
{
pos -= regionp->getOriginGlobal();
}
setPosBox(pos);
gReporterInstances.addData(report_type, this);
// Take a screenshot, but don't draw this floater.
setVisible(FALSE);
takeScreenshot();
setVisible(TRUE);
// Default text to be blank
childSetText("object_name", LLStringUtil::null);
childSetText("owner_name", LLStringUtil::null);
childSetFocus("summary_edit");
mDefaultSummary = childGetText("details_edit");
gDialogVisible = TRUE;
// only request details for abuse reports (not BUG reports)
if (report_type != BUG_REPORT)
{
// send a message and ask for information about this region -
// result comes back in processRegionInfo(..)
LLMessageSystem* msg = gMessageSystem;
msg->newMessage("RequestRegionInfo");
msg->nextBlock("AgentData");
msg->addUUID("AgentID", gAgent.getID());
msg->addUUID("SessionID", gAgent.getSessionID());
gAgent.sendReliableMessage();
};
} }
// static // static
@@ -228,16 +114,77 @@ void LLFloaterReporter::processRegionInfo(LLMessageSystem* msg)
U32 region_flags; U32 region_flags;
msg->getU32("RegionInfo", "RegionFlags", region_flags); msg->getU32("RegionInfo", "RegionFlags", region_flags);
if ( gDialogVisible ) if (LLFloaterReporter::instanceExists() && LLFloaterReporter::getInstance()->getVisible())
{ {
LLNotificationsUtil::add("HelpReportAbuseEmailLL"); LLNotificationsUtil::add("HelpReportAbuseEmailLL");
}; }
} }
// virtual
BOOL LLFloaterReporter::postBuild()
{
getChild<LLUICtrl>("abuse_location_edit")->setValue(gAgent.getSLURL());
enableControls(TRUE);
// convert the position to a string
LLVector3d pos = gAgent.getPositionGlobal();
LLViewerRegion *regionp = gAgent.getRegion();
if (regionp)
{
getChild<LLUICtrl>("sim_field")->setValue(regionp->getName());
pos -= regionp->getOriginGlobal();
}
setPosBox(pos);
// Take a screenshot, but don't draw this floater.
setVisible(FALSE);
takeScreenshot();
setVisible(TRUE);
// Default text to be blank
getChild<LLUICtrl>("object_name")->setValue(LLStringUtil::null);
getChild<LLUICtrl>("owner_name")->setValue(LLStringUtil::null);
mOwnerName = LLStringUtil::null;
getChild<LLUICtrl>("summary_edit")->setFocus(TRUE);
mDefaultSummary = getChild<LLUICtrl>("details_edit")->getValue().asString();
// send a message and ask for information about this region -
// result comes back in processRegionInfo(..)
LLMessageSystem* msg = gMessageSystem;
msg->newMessage("RequestRegionInfo");
msg->nextBlock("AgentData");
msg->addUUID("AgentID", gAgent.getID());
msg->addUUID("SessionID", gAgent.getSessionID());
gAgent.sendReliableMessage();
// abuser name is selected from a list
LLUICtrl* le = getChild<LLUICtrl>("abuser_name_edit");
le->setEnabled( false );
LLButton* pick_btn = getChild<LLButton>("pick_btn");
// XUI: Why aren't these in viewerart.ini?
pick_btn->setImages(std::string("UIImgFaceUUID"),
std::string("UIImgFaceSelectedUUID") );
childSetAction("pick_btn", onClickObjPicker, this);
childSetAction("select_abuser", boost::bind(&LLFloaterReporter::onClickSelectAbuser, this));
childSetAction("send_btn", onClickSend, this);
childSetAction("cancel_btn", onClickCancel, this);
// grab the user's name
std::string reporter;
gAgent.buildFullname(reporter);
getChild<LLUICtrl>("reporter_field")->setValue(reporter);
center();
return TRUE;
}
// virtual // virtual
LLFloaterReporter::~LLFloaterReporter() LLFloaterReporter::~LLFloaterReporter()
{ {
gReporterInstances.removeData(mReportType);
// child views automatically deleted // child views automatically deleted
mObjectID = LLUUID::null; mObjectID = LLUUID::null;
@@ -252,27 +199,26 @@ LLFloaterReporter::~LLFloaterReporter()
mMCDList.clear(); mMCDList.clear();
delete mResourceDatap; delete mResourceDatap;
gDialogVisible = FALSE;
} }
// virtual // virtual
void LLFloaterReporter::draw() void LLFloaterReporter::draw()
{ {
childSetEnabled("screen_check", TRUE ); getChildView("screen_check")->setEnabled(TRUE );
LLFloater::draw(); LLFloater::draw();
} }
void LLFloaterReporter::enableControls(BOOL enable) void LLFloaterReporter::enableControls(BOOL enable)
{ {
childSetEnabled("category_combo", enable); getChildView("category_combo")->setEnabled(enable);
childSetEnabled("screen_check", enable); getChildView("screen_check")->setEnabled(enable);
childDisable("screenshot"); getChildView("screenshot")->setEnabled(false);
childSetEnabled("pick_btn", enable); getChildView("pick_btn")->setEnabled(enable);
childSetEnabled("summary_edit", enable); getChildView("summary_edit")->setEnabled(enable);
childSetEnabled("details_edit", enable); getChildView("details_edit")->setEnabled(enable);
childSetEnabled("send_btn", enable); getChildView("send_btn")->setEnabled(enable);
childSetEnabled("cancel_btn", enable); getChildView("cancel_btn")->setEnabled(enable);
} }
void LLFloaterReporter::getObjectInfo(const LLUUID& object_id) void LLFloaterReporter::getObjectInfo(const LLUUID& object_id)
@@ -287,28 +233,29 @@ void LLFloaterReporter::getObjectInfo(const LLUUID& object_id)
mObjectID = object_id; mObjectID = object_id;
if (LLUUID::null != mObjectID) if (mObjectID.notNull())
{ {
// get object info for the user's benefit // get object info for the user's benefit
LLViewerObject* objectp = NULL; if (LLViewerObject* objectp = gObjectList.findObject(mObjectID))
objectp = gObjectList.findObject( mObjectID );
if (objectp)
{ {
if ( objectp->isAttachment() ) if ( objectp->isAttachment() )
{ {
objectp = (LLViewerObject*)objectp->getRoot(); objectp = (LLViewerObject*)objectp->getRoot();
mObjectID = objectp->getID();
} }
// correct the region and position information // correct the region and position information
LLViewerRegion *regionp = objectp->getRegion(); LLViewerRegion *regionp = objectp->getRegion();
if (regionp) if (regionp)
{ {
childSetText("sim_field", regionp->getName()); getChild<LLUICtrl>("sim_field")->setValue(regionp->getName());
// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a) // [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.0.0a)
/*
if ( (rlv_handler_t::isEnabled()) && (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) ) if ( (rlv_handler_t::isEnabled()) && (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) )
{ {
childSetText("sim_field", RlvStrings::getString(RLV_STRING_HIDDEN_REGION)); childSetText("sim_field", RlvStrings::getString(RLV_STRING_HIDDEN_REGION));
} }
*/
// [/RLVa:KB] // [/RLVa:KB]
LLVector3d global_pos; LLVector3d global_pos;
global_pos.setVec(objectp->getPositionRegion()); global_pos.setVec(objectp->getPositionRegion());
@@ -317,38 +264,14 @@ void LLFloaterReporter::getObjectInfo(const LLUUID& object_id)
if (objectp->isAvatar()) if (objectp->isAvatar())
{ {
// we have the information we need setFromAvatarID(mObjectID);
std::string object_owner;
LLNameValue* firstname = objectp->getNVPair("FirstName");
LLNameValue* lastname = objectp->getNVPair("LastName");
if (firstname && lastname)
{
object_owner.append(firstname->getString());
object_owner.append(1, ' ');
object_owner.append(lastname->getString());
}
else
{
object_owner.append("Unknown");
}
childSetText("object_name", object_owner);
// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RVLa-1.0.0e
if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
{
childSetVisible("object_name", false); // Hide the object name if the picked object represents an avataz
}
// [/RLVa:KB]
childSetText("owner_name", object_owner);
childSetText("abuser_name_edit", object_owner);
mAbuserID = object_id;
} }
else else
{ {
// we have to query the simulator for information // we have to query the simulator for information
// about this object // about this object
LLMessageSystem* msg = gMessageSystem; LLMessageSystem* msg = gMessageSystem;
U32 request_flags = (mReportType == BUG_REPORT) ? BUG_REPORT_REQUEST : COMPLAINT_REPORT_REQUEST; U32 request_flags = COMPLAINT_REPORT_REQUEST;
msg->newMessageFast(_PREHASH_RequestObjectPropertiesFamily); msg->newMessageFast(_PREHASH_RequestObjectPropertiesFamily);
msg->nextBlockFast(_PREHASH_AgentData); msg->nextBlockFast(_PREHASH_AgentData);
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
@@ -363,28 +286,50 @@ void LLFloaterReporter::getObjectInfo(const LLUUID& object_id)
} }
} }
void LLFloaterReporter::onClickSelectAbuser()
// static
void LLFloaterReporter::onClickSelectAbuser(void *userdata)
{ {
LLFloaterReporter *self = (LLFloaterReporter *)userdata; LLFloaterAvatarPicker* picker = LLFloaterAvatarPicker::show(boost::bind(&LLFloaterReporter::callbackAvatarID, this, _1, _2), FALSE, TRUE );
if (picker)
gFloaterView->getParentFloater(self)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLFloaterReporter::callbackAvatarID, self, _1, _2), FALSE, TRUE )); {
gFloaterView->getParentFloater(this)->addDependentFloater(picker);
}
} }
void LLFloaterReporter::callbackAvatarID(const uuid_vec_t& ids, const std::vector<LLAvatarName>& names) void LLFloaterReporter::callbackAvatarID(const uuid_vec_t& ids, const std::vector<LLAvatarName>& names)
{ {
if (ids.empty() || names.empty()) return; if (ids.empty() || names.empty()) return;
// this should never be called in a bug report but here for safety. getChild<LLUICtrl>("abuser_name_edit")->setValue(names[0].getCompleteName());
if ( mReportType != BUG_REPORT )
mAbuserID = ids[0];
refresh();
}
void LLFloaterReporter::setFromAvatarID(const LLUUID& avatar_id)
{
mAbuserID = mObjectID = avatar_id;
std::string avatar_link;
if (LLAvatarNameCache::getPNSName(avatar_id, avatar_link))
{ {
childSetText("abuser_name_edit", names[0].getCompleteName() ); getChild<LLUICtrl>("owner_name")->setValue(avatar_link);
getChild<LLUICtrl>("object_name")->setValue(avatar_link);
getChild<LLUICtrl>("abuser_name_edit")->setValue(avatar_link);
return;
}
mAbuserID = ids[0]; LLAvatarNameCache::get(avatar_id, boost::bind(&LLFloaterReporter::onAvatarNameCache, this, _1, _2));
}
refresh(); void LLFloaterReporter::onAvatarNameCache(const LLUUID& avatar_id, const LLAvatarName& av_name)
}; {
std::string avatar_link;
LLAvatarNameCache::getPNSName(av_name, avatar_link);
getChild<LLUICtrl>("owner_name")->setValue(avatar_link);
getChild<LLUICtrl>("object_name")->setValue(avatar_link);
getChild<LLUICtrl>("abuser_name_edit")->setValue(avatar_link);
} }
@@ -400,39 +345,34 @@ void LLFloaterReporter::onClickSend(void *userdata)
if(self->validateReport()) if(self->validateReport())
{ {
// only show copyright alert for abuse reports const int IP_CONTENT_REMOVAL = 66;
if ( self->mReportType != BUG_REPORT ) const int IP_PERMISSONS_EXPLOIT = 37;
LLComboBox* combo = self->getChild<LLComboBox>( "category_combo");
int category_value = combo->getSelectedValue().asInteger();
if ( ! self->mCopyrightWarningSeen )
{ {
const int IP_CONTENT_REMOVAL = 66; std::string details_lc = self->getChild<LLUICtrl>("details_edit")->getValue().asString();
const int IP_PERMISSONS_EXPLOIT = 37; LLStringUtil::toLower( details_lc );
LLComboBox* combo = self->getChild<LLComboBox>( "category_combo"); std::string summary_lc = self->getChild<LLUICtrl>("summary_edit")->getValue().asString();
int category_value = combo->getSelectedValue().asInteger(); LLStringUtil::toLower( summary_lc );
if ( details_lc.find( "copyright" ) != std::string::npos ||
if ( ! self->mCopyrightWarningSeen ) summary_lc.find( "copyright" ) != std::string::npos ||
category_value == IP_CONTENT_REMOVAL ||
category_value == IP_PERMISSONS_EXPLOIT)
{ {
std::string details_lc = self->childGetText("details_edit");
LLStringUtil::toLower( details_lc );
std::string summary_lc = self->childGetText("summary_edit");
LLStringUtil::toLower( summary_lc );
if ( details_lc.find( "copyright" ) != std::string::npos ||
summary_lc.find( "copyright" ) != std::string::npos ||
category_value == IP_CONTENT_REMOVAL ||
category_value == IP_PERMISSONS_EXPLOIT)
{
LLNotificationsUtil::add("HelpReportAbuseContainsCopyright");
self->mCopyrightWarningSeen = TRUE;
return;
}
}
else if (category_value == IP_CONTENT_REMOVAL)
{
// IP_CONTENT_REMOVAL *always* shows the dialog -
// ergo you can never send that abuse report type.
LLNotificationsUtil::add("HelpReportAbuseContainsCopyright"); LLNotificationsUtil::add("HelpReportAbuseContainsCopyright");
self->mCopyrightWarningSeen = TRUE;
return; return;
} }
} }
else if (category_value == IP_CONTENT_REMOVAL)
{
// IP_CONTENT_REMOVAL *always* shows the dialog -
// ergo you can never send that abuse report type.
LLNotificationsUtil::add("HelpReportAbuseContainsCopyright");
return;
}
LLUploadDialog::modalUploadDialog(LLTrans::getString("uploading_abuse_report")); LLUploadDialog::modalUploadDialog(LLTrans::getString("uploading_abuse_report"));
// *TODO don't upload image if checkbox isn't checked // *TODO don't upload image if checkbox isn't checked
@@ -445,10 +385,10 @@ void LLFloaterReporter::onClickSend(void *userdata)
} }
else else
{ {
if(self->childGetValue("screen_check")) if(self->getChild<LLUICtrl>("screen_check")->getValue())
{ {
self->childDisable("send_btn"); self->getChildView("send_btn")->setEnabled(FALSE);
self->childDisable("cancel_btn"); self->getChildView("cancel_btn")->setEnabled(FALSE);
// the callback from uploading the image calls sendReportViaLegacy() // the callback from uploading the image calls sendReportViaLegacy()
self->uploadImage(); self->uploadImage();
} }
@@ -486,8 +426,9 @@ void LLFloaterReporter::onClickObjPicker(void *userdata)
LLToolObjPicker::getInstance()->setExitCallback(LLFloaterReporter::closePickTool, self); LLToolObjPicker::getInstance()->setExitCallback(LLFloaterReporter::closePickTool, self);
LLToolMgr::getInstance()->setTransientTool(LLToolObjPicker::getInstance()); LLToolMgr::getInstance()->setTransientTool(LLToolObjPicker::getInstance());
self->mPicking = TRUE; self->mPicking = TRUE;
self->childSetText("object_name", LLStringUtil::null); self->getChild<LLUICtrl>("object_name")->setValue(LLStringUtil::null);
self->childSetText("owner_name", LLStringUtil::null); self->getChild<LLUICtrl>("owner_name")->setValue(LLStringUtil::null);
self->mOwnerName = LLStringUtil::null;
LLButton* pick_btn = self->getChild<LLButton>("pick_btn"); LLButton* pick_btn = self->getChild<LLButton>("pick_btn");
if (pick_btn) pick_btn->setToggleState(TRUE); if (pick_btn) pick_btn->setToggleState(TRUE);
} }
@@ -511,62 +452,34 @@ void LLFloaterReporter::closePickTool(void *userdata)
// static // static
void LLFloaterReporter::showFromMenu(EReportType report_type) void LLFloaterReporter::showFromMenu(EReportType report_type)
{ {
if (gReporterInstances.checkData(report_type)) if (COMPLAINT_REPORT != report_type)
{ {
// ...bring that window to front llwarns << "Unknown LLViewerReporter type : " << report_type << llendl;
LLFloaterReporter *f = gReporterInstances.getData(report_type); return;
f->open(); /* Flawfinder: ignore */
} }
else
LLFloaterReporter* f = getInstance();
if (f)
{ {
LLFloaterReporter *f; f->setReportType(report_type);
if (BUG_REPORT == report_type)
{
f = LLFloaterReporter::createNewBugReporter();
}
else if (COMPLAINT_REPORT == report_type)
{
f = LLFloaterReporter::createNewAbuseReporter();
}
else
{
llwarns << "Unknown LLViewerReporter type : " << report_type << llendl;
return;
}
f->center();
if (report_type == BUG_REPORT)
{
LLNotificationsUtil::add("HelpReportBug");
}
else
{
// popup for abuse reports is triggered elsewhere
}
// grab the user's name
std::string fullname;
gAgent.buildFullname(fullname);
f->childSetText("reporter_field", fullname);
} }
} }
// static // static
void LLFloaterReporter::showFromObject(const LLUUID& object_id) void LLFloaterReporter::show(const LLUUID& object_id, const std::string& avatar_name)
{ {
LLFloaterReporter* f = createNewAbuseReporter(); LLFloaterReporter* f = getInstance();
f->center();
f->setFocus(TRUE);
// grab the user's name if (avatar_name.empty())
std::string fullname; {
gAgent.buildFullname(fullname); // Request info for this object
f->childSetText("reporter_field", fullname); f->getObjectInfo(object_id);
}
// Request info for this object else
f->getObjectInfo(object_id); {
f->setFromAvatarID(object_id);
}
// Need to deselect on close // Need to deselect on close
f->mDeselectOnClose = TRUE; f->mDeselectOnClose = TRUE;
@@ -576,55 +489,33 @@ void LLFloaterReporter::showFromObject(const LLUUID& object_id)
// static // static
LLFloaterReporter* LLFloaterReporter::getReporter(EReportType report_type) void LLFloaterReporter::showFromObject(const LLUUID& object_id)
{ {
LLFloaterReporter *self = NULL; show(object_id);
if (gReporterInstances.checkData(report_type))
{
// ...bring that window to front
self = gReporterInstances.getData(report_type);
}
return self;
} }
LLFloaterReporter* LLFloaterReporter::createNewAbuseReporter() // static
void LLFloaterReporter::showFromAvatar(const LLUUID& avatar_id, const std::string avatar_name)
{ {
return new LLFloaterReporter("complaint_reporter", show(avatar_id, avatar_name);
LLRect(),
"Report Abuse",
COMPLAINT_REPORT);
} }
//static
LLFloaterReporter* LLFloaterReporter::createNewBugReporter()
{
return new LLFloaterReporter("bug_reporter",
LLRect(),
"Report Bug",
BUG_REPORT);
}
void LLFloaterReporter::setPickedObjectProperties(const std::string& object_name, const std::string& owner_name, const LLUUID owner_id) void LLFloaterReporter::setPickedObjectProperties(const std::string& object_name, const std::string& owner_name, const LLUUID owner_id)
{ {
childSetText("object_name", object_name); getChild<LLUICtrl>("object_name")->setValue(object_name);
// [RLVa:KB] - Checked: 2009-07-08 (RLVa-1.0.0e) | Added: RVLa-1.0.0e
if (gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
{ getChild<LLUICtrl>("owner_name")->setValue(owner_name);
childSetVisible("object_name", true); // Show the object name if the picked object is actually an object getChild<LLUICtrl>("abuser_name_edit")->setValue(owner_name);
}
// [/RLVa:KB]
childSetText("owner_name", owner_name);
childSetText("abuser_name_edit", owner_name);
mAbuserID = owner_id; mAbuserID = owner_id;
mOwnerName = owner_name;
} }
bool LLFloaterReporter::validateReport() bool LLFloaterReporter::validateReport()
{ {
// Ensure user selected a category from the list // Ensure user selected a category from the list
LLSD category_sd = childGetValue("category_combo"); LLSD category_sd = getChild<LLUICtrl>("category_combo")->getValue();
U8 category = (U8)category_sd.asInteger(); U8 category = (U8)category_sd.asInteger();
if(category >= 100) //This is here for reasons (like shenanigans) if(category >= 100) //This is here for reasons (like shenanigans)
{ {
@@ -633,55 +524,39 @@ bool LLFloaterReporter::validateReport()
} }
if (category == 0) if (category == 0)
{ {
if ( mReportType != BUG_REPORT ) LLNotificationsUtil::add("HelpReportAbuseSelectCategory");
{
LLNotificationsUtil::add("HelpReportAbuseSelectCategory");
}
else
{
LLNotificationsUtil::add("HelpReportAbuseAbuserNameEmpty");
}
return false; return false;
} }
if ( mReportType != BUG_REPORT )
{
if ( childGetText("abuser_name_edit").empty() )
{
LLNotificationsUtil::add("HelpReportAbuseAbuserLocationEmpty");
return false;
};
if ( childGetText("abuse_location_edit").empty() ) if ( getChild<LLUICtrl>("abuser_name_edit")->getValue().asString().empty() )
{
LLNotificationsUtil::add("HelpReportAbuseAbuserLocationEmpty");
return false;
};
};
if ( childGetText("summary_edit").empty() )
{ {
if ( mReportType != BUG_REPORT ) LLNotificationsUtil::add("HelpReportAbuseAbuserNameEmpty");
{ return false;
LLNotificationsUtil::add("HelpReportAbuseSummaryEmpty"); }
}
else if ( getChild<LLUICtrl>("abuse_location_edit")->getValue().asString().empty() )
{ {
LLNotificationsUtil::add("HelpReportBugSummaryEmpty"); LLNotificationsUtil::add("HelpReportAbuseAbuserLocationEmpty");
} return false;
}
if ( getChild<LLUICtrl>("abuse_location_edit")->getValue().asString().empty() )
{
LLNotificationsUtil::add("HelpReportAbuseAbuserLocationEmpty");
return false;
}
if ( getChild<LLUICtrl>("summary_edit")->getValue().asString().empty() )
{
LLNotificationsUtil::add("HelpReportAbuseSummaryEmpty");
return false; return false;
}; };
if ( childGetText("details_edit") == mDefaultSummary ) if ( getChild<LLUICtrl>("details_edit")->getValue().asString() == mDefaultSummary )
{ {
if ( mReportType != BUG_REPORT )
{
LLNotificationsUtil::add("HelpReportAbuseDetailsEmpty"); LLNotificationsUtil::add("HelpReportAbuseDetailsEmpty");
}
else
{
LLNotificationsUtil::add("HelpReportBugDetailsEmpty");
}
return false; return false;
}; };
return true; return true;
@@ -710,65 +585,45 @@ LLSD LLFloaterReporter::gatherReport()
#if LL_WINDOWS #if LL_WINDOWS
const char* platform = "Win"; const char* platform = "Win";
const char* short_platform = "O:W";
#elif LL_DARWIN #elif LL_DARWIN
const char* platform = "Mac"; const char* platform = "Mac";
const char* short_platform = "O:M";
#elif LL_LINUX #elif LL_LINUX
const char* platform = "Lnx"; const char* platform = "Lnx";
const char* short_platform = "O:L";
#elif LL_SOLARIS #elif LL_SOLARIS
const char* platform = "Sol"; const char* platform = "Sol";
const char* short_platform = "O:S";
#else #else
const char* platform = "???"; const char* platform = "???";
const char* short_platform = "O:?";
#endif #endif
if ( mReportType == BUG_REPORT)
{ summary << ""
summary << short_platform << " V" << gVersionMajor << "." << " |" << regionp->getName() << "|" // region reporter is currently in.
<< gVersionMinor << "." << " (" << getChild<LLUICtrl>("abuse_location_edit")->getValue().asString() << ")" // region abuse occured in (freeform text - no LLRegionPicker tool)
<< gVersionPatch << "." << " [" << category_name << "] " // updated category
<< gVersionBuild << " {" << getChild<LLUICtrl>("abuser_name_edit")->getValue().asString() << "} " // name of abuse entered in report (chosen using LLAvatarPicker)
<< " (" << regionp->getName() << ")" << " \"" << getChild<LLUICtrl>("summary_edit")->getValue().asString() << "\""; // summary as entered
<< "[" << category_name << "] "
<< "\"" << childGetValue("summary_edit").asString() << "\"";
}
else
{
summary << ""
<< " |" << regionp->getName() << "|" // region reporter is currently in.
<< " (" << childGetText("abuse_location_edit") << ")" // region abuse occured in (freeform text - no LLRegionPicker tool)
<< " [" << category_name << "] " // updated category
<< " {" << childGetText("abuser_name_edit") << "} " // name of abuse entered in report (chosen using LLAvatarPicker)
<< " \"" << childGetValue("summary_edit").asString() << "\""; // summary as entered
};
std::ostringstream details; std::ostringstream details;
if (mReportType != BUG_REPORT)
{ details << "V" << gVersionMajor << "." // client version moved to body of email for abuse reports
details << "V" << gVersionMajor << "." // client version moved to body of email for abuse reports << gVersionMinor << "."
<< gVersionMinor << "." << gVersionPatch << "."
<< gVersionPatch << "." << gVersionBuild << std::endl << std::endl;
<< gVersionBuild << std::endl << std::endl;
} std::string object_name = getChild<LLUICtrl>("object_name")->getValue().asString();
std::string object_name = childGetText("object_name"); if (!object_name.empty() && !mOwnerName.empty())
std::string owner_name = childGetText("owner_name");
if (!object_name.empty() && !owner_name.empty())
{ {
details << "Object: " << object_name << "\n"; details << "Object: " << object_name << "\n";
details << "Owner: " << owner_name << "\n"; details << "Owner: " << mOwnerName << "\n";
} }
if ( mReportType != BUG_REPORT )
{
details << "Abuser name: " << childGetText("abuser_name_edit") << " \n";
details << "Abuser location: " << childGetText("abuse_location_edit") << " \n";
};
details << childGetValue("details_edit").asString(); details << "Abuser name: " << getChild<LLUICtrl>("abuser_name_edit")->getValue().asString() << " \n";
details << "Abuser location: " << getChild<LLUICtrl>("abuse_location_edit")->getValue().asString() << " \n";
details << getChild<LLUICtrl>("details_edit")->getValue().asString();
std::string version_string; std::string version_string;
version_string = llformat( version_string = llformat(
@@ -784,14 +639,14 @@ LLSD LLFloaterReporter::gatherReport()
// only send a screenshot ID if we're asked to and the email is // only send a screenshot ID if we're asked to and the email is
// going to LL - Estate Owners cannot see the screenshot asset // going to LL - Estate Owners cannot see the screenshot asset
LLUUID screenshot_id = LLUUID::null; LLUUID screenshot_id = LLUUID::null;
if (childGetValue("screen_check")) if (getChild<LLUICtrl>("screen_check")->getValue())
{ {
screenshot_id = childGetValue("screenshot"); screenshot_id = getChild<LLUICtrl>("screenshot")->getValue();
}; }
LLSD report = LLSD::emptyMap(); LLSD report = LLSD::emptyMap();
report["report-type"] = (U8) mReportType; report["report-type"] = (U8) mReportType;
report["category"] = childGetValue("category_combo"); report["category"] = getChild<LLUICtrl>("category_combo")->getValue();
report["position"] = mPosition.getValue(); report["position"] = mPosition.getValue();
report["check-flags"] = (U8)0; // this is not used report["check-flags"] = (U8)0; // this is not used
report["screenshot-id"] = screenshot_id; report["screenshot-id"] = screenshot_id;
@@ -877,7 +732,7 @@ public:
void LLFloaterReporter::sendReportViaCaps(std::string url, std::string sshot_url, const LLSD& report) void LLFloaterReporter::sendReportViaCaps(std::string url, std::string sshot_url, const LLSD& report)
{ {
if(childGetValue("screen_check").asBoolean() && !sshot_url.empty()) if(getChild<LLUICtrl>("screen_check")->getValue().asBoolean() && !sshot_url.empty())
{ {
// try to upload screenshot // try to upload screenshot
LLHTTPClient::post(sshot_url, report, new LLUserReportScreenshotResponder(report, LLHTTPClient::post(sshot_url, report, new LLUserReportScreenshotResponder(report,
@@ -893,11 +748,11 @@ void LLFloaterReporter::sendReportViaCaps(std::string url, std::string sshot_url
void LLFloaterReporter::takeScreenshot() void LLFloaterReporter::takeScreenshot()
{ {
const S32 IMAGE_WIDTH = 1024; // Warning: This crops left and right in case of wide-screen monitor:
const S32 IMAGE_HEIGHT = 768; const S32 IMAGE_WIDTH = 1024; //gViewerWindow->getWindowWidthRaw();
const S32 IMAGE_HEIGHT = 768; //gViewerWindow->getWindowHeightRaw();
LLPointer<LLImageRaw> raw = new LLImageRaw; LLPointer<LLImageRaw> raw = new LLImageRaw;
// Warning: This crops left and right in case of wide-screen monitor:
if( !gViewerWindow->rawSnapshot(raw, IMAGE_WIDTH, IMAGE_HEIGHT, (F32)IMAGE_WIDTH / IMAGE_HEIGHT, TRUE, FALSE)) if( !gViewerWindow->rawSnapshot(raw, IMAGE_WIDTH, IMAGE_HEIGHT, (F32)IMAGE_WIDTH / IMAGE_HEIGHT, TRUE, FALSE))
{ {
llwarns << "Unable to take screenshot" << llendl; llwarns << "Unable to take screenshot" << llendl;
@@ -911,15 +766,11 @@ void LLFloaterReporter::takeScreenshot()
mResourceDatap->mExpectedUploadCost = 0; // we expect that abuse screenshots are free mResourceDatap->mExpectedUploadCost = 0; // we expect that abuse screenshots are free
mResourceDatap->mAssetInfo.mTransactionID.generate(); mResourceDatap->mAssetInfo.mTransactionID.generate();
mResourceDatap->mAssetInfo.mUuid = mResourceDatap->mAssetInfo.mTransactionID.makeAssetID(gAgent.getSecureSessionID()); mResourceDatap->mAssetInfo.mUuid = mResourceDatap->mAssetInfo.mTransactionID.makeAssetID(gAgent.getSecureSessionID());
if (BUG_REPORT == mReportType)
if (COMPLAINT_REPORT == mReportType)
{ {
mResourceDatap->mAssetInfo.mType = LLAssetType::AT_TEXTURE; mResourceDatap->mAssetInfo.mType = LLAssetType::AT_TEXTURE;
mResourceDatap->mPreferredLocation = LLFolderType::EType(-1); mResourceDatap->mPreferredLocation = LLFolderType::EType(LLResourceData::INVALID_LOCATION);
}
else if (COMPLAINT_REPORT == mReportType)
{
mResourceDatap->mAssetInfo.mType = LLAssetType::AT_TEXTURE;
mResourceDatap->mPreferredLocation = LLFolderType::EType(-2);
} }
else else
{ {
@@ -987,11 +838,7 @@ void LLFloaterReporter::uploadDoneCallback(const LLUUID &uuid, void *user_data,
} }
EReportType report_type = UNKNOWN_REPORT; EReportType report_type = UNKNOWN_REPORT;
if (data->mPreferredLocation == -1) if (data->mPreferredLocation == LLResourceData::INVALID_LOCATION)
{
report_type = BUG_REPORT;
}
else if (data->mPreferredLocation == -2)
{ {
report_type = COMPLAINT_REPORT; report_type = COMPLAINT_REPORT;
} }
@@ -1000,7 +847,7 @@ void LLFloaterReporter::uploadDoneCallback(const LLUUID &uuid, void *user_data,
llwarns << "Unknown report type : " << data->mPreferredLocation << llendl; llwarns << "Unknown report type : " << data->mPreferredLocation << llendl;
} }
LLFloaterReporter *self = getReporter(report_type); LLFloaterReporter *self = getInstance();
if (self) if (self)
{ {
self->mScreenID = uuid; self->mScreenID = uuid;
@@ -1018,38 +865,38 @@ void LLFloaterReporter::setPosBox(const LLVector3d &pos)
mPosition.mV[VX], mPosition.mV[VX],
mPosition.mV[VY], mPosition.mV[VY],
mPosition.mV[VZ]); mPosition.mV[VZ]);
childSetText("pos_field", pos_string); getChild<LLUICtrl>("pos_field")->setValue(pos_string);
} }
void LLFloaterReporter::setDescription(const std::string& description, LLMeanCollisionData *mcd) //void LLFloaterReporter::setDescription(const std::string& description, LLMeanCollisionData *mcd)
{ //{
LLFloaterReporter *self = gReporterInstances[COMPLAINT_REPORT]; // LLFloaterReporter *self = getInstance();
if (self) // if (self)
{ // {
self->childSetText("details_edit", description); // self->getChild<LLUICtrl>("details_edit")->setValue(description);
for_each(self->mMCDList.begin(), self->mMCDList.end(), DeletePointer()); // for_each(self->mMCDList.begin(), self->mMCDList.end(), DeletePointer());
self->mMCDList.clear(); // self->mMCDList.clear();
if (mcd) // if (mcd)
{ // {
self->mMCDList.push_back(new LLMeanCollisionData(mcd)); // self->mMCDList.push_back(new LLMeanCollisionData(mcd));
} // }
} // }
} //}
void LLFloaterReporter::addDescription(const std::string& description, LLMeanCollisionData *mcd) //void LLFloaterReporter::addDescription(const std::string& description, LLMeanCollisionData *mcd)
{ //{
LLFloaterReporter *self = gReporterInstances[COMPLAINT_REPORT]; // LLFloaterReporter *self = getInstance();
if (self) // if (self)
{ // {
LLTextEditor* text = self->getChild<LLTextEditor>("details_edit"); // LLTextEditor* text = self->getChild<LLTextEditor>("details_edit");
if (text) // if (text)
{ // {
text->insertText(description); // text->insertText(description);
} // }
if (mcd) // if (mcd)
{ // {
self->mMCDList.push_back(new LLMeanCollisionData(mcd)); // self->mMCDList.push_back(new LLMeanCollisionData(mcd));
} // }
} // }
} //}

View File

@@ -1,13 +1,12 @@
/** /**
* @file llfloaterreporter.h * @file llfloaterreporter.h
* @author Andrew Meadows * @author Andrew Meadows
* @brief Bug and abuse reports. * @brief Abuse reports.
* *
* $LicenseInfo:firstyear=2006&license=viewergpl$ * $LicenseInfo:firstyear=2006&license=viewergpl$
* * Second Life Viewer Source Code
* Copyright (c) 2006-2009, Linden Research, Inc. * Copyright (c) 2006-2009, Linden Research, Inc.
* *
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab * 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 * to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement * ("GPL"), unless you have obtained a separate licensing agreement
@@ -49,7 +48,7 @@ class LLMeanCollisionData;
struct LLResourceData; struct LLResourceData;
// these flags are used to label info requests to the server // these flags are used to label info requests to the server
const U32 BUG_REPORT_REQUEST = 0x01 << 0; //const U32 BUG_REPORT_REQUEST = 0x01 << 0; // DEPRECATED
const U32 COMPLAINT_REPORT_REQUEST = 0x01 << 1; const U32 COMPLAINT_REPORT_REQUEST = 0x01 << 1;
const U32 OBJECT_PAY_REQUEST = 0x01 << 2; const U32 OBJECT_PAY_REQUEST = 0x01 << 2;
@@ -74,48 +73,45 @@ enum EReportType
{ {
NULL_REPORT = 0, // don't use this value anywhere NULL_REPORT = 0, // don't use this value anywhere
UNKNOWN_REPORT = 1, UNKNOWN_REPORT = 1,
BUG_REPORT = 2, //BUG_REPORT = 2, // DEPRECATED
COMPLAINT_REPORT = 3, COMPLAINT_REPORT = 3,
CS_REQUEST_REPORT = 4 CS_REQUEST_REPORT = 4
}; };
class LLFloaterReporter class LLFloaterReporter
: public LLFloater : public LLFloater, public LLSingleton<LLFloaterReporter>
{ {
public: public:
LLFloaterReporter(const std::string& name, LLFloaterReporter();
const LLRect &rect,
const std::string& title,
EReportType = UNKNOWN_REPORT);
/*virtual*/ ~LLFloaterReporter(); /*virtual*/ ~LLFloaterReporter();
/*virtual*/ BOOL postBuild();
virtual void draw(); virtual void draw();
void setReportType(EReportType type) { mReportType = type; }
// Enables all buttons // Enables all buttons
static void showFromMenu(EReportType report_type); static void showFromMenu(EReportType report_type);
static void showFromObject(const LLUUID& object_id); static void showFromObject(const LLUUID& object_id);
static void showFromAvatar(const LLUUID& avatar_id, const std::string avatar_name);
static void onClickSend (void *userdata); static void onClickSend (void *userdata);
static void onClickCancel (void *userdata); static void onClickCancel (void *userdata);
static void onClickObjPicker (void *userdata); static void onClickObjPicker (void *userdata);
static void onClickSelectAbuser (void *userdata); void onClickSelectAbuser ();
static void closePickTool (void *userdata); static void closePickTool (void *userdata);
static void uploadDoneCallback(const LLUUID &uuid, void* user_data, S32 result, LLExtStat ext_status); static void uploadDoneCallback(const LLUUID &uuid, void* user_data, S32 result, LLExtStat ext_status);
static void addDescription(const std::string& description, LLMeanCollisionData *mcd = NULL); static void addDescription(const std::string& description, LLMeanCollisionData *mcd = NULL);
static void setDescription(const std::string& description, LLMeanCollisionData *mcd = NULL); static void setDescription(const std::string& description, LLMeanCollisionData *mcd = NULL);
// returns a pointer to reporter of report_type
static LLFloaterReporter* getReporter(EReportType report_type);
static LLFloaterReporter* createNewAbuseReporter();
static LLFloaterReporter* createNewBugReporter();
// static // static
static void processRegionInfo(LLMessageSystem* msg); static void processRegionInfo(LLMessageSystem* msg);
void setPickedObjectProperties(const std::string& object_name, const std::string& owner_name, const LLUUID owner_id); void setPickedObjectProperties(const std::string& object_name, const std::string& owner_name, const LLUUID owner_id);
private: private:
static void show(const LLUUID& object_id, const std::string& avatar_name = LLStringUtil::null);
void takeScreenshot(); void takeScreenshot();
void sendReportViaCaps(std::string url); void sendReportViaCaps(std::string url);
void uploadImage(); void uploadImage();
@@ -128,12 +124,16 @@ private:
void enableControls(BOOL own_avatar); void enableControls(BOOL own_avatar);
void getObjectInfo(const LLUUID& object_id); void getObjectInfo(const LLUUID& object_id);
void callbackAvatarID(const uuid_vec_t& ids, const std::vector<LLAvatarName>& names); void callbackAvatarID(const uuid_vec_t& ids, const std::vector<LLAvatarName>& names);
void setFromAvatarID(const LLUUID& avatar_id);
void onAvatarNameCache(const LLUUID& avatar_id, const LLAvatarName& av_name);
private: private:
EReportType mReportType; EReportType mReportType;
LLUUID mObjectID; LLUUID mObjectID;
LLUUID mScreenID; LLUUID mScreenID;
LLUUID mAbuserID; LLUUID mAbuserID;
// Store the real name, not the link, for upstream reporting
std::string mOwnerName;
BOOL mDeselectOnClose; BOOL mDeselectOnClose;
BOOL mPicking; BOOL mPicking;
LLVector3 mPosition; LLVector3 mPosition;

View File

@@ -5144,10 +5144,9 @@ void LLSelectMgr::processObjectPropertiesFamily(LLMessageSystem* msg, void** use
msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Description, desc); msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Description, desc);
// the reporter widget askes the server for info about picked objects // the reporter widget askes the server for info about picked objects
if (request_flags & (COMPLAINT_REPORT_REQUEST | BUG_REPORT_REQUEST)) if (request_flags & COMPLAINT_REPORT_REQUEST)
{ {
EReportType report_type = (COMPLAINT_REPORT_REQUEST & request_flags) ? COMPLAINT_REPORT : BUG_REPORT; LLFloaterReporter *reporterp = LLFloaterReporter::getInstance();
LLFloaterReporter *reporterp = LLFloaterReporter::getReporter(report_type);
if (reporterp) if (reporterp)
{ {
std::string fullname; std::string fullname;

View File

@@ -6501,12 +6501,6 @@ class LLShowFloater : public view_listener_t
{ {
LLFloaterLagMeter::showInstance(); LLFloaterLagMeter::showInstance();
} }
else if (floater_name == "bug reporter")
{
// Prevent menu from appearing in screen shot.
gMenuHolder->hideMenus();
LLFloaterReporter::showFromMenu(BUG_REPORT);
}
else if (floater_name == "buy currency") else if (floater_name == "buy currency")
{ {
LLFloaterBuyCurrency::buyCurrency(); LLFloaterBuyCurrency::buyCurrency();

View File

@@ -1,176 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater can_close="true" can_drag_on_left="false" can_minimize="true"
can_resize="false" height="455" min_height="100" min_width="100"
name="bug_reporter" title="Report Bug" width="390">
<texture_picker allow_no_texture="true" bottom="-150" default_image_name="None"
follows="left|top" height="114" label="" left="238" mouse_opaque="true"
name="screenshot" width="134" />
<check_box bottom_delta="-16" follows="left|top" font="SansSerifSmall" height="16"
initial_value="false" label="Include screenshot" left="234"
mouse_opaque="true" name="screen_check" width="116" />
<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-48" drop_shadow_visible="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="16" left="16"
mouse_opaque="true" name="reporter_title" v_pad="0" width="50">
Reporter:
</text>
<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-48" drop_shadow_visible="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="16" left_delta="62"
mouse_opaque="true" name="reporter_field" v_pad="0" width="120" />
<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-64" drop_shadow_visible="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="16" left="16"
mouse_opaque="true" name="sim_title" v_pad="0" width="50">
Region:
</text>
<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-64" drop_shadow_visible="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="16" left_delta="62"
mouse_opaque="true" name="sim_field" v_pad="0" width="120" />
<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-80" drop_shadow_visible="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="16" left="16"
mouse_opaque="true" name="pos_title" v_pad="0" width="50">
Position:
</text>
<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom="-80" drop_shadow_visible="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="16" left_delta="62"
mouse_opaque="true" name="pos_field" v_pad="0" width="120" />
<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="-22" drop_shadow_visible="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="16" left="16"
mouse_opaque="true" name="select_object_label" v_pad="0" width="200">
Click the button then the object:
</text>
<button bottom_delta="-32" font="SansSerif" halign="center" height="32" label=""
label_selected="" left="16" mouse_opaque="true" name="pick_btn"
tool_tip="Object Picker - Identify an object as the subject of this report"
width="32" />
<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="16" drop_shadow_visible="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="16" left="53"
mouse_opaque="true" name="object_name_label" v_pad="0" width="60">
Name:
</text>
<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="0" drop_shadow_visible="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="16" left_delta="66"
mouse_opaque="true" name="object_name" v_pad="0" width="109">
Consetetur Sadipscing
</text>
<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="-16" drop_shadow_visible="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="16" left="53"
mouse_opaque="true" name="owner_name_label" v_pad="0" width="60">
Owner:
</text>
<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="0" drop_shadow_visible="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="16" left_delta="66"
mouse_opaque="true" name="owner_name" v_pad="0" width="109">
Hendrerit Vulputate
</text>
<combo_box bottom_delta="-28" follows="left|top" height="20" left="16" mouse_opaque="true"
name="category_combo"
tool_tip="Category -- select the category that best describes this report"
width="180">
<combo_item name="Selectcategory" value="0">
Select category
</combo_item>
<combo_item name="Building" value="9">
Building
</combo_item>
<combo_item name="Character" value="8">
Character
</combo_item>
<combo_item name="Chat/IM" value="3">
Chat/IM
</combo_item>
<combo_item name="Documentation" value="10">
Documentation
</combo_item>
<combo_item name="Exploit" value="22">
Exploit
</combo_item>
<combo_item name="Graphics" value="11">
Graphics
</combo_item>
<combo_item name="Inventory" value="12">
Inventory
</combo_item>
<combo_item name="Lag" value="13">
Lag
</combo_item>
<combo_item name="MissingContent" value="21">
Missing Content
</combo_item>
<combo_item name="LindenDollars(L$)" value="14">
Linden Dollars (L$)
</combo_item>
<combo_item name="Permissions" value="15">
Permissions
</combo_item>
<combo_item name="Physics" value="16">
Physics
</combo_item>
<combo_item name="Script" value="17">
Script
</combo_item>
<combo_item name="Sound" value="6">
Sound
</combo_item>
<combo_item name="Stipends" value="18">
Stipends
</combo_item>
<combo_item name="Userinterface" value="19">
User interface
</combo_item>
<combo_item name="Miscellaneous" value="20">
Miscellaneous
</combo_item>
</combo_box>
<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="-25" drop_shadow_visible="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="16" left="16"
mouse_opaque="true" name="sum_title" v_pad="0" width="180">
Summary:
</text>
<line_editor bevel_style="in" border_style="line"
border_thickness="1" bottom_delta="-16" follows="left|top"
font="SansSerifSmall" height="16" left="16" max_length="64"
mouse_opaque="true" name="summary_edit"
width="356" spell_check="true" />
<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="-20" drop_shadow_visible="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="16" left="16"
mouse_opaque="true" name="dscr_title" v_pad="0" width="342">
Details: (Please provide as much information as possible)
</text>
<text_editor bottom_delta="-112" embedded_items="false"
follows="left|top" font="SansSerifSmall" height="112" left="16"
max_length="900" mouse_opaque="false" name="details_edit"
width="356" word_wrap="true" spell_check="true">
Steps to reproduce the bug:
Observed results:
Expected results:
</text_editor>
<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
bottom_delta="-40" drop_shadow_visible="true" follows="left|top"
font="SansSerifSmall" h_pad="0" halign="left" height="32" left="16"
mouse_opaque="true" name="bug_aviso" v_pad="0" width="342">
Note: Incomplete reports will not be investigated
If this bug allows you to do something you should not be able
to do, especially if it impacts performance or security, please
select the &apos;Exploit&apos; category. Thank you!
</text>
<button bottom="10" follows="right|bottom" font="SansSerif" halign="center" height="20"
label="Cancel" label_selected="Cancel" mouse_opaque="true"
name="cancel_btn" right="380" width="150" />
<button bottom="10" follows="right|bottom" font="SansSerif" halign="center" height="20"
label="Report Bug" label_selected="Report Bug" mouse_opaque="true"
name="send_btn" right="224" width="150" />
</floater>

View File

@@ -4848,22 +4848,6 @@ The region owner will resolve reports based on the local rules of this region as
The resolution of this report applies only to this Region; Residents access to other areas of the [SECOND_LIFE_GRID] will not be affected by the outcome of this report. Only [GRID_OWNER] can restrict access to the entirety of the [SECOND_LIFE_GRID]. The resolution of this report applies only to this Region; Residents access to other areas of the [SECOND_LIFE_GRID] will not be affected by the outcome of this report. Only [GRID_OWNER] can restrict access to the entirety of the [SECOND_LIFE_GRID].
</notification> </notification>
<notification
icon="alertmodal.tga"
name="HelpReportBug"
type="alertmodal">
Use this tool to *only* report technical features that do not perform as described or expected, please provide as much detail as possible.
You may reply to the auto-response email to add more details to your report.
All bug reports are investigated and assessed. No email response will be sent.
If you are having a technical difficulty, please contact Support at:
http://secondlife.com/community/support.php
Note: Incomplete reports will not be investigated
</notification>
<notification <notification
icon="alertmodal.tga" icon="alertmodal.tga"
name="HelpReportAbuseSelectCategory" name="HelpReportAbuseSelectCategory"
@@ -4872,14 +4856,6 @@ Please select a category for this abuse report.
Selecting a category helps us file and process abuse reports. Selecting a category helps us file and process abuse reports.
</notification> </notification>
<notification
icon="alertmodal.tga"
name="HelpReportBugSelectCategory"
type="alertmodal">
Please select a category for this bug.
Selecting a category helps us file and process bug reports.
</notification>
<notification <notification
icon="alertmodal.tga" icon="alertmodal.tga"
name="HelpReportAbuseAbuserNameEmpty" name="HelpReportAbuseAbuserNameEmpty"
@@ -4904,14 +4880,6 @@ Please enter a summary of the abuse that took place.
Entering an accurate summary helps us file and process abuse reports. Entering an accurate summary helps us file and process abuse reports.
</notification> </notification>
<notification
icon="alertmodal.tga"
name="HelpReportBugSummaryEmpty"
type="alertmodal">
Please enter a summary of the bug.
Entering an accurate summary helps us file and process bug reports.
</notification>
<notification <notification
icon="alertmodal.tga" icon="alertmodal.tga"
name="HelpReportAbuseDetailsEmpty" name="HelpReportAbuseDetailsEmpty"
@@ -4921,15 +4889,6 @@ Be as specific as you can, including names and the details of the incident you a
Entering an accurate description helps us file and process abuse reports. Entering an accurate description helps us file and process abuse reports.
</notification> </notification>
<notification
icon="alertmodal.tga"
name="HelpReportBugDetailsEmpty"
type="alertmodal">
Please enter a detailed description of the bug.
Be as specific as you can, including steps to reproduce the bug if possible.
Entering an accurate description helps us file and process bug reports.
</notification>
<notification <notification
icon="alertmodal.tga" icon="alertmodal.tga"
name="HelpReportNope" name="HelpReportNope"

View File

@@ -1,107 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="bug_reporter" title="Reportar Fallo">
<texture_picker label="" name="screenshot"/>
<check_box label="Incluir captura de pantalla" name="screen_check"/>
<text name="reporter_title">
Informante:
</text>
<text name="sim_title">
Región:
</text>
<text name="pos_title">
Posición:
</text>
<text name="select_object_label">
Haz clic en el botón y en el objeto para seleccionar:
</text>
<button label="" label_selected="" name="pick_btn" tool_tip="Selector de Objetos - Identifica un objeto como el sujeto de este reporte"/>
<text name="object_name_label">
Nombre:
</text>
<text name="object_name">
Consetetur Sadipscing
</text>
<text name="owner_name_label">
Propietario:
</text>
<text name="owner_name">
Hendrerit Vulputate
</text>
<combo_box name="category_combo" tool_tip="Categoría -- Elige la categoría que mejor describe este reporte">
<combo_item name="Selectcategory">
Elegir categoría
</combo_item>
<combo_item name="Building">
Construcción
</combo_item>
<combo_item name="Character" value="8">
Personaje
</combo_item>
<combo_item name="Chat/IM">
Chat/MI
</combo_item>
<combo_item name="Documentation">
Documentación
</combo_item>
<combo_item name="Exploit">
Exploit
</combo_item>
<combo_item name="Graphics" value="11">
Gráficos
</combo_item>
<combo_item name="Inventory">
Inventario
</combo_item>
<combo_item name="Lag">
Lag
</combo_item>
<combo_item name="MissingContent">
Contenido Perdido
</combo_item>
<combo_item name="LindenDollars(L$)">
Linden Dollars (L$)
</combo_item>
<combo_item name="Permissions">
Permisos
</combo_item>
<combo_item name="Physics">
Física
</combo_item>
<combo_item name="Script">
Script
</combo_item>
<combo_item name="Sound">
Sonidos
</combo_item>
<combo_item name="Stipends">
Salario
</combo_item>
<combo_item name="Userinterface">
Interfaz de usuario
</combo_item>
<combo_item name="Miscellaneous">
Misceláneo
</combo_item>
</combo_box>
<text name="sum_title">
Sumario:
</text>
<text name="dscr_title">
Detalles: (Por favor, proporciona toda la información que sea posible)
</text>
<text_editor name="details_edit">
Pasos para reproducir el fallo:
Resultados observados:
Resultados esperados:
</text_editor>
<text name="bug_aviso">
Nota: los informes incompletos no serán investigados
Si el fallo te permite hacer algo que no deberías poder hacer,
especialmente si éste impacta en el rendimiento o seguridad,
por favor seleeciona la categoría &apos;Exploit&apos; ¡Gracias!
</text>
<button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/>
<button label="Reportar Fallo" label_selected="Reportar Fallo" name="send_btn"/>
</floater>

View File

@@ -2736,29 +2736,11 @@ El propietario de la región resolverá las denuncias basándose en las reglas l
La resolución de esta denuncia se aplica exclusivamente a esta región; el acceso de los residentes a otras áreas de [SECOND_LIFE_GRID] no se verá afectado por el resultado de esta denuncia. Únicamente [GRID_OWNER] puede impedir el acceso a la totalidad de [SECOND_LIFE_GRID]. La resolución de esta denuncia se aplica exclusivamente a esta región; el acceso de los residentes a otras áreas de [SECOND_LIFE_GRID] no se verá afectado por el resultado de esta denuncia. Únicamente [GRID_OWNER] puede impedir el acceso a la totalidad de [SECOND_LIFE_GRID].
</notification> </notification>
<notification name="HelpReportBug">
Usa esta herramienta *sólo* para informar de cuestiones técnicas que no se comportan como se describe o era esperable. Por favor, aporta todos los detalles que puedas.
Deberás responder al correo electrónico de auto respuesta para añadir más detalles a tu informe.
Todos los informes de fallos serán investigados y evaluados. No se contestará por correo electrónico.
Si tienes algún problema técnico, por favor, contacta con Soporte en:
http://secondlife.com/community/support.php
Nota: no se investigarán los informes incompletos.
</notification>
<notification name="HelpReportAbuseSelectCategory"> <notification name="HelpReportAbuseSelectCategory">
Por favor, elige una categoría para esta denuncia de infracción. Por favor, elige una categoría para esta denuncia de infracción.
Seleccionar una categoría nos ayuda a clasificar y procesar las denuncias de infracciones. Seleccionar una categoría nos ayuda a clasificar y procesar las denuncias de infracciones.
</notification> </notification>
<notification name="HelpReportBugSelectCategory">
Por favor, elige una categoría para este fallo.
Seleccionar una categoría nos ayuda a clasificar y procesar los informes de fallos.
</notification>
<notification name="HelpReportAbuseAbuserNameEmpty"> <notification name="HelpReportAbuseAbuserNameEmpty">
Por favor, escribe el nombre del infractor. Por favor, escribe el nombre del infractor.
Aportar el dato preciso nos ayuda a clasificar y procesar las denuncias de infracciones. Aportar el dato preciso nos ayuda a clasificar y procesar las denuncias de infracciones.
@@ -2774,23 +2756,12 @@ Aportar el dato preciso nos ayuda a clasificar y procesar las denuncias de infra
Aportar un resumen preciso nos ayuda a clasificar y procesar las denuncias de infracciones. Aportar un resumen preciso nos ayuda a clasificar y procesar las denuncias de infracciones.
</notification> </notification>
<notification name="HelpReportBugSummaryEmpty">
Por favor, escribe un resumen del fallo.
Aportar un resumen preciso nos ayuda a clasificar y procesar los informes de fallos.
</notification>
<notification name="HelpReportAbuseDetailsEmpty"> <notification name="HelpReportAbuseDetailsEmpty">
Por favor, escribe una descripción minuciosa de la infracción que ha habido. Por favor, escribe una descripción minuciosa de la infracción que ha habido.
Se tan específico como puedas, incluyendo los nombres y los detalles implicados en el incidente que denuncias. Se tan específico como puedas, incluyendo los nombres y los detalles implicados en el incidente que denuncias.
Aportar una descripción precisa nos ayuda a clasificar y procesar las denuncias de infracciones. Aportar una descripción precisa nos ayuda a clasificar y procesar las denuncias de infracciones.
</notification> </notification>
<notification name="HelpReportBugDetailsEmpty">
Por favor, escribe una descripción minuciosa del fallo.
Se tan específico como puedas, incluyendo -si es posible- los pasos que permitan reproducir el fallo.
Aportar una descripción precisa nos ayuda a clasificar y procesar los informes de fallos.
</notification>
<notification name="HelpReportNope"> <notification name="HelpReportNope">
No te entrometas en los asuntos de los magos, ya que son sutiles y rápidos para la ira. - J.R.R. Tolkien No te entrometas en los asuntos de los magos, ya que son sutiles y rápidos para la ira. - J.R.R. Tolkien

View File

@@ -1,108 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="bug_reporter" title="Signaler un bug">
<text name="reporter_title">
Signalant:
</text>
<text name="sim_title">
Sim:
</text>
<text name="pos_title">
Position:
</text>
<text name="select_object_label">
Cliquer sur le bouton puis l'objet:
</text>
<button label="" label_selected="" name="pick_btn" tool_tip="Le sélecteur d'objet vous permet d'identifier un objet comme sujet du rapport."/>
<text name="object_name_label">
Nom:
</text>
<text name="object_name">
Consetetur Sadipscing
</text>
<text name="owner_name_label">
Propriétaire :
</text>
<check_box label="Inclure une capture d'écran" name="screen_check"/>
<texture_picker label="Instantané en cours" name="screenshot"/>
<text name="category_label">
Catégorie :
</text>
<text name="owner_name">
Hendrerit Vulputate
</text>
<combo_box name="category_combo" tool_tip="Choisissez la catégorie qui décrit le mieux ce rapport">
<combo_item name="Selectcategory">
Sélectionner une catégorie
</combo_item>
<combo_item name="Building">
Construire
</combo_item>
<combo_item name="Character">
Personnage
</combo_item>
<combo_item name="Chat/IM">
Chat/IM
</combo_item>
<combo_item name="Documentation">
Documentation
</combo_item>
<combo_item name="Exploit">
Exploit
</combo_item>
<combo_item name="Graphics">
Graphiques
</combo_item>
<combo_item name="Inventory">
Inventaire
</combo_item>
<combo_item name="Lag">
Lag
</combo_item>
<combo_item name="MissingContent">
Contenu manquant
</combo_item>
<combo_item name="LindenDollars(L$)">
Dollar Linden (L$)
</combo_item>
<combo_item name="Permissions">
Autorisations
</combo_item>
<combo_item name="Physics">
Propriétés physiques
</combo_item>
<combo_item name="Script">
Script
</combo_item>
<combo_item name="Sound">
Son
</combo_item>
<combo_item name="Stipends">
Subsides
</combo_item>
<combo_item name="Userinterface">
Interface utilisateur
</combo_item>
<combo_item name="Miscellaneous">
Divers
</combo_item>
</combo_box>
<text name="sum_title">
Récapitulatif:
</text>
<text name="dscr_title">
Détails (soyez aussi précis que possible):
</text>
<text_editor name="details_edit">
Étapes pour reproduire le bug:
Résultats observés:
Résultats attendus:
</text_editor>
<text name="bug_aviso">
Remarque : les rapports incomplets ne feront pas l'objet d'une enquête.
Si ce bug vous permet de faire quelque chose que vous ne devriez pas pouvoir faire, surtout s'il a des conséquences sur la sécurité et la performance, veuillez sélectionner la catégorie Exploit. Merci!
</text>
<button label="Signaler un bug" label_selected="Signaler un bug" name="send_btn"/>
<button label="Annuler" label_selected="Annuler" name="cancel_btn"/>
</floater>

View File

@@ -2390,29 +2390,11 @@ Le propriétaire de la région traitera les rapports en fonction des règles de
La résolution de ce rapport ne s'applique qu'à cette région ; L'accès aux autres endroits de Second Life ne sera pas affecté par les résultats de cette enquête. Seul Linden Lab peut interdire l'accès à l'ensemble de Second Life. La résolution de ce rapport ne s'applique qu'à cette région ; L'accès aux autres endroits de Second Life ne sera pas affecté par les résultats de cette enquête. Seul Linden Lab peut interdire l'accès à l'ensemble de Second Life.
</notification> </notification>
<notification name="HelpReportBug">
N'utilisez cet outil que pour signaler des problèmes techniques et soyez aussi précis que possible.
Vous pouvez répondre à l'e-mail automatique pour ajouter des détails à votre rapport.
Tous les bugs signalés sont reproduits et évalués. Aucune réponse ne sera envoyée par e-mail.
Si vous avez un problème technique, veuillez contacter le service clientèle à :
http://secondlife.com/community/support.php
Remarque : les rapports incomplets ne feront pas l'objet d'une enquête.
</notification>
<notification name="HelpReportAbuseSelectCategory"> <notification name="HelpReportAbuseSelectCategory">
Veuillez choisir une catégorie pour ce rapport d'infraction. Veuillez choisir une catégorie pour ce rapport d'infraction.
Le choix d'une catégorie nous permet de traiter les rapports d'infraction plus rapidement. Le choix d'une catégorie nous permet de traiter les rapports d'infraction plus rapidement.
</notification> </notification>
<notification name="HelpReportBugSelectCategory">
Veuillez choisir une catégorie pour ce bug.
Le choix d'une catégorie nous permet de traiter les bugs plus rapidement.
</notification>
<notification name="HelpReportAbuseAbuserNameEmpty"> <notification name="HelpReportAbuseAbuserNameEmpty">
Veuillez saisir le nom du contrevenant. Veuillez saisir le nom du contrevenant.
Lorsque nous avons le nom du contrevenant, nous sommes en mesure de traiter les rapports plus rapidement. Lorsque nous avons le nom du contrevenant, nous sommes en mesure de traiter les rapports plus rapidement.
@@ -2428,23 +2410,12 @@ Veuillez saisir un récapitulatif de l'infraction.
Les récapitulatifs précis nous permettent de traiter les rapports plus rapidement. Les récapitulatifs précis nous permettent de traiter les rapports plus rapidement.
</notification> </notification>
<notification name="HelpReportBugSummaryEmpty">
Veuillez saisir un récapitulatif du bug.
Les récapitulatifs précis nous permettent de résoudre les bugs plus rapidement.
</notification>
<notification name="HelpReportAbuseDetailsEmpty"> <notification name="HelpReportAbuseDetailsEmpty">
Veuillez saisir une description détaillée de l'infraction. Veuillez saisir une description détaillée de l'infraction.
Soyez aussi précis que possible et essayez de fournir des noms ainsi que des détails sur l'incident que vous signalez. Soyez aussi précis que possible et essayez de fournir des noms ainsi que des détails sur l'incident que vous signalez.
Les descriptions précises nous permettent de traiter les rapports plus rapidement. Les descriptions précises nous permettent de traiter les rapports plus rapidement.
</notification> </notification>
<notification name="HelpReportBugDetailsEmpty">
Veuillez saisir une description détaillée du bug.
Soyez aussi spécifique que possible et essayez d'indiquer les étapes à suivre pour reproduire le bug.
Les descriptions précises nous permettent de résoudre les bugs plus rapidement.
</notification>
<notification name="HelpReportAbuseContainsCopyright"> <notification name="HelpReportAbuseContainsCopyright">
Cher résident, Cher résident,

View File

@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="bug_reporter" title="Reportar Bug">
<text name="sim_title">
Região:
</text>
<text name="select_object_label">
Clique no botão e depois no objeto:
</text>
<texture_picker label="" name="screenshot"/>
</floater>

View File

@@ -2297,29 +2297,11 @@ O dono da região resolverá as reportagens baseado nas regras locais desta regi
A resolução desta reportagem se aplica apenas a esta região; o acesso de Residentes às outras áreas do [SECOND_LIFE_GRID] não será afetado pelas decisões desta reportagem. Apenas a [GRID_OWNER] pode restringir acesso a todo o [SECOND_LIFE_GRID]. A resolução desta reportagem se aplica apenas a esta região; o acesso de Residentes às outras áreas do [SECOND_LIFE_GRID] não será afetado pelas decisões desta reportagem. Apenas a [GRID_OWNER] pode restringir acesso a todo o [SECOND_LIFE_GRID].
</notification> </notification>
<notification name="HelpReportBug">
Use esta ferramenta para reportar *apenas* características técnicas que não atuem como descrito ou esperado.
Por favor, forneça tantos detalhes quanto possível. Você pode responder ao e-mail de resposta automática para adicionar mais detalhes à sua reportagem.
Todas as reportagens de bugs são investigadas e avaliadas. Nenhum e-mail de resposta será enviado.
Se você estiver tendo uma dificuldade técnica, por favor contate o Suporte em:
http://secondlife.com/community/support.php
Nota: reportagens incompletas não serão investigadas
</notification>
<notification name="HelpReportAbuseSelectCategory"> <notification name="HelpReportAbuseSelectCategory">
Por favor, selecione uma categoria para a reportagem deste abuso. Por favor, selecione uma categoria para a reportagem deste abuso.
A seleção de uma categoria nos ajuda a arquivar e processar as reportagens de abuso. A seleção de uma categoria nos ajuda a arquivar e processar as reportagens de abuso.
</notification> </notification>
<notification name="HelpReportBugSelectCategory">
Por favor, selecione uma categoria para este bug.
A seleção de uma categoria nos ajuda a arquivar e processar as reportagens de bugs.
</notification>
<notification name="HelpReportAbuseAbuserNameEmpty"> <notification name="HelpReportAbuseAbuserNameEmpty">
Por favor, entre com o nome do perturbador. Por favor, entre com o nome do perturbador.
Entrando com um valor preciso, nos ajuda a arquivar e processar as reportagens de abuso. Entrando com um valor preciso, nos ajuda a arquivar e processar as reportagens de abuso.
@@ -2335,22 +2317,12 @@ Entrando com um valor preciso, nos ajuda a arquivar e processar as reportagens d
Fazer um resumo detalhado nos ajuda a arquivar e processar as reportagens de abuso. Fazer um resumo detalhado nos ajuda a arquivar e processar as reportagens de abuso.
</notification> </notification>
<notification name="HelpReportBugSummaryEmpty">
Por favor, digite um resumo do bug. Realizar um resumo detalhado nos ajuda a arquivar e processar as reportagens de abuso.
</notification>
<notification name="HelpReportAbuseDetailsEmpty"> <notification name="HelpReportAbuseDetailsEmpty">
Por favor, digite uma descrição detalhada do abuso que ocorreu. Por favor, digite uma descrição detalhada do abuso que ocorreu.
Seja tão específico quanto você puder, incluindo nomes e os detalhes do incidente que está denunciando. Seja tão específico quanto você puder, incluindo nomes e os detalhes do incidente que está denunciando.
Fazer uma descrição precisa nos ajuda a arquivar e processar as reportagens de abuso. Fazer uma descrição precisa nos ajuda a arquivar e processar as reportagens de abuso.
</notification> </notification>
<notification name="HelpReportBugDetailsEmpty">
Por favor, digite uma descrição detalhada do bug.
Seja tão específico quanto você puder, incluindo as etapas para reproduzir o bug, se possível.
Fazer uma descrição precisa nos ajuda a arquivar e processar os relatórios de bugs.
</notification>
<notification name="HelpReportAbuseContainsCopyright"> <notification name="HelpReportAbuseContainsCopyright">
Caro Residente, Caro Residente,