From e9bd6a3b0d54b960425310fd3755dd9045ca9158 Mon Sep 17 00:00:00 2001 From: Shyotl Date: Mon, 9 Jan 2012 01:40:30 -0600 Subject: [PATCH] Better translation support relating to client initialization/login. --- indra/llui/CMakeLists.txt | 4 +- indra/llui/llmenugl.cpp | 17 +- indra/{newview => llui}/lltrans.cpp | 21 +- indra/{newview => llui}/lltrans.h | 8 +- indra/llui/lluitrans.cpp | 102 ---------- indra/llui/lluitrans.h | 87 -------- indra/llwindow/llwindowcallbacks.h | 4 + indra/llwindow/llwindowwin32.cpp | 92 ++++----- indra/newview/CMakeLists.txt | 2 - indra/newview/llappviewer.cpp | 116 ++++++----- indra/newview/llappviewerwin32.cpp | 24 +-- indra/newview/llstartup.cpp | 64 +++--- indra/newview/llviewermessage.cpp | 2 +- indra/newview/llviewerwindow.cpp | 35 +++- indra/newview/llviewerwindow.h | 3 + indra/newview/llworld.cpp | 3 +- .../skins/default/xui/en-us/strings.xml | 101 +++++++++- .../newview/skins/default/xui/fr/strings.xml | 185 ++++++++++++++++++ 18 files changed, 495 insertions(+), 375 deletions(-) rename indra/{newview => llui}/lltrans.cpp (81%) rename indra/{newview => llui}/lltrans.h (89%) delete mode 100644 indra/llui/lluitrans.cpp delete mode 100644 indra/llui/lluitrans.h diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt index 8ca2aa726..dd25fff0a 100644 --- a/indra/llui/CMakeLists.txt +++ b/indra/llui/CMakeLists.txt @@ -65,12 +65,12 @@ set(llui_SOURCE_FILES lltextbox.cpp lltexteditor.cpp lltextparser.cpp + lltrans.cpp llui.cpp lluictrl.cpp lluictrlfactory.cpp lluiimage.cpp lluistring.cpp - lluitrans.cpp llundo.cpp llviewborder.cpp llview.cpp @@ -126,6 +126,7 @@ set(llui_HEADER_FILES lltextbox.h lltexteditor.h lltextparser.h + lltrans.h lluiconstants.h lluictrlfactory.h lluictrl.h @@ -133,7 +134,6 @@ set(llui_HEADER_FILES llui.h lluiimage.h lluistring.h - lluitrans.h lluixmltags.h llundo.h llviewborder.h diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 15868333c..de6d988b2 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -59,8 +59,7 @@ #include "llresmgr.h" #include "llui.h" -#include "lluitrans.h" - +#include "lltrans.h" #include "llstl.h" #include "v2math.h" @@ -271,24 +270,24 @@ void LLMenuItemGL::appendAcceleratorString( std::string& st ) const { if ( mAcceleratorMask & MASK_MAC_CONTROL ) { - st.append( LLUITrans::getString("accel-mac-control") ); + st.append( LLTrans::getString("accel-mac-control") ); } else { - st.append( LLUITrans::getString("accel-mac-command") ); // Symbol would be "\xE2\x8C\x98" + st.append( LLTrans::getString("accel-mac-command") ); // Symbol would be "\xE2\x8C\x98" } } if( mAcceleratorMask & MASK_ALT ) - st.append( LLUITrans::getString("accel-mac-option") ); // Symbol would be "\xE2\x8C\xA5" + st.append( LLTrans::getString("accel-mac-option") ); // Symbol would be "\xE2\x8C\xA5" if( mAcceleratorMask & MASK_SHIFT ) - st.append( LLUITrans::getString("accel-mac-shift") ); // Symbol would be "\xE2\x8C\xA7" + st.append( LLTrans::getString("accel-mac-shift") ); // Symbol would be "\xE2\x8C\xA7" #else if( mAcceleratorMask & MASK_CONTROL ) - st.append( LLUITrans::getString("accel-win-control") ); + st.append( LLTrans::getString("accel-win-control") ); if( mAcceleratorMask & MASK_ALT ) - st.append( LLUITrans::getString("accel-win-alt") ); + st.append( LLTrans::getString("accel-win-alt") ); if( mAcceleratorMask & MASK_SHIFT ) - st.append( LLUITrans::getString("accel-win-shift") ); + st.append( LLTrans::getString("accel-win-shift") ); #endif std::string keystr = LLKeyboard::stringFromKey( mAcceleratorKey ); diff --git a/indra/newview/lltrans.cpp b/indra/llui/lltrans.cpp similarity index 81% rename from indra/newview/lltrans.cpp rename to indra/llui/lltrans.cpp index 187782d5e..b36e185d1 100644 --- a/indra/newview/lltrans.cpp +++ b/indra/llui/lltrans.cpp @@ -31,7 +31,7 @@ */ -#include "llviewerprecompiledheaders.h" +#include "linden_common.h" #include "lltrans.h" #include "llxmlnode.h" #include "lluictrlfactory.h" @@ -41,9 +41,10 @@ #include LLTrans::template_map_t LLTrans::sStringTemplates; +LLStringUtil::format_map_t LLTrans::sDefaultArgs; //static -bool LLTrans::parseStrings(const std::string& xml_filename) +bool LLTrans::parseStrings(const std::string& xml_filename, const std::set& default_args) { LLXMLNodePtr root; BOOL success = LLUICtrlFactory::getLayeredXMLNode(xml_filename, root); @@ -54,6 +55,7 @@ bool LLTrans::parseStrings(const std::string& xml_filename) return false; } + sDefaultArgs.clear(); for (LLXMLNode* string = root->getFirstChild(); string != NULL; string = string->getNextSibling()) { @@ -72,19 +74,30 @@ bool LLTrans::parseStrings(const std::string& xml_filename) LLTransTemplate xml_template(string_name, string->getTextContents()); sStringTemplates[xml_template.mName] = xml_template; + + std::set::const_iterator iter = default_args.find(xml_template.mName); + if (iter != default_args.end()) + { + std::string name = *iter; + if (name[0] != '[') + name = llformat("[%s]",name.c_str()); + sDefaultArgs[name] = xml_template.mText; + } } return true; } //static -std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args) +std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& msg_args) { template_map_t::iterator iter = sStringTemplates.find(xml_desc); if (iter != sStringTemplates.end()) { std::string text = iter->second.mText; + LLStringUtil::format_map_t args = sDefaultArgs; + args.insert(msg_args.begin(), msg_args.end()); LLStringUtil::format(text, args); return text; @@ -96,7 +109,7 @@ std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil:: LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL; LLNotificationsUtil::add("MissingString", args); - return xml_desc; + return "MissingString("+xml_desc+")"; } } diff --git a/indra/newview/lltrans.h b/indra/llui/lltrans.h similarity index 89% rename from indra/newview/lltrans.h rename to indra/llui/lltrans.h index d735fa630..bea94d9c8 100644 --- a/indra/newview/lltrans.h +++ b/indra/llui/lltrans.h @@ -1,6 +1,6 @@ /** - * @file lltrans.h - * @brief LLTrans definition + * @file lluitrans.h + * @brief LLUITrans definition * * $LicenseInfo:firstyear=2000&license=viewergpl$ * @@ -61,9 +61,10 @@ public: /** * @brief Parses the xml file that holds the strings. Used once on startup * @param xml_filename Filename to parse + * @param default_args Set of strings (expected to be in the file) to use as default replacement args, e.g. "SECOND_LIFE" * @returns true if the file was parsed successfully, true if something went wrong */ - static bool parseStrings(const std::string& xml_filename); + static bool parseStrings(const std::string& xml_filename, const std::set& default_args); /** * @brief Returns a translated string @@ -88,6 +89,7 @@ public: private: typedef std::map template_map_t; static template_map_t sStringTemplates; + static LLStringUtil::format_map_t sDefaultArgs; }; #endif diff --git a/indra/llui/lluitrans.cpp b/indra/llui/lluitrans.cpp deleted file mode 100644 index a60ff370d..000000000 --- a/indra/llui/lluitrans.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/** - * @file lluitrans.cpp - * @brief LLUITrans implementation - * - * $LicenseInfo:firstyear=2000&license=viewergpl$ - * - * Copyright (c) 2000-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - - -#include "linden_common.h" -#include "lluitrans.h" -#include "llxmlnode.h" -#include "lluictrlfactory.h" -#include "llalertdialog.h" -#include "llnotificationsutil.h" - -#include - -LLUITrans::template_map_t LLUITrans::sStringTemplates; - -//static -bool LLUITrans::parseStrings(const std::string& xml_filename) -{ - LLXMLNodePtr root; - BOOL success = LLUICtrlFactory::getLayeredXMLNode(xml_filename, root); - - if (!success || root.isNull() || !root->hasName( "strings" )) - { - llerrs << "Problem reading strings: " << xml_filename << llendl; - return false; - } - - for (LLXMLNode* string = root->getFirstChild(); - string != NULL; string = string->getNextSibling()) - { - if (!string->hasName("string")) - { - continue; - } - - std::string string_name; - - if (! string->getAttributeString("name", string_name)) - { - llwarns << "Unable to parse string with no name" << llendl; - continue; - } - - LLUITransTemplate xml_template(string_name, string->getTextContents()); - sStringTemplates[xml_template.mName] = xml_template; - } - - return true; -} - -//static -std::string LLUITrans::getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args) -{ - template_map_t::iterator iter = sStringTemplates.find(xml_desc); - - if (iter != sStringTemplates.end()) - { - std::string text = iter->second.mText; - LLStringUtil::format(text, args); - - return text; - } - else - { - LLSD args; - args["STRING_NAME"] = xml_desc; - LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL; - LLNotificationsUtil::add("MissingString", args); - - return xml_desc; - } -} - diff --git a/indra/llui/lluitrans.h b/indra/llui/lluitrans.h deleted file mode 100644 index 32fb46828..000000000 --- a/indra/llui/lluitrans.h +++ /dev/null @@ -1,87 +0,0 @@ -/** - * @file lluitrans.h - * @brief LLUITrans definition - * - * $LicenseInfo:firstyear=2000&license=viewergpl$ - * - * Copyright (c) 2000-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#ifndef LL_UI_TRANS_H -#define LL_UI_TRANS_H - -#include - -/** - * @brief String template loaded from strings.xml - */ -class LLUITransTemplate -{ -public: - LLUITransTemplate(const std::string& name = LLStringUtil::null, const std::string& text = LLStringUtil::null) : mName(name), mText(text) {} - - std::string mName; - std::string mText; -}; - -class LLUITrans -{ -public: - LLUITrans(); - - /** - * @brief Parses the xml file that holds the strings. Used once on startup - * @param xml_filename Filename to parse - * @returns true if the file was parsed successfully, true if something went wrong - */ - static bool parseStrings(const std::string& xml_filename); - - /** - * @brief Returns a translated string - * @param xml_desc String's description - * @param args A list of substrings to replace in the string - * @returns Translated string - */ - static std::string getString(const std::string &xml_desc, const LLStringUtil::format_map_t& args); - - /** - * @brief Returns a translated string - * @param xml_desc String's description - * @returns Translated string - */ - static std::string getString(const std::string &xml_desc) - { - LLStringUtil::format_map_t empty; - return getString(xml_desc, empty); - } - - -private: - typedef std::map template_map_t; - static template_map_t sStringTemplates; -}; - -#endif diff --git a/indra/llwindow/llwindowcallbacks.h b/indra/llwindow/llwindowcallbacks.h index 5ba442ed4..6d353c479 100644 --- a/indra/llwindow/llwindowcallbacks.h +++ b/indra/llwindow/llwindowcallbacks.h @@ -84,6 +84,10 @@ public: virtual void handlePauseWatchdog(LLWindow *window); virtual void handleResumeWatchdog(LLWindow *window); + // Look up a localized string, usually for an error message + virtual std::string translateString(const char* tag); + virtual std::string translateString(const char* tag, + const std::map& args); }; diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 86eb5ece9..5263d68c1 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -496,7 +496,8 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks, if (!RegisterClass(&wc)) { - OSMessageBox("RegisterClass failed", "Error", OSMB_OK); + OSMessageBox(mCallbacks->translateString("MBRegClassFailed"), + mCallbacks->translateString("MBError"), OSMB_OK); return; } sIsClassRegistered = TRUE; @@ -608,8 +609,11 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks, mFullscreenBits = -1; mFullscreenRefresh = -1; - std::string error = llformat("Unable to run fullscreen at %d x %d.\nRunning in window.", width, height); - OSMessageBox(error, "Error", OSMB_OK); + std::map args; + args["[WIDTH]"] = llformat("%d", width); + args["[HEIGHT]"] = llformat ("%d", height); + OSMessageBox(mCallbacks->translateString("MBFullScreenErr", args), + mCallbacks->translateString("MBError"), OSMB_OK); } } @@ -752,7 +756,9 @@ void LLWindowWin32::close() // This causes WM_DESTROY to be sent *immediately* if (!DestroyWindow(mWindowHandle)) { - OSMessageBox("DestroyWindow(mWindowHandle) failed", "Shutdown Error", OSMB_OK); + OSMessageBox(mCallbacks->translateString("MBDestroyWinFailed"), + mCallbacks->translateString("MBShutdownErr"), + OSMB_OK); } mWindowHandle = NULL; @@ -1059,14 +1065,16 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO if (!(mhDC = GetDC(mWindowHandle))) { close(); - OSMessageBox("Can't make GL device context", "Error", OSMB_OK); + OSMessageBox(mCallbacks->translateString("MBDevContextErr"), + mCallbacks->translateString("MBError"), OSMB_OK); return FALSE; } if (!(pixel_format = ChoosePixelFormat(mhDC, &pfd))) { close(); - OSMessageBox("Can't find suitable pixel format", "Error", OSMB_OK); + OSMessageBox(mCallbacks->translateString("MBPixelFmtErr"), + mCallbacks->translateString("MBError"), OSMB_OK); return FALSE; } @@ -1075,57 +1083,48 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO &pfd)) { close(); - OSMessageBox("Can't get pixel format description", "Error", OSMB_OK); + OSMessageBox(mCallbacks->translateString("MBPixelFmtDescErr"), + mCallbacks->translateString("MBError"), OSMB_OK); return FALSE; } if (pfd.cColorBits < 32) { close(); - OSMessageBox( - "Second Life requires True Color (32-bit) to run in a window.\n" - "Please go to Control Panels -> Display -> Settings and\n" - "set the screen to 32-bit color.\n" - "Alternately, if you choose to run fullscreen, Second Life\n" - "will automatically adjust the screen each time it runs.", - "Error", - OSMB_OK); + OSMessageBox(mCallbacks->translateString("MBTrueColorWindow"), + mCallbacks->translateString("MBError"), OSMB_OK); return FALSE; } if (pfd.cAlphaBits < 8) { close(); - OSMessageBox( - "Second Life is unable to run because it can't get an 8 bit alpha\n" - "channel. Usually this is due to video card driver issues.\n" - "Please make sure you have the latest video card drivers installed.\n" - "Also be sure your monitor is set to True Color (32-bit) in\n" - "Control Panels -> Display -> Settings.\n" - "If you continue to receive this message, contact customer service.", - "Error", - OSMB_OK); + OSMessageBox(mCallbacks->translateString("MBAlpha"), + mCallbacks->translateString("MBError"), OSMB_OK); return FALSE; } if (!SetPixelFormat(mhDC, pixel_format, &pfd)) { close(); - OSMessageBox("Can't set pixel format", "Error", OSMB_OK); + OSMessageBox(mCallbacks->translateString("MBPixelFmtSetErr"), + mCallbacks->translateString("MBError"), OSMB_OK); return FALSE; } if (!(mhRC = wglCreateContext(mhDC))) { close(); - OSMessageBox("Can't create GL rendering context", "Error", OSMB_OK); + OSMessageBox(mCallbacks->translateString("MBGLContextErr"), + mCallbacks->translateString("MBError"), OSMB_OK); return FALSE; } if (!wglMakeCurrent(mhDC, mhRC)) { close(); - OSMessageBox("Can't activate GL rendering context", "Error", OSMB_OK); + OSMessageBox(mCallbacks->translateString("MBGLContextActErr"), + mCallbacks->translateString("MBError"), OSMB_OK); return FALSE; } @@ -1322,14 +1321,15 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO if (!(mhDC = GetDC(mWindowHandle))) { close(); - OSMessageBox("Can't make GL device context", "Error", OSMB_OK); + OSMessageBox(mCallbacks->translateString("MBDevContextErr"), mCallbacks->translateString("MBError"), OSMB_OK); return FALSE; } if (!SetPixelFormat(mhDC, pixel_format, &pfd)) { close(); - OSMessageBox("Can't set pixel format", "Error", OSMB_OK); + OSMessageBox(mCallbacks->translateString("MBPixelFmtSetErr"), + mCallbacks->translateString("MBError"), OSMB_OK); return FALSE; } @@ -1366,7 +1366,7 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO &pfd)) { close(); - OSMessageBox("Can't get pixel format description", "Error", OSMB_OK); + OSMessageBox(mCallbacks->translateString("MBPixelFmtDescErr"), mCallbacks->translateString("MBError"), OSMB_OK); return FALSE; } @@ -1379,29 +1379,14 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO if (pfd.cColorBits < 32 || GetDeviceCaps(mhDC, BITSPIXEL) < 32) { close(); - OSMessageBox( - "Second Life requires True Color (32-bit) to run in a window.\n" - "Please go to Control Panels -> Display -> Settings and\n" - "set the screen to 32-bit color.\n" - "Alternately, if you choose to run fullscreen, Second Life\n" - "will automatically adjust the screen each time it runs.", - "Error", - OSMB_OK); + OSMessageBox(mCallbacks->translateString("MBTrueColorWindow"), mCallbacks->translateString("MBError"), OSMB_OK); return FALSE; } if (pfd.cAlphaBits < 8) { close(); - OSMessageBox( - "Second Life is unable to run because it can't get an 8 bit alpha\n" - "channel. Usually this is due to video card driver issues.\n" - "Please make sure you have the latest video card drivers installed.\n" - "Also be sure your monitor is set to True Color (32-bit) in\n" - "Control Panels -> Display -> Settings.\n" - "If you continue to receive this message, contact customer service.", - "Error", - OSMB_OK); + OSMessageBox(mCallbacks->translateString("MBAlpha"), mCallbacks->translateString("MBError"), OSMB_OK); return FALSE; } @@ -1454,28 +1439,21 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO if (!mhRC && !(mhRC = wglCreateContext(mhDC))) { close(); - OSMessageBox("Can't create GL rendering context", "Error", OSMB_OK); + OSMessageBox(mCallbacks->translateString("MBGLContextErr"), mCallbacks->translateString("MBError"), OSMB_OK); return FALSE; } if (!wglMakeCurrent(mhDC, mhRC)) { close(); - OSMessageBox("Can't activate GL rendering context", "Error", OSMB_OK); + OSMessageBox(mCallbacks->translateString("MBGLContextActErr"), mCallbacks->translateString("MBError"), OSMB_OK); return FALSE; } if (!gGLManager.initGL()) { close(); - OSMessageBox( - "Second Life is unable to run because your video card drivers\n" - "did not install properly, are out of date, or are for unsupported\n" - "hardware. Please make sure you have the latest video card drivers\n" - "and even if you do have the latest, try reinstalling them.\n\n" - "If you continue to receive this message, contact customer service.", - "Error", - OSMB_OK); + OSMessageBox(mCallbacks->translateString("MBVideoDrvErr"), mCallbacks->translateString("MBError"), OSMB_OK); return FALSE; } diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 39b74df92..fc402c862 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -426,7 +426,6 @@ set(viewer_SOURCE_FILES lltoolselectrect.cpp lltoolview.cpp lltracker.cpp - lltrans.cpp lltranslate.cpp lluploaddialog.cpp lluploadfloaterobservers.cpp @@ -900,7 +899,6 @@ set(viewer_HEADER_FILES lltoolselectrect.h lltoolview.h lltracker.h - lltrans.h lltranslate.h lluiconstants.h lluploaddialog.h diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index f81728318..74622e9b1 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -130,7 +130,7 @@ #include "llviewermenu.h" #include "llselectmgr.h" #include "lltrans.h" -#include "lluitrans.h" +#include "lltrans.h" #include "lltracker.h" #include "llviewerparcelmgr.h" #include "llworldmapview.h" @@ -365,6 +365,20 @@ class LLDeferredTaskList: public LLSingleton signal_t mSignal; }; + +//---------------------------------------------------------------------------- + +// List of entries from strings.xml to always replace +static std::set default_trans_args; +void init_default_trans_args() +{ + default_trans_args.insert("SECOND_LIFE"); // World + default_trans_args.insert("APP_NAME"); + default_trans_args.insert("CAPITALIZED_APP_NAME"); + default_trans_args.insert("SECOND_LIFE_GRID"); + default_trans_args.insert("SUPPORT_SITE"); +} + //---------------------------------------------------------------------------- // File scope definitons const char *VFS_DATA_FILE_BASE = "data.db2.x."; @@ -598,7 +612,10 @@ bool LLAppViewer::init() // // OK to write stuff to logs now, we've now crash reported if necessary // - if (!initConfiguration()) + + init_default_trans_args(); + + if (!initConfiguration()) return false; LL_INFOS("InitInfo") << "Configuration initialized." << LL_ENDL ; @@ -688,12 +705,13 @@ bool LLAppViewer::init() ); LLWeb::initClass(); // do this after LLUI + LLUICtrlFactory::getInstance()->setupPaths(); // update paths with correct language set + LLTrans::parseStrings("strings.xml", default_trans_args); + LLTextEditor::setURLCallbacks(&LLWeb::loadURL, &LLURLDispatcher::dispatchFromTextEditor, &LLURLDispatcher::dispatchFromTextEditor); - LLUICtrlFactory::getInstance()->setupPaths(); // update paths with correct language set - ///////////////////////////////////////////////// // // Load settings files @@ -753,18 +771,8 @@ bool LLAppViewer::init() if (!initCache()) { std::ostringstream msg; - msg << - gSecondLife << " is unable to access a file that it needs.\n" - "\n" - "This can be because you somehow have multiple copies running, " - "or your system incorrectly thinks a file is open. " - "If this message persists, restart your computer and try again. " - "If it continues to persist, you may need to completely uninstall " << - gSecondLife << " and reinstall it."; - OSMessageBox( - msg.str(), - LLStringUtil::null, - OSMB_OK); + msg << LLTrans::getString("MBUnableToAccessFile"); + OSMessageBox(msg.str(),LLStringUtil::null,OSMB_OK); return 1; } LL_INFOS("InitInfo") << "Cache initialization is done." << LL_ENDL ; @@ -1964,6 +1972,9 @@ bool LLAppViewer::initConfiguration() return false; } + LLUICtrlFactory::getInstance()->setupPaths(); // setup paths for LLTrans based on settings files only + LLTrans::parseStrings("strings.xml", default_trans_args); + //COA vars in gSavedSettings will be linked to gSavedPerAccountSettings entries that will be created if not present. //Signals will be shared between linked vars. gSavedSettings.connectCOAVars(gSavedPerAccountSettings); @@ -2048,15 +2059,8 @@ bool LLAppViewer::initConfiguration() llinfos << "Command line usage:\n" << clp << llendl; std::ostringstream msg; - msg << "Second Life found an error parsing the command line. \n" - << "Please see: http://wiki.secondlife.com/wiki/Client_parameters \n" - << "Error: " << clp.getErrorMessage(); - - OSMessageBox( - msg.str(), - LLStringUtil::null, - OSMB_OK); - + msg << LLTrans::getString("MBCmdLineError") << clp.getErrorMessage(); + OSMessageBox(msg.str(),LLStringUtil::null,OSMB_OK); return false; } @@ -2100,7 +2104,7 @@ bool LLAppViewer::initConfiguration() if(clp.hasOption("help")) { std::ostringstream msg; - msg << "Command line usage:\n" << clp; + msg << LLTrans::getString("MBCmdLineUsg") << "\n" << clp; llinfos << msg.str() << llendl; OSMessageBox( @@ -2264,7 +2268,7 @@ bool LLAppViewer::initConfiguration() #if LL_DARWIN // Initialize apple menubar and various callbacks - init_apple_menu(gSecondLife.c_str()); + init_apple_menu(LLTrans::getString("APP_NAME").c_str()); #if __ppc__ // If the CPU doesn't have Altivec (i.e. it's not at least a G4), don't go any further. @@ -2272,7 +2276,7 @@ bool LLAppViewer::initConfiguration() if(!gSysCPU.hasAltivec()) { std::ostringstream msg; - msg << gSecondLife << " requires a processor with AltiVec (G4 or later)."; + msg << LLTrans::getString("MBRequiresAltiVec"); OSMessageBox( msg.str(), LLStringUtil::null, @@ -2286,10 +2290,11 @@ bool LLAppViewer::initConfiguration() // Display splash screen. Must be after above check for previous // crash as this dialog is always frontmost. - std::ostringstream splash_msg; - splash_msg << "Loading " << gSecondLife << "..."; + std::string splash_msg; + LLStringUtil::format_map_t args; + splash_msg = LLTrans::getString("StartupLoading", args); LLSplashScreen::show(); - LLSplashScreen::update(splash_msg.str()); + LLSplashScreen::update(splash_msg); //LLVolumeMgr::initClass(); LLVolumeMgr* volume_manager = new LLVolumeMgr(); @@ -2303,12 +2308,11 @@ bool LLAppViewer::initConfiguration() // // Set the name of the window // -#if LL_RELEASE_FOR_DOWNLOAD - gWindowTitle = gSecondLife; -#elif LL_DEBUG - gWindowTitle = gSecondLife + std::string(" [DEBUG] ") + gArgs; + gWindowTitle = LLTrans::getString("APP_NAME"); +#if LL_DEBUG + gWindowTitle += std::string(" [DEBUG] ") + gArgs; #else - gWindowTitle = gSecondLife + std::string(" ") + gArgs; + gWindowTitle += std::string(" ") + gArgs; #endif LLStringUtil::truncate(gWindowTitle, 255); @@ -2345,11 +2349,7 @@ bool LLAppViewer::initConfiguration() if (mSecondInstance) { std::ostringstream msg; - msg << - gSecondLife << " is already running.\n" - "\n" - "Check your task bar for a minimized copy of the program.\n" - "If this message persists, restart your computer.", + msg << LLTrans::getString("MBAlreadyRunning"); OSMessageBox( msg.str(), LLStringUtil::null, @@ -2418,20 +2418,17 @@ void LLAppViewer::checkForCrash(void) // Pop up a freeze or crash warning dialog // S32 choice; - if(gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING) == CRASH_BEHAVIOR_ASK) + const S32 cb = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING); + if(cb == CRASH_BEHAVIOR_ASK) { std::ostringstream msg; - msg << gSecondLife - << " appears to have frozen or crashed on the previous run.\n" - << "Would you like to send a crash report?"; - std::string alert; - alert = gSecondLife; - alert += " Alert"; + msg << LLTrans::getString("MBFrozenCrashed"); + std::string alert = LLTrans::getString("APP_NAME") + " " + LLTrans::getString("MBAlert"); choice = OSMessageBox(msg.str(), alert, OSMB_YESNO); } - else if(gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING) == CRASH_BEHAVIOR_NEVER_SEND) + else if(cb == CRASH_BEHAVIOR_NEVER_SEND) { choice = OSBTN_NO; } @@ -2512,9 +2509,6 @@ bool LLAppViewer::initWindow() LLUI::sWindow = gViewerWindow->getWindow(); - LLTrans::parseStrings("strings.xml"); - LLUITrans::parseStrings("ui_strings.xml"); - // Show watch cursor gViewerWindow->setCursor(UI_CURSOR_WAIT); @@ -2637,7 +2631,7 @@ void LLAppViewer::writeSystemInfo() gDebugInfo["CrashNotHandled"] = (LLSD::Boolean)true; // Dump some debugging info - LL_INFOS("SystemInfo") << gSecondLife + LL_INFOS("SystemInfo") << LLTrans::getString("APP_NAME") << " version " << LL_VERSION_MAJOR << "." << LL_VERSION_MINOR << "." << LL_VERSION_PATCH << LL_ENDL; @@ -3237,14 +3231,14 @@ bool LLAppViewer::initCache() if (mPurgeCache && !read_only) { - LLSplashScreen::update("Clearing cache..."); + LLSplashScreen::update(LLTrans::getString("StartupClearingCache")); purgeCache(); // texture_cache_mismatch = false; // } - LLSplashScreen::update("Initializing Texture Cache..."); + LLSplashScreen::update(LLTrans::getString("StartupInitializingTextureCache")); // Init the texture cache // Allocate 80% of the cache size for textures @@ -3272,7 +3266,7 @@ bool LLAppViewer::initCache() LLVOCache::getInstance()->initCache(LL_PATH_CACHE, gSavedSettings.getU32("CacheNumberOfRegionsForObjects"), getObjectCacheVersion()) ; - LLSplashScreen::update("Initializing VFS..."); + LLSplashScreen::update(LLTrans::getString("StartupInitializingVFS")); // Init the VFS vfs_size = llmin(vfs_size + extra, MAX_VFS_SIZE); @@ -3433,7 +3427,7 @@ void LLAppViewer::addOnIdleCallback(const boost::function& cb) void LLAppViewer::purgeCache() { - LL_INFOS("AppCache") << "Purging Cache and Texture Cache..." << llendl; + LL_INFOS("AppCache") << "Purging Cache and Texture Cache..." << LL_ENDL; LLAppViewer::getTextureCache()->purgeCache(LL_PATH_CACHE); LLVOCache::getInstance()->removeCache(LL_PATH_CACHE); std::string mask = "*.*"; @@ -4076,7 +4070,7 @@ void LLAppViewer::idleShutdown() S32 finished_uploads = total_uploads - pending_uploads; F32 percent = 100.f * finished_uploads / total_uploads; gViewerWindow->setProgressPercent(percent); - gViewerWindow->setProgressString("Saving final data..."); + gViewerWindow->setProgressString(LLTrans::getString("SavingSettings")); return; } @@ -4088,7 +4082,7 @@ void LLAppViewer::idleShutdown() // Wait for a LogoutReply message gViewerWindow->setShowProgress(!gSavedSettings.getBOOL("AscentDisableLogoutScreens")); gViewerWindow->setProgressPercent(100.f); - gViewerWindow->setProgressString("Logging out..."); + gViewerWindow->setProgressString(LLTrans::getString("LoggingOut")); return; } @@ -4300,8 +4294,8 @@ void LLAppViewer::idleNetwork() { LLUUID this_region_id = agent_region->getRegionID(); bool this_region_alive = agent_region->isAlive(); - if (mAgentRegionLastAlive && !this_region_alive // newly dead - && mAgentRegionLastID == this_region_id) // same region + if ((mAgentRegionLastAlive && !this_region_alive) // newly dead + && (mAgentRegionLastID == this_region_id)) // same region { forceDisconnect(LLTrans::getString("AgentLostConnection")); } diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 133e97aea..79da09dfc 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -64,6 +64,7 @@ #include "llfindlocale.h" #include "llcommandlineparser.h" +#include "lltrans.h" // *FIX:Mani - This hack is to fix a linker issue with libndofdev.lib // The lib was compiled under VS2005 - in VS2003 we need to remap assert @@ -469,7 +470,7 @@ bool LLAppViewerWin32::initHardwareTest() // but vram. vram_only = TRUE; - LLSplashScreen::update("Detecting hardware..."); + LLSplashScreen::update(LLTrans::getString("StartupDetectingHardware")); LL_DEBUGS("AppInit") << "Attempting to poll DirectX for hardware info" << LL_ENDL; gDXHardware.setWriteDebugFunc(write_debug_dx); @@ -483,19 +484,10 @@ bool LLAppViewerWin32::initHardwareTest() // Warn them that runnin without DirectX 9 will // not allow us to tell them about driver issues std::ostringstream msg; - msg << - LLAppViewer::instance()->getSecondLifeTitle() << " is unable to detect DirectX 9.0b or greater.\n" - "\n" << - LLAppViewer::instance()->getSecondLifeTitle() << " uses DirectX to detect hardware and/or\n" - "outdated drivers that can cause stability problems,\n" - "poor performance and crashes. While you can run\n" << - LLAppViewer::instance()->getSecondLifeTitle() << " without it, we highly recommend running\n" - "with DirectX 9.0b\n" - "\n" - "Do you wish to continue?\n"; + msg << LLTrans::getString ("MBNoDirectX"); S32 button = OSMessageBox( msg.str(), - "Warning", + LLTrans::getString("MBWarning"), OSMB_YESNO); if (OSBTN_NO== button) { @@ -511,10 +503,12 @@ bool LLAppViewerWin32::initHardwareTest() gSavedSettings.setBOOL("ProbeHardwareOnStartup", FALSE); // Disable so debugger can work - std::ostringstream splash_msg; - splash_msg << "Loading " << LLAppViewer::instance()->getSecondLifeTitle() << "..."; + std::string splash_msg; + LLStringUtil::format_map_t args; + args["[APP_NAME]"] = LLAppViewer::instance()->getSecondLifeTitle(); + splash_msg = LLTrans::getString("StartupLoading", args); - LLSplashScreen::update(splash_msg.str()); + LLSplashScreen::update(splash_msg); } if (!restoreErrorTrap()) diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 191b8c918..5d550181e 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -263,6 +263,9 @@ static bool gUseCircuitCallbackCalled = false; EStartupState LLStartUp::gStartupState = STATE_FIRST; +static U64 gFirstSimHandle = 0; +static LLHost gFirstSim; +static std::string gFirstSimSeedCap; // // local function declaration // @@ -374,9 +377,6 @@ bool idle_startup() static std::string password; static std::vector requested_options; - static U64 first_sim_handle = 0; - static LLHost first_sim; - static std::string first_sim_seed_cap; static U32 first_sim_size_x = 256; static U32 first_sim_size_y = 256; @@ -823,7 +823,6 @@ bool idle_startup() set_startup_status(0.03f, msg.c_str(), gAgent.mMOTD.c_str()); display_startup(); // LLViewerMedia::initBrowser(); - LLStartUp::setStartupState( STATE_LOGIN_SHOW ); return FALSE; } @@ -1135,7 +1134,7 @@ bool idle_startup() // Display the startup progress bar. gViewerWindow->setShowProgress(!gSavedSettings.getBOOL("AscentDisableLogoutScreens")); - gViewerWindow->setProgressCancelButtonVisible(TRUE, std::string("Quit")); // *TODO: Translate + gViewerWindow->setProgressCancelButtonVisible(TRUE, LLTrans::getString("Quit")); // Poke the VFS, which could potentially block for a while if // Windows XP is acting up @@ -1220,9 +1219,7 @@ bool idle_startup() } auth_method = "login_to_simulator"; - LLStringUtil::format_map_t args; - args["[APP_NAME]"] = LLAppViewer::instance()->getSecondLifeTitle(); - auth_desc = LLTrans::getString("LoginInProgress", args); + auth_desc = LLTrans::getString("LoginInProgress"); LLStartUp::setStartupState( STATE_XMLRPC_LEGACY_LOGIN ); // XMLRPC } @@ -1365,7 +1362,7 @@ bool idle_startup() LL_DEBUGS("AppInit") << "STATE_LOGIN_NO_DATA_YET" << LL_ENDL; // If we get here we have gotten past the potential stall // in curl, so take "may appear frozen" out of progress bar. JC - auth_desc = "Logging in..."; + auth_desc = LLTrans::getString("LoginInProgressNoFrozen"); set_startup_status(progress, auth_desc, auth_message); // Process messages to keep from dropping circuit. LLMessageSystem* msg = gMessageSystem; @@ -1431,7 +1428,7 @@ bool idle_startup() } else { - emsg << "Login failed.\n"; + emsg << LLTrans::getString("LoginFailed") + "\n"; reason_response = LLUserAuth::getInstance()->getResponse("reason"); message_response = LLUserAuth::getInstance()->getResponse("message"); @@ -1571,7 +1568,7 @@ bool idle_startup() text = LLUserAuth::getInstance()->getResponse("secure_session_id"); if(!text.empty()) gAgent.mSecureSessionID.set(text); - text = LLUserAuth::getInstance()->getResponse("firsst_name"); + text = LLUserAuth::getInstance()->getResponse("first_name"); if(!text.empty()) { // Remove quotes from string. Login.cgi sends these to force @@ -1663,10 +1660,10 @@ bool idle_startup() if(!sim_ip_str.empty() && !sim_port_str.empty()) { U32 sim_port = strtoul(sim_port_str.c_str(), NULL, 10); - first_sim.set(sim_ip_str, sim_port); - if (first_sim.isOk()) + gFirstSim.set(sim_ip_str, sim_port); + if (gFirstSim.isOk()) { - gMessageSystem->enableCircuit(first_sim, TRUE); + gMessageSystem->enableCircuit(gFirstSim, TRUE); } } std::string region_x_str = LLUserAuth::getInstance()->getResponse("region_x"); @@ -1675,7 +1672,7 @@ bool idle_startup() { U32 region_x = strtoul(region_x_str.c_str(), NULL, 10); U32 region_y = strtoul(region_y_str.c_str(), NULL, 10); - first_sim_handle = to_region_handle(region_x, region_y); + gFirstSimHandle = to_region_handle(region_x, region_y); } text = LLUserAuth::getInstance()->getResponse("region_size_x"); @@ -1698,7 +1695,7 @@ bool idle_startup() } text = LLUserAuth::getInstance()->getResponse("seed_capability"); - if (!text.empty()) first_sim_seed_cap = text; + if (!text.empty()) gFirstSimSeedCap = text; text = LLUserAuth::getInstance()->getResponse("seconds_since_epoch"); if(!text.empty()) @@ -1874,7 +1871,7 @@ bool idle_startup() if(gAgentID.notNull() && gAgentSessionID.notNull() && gMessageSystem->mOurCircuitCode - && first_sim.isOk()) + && gFirstSim.isOk()) // OGPX : Inventory root might be null in OGP. // && gAgent.mInventoryRootID.notNull()) { @@ -1970,14 +1967,14 @@ bool idle_startup() // This is necessary because creating objects before this is set will result in a // bad mPositionAgent cache. - gAgent.initOriginGlobal(from_region_handle(first_sim_handle)); + gAgent.initOriginGlobal(from_region_handle(gFirstSimHandle)); - LLWorld::getInstance()->addRegion(first_sim_handle, first_sim, first_sim_size_x, first_sim_size_y); + LLWorld::getInstance()->addRegion(gFirstSimHandle, gFirstSim, first_sim_size_x, first_sim_size_y); - LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(first_sim_handle); + LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(gFirstSimHandle); LL_INFOS("AppInit") << "Adding initial simulator " << regionp->getOriginGlobal() << LL_ENDL; - regionp->setSeedCapability(first_sim_seed_cap); + regionp->setSeedCapability(gFirstSimSeedCap); LL_DEBUGS("AppInit") << "Waiting for seed grant ...." << LL_ENDL; // Set agent's initial region to be the one we just created. @@ -2019,6 +2016,25 @@ bool idle_startup() //--------------------------------------------------------------------- if(STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState()) { + /*LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle(gFirstSimHandle); + if (regionp->capabilitiesReceived()) + { + LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED ); + } + else + { + U32 num_retries = regionp->getNumSeedCapRetries(); + if (num_retries > 0) + { + LLStringUtil::format_map_t args; + args["[NUMBER]"] = llformat("%d", num_retries + 1); + set_startup_status(0.4f, LLTrans::getString("LoginRetrySeedCapGrant", args), gAgent.mMOTD); + } + else + { + set_startup_status(0.4f, LLTrans::getString("LoginRequestSeedCapGrant"), gAgent.mMOTD); + } + }*/ return FALSE; } @@ -2215,16 +2231,16 @@ bool idle_startup() gUseCircuitCallbackCalled = FALSE; - msg->enableCircuit(first_sim, TRUE); + msg->enableCircuit(gFirstSim, TRUE); // now, use the circuit info to tell simulator about us! - LL_INFOS("AppInit") << "viewer: UserLoginLocationReply() Enabling " << first_sim << " with code " << msg->mOurCircuitCode << LL_ENDL; + LL_INFOS("AppInit") << "viewer: UserLoginLocationReply() Enabling " << gFirstSim << " with code " << msg->mOurCircuitCode << LL_ENDL; msg->newMessageFast(_PREHASH_UseCircuitCode); msg->nextBlockFast(_PREHASH_CircuitCode); msg->addU32Fast(_PREHASH_Code, msg->mOurCircuitCode); msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); msg->addUUIDFast(_PREHASH_ID, gAgent.getID()); msg->sendReliable( - first_sim, + gFirstSim, MAX_TIMEOUT_COUNT, FALSE, TIMEOUT_SECONDS, diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 8db1665d1..0610f07a2 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -3922,7 +3922,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**) << x << ":" << y << " current pos " << gAgent.getPositionGlobal() << LL_ENDL; - LLAppViewer::instance()->forceDisconnect("You were sent to an invalid region."); + LLAppViewer::instance()->forceDisconnect(LLTrans::getString("SentToInvalidRegion")); return; } diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index ea1f6f91d..582107ddb 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -65,6 +65,7 @@ #include "llrect.h" #include "llsky.h" #include "llstring.h" +#include "lltrans.h" #include "llui.h" #include "lluuid.h" #include "llview.h" @@ -1228,7 +1229,7 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated) { // if we're in world, show a progress bar to hide reloading of textures llinfos << "Restoring GL during activate" << llendl; - restoreGL("Restoring..."); + restoreGL(LLTrans::getString("ProgressRestoring")); } else { @@ -1403,6 +1404,27 @@ void LLViewerWindow::handlePauseWatchdog(LLWindow *window) LLAppViewer::instance()->pauseMainloopTimeout(); } +//virtual +std::string LLViewerWindow::translateString(const char* tag) +{ + return LLTrans::getString( std::string(tag) ); +} + +//virtual +std::string LLViewerWindow::translateString(const char* tag, + const std::map& args) +{ + // LLTrans uses a special subclass of std::string for format maps, + // but we must use std::map<> in these callbacks, otherwise we create + // a dependency between LLWindow and LLFormatMapString. So copy the data. + LLStringUtil::format_map_t args_copy; + std::map::const_iterator it = args.begin(); + for ( ; it != args.end(); ++it) + { + args_copy[it->first] = it->second; + } + return LLTrans::getString( std::string(tag), args_copy); +} // // Classes @@ -1466,12 +1488,13 @@ LLViewerWindow::LLViewerWindow( if (NULL == mWindow) { - LLSplashScreen::update("Graphics Initialization Failed. Please Update Your Graphics Driver!"); + LLSplashScreen::update(LLTrans::getString("StartupRequireDriverUpdate")); LL_WARNS("Window") << "Failed to create window, to be shutting Down, be sure your graphics driver is updated." << llendl ; ms_sleep(5000) ; //wait for 5 seconds. - LLSplashScreen::update("Shutting down..."); + + LLSplashScreen::update(LLTrans::getString("ShuttingDown")); #if LL_LINUX || LL_SOLARIS llwarns << "Unable to create window, be sure screen is set at 32-bit color and your graphics driver is configured correctly. See README-linux.txt or README-solaris.txt for further information." << llendl; @@ -4577,7 +4600,7 @@ void LLViewerWindow::drawMouselookInstructions() } // Draw instructions for mouselook ("Press ESC to leave Mouselook" in a box at the top of the screen.) - const std::string instructions = "Press ESC to leave Mouselook."; + const std::string instructions = LLTrans::getString("LeaveMouselook"); const LLFontGL* font = LLResMgr::getInstance()->getRes( LLFONT_SANSSERIF ); const S32 INSTRUCTIONS_PAD = 5; @@ -4983,7 +5006,7 @@ void LLViewerWindow::restartDisplay(BOOL show_progress_bar) stopGL(); if (show_progress_bar) { - restoreGL("Changing Resolution..."); + restoreGL(LLTrans::getString("ProgressChangingResolution")); } else { @@ -5070,7 +5093,7 @@ BOOL LLViewerWindow::changeDisplaySettings(BOOL fullscreen, LLCoordScreen size, llinfos << "Restoring GL during resolution change" << llendl; if (show_progress_bar) { - restoreGL("Changing Resolution..."); + restoreGL(LLTrans::getString("ProgressChangingResolution")); } else { diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index 1be59a452..6e8bf7e56 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -183,6 +183,9 @@ public: /*virtual*/ void handlePingWatchdog(LLWindow *window, const char * msg); /*virtual*/ void handlePauseWatchdog(LLWindow *window); /*virtual*/ void handleResumeWatchdog(LLWindow *window); + /*virtual*/ std::string translateString(const char* tag); + /*virtual*/ std::string translateString(const char* tag, + const std::map& args); // diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 85751370c..1ff20dbb1 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -45,6 +45,7 @@ #include "llhttpnode.h" #include "llregionhandle.h" #include "llsurface.h" +#include "lltrans.h" #include "llviewercamera.h" #include "llviewertexture.h" #include "llviewertexturelist.h" @@ -278,7 +279,7 @@ void LLWorld::removeRegion(const LLHost &host) llwarns << "gFrameTimeSeconds " << gFrameTimeSeconds << llendl; llwarns << "Disabling region " << regionp->getName() << " that agent is in!" << llendl; - LLAppViewer::instance()->forceDisconnect("You have been disconnected from the region you were in."); + LLAppViewer::instance()->forceDisconnect(LLTrans::getString("YouHaveBeenDisconnected")); regionp->saveObjectCache() ; //force to save objects here in case that the object cache is about to be destroyed. return; diff --git a/indra/newview/skins/default/xui/en-us/strings.xml b/indra/newview/skins/default/xui/en-us/strings.xml index 7cae0290f..c9b7a8d09 100644 --- a/indra/newview/skins/default/xui/en-us/strings.xml +++ b/indra/newview/skins/default/xui/en-us/strings.xml @@ -14,8 +14,27 @@ [NAME]'s teleport lure is to [DESTINATION] + + Second Life + Singularity Viewer + SINGULARITY VIEWER + Second Life Grid + Second Life Support Portal + + + Detecting hardware... + Loading [APP_NAME]... + Clearing cache... + Initializing Texture Cache... + Initializing VFS... + Graphics Initialization Failed. Please Update Your Graphics Driver! + + + Restoring... + Changing Resolution... Logging in. [APP_NAME] may appear frozen. Please wait. + Logging in... Authenticating Performing account maintenance... Previous login attempt failed. Logging in, attempt [NUMBER] @@ -30,14 +49,22 @@ Initializing QuickTime... QuickTime not found - unable to initialize. QuickTime initialized successfully. + Requesting region capabilities... + Requesting region capabilities, attempt [NUMBER]... Waiting for region handshake... Connecting to region... Downloading clothing... + Login failed. + Quit This region may be experiencing trouble. Please check your connection to the Internet. - + Saving your settings... + Logging out... + Shutting down... + You have been disconnected from the region you were in. + You were sent to an invalid region. Person @@ -1781,6 +1808,78 @@ Returns a key that is the UUID of the user seated on the prim. --> + + + Press ESC to return to World View + + Ctrl- + Cmd- + Opt- + Shift- + Ctrl- + Alt- + Shift- + + + An error was found parsing the command line. +Please see: http://wiki.secondlife.com/wiki/Client_parameters +Error: + + [APP_NAME] Command line usage: + + [APP_NAME] is unable to access a file that it needs. + +This can be because you somehow have multiple copies running, or your system incorrectly thinks a file is open. +If this message persists, restart your computer and try again. +If it continues to persist, you may need to completely uninstall [APP_NAME] and reinstall it. + + [APP_NAME] requires a processor with AltiVec (G4 or later). + + [APP_NAME] is already running. +Check your task bar for a minimized copy of the program. +If this message persists, restart your computer. + + + [APP_NAME] appears to have frozen or crashed on the previous run. +Would you like to send a crash report? + + Notification + + [APP_NAME] is unable to detect DirectX 9.0b or greater. +[APP_NAME] uses DirectX to detect hardware and/or outdated drivers that can cause stability problems, poor performance and crashes. While you can run [APP_NAME] without it, we highly recommend running with DirectX 9.0b. + +Do you wish to continue? + + Warning + RegisterClass failed + Error + + Unable to run fullscreen at [WIDTH] x [HEIGHT]. +Running in window. + + Shutdown Error while destroying window (DestroyWindow() failed) + Shutdown Error + Can't make GL device context + Can't find suitable pixel format + Can't get pixel format description + + [APP_NAME] requires True Color (32-bit) to run. +Please go to your computer's display settings and set the color mode to 32-bit. + + + [APP_NAME] is unable to run because it can't get an 8 bit alpha channel. Usually this is due to video card driver issues. +Please make sure you have the latest video card drivers installed. +Also be sure your monitor is set to True Color (32-bit) in Control Panels > Display > Settings. +If you continue to receive this message, contact the [SUPPORT_SITE]. + + Can't set pixel format + Can't create GL rendering context + Can't activate GL rendering context + + [APP_NAME] is unable to run because your video card drivers did not install properly, are out of date, or are for unsupported hardware. Please make sure you have the latest video card drivers and even if you do have the latest, try reinstalling them. + +If you continue to receive this message, contact the [SUPPORT_SITE]. + osSetRegionWaterHeight(float height) diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 30183a0ca..bdde1edd9 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -4,9 +4,51 @@ For example, the strings used in avatar chat bubbles, and strings that are returned from one component and may appear in many places--> + + Second Life + + + Singularity Viewer + + + SINGULARITY VIEWER + + + Grille de Second Life + + + Portail Assistance Second Life + + + Détection du matériel... + + + Chargement de [APP_NAME]... + + + Vidage du cache... + + + Initialisation du cache des textures... + + + Initialisation VFS... + + + Échec d'initialisation des graphiques. Veuillez mettre votre pilote graphique à jour. + + + Restauration... + + + Changement de la résolution... + La connexion à [APP_NAME] apparaît peut-être comme étant gelée. Veuillez patienter. + + Connexion... + Authentification en cours @@ -46,6 +88,12 @@ Initialisation de Quicktime réussie. + + Capacités de la région demandées... + + + Capacités de la région demandées... Tentative n° [NUMBER]. + Liaison avec la région en cours de création... @@ -55,9 +103,30 @@ Habits en cours de téléchargement, esperons le ... + + Échec de la connexion. + + + Quitter + Il y a peut-être des problèmes techniques dans cette region. Veuillez vérifier votre connexion Internet. + + Enregistrement des paramètres... + + + Déconnexion... + + + Arrêt en cours... + + + Vous avez été déconnecté de la région où vous étiez. + + + Vous avez été transféré vers une région non valide. + Personne @@ -488,3 +557,119 @@ Choisir le répertoire + + Appuyez sur ESC pour quitter la vue subjective + + + + Ctrl- + + + Cmd- + + + Opt- + + + Maj- + + + Ctrl- + + + Alt- + + + Maj- + + + Une erreur est survenue lors de la lecture de la ligne de commande. +Merci de consulter : http://wiki.secondlife.com/wiki/Client_parameters +Erreur : + + + [APP_NAME] - Utilisation de la ligne de commande : + + + [APP_NAME] ne peut accéder à un fichier requis. + +Cela vient du fait que quelqu'un a ouvert plusieurs copies ou que votre système pense qu'un fichier est ouvert. +Si ce message persiste, veuillez redémarrer votre ordinateur. +Si le problème persiste, vous devrez peut-être complètement désinstaller puis réinstaller [APP_NAME]. + + + Erreur fatale + + + [APP_NAME] nécessite un microprocesseur AltiVec (version G4 ou antérieure). + + + [APP_NAME] est déjà en cours d'exécution. +Vérifiez si une version minimisée du programme apparaît dans votre barre de tâches. +Si ce message persiste, redémarrez votre ordinateur. + + + [APP_NAME] semble avoir crashé lors de l'utilisation précédente. +Voulez-vous envoyer un rapport de crash ? + + + Notification + + + [APP_NAME] ne peut détecter DirectX 9.0b ou une version supérieure. +[APP_NAME] utilise DirectX pour détecter les matériels et/ou les pilotes qui ne sont pas à jour et peuvent causer des problèmes de stabilité, de performance ou des plantages. Bien que vous puissiez utiliser [APP_NAME] sans DirectX, nous vous recommandons de l'utiliser avec DirectX 9.0b. + +Voulez-vous continuer ? + + + Avertissement + + + RegisterClass a échoué + + + Erreur + + + Impossible d'ouvrir le mode plein écran à [WIDTH] x [HEIGHT]. +Utilisation du mode fenêtré. + + + Erreur de fermeture lors de la destruction de la fenêtre (DestroyWindow() a échoué) + + + Erreur de fermeture + + + Impossible de créer le contexte GL + + + Impossible de trouver le format pixel approprié + + + Impossible de trouver la description du format pixel + + + [APP_NAME] nécessite True Color (32 bits) pour s'exécuter. +Accédez aux paramètres d'affichage de votre ordinateur et réglez le mode couleur sur 32 bits. + + + [APP_NAME] ne peut pas s'exécuter, car il n'y pas de canal alpha 8 bits accessible. En général, ceci vient de problèmes avec le pilote de la carte vidéo. +Assurez-vous d'avoir installé le pilote de carte vidéo le plus récent possible. +Assurez-vous aussi que votre écran est réglé sur True Color (32 bits) sous Panneau de configuration > Affichage > Paramètres. +Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. + + + Impossible de trouver le format pixel approprié + + + Impossible de créer le contexte de rendu GL + + + Impossible d'activer le contexte de rendu GL + + + [APP_NAME] ne peut pas s'exécuter car les pilotes de votre carte vidéo n'ont pas été installés correctement, ne sont pas à jour, ou sont pour du matériel non pris en charge. Assurez-vous d'avoir des pilotes de cartes vidéos récents, et même si vous avez les plus récents, réinstallez-les. + +Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. +