Hooked LLTrans into LLNotification stuffs. Also, fixed [CURRENCY] showing up in several places on the buy land window.

This commit is contained in:
Shyotl
2012-01-11 00:49:14 -06:00
parent e847b105f2
commit 68bc6749e5
24 changed files with 363 additions and 302 deletions

View File

@@ -106,6 +106,7 @@ set(llui_HEADER_FILES
llnotificationptr.h
llnotifications.h
llnotificationsutil.h
llnotificationtemplate.h
llpanel.h
llprogressbar.h
llradiogroup.h

View File

@@ -31,9 +31,13 @@
*/
#include "linden_common.h"
#include "llnotifications.h"
#include "llnotificationtemplate.h"
#include "lluictrlfactory.h"
#include "lldir.h"
#include "llsdserialize.h"
#include "lltrans.h"
#include "llnotifications.h"
@@ -164,12 +168,7 @@ bool filterIgnoredNotifications(LLNotificationPtr notification)
{
LLNotificationFormPtr form = notification->getForm();
// Check to see if the user wants to ignore this alert
if (form->getIgnoreType() != LLNotificationForm::IGNORE_NO)
{
return LLUI::sConfigGroup->getWarning(notification->getName());
}
return true;
return !notification->getForm()->getIgnored();
}
bool handleIgnoredNotification(const LLSD& payload)
@@ -219,7 +218,8 @@ LLNotificationForm::LLNotificationForm()
LLNotificationForm::LLNotificationForm(const std::string& name, const LLXMLNodePtr xml_node)
: mFormData(LLSD::emptyArray()),
mIgnore(IGNORE_NO)
mIgnore(IGNORE_NO),
mInvertSetting(false)
{
if (!xml_node->hasName("form"))
{
@@ -248,7 +248,7 @@ LLNotificationForm::LLNotificationForm(const std::string& name, const LLXMLNodeP
LLUI::sIgnoresGroup->declareLLSD(std::string("Default") + name, "", std::string("Default response for notification " + name));
}
child->getAttributeString("text", mIgnoreMsg);
LLUI::sIgnoresGroup->addWarning(name);
mIgnoreSetting = LLUI::sIgnoresGroup->addWarning(name);
}
else
{
@@ -344,13 +344,13 @@ void LLNotificationForm::formatElements(const LLSD& substitutions)
if ((*it).has("text"))
{
std::string text = (*it)["text"].asString();
text = LLNotification::format(text, substitutions);
LLStringUtil::format(text, substitutions);
(*it)["text"] = text;
}
if ((*it)["type"].asString() == "text" && (*it).has("value"))
{
std::string value = (*it)["value"].asString();
value = LLNotification::format(value, substitutions);
LLStringUtil::format(value, substitutions);
(*it)["value"] = value;
}
}
@@ -367,6 +367,33 @@ std::string LLNotificationForm::getDefaultOption()
return "";
}
LLControlVariablePtr LLNotificationForm::getIgnoreSetting()
{
return mIgnoreSetting;
}
bool LLNotificationForm::getIgnored()
{
bool show = true;
if (mIgnore != LLNotificationForm::IGNORE_NO
&& mIgnoreSetting)
{
show = mIgnoreSetting->getValue().asBoolean();
if (mInvertSetting) show = !show;
}
return !show;
}
void LLNotificationForm::setIgnored(bool ignored)
{
if (mIgnoreSetting)
{
if (mInvertSetting) ignored = !ignored;
mIgnoreSetting->setValue(!ignored);
}
}
LLNotificationTemplate::LLNotificationTemplate() :
mExpireSeconds(0),
mExpireOption(-1),
@@ -417,6 +444,7 @@ LLNotification::LLNotification(const LLSD& sd) :
LLSD LLNotification::asLLSD()
{
LLSD output;
output["id"] = mId;
output["name"] = mTemplatep->mName;
output["form"] = getForm()->asLLSD();
output["substitutions"] = mSubstitutions;
@@ -545,7 +573,7 @@ void LLNotification::respond(const LLSD& response)
if (mForm->getIgnoreType() != LLNotificationForm::IGNORE_NO)
{
LLUI::sIgnoresGroup->setWarning(getName(), !mIgnored);
mForm->setIgnored(mIgnored);
if (mIgnored && mForm->getIgnoreType() == LLNotificationForm::IGNORE_WITH_LAST_RESPONSE)
{
LLUI::sIgnoresGroup->setLLSD("Default" + getName(), response);
@@ -555,6 +583,36 @@ void LLNotification::respond(const LLSD& response)
update();
}
const std::string& LLNotification::getName() const
{
return mTemplatep->mName;
}
const std::string& LLNotification::getIcon() const
{
return mTemplatep->mIcon;
}
bool LLNotification::isPersistent() const
{
return mTemplatep->mPersist;
}
std::string LLNotification::getType() const
{
return (mTemplatep ? mTemplatep->mType : "");
}
S32 LLNotification::getURLOption() const
{
return (mTemplatep ? mTemplatep->mURLOption : -1);
}
bool LLNotification::hasUniquenessConstraints() const
{
return (mTemplatep ? mTemplatep->mUnique : false);
}
void LLNotification::setIgnored(bool ignore)
{
mIgnored = ignore;
@@ -569,21 +627,6 @@ void LLNotification::setResponseFunctor(std::string const &responseFunctorName)
mTemporaryResponder = false;
}
bool LLNotification::payloadContainsAll(const std::vector<std::string>& required_fields) const
{
for(std::vector<std::string>::const_iterator required_fields_it = required_fields.begin();
required_fields_it != required_fields.end();
required_fields_it++)
{
std::string required_field_name = *required_fields_it;
if( ! getPayload().has(required_field_name))
{
return false; // a required field was not found
}
}
return true; // all required fields were found
}
bool LLNotification::isEquivalentTo(LLNotificationPtr that) const
{
if (this->mTemplatep->mName != that->mTemplatep->mName)
@@ -592,11 +635,28 @@ bool LLNotification::isEquivalentTo(LLNotificationPtr that) const
}
if (this->mTemplatep->mUnique)
{
const LLSD& these_substitutions = this->getSubstitutions();
const LLSD& those_substitutions = that->getSubstitutions();
const LLSD& this_payload = this->getPayload();
const LLSD& that_payload = that->getPayload();
// highlander bit sez there can only be one of these
return
this->payloadContainsAll(that->mTemplatep->mUniqueContext) &&
that->payloadContainsAll(this->mTemplatep->mUniqueContext);
for (std::vector<std::string>::const_iterator it = mTemplatep->mUniqueContext.begin(), end_it = mTemplatep->mUniqueContext.end();
it != end_it;
++it)
{
// if templates differ in either substitution strings or payload with the given field name
// then they are considered inequivalent
// use of get() avoids converting the LLSD value to a map as the [] operator would
if (these_substitutions.get(*it).asString() != those_substitutions.get(*it).asString()
|| this_payload.get(*it).asString() != that_payload.get(*it).asString())
{
return false;
}
}
return true;
}
return false;
}
@@ -605,23 +665,15 @@ void LLNotification::init(const std::string& template_name, const LLSD& form_ele
mTemplatep = LLNotifications::instance().getTemplate(template_name);
if (!mTemplatep) return;
// add default substitutions
// TODO: change this to read from the translatable strings file!
if (gHippoGridManager->getConnectedGrid()->isSecondLife()) {
mSubstitutions["[SECOND_LIFE]"] = "Second Life";
const LLStringUtil::format_map_t& default_args = LLTrans::getDefaultArgs();
for (LLStringUtil::format_map_t::const_iterator iter = default_args.begin();
iter != default_args.end(); ++iter)
{
mSubstitutions[iter->first] = iter->second;
}
else {
mSubstitutions["[SECOND_LIFE]"] = gHippoGridManager->getConnectedGrid()->getGridName();
}
mSubstitutions["[VIEWER_NAME]"] = LLNotifications::instance().getGlobalString("VIEWER_NAME");
mSubstitutions["[VIEWER_SITE]"] = LLNotifications::instance().getGlobalString("VIEWER_SITE");
mSubstitutions["[GRID_NAME]"] = gHippoGridManager->getConnectedGrid()->getGridName();
mSubstitutions["[GRID_SITE]"] = gHippoGridManager->getConnectedGrid()->getWebSite();
mSubstitutions["[CURRENCY]"] = gHippoGridManager->getConnectedGrid()->getCurrencySymbol();
mSubstitutions["_URL"] = getURL();
mSubstitutions["_NAME"] = template_name;
// TODO: something like this so that a missing alert is sensible:
//mSubstitutions["_ARGS"] = get_all_arguments_as_text(mSubstitutions);
@@ -631,6 +683,8 @@ void LLNotification::init(const std::string& template_name, const LLSD& form_ele
// apply substitution to form labels
mForm->formatElements(mSubstitutions);
mIgnored = mForm->getIgnored();
LLDate rightnow = LLDate::now();
if (mTemplatep->mExpireSeconds)
{
@@ -653,63 +707,6 @@ std::string LLNotification::summarize() const
return s;
}
//static
std::string LLNotification::format(const std::string& s, const LLSD& substitutions)
{
if (!substitutions.isMap())
{
return s;
}
std::ostringstream output;
// match strings like [NAME]
const boost::regex key("\\[([0-9_A-Z]+)]");
std::string::const_iterator start = s.begin();
std::string::const_iterator end = s.end();
boost::smatch match;
while (boost::regex_search(start, end, match, key, boost::match_default))
{
bool found_replacement = false;
std::string replacement;
// see if we have a replacement for the bracketed string (without the brackets)
// test first using has() because if we just look up with operator[] we get back an
// empty string even if the value is missing. We want to distinguish between
// missing replacements and deliberately empty replacement strings.
if (substitutions.has(std::string(match[1].first, match[1].second)))
{
replacement = substitutions[std::string(match[1].first, match[1].second)].asString();
found_replacement = true;
}
// if not, see if there's one WITH brackets
else if (substitutions.has(std::string(match[0].first, match[0].second)))
{
replacement = substitutions[std::string(match[0].first, match[0].second)].asString();
found_replacement = true;
}
if (found_replacement)
{
// found a replacement
// "hello world" is output
output << std::string(start, match[0].first) << replacement;
}
else
{
// we had no replacement, so leave the string we searched for so that it gets noticed by QA
// "hello [NAME_NOT_FOUND]" is output
output << std::string(start, match[0].second);
}
// update search position
start = match[0].second;
}
// send the remainder of the string (with no further matches for bracketed names)
output << std::string(start, end);
return output.str();
}
std::string LLNotification::getMessage() const
{
@@ -718,15 +715,30 @@ std::string LLNotification::getMessage() const
// cache it in the notification
if (!mTemplatep)
return std::string();
return format(mTemplatep->mMessage, mSubstitutions);
std::string message = mTemplatep->mMessage;
LLStringUtil::format(message, mSubstitutions);
return message;
}
std::string LLNotification::getLabel() const
{
return (mTemplatep ? format(mTemplatep->mLabel, mSubstitutions) : "");
if(!mTemplatep)
return std::string();
std::string label = mTemplatep->mLabel;
LLStringUtil::format(label, mSubstitutions);
return label;
}
std::string LLNotification::getURL() const
{
if (!mTemplatep)
return std::string();
std::string url = mTemplatep->mURL;
LLStringUtil::format(url, mSubstitutions);
return (mTemplatep ? url : "");
}
// =========================================================
// LLNotificationChannel implementation

View File

@@ -217,6 +217,9 @@ public:
// appends form elements from another form serialized as LLSD
void append(const LLSD& sub_form);
std::string getDefaultOption();
LLPointer<class LLControlVariable> getIgnoreSetting();
bool getIgnored();
void setIgnored(bool ignored);
EIgnoreType getIgnoreType() { return mIgnore; }
std::string getIgnoreMessage() { return mIgnoreMsg; }
@@ -224,80 +227,15 @@ public:
private:
LLSD mFormData;
EIgnoreType mIgnore;
std::string mIgnoreMsg;
std::string mIgnoreMsg;
LLPointer<class LLControlVariable> mIgnoreSetting;
bool mInvertSetting;
};
typedef boost::shared_ptr<LLNotificationForm> LLNotificationFormPtr;
// This is the class of object read from the XML file (notifications.xml,
// from the appropriate local language directory).
struct LLNotificationTemplate
{
LLNotificationTemplate();
// the name of the notification -- the key used to identify it
// Ideally, the key should follow variable naming rules
// (no spaces or punctuation).
std::string mName;
// The type of the notification
// used to control which queue it's stored in
std::string mType;
// The text used to display the notification. Replaceable parameters
// are enclosed in square brackets like this [].
std::string mMessage;
// The label for the notification; used for
// certain classes of notification (those with a window and a window title).
// Also used when a notification pops up underneath the current one.
// Replaceable parameters can be used in the label.
std::string mLabel;
// The name of the icon image. This should include an extension.
std::string mIcon;
// This is the Highlander bit -- "There Can Be Only One"
// An outstanding notification with this bit set
// is updated by an incoming notification with the same name,
// rather than creating a new entry in the queue.
// (used for things like progress indications, or repeating warnings
// like "the grid is going down in N minutes")
bool mUnique;
// if we want to be unique only if a certain part of the payload is constant
// specify the field names for the payload. The notification will only be
// combined if all of the fields named in the context are identical in the
// new and the old notification; otherwise, the notification will be
// duplicated. This is to support suppressing duplicate offers from the same
// sender but still differentiating different offers. Example: Invitation to
// conference chat.
std::vector<std::string> mUniqueContext;
// If this notification expires automatically, this value will be
// nonzero, and indicates the number of seconds for which the notification
// will be valid (a teleport offer, for example, might be valid for
// 300 seconds).
U32 mExpireSeconds;
// if the offer expires, one of the options is chosen automatically
// based on its "value" parameter. This controls which one.
// If expireSeconds is specified, expireOption should also be specified.
U32 mExpireOption;
// if the notification contains a url, it's stored here (and replaced
// into the message where [_URL] is found)
std::string mURL;
// if there's a URL in the message, this controls which option visits
// that URL. Obsolete this and eliminate the buttons for affected
// messages when we allow clickable URLs in the UI
U32 mURLOption;
// does this notification persist across sessions? if so, it will be
// serialized to disk on first receipt and read on startup
bool mPersist;
// This is the name of the default functor, if present, to be
// used for the notification's callback. It is optional, and used only if
// the notification is constructed without an identified functor.
std::string mDefaultFunctor;
// The form data associated with a given notification (buttons, text boxes, etc)
LLNotificationFormPtr mForm;
// default priority for notifications of this type
ENotificationPriority mPriority;
// UUID of the audio file to be played when this notification arrives
// this is loaded as a name, but looked up to get the UUID upon template load.
// If null, it wasn't specified.
LLUUID mSoundEffect;
};
struct LLNotificationTemplate;
// we want to keep a map of these by name, and it's best to manage them
// with smart pointers
@@ -401,21 +339,15 @@ private:
// this is just for making it easy to look things up in a set organized by UUID -- DON'T USE IT
// for anything real!
LLNotification(LLUUID uuid) : mId(uuid) {}
LLNotification(LLUUID uuid) : mId(uuid), mCancelled(false), mRespondedTo(false), mIgnored(false), mPriority(NOTIFICATION_PRIORITY_UNSPECIFIED), mTemporaryResponder(false) {}
void cancel();
bool payloadContainsAll(const std::vector<std::string>& required_fields) const;
public:
// constructor from a saved notification
LLNotification(const LLSD& sd);
// This is a string formatter for substituting into the message directly
// from LLSD without going through the hopefully-to-be-obsoleted LLString
static std::string format(const std::string& text, const LLSD& substitutions);
void setResponseFunctor(std::string const &responseFunctorName);
typedef enum e_response_template_type
@@ -474,11 +406,12 @@ public:
return mIgnored;
}
const std::string& getName() const
{
return mTemplatep->mName;
}
const std::string& getName() const;
const std::string& getIcon() const;
bool isPersistent() const;
const LLUUID& id() const
{
return mId;
@@ -499,23 +432,11 @@ public:
return mTimestamp;
}
std::string getType() const
{
return (mTemplatep ? mTemplatep->mType : "");
}
std::string getType() const;
std::string getMessage() const;
std::string getLabel() const;
std::string getURL() const
{
return (mTemplatep ? mTemplatep->mURL : "");
}
S32 getURLOption() const
{
return (mTemplatep ? mTemplatep->mURLOption : -1);
}
std::string getURL() const;
S32 getURLOption() const;
const LLNotificationFormPtr getForm();
@@ -581,7 +502,7 @@ public:
std::string summarize() const;
bool hasUniquenessConstraints() const { return (mTemplatep ? mTemplatep->mUnique : false);}
bool hasUniquenessConstraints() const;
virtual ~LLNotification() {}
};
@@ -650,7 +571,7 @@ namespace LLNotificationComparators
struct orderBy
{
typedef boost::function<T (LLNotificationPtr)> field_t;
orderBy(field_t field, EDirection = ORDER_INCREASING) : mField(field) {}
orderBy(field_t field, EDirection direction = ORDER_INCREASING) : mField(field), mDirection(direction) {}
bool operator()(LLNotificationPtr lhs, LLNotificationPtr rhs)
{
if (mDirection == ORDER_DECREASING)

View File

@@ -0,0 +1,108 @@
/**
* @file llnotificationtemplate.h
* @brief Description of notification contents
* @author Q (with assistance from Richard and Coco)
*
* $LicenseInfo:firstyear=2008&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef LL_LLNOTIFICATION_TEMPLATE_H
#define LL_LLNOTIFICATION_TEMPLATE_H
#include "llnotifications.h"
typedef boost::shared_ptr<LLNotificationForm> LLNotificationFormPtr;
// This is the class of object read from the XML file (notifications.xml,
// from the appropriate local language directory).
struct LLNotificationTemplate
{
LLNotificationTemplate();
// the name of the notification -- the key used to identify it
// Ideally, the key should follow variable naming rules
// (no spaces or punctuation).
std::string mName;
// The type of the notification
// used to control which queue it's stored in
std::string mType;
// The text used to display the notification. Replaceable parameters
// are enclosed in square brackets like this [].
std::string mMessage;
// The label for the notification; used for
// certain classes of notification (those with a window and a window title).
// Also used when a notification pops up underneath the current one.
// Replaceable parameters can be used in the label.
std::string mLabel;
// The name of the icon image. This should include an extension.
std::string mIcon;
// This is the Highlander bit -- "There Can Be Only One"
// An outstanding notification with this bit set
// is updated by an incoming notification with the same name,
// rather than creating a new entry in the queue.
// (used for things like progress indications, or repeating warnings
// like "the grid is going down in N minutes")
bool mUnique;
// if we want to be unique only if a certain part of the payload is constant
// specify the field names for the payload. The notification will only be
// combined if all of the fields named in the context are identical in the
// new and the old notification; otherwise, the notification will be
// duplicated. This is to support suppressing duplicate offers from the same
// sender but still differentiating different offers. Example: Invitation to
// conference chat.
std::vector<std::string> mUniqueContext;
// If this notification expires automatically, this value will be
// nonzero, and indicates the number of seconds for which the notification
// will be valid (a teleport offer, for example, might be valid for
// 300 seconds).
U32 mExpireSeconds;
// if the offer expires, one of the options is chosen automatically
// based on its "value" parameter. This controls which one.
// If expireSeconds is specified, expireOption should also be specified.
U32 mExpireOption;
// if the notification contains a url, it's stored here (and replaced
// into the message where [_URL] is found)
std::string mURL;
// if there's a URL in the message, this controls which option visits
// that URL. Obsolete this and eliminate the buttons for affected
// messages when we allow clickable URLs in the UI
U32 mURLOption;
// does this notification persist across sessions? if so, it will be
// serialized to disk on first receipt and read on startup
bool mPersist;
// This is the name of the default functor, if present, to be
// used for the notification's callback. It is optional, and used only if
// the notification is constructed without an identified functor.
std::string mDefaultFunctor;
// The form data associated with a given notification (buttons, text boxes, etc)
LLNotificationFormPtr mForm;
// default priority for notifications of this type
ENotificationPriority mPriority;
// UUID of the audio file to be played when this notification arrives
// this is loaded as a name, but looked up to get the UUID upon template load.
// If null, it wasn't specified.
LLUUID mSoundEffect;
};
#endif //LL_LLNOTIFICATION_TEMPLATE_H

View File

@@ -85,8 +85,20 @@ public:
return getString(xml_desc, empty);
}
// get the default args
static const LLStringUtil::format_map_t& getDefaultArgs()
{
return sDefaultArgs;
}
static void setDefaultArg(const std::string& name, const std::string& value);
// insert default args into an arg list
static void getArgs(LLStringUtil::format_map_t& args)
{
args.insert(sDefaultArgs.begin(), sDefaultArgs.end());
}
private:
typedef std::map<std::string, LLTransTemplate > template_map_t;
static template_map_t sStringTemplates;

View File

@@ -1150,7 +1150,7 @@ static std::string get_warn_name(const std::string& name)
return warnname;
}
void LLControlGroup::addWarning(const std::string& name)
LLControlVariable *LLControlGroup::addWarning(const std::string& name)
{
// Note: may get called more than once per warning
// (e.g. if allready loaded from a settings file),
@@ -1159,6 +1159,7 @@ void LLControlGroup::addWarning(const std::string& name)
std::string comment = std::string("Enables ") + name + std::string(" warning dialog");
declareBOOL(warnname, TRUE, comment);
mWarnings.insert(warnname);
return getControl(warnname);
}
BOOL LLControlGroup::getWarning(const std::string& name)

View File

@@ -336,7 +336,7 @@ public:
// Ignorable Warnings
// Add a config variable to be reset on resetWarnings()
void addWarning(const std::string& name);
LLControlVariable *addWarning(const std::string& name);
BOOL getWarning(const std::string& name);
void setWarning(const std::string& name, BOOL val);

View File

@@ -378,6 +378,7 @@ void init_default_trans_args()
default_trans_args.insert("SECOND_LIFE_GRID");
default_trans_args.insert("SUPPORT_SITE");
default_trans_args.insert("CURRENCY");
default_trans_args.insert("GRID_OWNER");
}
//----------------------------------------------------------------------------

View File

@@ -95,7 +95,6 @@ void LLFirstUse::useBalanceIncrease(S32 delta)
LLSD args;
args["AMOUNT"] = llformat("%d",delta);
args["CURRENCY"] = gHippoGridManager->getConnectedGrid()->getCurrencySymbol();
LLNotificationsUtil::add("FirstBalanceIncrease", args);
}
}
@@ -110,7 +109,6 @@ void LLFirstUse::useBalanceDecrease(S32 delta)
LLSD args;
args["AMOUNT"] = llformat("%d",-delta);
args["CURRENCY"] = gHippoGridManager->getConnectedGrid()->getCurrencySymbol();
LLNotificationsUtil::add("FirstBalanceDecrease", args);
}
}

View File

@@ -1042,18 +1042,17 @@ void LLFloaterBuyLandUI::refreshUI()
cost_per_sqm = (F32)mParcelPrice / (F32)mParcelActualArea;
}
LLStringUtil::format_map_t info_price_args;
info_price_args["[PRICE]"] = llformat("%d", mParcelPrice);
info_price_args["[PRICE_PER_SQM]"] = llformat("%.1f", cost_per_sqm);
string_args["[PRICE]"] = llformat("%d", mParcelPrice);
string_args["[PRICE_PER_SQM]"] = llformat("%.1f", cost_per_sqm);
if (mParcelSoldWithObjects)
{
info_price_args["[SOLD_WITH_OBJECTS]"] = getString("sold_with_objects");
string_args["[SOLD_WITH_OBJECTS]"] = getString("sold_with_objects");
}
else
{
info_price_args["[SOLD_WITH_OBJECTS]"] = getString("sold_without_objects");
string_args["[SOLD_WITH_OBJECTS]"] = getString("sold_without_objects");
}
childSetText("info_price", getString("info_price_string", info_price_args));
childSetText("info_price", getString("info_price_string", string_args));
childSetVisible("info_price", mParcelIsForSale);
}
else

View File

@@ -946,7 +946,6 @@ void LLPanelLandGeneral::onClickBuyPass(void* data)
LLSD args;
args["COST"] = cost;
args["CURRENCY"] = gHippoGridManager->getConnectedGrid()->getCurrencySymbol();
args["PARCEL_NAME"] = parcel_name;
args["TIME"] = time;

View File

@@ -55,6 +55,7 @@
#include "llstatusbar.h"
#include "llviewerregion.h"
#include "lleconomy.h"
#include "lltrans.h"
#include "llgl.h"
#include "llglheaders.h"
@@ -362,7 +363,7 @@ bool LLFloaterPostcard::missingSubjMsgAlertCallback(const LLSD& notification, co
{
// Stuff the subject back into the form.
LLStringUtil::format_map_t targs;
targs["[GRID_NAME]"] = gHippoGridManager->getConnectedGrid()->getGridName();
targs["[SECOND_LIFE]"] = LLTrans::getString("SECOND_LIFE");
std::string subj = getString("default_subject");
LLStringUtil::format(subj, targs);

View File

@@ -482,7 +482,6 @@ void LLHoverView::updateText()
else if (for_sale)
{
LLStringUtil::format_map_t args;
args["[CURRENCY]"] = gHippoGridManager->getConnectedGrid()->getCurrencySymbol();
args["[AMOUNT]"] = llformat("%d", nodep->mSaleInfo.getSalePrice());
line.append(LLTrans::getString("TooltipForSaleL$", args));
suppressObjectHoverDisplay = FALSE; // Show tip
@@ -686,7 +685,6 @@ void LLHoverView::updateText()
if (hover_parcel && hover_parcel->getParcelFlag(PF_FOR_SALE))
{
LLStringUtil::format_map_t args;
args["[CURRENCY]"] = gHippoGridManager->getConnectedGrid()->getCurrencySymbol();
args["[AMOUNT]"] = llformat("%d", hover_parcel->getSalePrice());
line = LLTrans::getString("TooltipForSaleL$", args);
mText.push_back(line);

View File

@@ -44,6 +44,7 @@
#include "lliconctrl.h"
#include "lltextbox.h"
#include "lltexteditor.h"
#include "lltrans.h"
#include "lluiconstants.h"
#include "llui.h"
#include "llxmlnode.h"
@@ -581,14 +582,15 @@ void LLNotifyBox::close()
void LLNotifyBox::format(std::string& msg, const LLStringUtil::format_map_t& args)
{
// XUI:translate!
// add default substitutions
LLStringUtil::format_map_t targs = args;
targs["[SECOND_LIFE]"] = gHippoGridManager->getConnectedGrid()->getGridName();
targs["[GRID_NAME]"] = gHippoGridManager->getConnectedGrid()->getGridName();
targs["[GRID_OWNER]"] = gHippoGridManager->getConnectedGrid()->getGridOwner();
targs["[GRID_SITE]"] = gHippoGridManager->getConnectedGrid()->getWebSite();
targs["[CURRENCY]"] = gHippoGridManager->getConnectedGrid()->getCurrencySymbol();
targs["[VIEWER_NAME]"] = "Singularity Viewer";
const LLStringUtil::format_map_t& default_args = LLTrans::getDefaultArgs();
for (LLStringUtil::format_map_t::const_iterator iter = default_args.begin();
iter != default_args.end(); ++iter)
{
targs[iter->first] = iter->second;
}
LLStringUtil::format(msg, targs);
}

View File

@@ -883,7 +883,6 @@ void LLPanelClassified::callbackGotPriceForListing(S32 option, std::string text,
LLSD args;
std::string price_text = llformat("%d", MINIMUM_PRICE_FOR_LISTING);
args["MIN_PRICE"] = price_text;
args["[CURRENCY]"] = gHippoGridManager->getConnectedGrid()->getCurrencySymbol();
LLNotificationsUtil::add("MinClassifiedPrice", args);
return;

View File

@@ -372,7 +372,6 @@ void LLPanelGroupGeneral::onClickJoin(void *userdata)
S32 cost = gdatap->mMembershipFee;
LLSD args;
args["COST"] = llformat("%d", cost);
args["CURRENCY"] = gHippoGridManager->getConnectedGrid()->getCurrencySymbol();
LLSD payload;
payload["group_id"] = self->mGroupID;

View File

@@ -245,7 +245,6 @@ void LLTaskInvFVBridge::buyItem()
{
LLSD args;
args["PRICE"] = llformat("%d",sale_info.getSalePrice());
args["CURRENCY"] = gHippoGridManager->getConnectedGrid()->getCurrencySymbol();
args["OWNER"] = owner_name;
if (sale_info.getSaleType() != LLSaleInfo::FS_CONTENTS)
{

View File

@@ -40,6 +40,7 @@
#include "llviewercontrol.h"
#include "lluictrlfactory.h"
#include "llfirstuse.h"
#include "llnotificationtemplate.h"
//-----------------------------------------------------------------------------
LLPanelMsgs::LLPanelMsgs() :
@@ -71,11 +72,14 @@ BOOL LLPanelMsgs::postBuild()
return TRUE;
}
void LLPanelMsgs::buildLists()
{
LLScrollListCtrl& disabled_popups = getChildRef<LLScrollListCtrl>("disabled_popups");
LLScrollListCtrl& enabled_popups = getChildRef<LLScrollListCtrl>("enabled_popups");
void LLPanelMsgs::buildLists() //void LLFloaterPreference::buildPopupLists() in v3
{
LLScrollListCtrl& disabled_popups =
getChildRef<LLScrollListCtrl>("disabled_popups");
LLScrollListCtrl& enabled_popups =
getChildRef<LLScrollListCtrl>("enabled_popups");
disabled_popups.deleteAllItems();
enabled_popups.deleteAllItems();
@@ -90,14 +94,20 @@ void LLPanelMsgs::buildLists()
if (ignore == LLNotificationForm::IGNORE_NO)
continue;
LLSD params;
params["name"] = (*iter).first;
LLNotificationPtr notification = LLNotificationPtr(new LLNotification(params));
LLSD row;
row["columns"][0]["value"] = formp->getIgnoreMessage();
std::string ignore_msg = formp->getIgnoreMessage();
LLStringUtil::format(ignore_msg,notification->getSubstitutions());
row["columns"][0]["value"] = ignore_msg;
row["columns"][0]["font"] = "SANSSERIF_SMALL";
row["columns"][0]["width"] = 300;
LLScrollListItem* item = NULL;
bool show_popup = gSavedSettings.getWarning(templatep->mName);
bool show_popup = !formp->getIgnored();
if (!show_popup)
{
if (ignore == LLNotificationForm::IGNORE_WITH_LAST_RESPONSE)

View File

@@ -991,7 +991,13 @@ bool idle_startup()
gHippoGridManager->setCurrentGridAsConnected();
gHippoLimits->setLimits();
LLTrans::setDefaultArg("CURRENCY",gHippoGridManager->getConnectedGrid()->getCurrencySymbol()); //replace [CURRENCY] with OS$, not L$ for instance.
if(!gHippoGridManager->getConnectedGrid()->isSecondLife())
{
LLTrans::setDefaultArg("[CURRENCY]",gHippoGridManager->getConnectedGrid()->getCurrencySymbol()); //replace [CURRENCY] with OS$, not L$ for instance.
LLTrans::setDefaultArg("[SECOND_LIFE]", gHippoGridManager->getConnectedGrid()->getGridName());
LLTrans::setDefaultArg("[SECOND_LIFE_GRID]", gHippoGridManager->getConnectedGrid()->getGridName() + " Grid");
LLTrans::setDefaultArg("[GRID_OWNER]", gHippoGridManager->getConnectedGrid()->getGridOwner());
}
// create necessary directories
// *FIX: these mkdir's should error check

View File

@@ -774,7 +774,6 @@ bool join_group_response(const LLSD& notification, const LLSD& response)
delete_context_data = FALSE;
LLSD args;
args["COST"] = llformat("%d", fee);
args["CURRENCY"] = gHippoGridManager->getConnectedGrid()->getCurrencySymbol();
// Set the fee for next time to 0, so that we don't keep
// asking about a fee.
LLSD next_payload = notification["payload"];

View File

@@ -43,8 +43,8 @@
<button bottom_delta="0" follows="right|bottom" height="20" label="Send"
left_delta="-106" name="send_btn" width="100" />
<string name="default_subject">
Postcard from [GRID_NAME].
</string>
Postcard from [SECOND_LIFE].
</string>
<string name="default_message">
Check this out!
</string>

View File

@@ -1,12 +1,4 @@
<?xml version="1.0" ?><notifications>
<global name="VIEWER_NAME">
Singularity Viewer
</global>
<global name="VIEWER_SITE">
http://www.singularityviewer.org/
</global>
<global name="skipnexttime">
@@ -188,7 +180,7 @@ The media filters have been cleared
name="MissingAlert"
label="Unknown Alert Message"
type="alertmodal">
Your version of [VIEWER_NAME] does not know how to display the alert message it just received.
Your version of [APP_NAME] does not know how to display the alert message it just received.
Error details: The alert called &apos;[_NAME]&apos; was not found in notifications.xml.
<usetemplate
@@ -252,7 +244,7 @@ No tutorial is currently available.
icon="alertmodal.tga"
name="BadInstallation"
type="alertmodal">
An error occurred while updating [VIEWER_NAME]. Please download the latest version from the official download site.
An error occurred while updating [APP_NAME]. Please download the latest version from the official download site.
<usetemplate
name="okbutton"
yestext="Ok"/>
@@ -262,9 +254,9 @@ An error occurred while updating [VIEWER_NAME]. Please download the latest versi
icon="alertmodal.tga"
name="LoginFailedNoNetwork"
type="alertmodal">
Network Error: Could not establish a connection.
Could not connect to the [SECOND_LIFE_GRID].
&apos;[DIAGNOSTIC]&apos;
Please check your network connection.
Make sure your Internet connection is working properly.
<usetemplate
name="okbutton"
yestext="Ok"/>
@@ -527,7 +519,7 @@ Selecting &quot;Show in Search&quot; will show:
type="alertmodal">
You can propose to another Resident or dissolve an existing partnership through the [SECOND_LIFE] website.
Go to the [GRID_NAME] web site for more information on partnering?
Go to the [SECOND_LIFE] web site for more information on partnering?
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -610,7 +602,7 @@ Your selling price will be [CURRENCY][SALE_PRICE] and will be authorized for sal
icon="alertmodal.tga"
name="ConfirmLandSaleToAnyoneChange"
type="alertmodal">
ATTENTION: Clicking &apos;sell to anyone&apos; makes your land available to the entire [GRID_NAME] community, even those not in this region.
ATTENTION: Clicking &apos;sell to anyone&apos; makes your land available to the entire [SECOND_LIFE] community, even those not in this region.
The selected [LAND_SIZE] m² land is being set for sale.
Your selling price will be [CURRENCY][SALE_PRICE] and will be authorized for sale to [NAME].
@@ -894,9 +886,9 @@ You can not wear that item because it has not yet loaded. Please try again in a
name="MustHaveAccountToLogIn"
type="alertmodal">
Oops! Something was left blank.
You need to enter the First and Last name, or Username of your avatar.
You need to enter the Username name of your avatar.
You need an account to enter [GRID_NAME]. Would you like to create one now?
You need an account to enter [SECOND_LIFE]. Would you like to create one now?
<usetemplate
name="okcancelbuttons"
notext="Try again"
@@ -909,7 +901,7 @@ You need an account to enter [GRID_NAME]. Would you like to create one now?
type="alertmodal">
You need to enter the First and Last name, or Username of your avatar.
You need an account to enter [GRID_NAME].
You need an account to enter the [SECOND_LIFE_GRID].
</notification>
<notification
@@ -1013,29 +1005,29 @@ Would you like to disable all popups which can be skipped?
icon="notify.tga"
name="CacheWillClear"
type="notify">
Cache will be cleared after you restart [SECOND_LIFE].
Cache will be cleared after you restart [APP_NAME].
</notification>
<notification
icon="notify.tga"
name="CacheWillBeMoved"
type="notify">
Cache will be moved after you restart [SECOND_LIFE].
Note: This will clear the cache.
Cache will be moved after you restart [APP_NAME].
Note: This will clear the cache.
</notification>
<notification
icon="notify.tga"
name="ChangeConnectionPort"
type="notify">
Port settings take effect after you restart [SECOND_LIFE].
Port settings take effect after you restart [APP_NAME].
</notification>
<notification
icon="notify.tga"
name="ProxyNeedRestart"
type="notify">
Socks proxy settings will take effect after you restart [SECOND_LIFE].
Socks proxy settings will take effect after you restart [APP_NAME].
</notification>
<notification
@@ -1091,7 +1083,7 @@ Could not connect to Socks5 proxy server "[PROXY]"
icon="notify.tga"
name="ChangeSkin"
type="notfy">
The new skin will appear after you restart [SECOND_LIFE].
The new skin will appear after you restart [APP_NAME].
</notification>
<notification
@@ -1224,7 +1216,7 @@ Unable to write file [[FILE]]
icon="alertmodal.tga"
name="UnsupportedHardware"
type="alertmodal">
Warning: Your system does not meet [VIEWER_NAME] minimum system requirements. If you continue using [VIEWER_NAME], you may experience poor performance. [GRID_OWNER] cannot provide technical support for unsupported system configurations.
Warning: Your system does not meet [APP_NAME] minimum system requirements. If you continue using [APP_NAME], you may experience poor performance. [GRID_OWNER] cannot provide technical support for unsupported system configurations.
MINSPECS
Do you wish to visit [_URL] for more information?
@@ -1244,7 +1236,7 @@ Warning: Your system does not meet [VIEWER_NAME] minimum system requirements. If
name="UnknownGPU"
type="alertmodal">
Your system contains a graphics card that is unknown to us at this time.
This is often the case with new hardware we haven&apos;t had a chance to test. [VIEWER_NAME] will most likely run properly, but you may need to adjust your graphics settings to something more appropriate.
This is often the case with new hardware we haven&apos;t had a chance to test. [APP_NAME] will most likely run properly, but you may need to adjust your graphics settings to something more appropriate.
(Edit menu &gt; Preferences &gt; Graphics).
<form name="form">
<ignore name="ignore"
@@ -1256,11 +1248,11 @@ This is often the case with new hardware we haven&apos;t had a chance to test.
icon="alertmodal.tga"
name="DisplaySettingsNoShaders"
type="alertmodal">
[SECOND_LIFE] crashed while initializing graphics drivers.
Graphics Quality will be set to low to avoid some common driver errors.
This will disable some graphics features.
We recommend updating your graphics card drivers.
Graphics Quality can be raised in Preferences &gt; Graphics.
[APP_NAME] crashed while initializing graphics drivers.
Graphics Quality will be set to low to avoid some common driver errors.
This will disable some graphics features.
We recommend updating your graphics card drivers.
Graphics Quality can be raised in Preferences &gt; Graphics.
</notification>
<notification
@@ -1868,7 +1860,7 @@ Cannot find the region this land is in.
icon="alertmodal.tga"
name="CannotCloseFloaterBuyLand"
type="alertmodal">
You cannot close the Buy Land window until [GRID_NAME] estimates the price of this transaction.
You cannot close the Buy Land window until [APP_NAME] estimates the price of this transaction.
</notification>
<notification
@@ -2195,7 +2187,7 @@ and provide details about your network setup.
type="alertmodal">
You have been logged out of [SECOND_LIFE]:
[MESSAGE]
You can still look at existing IM and chat by clicking &apos;View IM &amp; Chat&apos;. Otherwise, click &apos;Quit&apos; to exit [SECOND_LIFE] immediately.
You can still look at existing IM and chat by clicking &apos;View IM &amp; Chat&apos;. Otherwise, click &apos;Quit&apos; to exit [APP_NAME] immediately.
<usetemplate
name="okcancelbuttons"
notext="Quit"
@@ -2536,7 +2528,7 @@ You have been moved into a nearby region.
name="ClothingLoading"
type="alertmodal">
Your clothing is still downloading.
You can use [SECOND_LIFE] normally and other users will see you correctly.
You can use [SECOND_LIFE] normally and other people will see you correctly.
<form name="form">
<ignore name="ignore"
text="When clothing is taking a long time to download"/>
@@ -2547,7 +2539,8 @@ You can use [SECOND_LIFE] normally and other users will see you correctly.
icon="alertmodal.tga"
name="FirstRun"
type="alertmodal">
[SECOND_LIFE] installation is complete.
[APP_NAME] installation is complete.
If this is your first time using [SECOND_LIFE], you will need to create an account before you can log on.
Return to www.secondlife.com to create a new account?
@@ -2561,7 +2554,7 @@ Return to www.secondlife.com to create a new account?
icon="alertmodal.tga"
name="LoginPacketNeverReceived"
type="alertmodal">
We&apos;re having trouble connecting. There may be a problem with your internet connection or the [GRID_NAME] servers.
We&apos;re having trouble connecting. There may be a problem with your internet connection or the [SECOND_LIFE_GRID].
You can either check your internet connection and try again in a few minutes, click Help to connect to our support site, or click Teleport to attempt to teleport home.
<form name="form">
@@ -2790,9 +2783,9 @@ Finished download of raw terrain file to:
icon="alertmodal.tga"
name="DownloadWindowsMandatory"
type="alertmodal">
A new version of [SECOND_LIFE] is available.
A new version of [APP_NAME] is available.
[MESSAGE]
You must download this update to use [SECOND_LIFE].
You must download this update to use [APP_NAME].
<usetemplate
name="okcancelbuttons"
notext="Quit"
@@ -2803,7 +2796,7 @@ You must download this update to use [SECOND_LIFE].
icon="alertmodal.tga"
name="DownloadWindows"
type="alertmodal">
An updated version of [SECOND_LIFE] is available.
An updated version of [APP_NAME] is available.
[MESSAGE]
This update is not required, but we suggest you install it to improve performance and stability.
<usetemplate
@@ -2816,7 +2809,7 @@ This update is not required, but we suggest you install it to improve performanc
icon="alertmodal.tga"
name="DownloadWindowsReleaseForDownload"
type="alertmodal">
An updated version of [SECOND_LIFE] is available.
An updated version of [APP_NAME] is available.
[MESSAGE]
This update is not required, but we suggest you install it to improve performance and stability.
<usetemplate
@@ -2829,9 +2822,9 @@ This update is not required, but we suggest you install it to improve performanc
icon="alertmodal.tga"
name="DownloadMacMandatory"
type="alertmodal">
A new version of [SECOND_LIFE] is available.
A new version of [APP_NAME] is available.
[MESSAGE]
You must download this update to use [SECOND_LIFE].
You must download this update to use [APP_NAME].
Download to your Applications folder?
<usetemplate
@@ -2844,7 +2837,7 @@ Download to your Applications folder?
icon="alertmodal.tga"
name="DownloadMac"
type="alertmodal">
An updated version of [SECOND_LIFE] is available.
An updated version of [APP_NAME] is available.
[MESSAGE]
This update is not required, but we suggest you install it to improve performance and stability.
@@ -2859,7 +2852,7 @@ Download to your Applications folder?
icon="alertmodal.tga"
name="DownloadMacReleaseForDownload"
type="alertmodal">
An updated version of [SECOND_LIFE] is available.
An updated version of [APP_NAME] is available.
[MESSAGE]
This update is not required, but we suggest you install it to improve performance and stability.
@@ -4092,7 +4085,7 @@ Access to this estate will be limited to groups listed here and any Residents ab
name="HelpEstateAbuseEmailAddress"
type="alertmodal">
Setting this to a valid email address will cause abuse reports on this estate to be sent to that address.
Setting it blank will cause abuse reports to be sent only to [GRID_NAME].
Setting it blank will cause abuse reports to be sent only to [SECOND_LIFE].
</notification>
<notification
@@ -4118,7 +4111,7 @@ Default: off
label="Voice Version Mismatch"
name="VoiceVersionMismatch"
type="alertmodal">
This version of [VIEWER_NAME] is not compatible with the Voice Chat feature in this region. Please upgrate to the latest version.
This version of [APP_NAME] is not compatible with the Voice Chat feature in this region. Please upgrate to the latest version.
</notification>
<notification
@@ -4357,7 +4350,7 @@ There are no items in this object that you are allowed to copy.
icon="alertmodal.tga"
name="WebLaunchAccountHistory"
type="alertmodal">
Go to the [GRID_NAME] web site to see your account history?
Go to the [SECOND_LIFE] web site to see your account history?
<usetemplate
ignoretext="When loading account history web page"
name="okcancelignore"
@@ -4369,9 +4362,9 @@ Go to the [GRID_NAME] web site to see your account history?
icon="alertmodal.tga"
name="ClickOpenF1Help"
type="alertmodal">
Visit the [GRID_NAME] Support Web site?
Visit the [SECOND_LIFE] Support Web site?
<usetemplate
ignoretext="When visiting the [GRID_NAME] Support Website."
ignoretext="When visiting the [SECOND_LIFE] Support Website."
name="okcancelignore"
notext="Cancel"
yestext="Go"/>
@@ -4390,7 +4383,7 @@ This grid has no link for support.
type="alertmodal">
Are you sure you want to quit?
<usetemplate
ignoretext="When Quitting [VIEWER_NAME]."
ignoretext="When Quitting [APP_NAME]."
name="okcancelignore"
notext="Continue"
yestext="Quit"/>
@@ -4421,7 +4414,7 @@ As a service to residents and visitors, the owner of the region you are in has e
The region owner will resolve reports based on the local rules of this region as outlined in the estate Covenant.
(View covenants by going to the World menu and selecting About Land.)
The resolution of this report applies only to this Region; Residents access to other areas of [GRID_NAME] will not be affected by the outcome of this report. Only [GRID_OWNER] can restrict access to the entirety of [GRID_NAME].
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
@@ -4510,15 +4503,15 @@ Entering an accurate description helps us file and process bug reports.
icon="alertmodal.tga"
name="HelpReportAbuseContainsCopyright"
type="alertmodal">
Dear Resident,
Dear Resident,
You appear to be reporting intellectual property infringement. Please make sure you are reporting it correctly:
You appear to be reporting intellectual property infringement. Please make sure you are reporting it correctly:
(1) The Abuse Process. You may submit an abuse report if you believe a Resident is exploiting the [GRID_NAME] permissions system, for example, by using CopyBot or similar copying tools, to infringe intellectual property rights. The Abuse Team investigates and issues appropriate disciplinary action for behavior that violates the [GRID_NAME] Community Standards or Terms of Service. However, the Abuse Team does not handle and will not respond to requests to remove content from the [GRID_NAME] world.
(1) The Abuse Process. You may submit an abuse report if you believe a Resident is exploiting the [SECOND_LIFE] permissions system, for example, by using CopyBot or similar copying tools, to infringe intellectual property rights. The Abuse Team investigates and issues appropriate disciplinary action for behavior that violates the [SECOND_LIFE] Community Standards or Terms of Service. However, the Abuse Team does not handle and will not respond to requests to remove content from the [SECOND_LIFE] world.
(2) The DMCA or Content Removal Process. To request removal of content from [GRID_NAME], you MUST submit a valid notification of infringement as provided in our DMCA Policy.
(2) The DMCA or Content Removal Process. To request removal of content from [SECOND_LIFE], you MUST submit a valid notification of infringement as provided in our DMCA Policy.
If you still wish to continue with the abuse process, please close this window and finish submitting your report. You may need to select the specific category &apos;CopyBot or Permissions Exploit&apos;.
If you still wish to continue with the abuse process, please close this window and finish submitting your report. You may need to select the specific category &apos;CopyBot or Permissions Exploit&apos;.
Thank you,
@@ -4766,7 +4759,7 @@ Click &quot;Advanced Water&quot; to bring up an editor with more advanced settin
icon="alertmodal.tga"
name="HelpDayCycle"
type="alertmodal">
The Day Cycle Editor gives you control over the sky during [GRID_NAME]&apos;s day/night cycle. This is the cycle that is used by the Basic Environment Editor&apos;s Time of Day slider.
The Day Cycle Editor gives you control over the sky during [SECOND_LIFE]&apos;s day/night cycle. This is the cycle that is used by the Basic Environment Editor&apos;s Time of Day slider.
The Day Cycle Editor works by setting keyframes. These are nodes (represented by the gray blips on the time graph) that have Sky Presets associated with them. As the Time of Day progresses, the WindLight sky &quot;animates&quot; as it interpolates between these keyframes.
@@ -5186,7 +5179,7 @@ Would you like to automatically wear the clothing item you create?
name="NotAgeVerified"
type="alertmodal">
You need to be age-verified in order to access this parcel.
Would you like to visit the [GRID_NAME] website to verify your age?
Would you like to visit the [SECOND_LIFE] website to verify your age?
[_URL]
<url option="0" name="url">
@@ -5205,7 +5198,7 @@ Would you like to visit the [GRID_NAME] website to verify your age?
name="Cannot enter parcel: no payment info on file"
type="alertmodal">
This parcel requires that you have payment information on file before you can access it.
Would you like to visit the [GRID_NAME] website to set this up?
Would you like to visit the [SECOND_LIFE] website to set this up?
[_URL]
<url option="0" name="url">
@@ -6311,7 +6304,7 @@ Failed to find [TYPE] named [DESC] in database.
icon="notify.tga"
name="InvalidWearable"
type="notify">
The item you are trying to wear uses a feature that your viewer can&apos;t read. Please consider using the latest [VIEWER_NAME].
The item you are trying to wear uses a feature that your viewer can&apos;t read. Please consider using the latest [APP_NAME].
</notification>
<notification
@@ -6530,7 +6523,7 @@ Flexible objects may not be physical and must be phantom until the flexible chec
name="FirstDebugMenus"
type="notify">
You have enabled the Advanced menu.
This menu contains features useful for developers debugging [VIEWER_NAME].
This menu contains features useful for developers debugging [APP_NAME].
To toggle this menu on Windows press Ctrl-Alt-D. On Mac press Cmd-Opt-Shift-D.
</notification>
@@ -6860,15 +6853,15 @@ The URL you clicked cannot be opened from this web browser.
</global>
<global name="UnsupportedGLRequirements">
You do not appear to have the proper hardware requirements for [VIEWER_NAME]. The viewer requires an OpenGL graphics card that has multitexture support. If this is the case, you may want to make sure that you have the latest drivers for your graphics card, and service packs and patches for your operating system.
You do not appear to have the proper hardware requirements for [APP_NAME]. The viewer requires an OpenGL graphics card that has multitexture support. If this is the case, you may want to make sure that you have the latest drivers for your graphics card, and service packs and patches for your operating system.
</global>
<global name="UnsupportedCPUSSE2">
You do not appear to have the proper hardware requirements for [VIEWER_NAME]. The viewer requires a CPU that supports SSE2
You do not appear to have the proper hardware requirements for [APP_NAME]. The viewer requires a CPU that supports SSE2
</global>
<global name="UnsupportedCPUSSE">
You do not appear to have the proper hardware requirements for [VIEWER_NAME]. The viewer requires a CPU that supports SSE
You do not appear to have the proper hardware requirements for [APP_NAME]. The viewer requires a CPU that supports SSE
</global>
<global name="UnsupportedCPUAmount">

View File

@@ -6,6 +6,8 @@
<strings>
<string name="CURRENCY">L$</string>
<string name="GRID_OWNER">Linden Lab</string>
<string name="hippo_label_free">free</string>
<string name="hippo_label_week">week</string>
<string name="TeleportOfferMaturity">
@@ -76,7 +78,7 @@
<string name="TooltipFlagScript">Script</string>
<string name="TooltipFlagPhysics">Physics</string>
<string name="TooltipFlagTouch">Touch</string>
<string name="TooltipFlagL$">L$</string>
<string name="TooltipFlagL$">[CURRENCY]</string>
<string name="TooltipFlagDropInventory">Drop Inventory</string>
<string name="TooltipFlagPhantom">Phantom</string>
<string name="TooltipFlagTemporary">Temporary</string>

View File

@@ -5,6 +5,7 @@
that are returned from one component and may appear in many places-->
<strings>
<string name="CURRENCY">L$</string>
<string name="GRID_OWNER">Linden Lab</string>
<string name="SECOND_LIFE">
Second Life
</string>
@@ -153,7 +154,7 @@
Toucher
</string>
<string name="TooltipFlagL$">
L$
[CURRENCY]
</string>
<string name="TooltipFlagDropInventory">
Laisser tomber l&apos;inventaire
@@ -171,7 +172,7 @@
Copie autorisée
</string>
<string name="TooltipForSaleL$">
À vendre : [AMOUNT] L$
À vendre : [AMOUNT] [CURRENCY]
</string>
<string name="TooltipForSaleMsg">
À vendre : [MESSAGE]