Merged in Glorf/ryzomcore/fix_speed (pull request #141)

Displayed speed is now actual speed, fix #295
This commit is contained in:
C?dric OCHS 2016-10-21 06:15:56 +00:00
commit f1840fc189
85 changed files with 1460 additions and 976 deletions

View file

@ -304,7 +304,7 @@ IF(WITH_QT5)
ADD_QT_LIBRARY(XcbQpa)
ADD_QT_LIBRARY(PlatformSupport)
SET(QT_LIBRARIES ${QT_LIBRARIES} -lX11-xcb -lXi -lSM -lICE -lxcb -lGL)
SET(QT_LIBRARIES ${QT_LIBRARIES} -lX11-xcb -lXi -lSM -lICE -lxcb -lGL -lxcb-glx)
IF(EXISTS "${QT_LIBRARY_DIR}/libxcb-static.a")
SET(QT_LIBRARIES ${QT_LIBRARIES} "${QT_LIBRARY_DIR}/libxcb-static.a")
ENDIF()

View file

@ -40,7 +40,8 @@ MACRO(NL_CONFIGURE_CHECKS)
SET(NL_VERSION "${NL_VERSION_MAJOR}.${NL_VERSION_MINOR}.${NL_VERSION_PATCH}.${REVISION}")
SET(NL_VERSION_RC "${NL_VERSION_MAJOR},${NL_VERSION_MINOR},${NL_VERSION_PATCH},${REVISION}")
SET(RYZOM_VERSION "${RYZOM_VERSION_MAJOR}.${RYZOM_VERSION_MINOR}.${RYZOM_VERSION_PATCH}.${REVISION}")
SET(RYZOM_VERSION_SHORT "${RYZOM_VERSION_MAJOR}.${RYZOM_VERSION_MINOR}.${RYZOM_VERSION_PATCH}")
SET(RYZOM_VERSION "${RYZOM_VERSION_SHORT}.${REVISION}")
SET(RYZOM_VERSION_RC "${RYZOM_VERSION_MAJOR},${RYZOM_VERSION_MINOR},${RYZOM_VERSION_PATCH},${REVISION}")
NOW(BUILD_DATE)

View file

@ -334,6 +334,7 @@ MACRO(NL_SETUP_RYZOM_DEFAULT_OPTIONS)
OPTION(WITH_RYZOM_PATCH "Enable Ryzom in-game patch support" OFF)
OPTION(WITH_RYZOM_CUSTOM_PATCH_SERVER "Only use patch server from CFG file" OFF)
OPTION(WITH_RYZOM_STEAM "Enable Steam features" OFF)
OPTION(WITH_RYZOM_SANDBOX "Enable Sandbox under OS X" OFF)
ENDMACRO(NL_SETUP_RYZOM_DEFAULT_OPTIONS)
MACRO(NL_SETUP_SNOWBALLS_DEFAULT_OPTIONS)

View file

@ -196,18 +196,6 @@ CDriverGL::CDriverGL()
_backBufferHeight = 0;
_backBufferWidth = 0;
// autorelease pool for memory management
_autoreleasePool = [[NSAutoreleasePool alloc] init];
// init the application object
[NSApplication sharedApplication];
// create the menu in the top screen bar
setupApplicationMenu();
// finish the application launching
[NSApp finishLaunching];
#elif defined (NL_OS_UNIX)
_dpy = 0;
@ -373,10 +361,6 @@ CDriverGL::~CDriverGL()
{
H_AUTO_OGL(CDriverGL_CDriverGLDtor)
release();
#if defined(NL_OS_MAC)
[_autoreleasePool release];
#endif
}
// --------------------------------------------------
@ -942,13 +926,6 @@ bool CDriverGL::swapBuffers()
#elif defined(NL_OS_MAC)
// TODO: maybe do this somewhere else?
if(_DestroyWindow)
{
[_autoreleasePool release];
_autoreleasePool = [[NSAutoreleasePool alloc] init];
}
[_ctx flushBuffer];
#elif defined (NL_OS_UNIX)

View file

@ -343,9 +343,14 @@ bool CDriverGL::init (uintptr_t windowIcon, emptyProc exitFunc)
retrieveATIDriverVersion();
#elif defined(NL_OS_MAC)
// nothing to do
nlunreferenced(windowIcon);
// autorelease pool for memory management
_autoreleasePool = [[NSAutoreleasePool alloc] init];
// init the application object
[NSApplication sharedApplication];
#elif defined (NL_OS_UNIX)
nlunreferenced(windowIcon);
@ -486,6 +491,7 @@ bool CDriverGL::unInit()
#elif defined(NL_OS_MAC)
// nothing to do
[_autoreleasePool release];
#elif defined (NL_OS_UNIX)
@ -1466,6 +1472,12 @@ bool CDriverGL::createWindow(const GfxMode &mode)
#elif defined(NL_OS_MAC)
// create the menu in the top screen bar
setupApplicationMenu();
// finish the application launching
[NSApp finishLaunching];
// describe how the window should look like and behave
unsigned int styleMask = NSTitledWindowMask | NSClosableWindowMask |
NSMiniaturizableWindowMask | NSResizableWindowMask;
@ -1642,6 +1654,7 @@ bool CDriverGL::destroyWindow()
}
#elif defined(NL_OS_MAC)
#elif defined(NL_OS_UNIX)
if (_DestroyWindow && _ctx) // FIXME: _DestroyWindow may need to be removed here as well
@ -1664,6 +1677,8 @@ bool CDriverGL::destroyWindow()
[[containerView() window] release];
[containerView() release];
[_glView release];
[_autoreleasePool release];
}
_ctx = nil;

View file

@ -451,7 +451,6 @@ void CInstanceGroup::serial (NLMISC::IStream& f)
_PointLightArray.clear();
}
if (version >= 2)
f.serial(_GlobalPos);

View file

@ -422,7 +422,7 @@ namespace NLGUI
{
nlassert(key);
nlassert(isValid());
if (!isTable()) throw ELuaNotATable(NLMISC::toString("Trying to set a value '%d" NL_I64 "' at key %s on object '%s' of type %s (not a table).", value, key, getId().c_str(), getTypename()));
if (!isTable()) throw ELuaNotATable(NLMISC::toString("Trying to set a value '%" NL_I64 "d' at key %s on object '%s' of type %s (not a table).", value, key, getId().c_str(), getTypename()));
CLuaStackChecker lsc(_LuaState);
push();
_LuaState->push(key);

View file

@ -72,9 +72,6 @@ INelContext::~INelContext()
CInstanceCounterLocalManager::releaseInstance();
// uninit some systems stuff
CSystemUtils::uninit();
_NelContext = NULL;
*(_getInstance()) = NULL;
}
@ -94,9 +91,6 @@ void INelContext::contextReady()
// set numeric locale to C to avoid the use of decimal separators different of a dot
char *locale = setlocale(LC_NUMERIC, "C");
// init some systems stuff
CSystemUtils::init();
// register any pending thinks
// register local instance counter in the global instance counter manager

View file

@ -1082,7 +1082,7 @@ NLMISC_CATEGORISED_COMMAND(nel,displayMeasures, "display hierarchical timer", "[
}
sint depth = 0;
bool hasDepth = (sscanf(args[0].c_str(), "%d", &depth) == 1 || (args.size() > 1 && sscanf(args[1].c_str(), "%d", &depth) == 1));
bool hasDepth = (fromString(args[0], depth) || (args.size() > 1 && fromString(args[1], depth)));
CASE_DISPLAYMEASURES(NoSort, -3)
CASE_DISPLAYMEASURES(TotalTime, -2)

View file

@ -419,13 +419,13 @@ int main(int argc, char* argv[])
float weldThreshold, middleEdgeWeldThreshold;
if (::sscanf(argv[2], "%f", &weldThreshold) != 1)
if (!fromString(argv[2], weldThreshold))
{
nlinfo("invalid weldThreshold");
return -1;
}
if (::sscanf(argv[3], "%f", &middleEdgeWeldThreshold) != 1)
if (!fromString(argv[3], middleEdgeWeldThreshold))
{
nlinfo("invalid middleEdgeWeldThreshold");
return -1;

View file

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
</dict>
</plist>

36
code/ryzom/client/macosx/upgd_nl.sh Normal file → Executable file
View file

@ -12,33 +12,21 @@ MACOSPATH=$(dirname "$RYZOM_CLIENT")
SIGNPATH=$CONTENTSPATH/_CodeSignature
# all files of original Bundle are in the same directory
# we have to copy them to the right location
# we have to uncompress them to the right location
# client_default.cfg and ryzom.icns are already in the right location
# PkgInfo usually doesn't change so don't copy it
# uncompress Ryzom
if [ -e "$ROOTPATH/Ryzom.zip" ]
then
unzip -o "$ROOTPATH/Ryzom.zip" -d "$CONTENTSPATH/../.."
fi
# Info.plist contains updated version
cp -p "$ROOTPATH/Info.plist" "$CONTENTSPATH"
cp -p "$ROOTPATH/CodeResources" "$SIGNPATH"
# executable flag for all executables
chmod +x "$ROOTPATH/Ryzom"
chmod +x "$ROOTPATH/CrashReport"
chmod +x "$ROOTPATH/RyzomClientPatcher"
chmod +x "$ROOTPATH/RyzomConfiguration"
# remove previous executables
rm -f "$MACOSPATH/Ryzom"
rm -f "$MACOSPATH/CrashReport"
rm -f "$MACOSPATH/RyzomClientPatcher"
rm -f "$MACOSPATH/RyzomConfiguration"
# copy all binaries in MacOS directory
cp -p "$ROOTPATH/Ryzom" "$MACOSPATH"
cp -p "$ROOTPATH/CrashReport" "$MACOSPATH"
cp -p "$ROOTPATH/RyzomClientPatcher" "$MACOSPATH"
cp -p "$ROOTPATH/RyzomConfiguration" "$MACOSPATH"
# only uncompress Ryzom Installer if found in parent directory
if [ -e "$ROOTPATH/RyzomInstaller.zip" ] && [ -d "$CONTENTSPATH/../../../Ryzom Installer.app" ]
then
rm -rf "$CONTENTSPATH/../../../Ryzom Installer.app"
unzip -o "$ROOTPATH/RyzomInstaller.zip" -d "$CONTENTSPATH/../../.."
fi
exit 0

View file

@ -65,7 +65,7 @@ IF(WITH_RYZOM_CLIENT)
SET(MACOSX_BUNDLE_GUI_IDENTIFIER "com.winchgate.Ryzom")
SET(MACOSX_BUNDLE_LONG_VERSION_STRING ${RYZOM_VERSION})
SET(MACOSX_BUNDLE_BUNDLE_NAME "Ryzom")
SET(MACOSX_BUNDLE_SHORT_VERSION_STRING ${RYZOM_VERSION})
SET(MACOSX_BUNDLE_SHORT_VERSION_STRING ${RYZOM_VERSION_SHORT})
SET(MACOSX_BUNDLE_BUNDLE_VERSION "1.0")
SET(MACOSX_BUNDLE_COPYRIGHT ${COPYRIGHT})
SET(RYZOM_OUTPUT_DIR ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${MACOSX_BUNDLE_BUNDLE_NAME}.app)
@ -91,6 +91,12 @@ IF(WITH_RYZOM_CLIENT)
ADD_CUSTOM_COMMAND(TARGET ryzom_client POST_BUILD COMMAND cp ARGS -RpX ${RYZOM_DATA_DIR} ${RYZOM_RESOURCES_DIR})
ENDIF()
IF(WITH_RYZOM_SANDBOX)
SET(ENTITLEMENTS --entitlements ${MAC_RESOURCES_DIR}/ryzom.entitlements)
ELSE()
SET(ENTITLEMENTS)
ENDIF()
IF(TARGET crash_report)
ADD_DEPENDENCIES(ryzom_client crash_report)
@ -98,7 +104,7 @@ IF(WITH_RYZOM_CLIENT)
ADD_CUSTOM_COMMAND(TARGET ryzom_client POST_BUILD COMMAND cp -p ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/crash_report ${RYZOM_CONTENTS_DIR}/MacOS/CrashReport)
IF(CODESIGN_ALLOCATE AND APPLE_CERTIFICATE)
ADD_CUSTOM_COMMAND(TARGET ryzom_client POST_BUILD COMMAND CODESIGN_ALLOCATE=${CODESIGN_ALLOCATE} codesign -fs "${APPLE_CERTIFICATE}" "${RYZOM_CONTENTS_DIR}/MacOS/CrashReport" COMMENT "Signing CrashReport executable...")
ADD_CUSTOM_COMMAND(TARGET ryzom_client POST_BUILD COMMAND CODESIGN_ALLOCATE=${CODESIGN_ALLOCATE} codesign ${ENTITLEMENTS} -fs "${APPLE_CERTIFICATE}" "${RYZOM_CONTENTS_DIR}/MacOS/CrashReport" COMMENT "Signing CrashReport executable...")
ENDIF()
ENDIF()
@ -109,7 +115,7 @@ IF(WITH_RYZOM_CLIENT)
ADD_CUSTOM_COMMAND(TARGET ryzom_client POST_BUILD COMMAND cp -p ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ryzom_client_patcher ${RYZOM_CONTENTS_DIR}/MacOS/RyzomClientPatcher)
IF(CODESIGN_ALLOCATE AND APPLE_CERTIFICATE)
ADD_CUSTOM_COMMAND(TARGET ryzom_client POST_BUILD COMMAND CODESIGN_ALLOCATE=${CODESIGN_ALLOCATE} codesign -fs "${APPLE_CERTIFICATE}" "${RYZOM_CONTENTS_DIR}/MacOS/RyzomClientPatcher" COMMENT "Signing RyzomClientPatcher executable...")
ADD_CUSTOM_COMMAND(TARGET ryzom_client POST_BUILD COMMAND CODESIGN_ALLOCATE=${CODESIGN_ALLOCATE} codesign ${ENTITLEMENTS} -fs "${APPLE_CERTIFICATE}" "${RYZOM_CONTENTS_DIR}/MacOS/RyzomClientPatcher" COMMENT "Signing RyzomClientPatcher executable...")
ENDIF()
ENDIF()
@ -120,7 +126,7 @@ IF(WITH_RYZOM_CLIENT)
ADD_CUSTOM_COMMAND(TARGET ryzom_client POST_BUILD COMMAND cp -p ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ryzom_configuration_qt ${RYZOM_CONTENTS_DIR}/MacOS/RyzomConfiguration)
IF(CODESIGN_ALLOCATE AND APPLE_CERTIFICATE)
ADD_CUSTOM_COMMAND(TARGET ryzom_client POST_BUILD COMMAND CODESIGN_ALLOCATE=${CODESIGN_ALLOCATE} codesign -fs "${APPLE_CERTIFICATE}" "${RYZOM_CONTENTS_DIR}/MacOS/RyzomConfiguration" COMMENT "Signing RyzomConfiguration executable...")
ADD_CUSTOM_COMMAND(TARGET ryzom_client POST_BUILD COMMAND CODESIGN_ALLOCATE=${CODESIGN_ALLOCATE} codesign ${ENTITLEMENTS} -fs "${APPLE_CERTIFICATE}" "${RYZOM_CONTENTS_DIR}/MacOS/RyzomConfiguration" COMMENT "Signing RyzomConfiguration executable...")
ENDIF()
ENDIF()
@ -134,7 +140,7 @@ IF(WITH_RYZOM_CLIENT)
ENDIF()
IF(CODESIGN_ALLOCATE AND APPLE_CERTIFICATE)
ADD_CUSTOM_COMMAND(TARGET ryzom_client POST_BUILD COMMAND CODESIGN_ALLOCATE=${CODESIGN_ALLOCATE} codesign -fs "${APPLE_CERTIFICATE}" "${RYZOM_OUTPUT_DIR}" COMMENT "Signing Ryzom bundle...")
ADD_CUSTOM_COMMAND(TARGET ryzom_client POST_BUILD COMMAND CODESIGN_ALLOCATE=${CODESIGN_ALLOCATE} codesign ${ENTITLEMENTS} -fs "${APPLE_CERTIFICATE}" "${RYZOM_OUTPUT_DIR}" COMMENT "Signing Ryzom bundle...")
ENDIF()
ENDIF()

View file

@ -1148,6 +1148,7 @@ void prelogInit()
Driver->setSwapVBLInterval(0);
// initialize system utils class
CSystemUtils::init();
CSystemUtils::setWindow(Driver->getDisplay());
CLoginProgressPostThread::getInstance().step(CLoginStep(LoginStep_VideoModeSetupHighColor, "login_step_video_mode_setup_high_color"));

View file

@ -1619,6 +1619,7 @@ void initBloomConfigUI()
bool supportBloom = Driver->supportBloomEffect();
CInterfaceManager *pIM = CInterfaceManager::getInstance();
CCtrlBaseButton* button = dynamic_cast<CCtrlBaseButton*>(CWidgetManager::getInstance()->getElementFromId("ui:interface:game_config:content:fx:bloom_gr:bloom:c"));
if(button)
{
@ -1631,6 +1632,12 @@ void initBloomConfigUI()
button->setFrozen(!supportBloom);
}
button = dynamic_cast<CCtrlBaseButton*>(CWidgetManager::getInstance()->getElementFromId("ui:interface:game_config:content:fx:fxaa:c"));
if (button)
{
button->setFrozen(!supportBloom);
}
CCtrlScroll * scroll = dynamic_cast<CCtrlScroll*>(CWidgetManager::getInstance()->getElementFromId("ui:interface:game_config:content:fx:bloom_gr:density_bloom:c"));
if(scroll)
{

View file

@ -933,7 +933,7 @@ void CPatchManager::createBatchFile(CProductDescriptionForClient &descFile, bool
if (wantRyzomRestart)
{
// wait until client not in memory anymore
contentSuffix += toString("until ! pgrep %s > /dev/null; do sleep 1; done\n", CFile::getFilename(RyzomFilename).c_str());
contentSuffix += toString("until ! pgrep -x \"%s\" > /dev/null; do sleep 1; done\n", CFile::getFilename(RyzomFilename).c_str());
}
// launch upgrade script if present (it'll execute additional steps like moving or deleting files)
@ -948,7 +948,12 @@ void CPatchManager::createBatchFile(CProductDescriptionForClient &descFile, bool
contentSuffix += "cd \"$STARTUPPATH\"\n\n";
// launch new client
contentSuffix += toString("\"$RYZOM_CLIENT\" %s $LOGIN $PASSWORD $SHARDID\n", additionalParams.c_str());
#ifdef NL_OS_MAC
// use exec command under OS X
contentSuffix += toString("exec \"$RYZOM_CLIENT\" %s $LOGIN $PASSWORD $SHARDID\n", additionalParams.c_str());
#else
contentSuffix += toString("\"$RYZOM_CLIENT\" %s $LOGIN $PASSWORD $SHARDID &\n", additionalParams.c_str());
#endif
}
#endif

View file

@ -2756,7 +2756,16 @@ void CNetworkConnection::sendSystemDisconnection()
uint32 length = message.length();
if (_Connection.connected())
{
try
{
_Connection.send(message.buffer(), length);
}
catch (const ESocket &e)
{
nlwarning("Socket exception: %s", e.what());
}
}
//sendUDP (&(_Connection), message.buffer(), length);
statsSend(length);

View file

@ -556,6 +556,7 @@ void release()
// restore screensaver state
CSystemUtils::enableScreensaver(LastScreenSaverEnabled);
CSystemUtils::uninit();
// release PACS primitives
deletePrimitiveBlocks();
@ -663,9 +664,6 @@ void release()
NLGUI::CDBManager::release();
CWidgetManager::release();
#if FINAL_VERSION
// openURL ("http://ryzom.com/exit/");
#endif

View file

@ -295,7 +295,7 @@ bool packLZMA(const std::string &srcFileName, const std::string &lzmaFileName)
auto_ptr<uint8> outProps = auto_ptr<uint8>(new uint8[outPropsSize]);
// compress with best compression and other default settings
sint res = LzmaCompress(outBuffer.get(), &outSize, inBuffer.get(), inSize, outProps.get(), &outPropsSize, 9, 1 << 24, 3, 0, 2, 32, 1);
sint res = LzmaCompress(outBuffer.get(), &outSize, inBuffer.get(), inSize, outProps.get(), &outPropsSize, 9, 1 << 27, -1, -1, -1, -1, 1);
switch(res)
{

7
code/ryzom/client/unix/upgd_nl.sh Normal file → Executable file
View file

@ -13,4 +13,11 @@ chmod +x "$ROOTPATH/ryzom_client_patcher"
chmod +x "$ROOTPATH/ryzom_configuration_qt"
chmod +x "$ROOTPATH/ryzom_installer_qt"
# copy Ryzom Installer if present in parent directory
if [ -e "$ROOTPATH/../ryzom_installer_qt" ]
then
rm -f "$ROOTPATH/../ryzom_installer_qt"
cp -a "$ROOTPATH/ryzom_installer_qt" "$ROOTPATH/.."
fi
exit 0

View file

@ -30,6 +30,10 @@ if exist %ROOTPATH%\msvcr100_win64.dll (
if exist %ROOTPATH%\..\ryzom_installer_qt_r.exe (
if exist %ROOTPATH%\..\ryzom_installer_qt_r.exe del %ROOTPATH%\..\ryzom_installer_qt_r.exe
copy /Y %ROOTPATH%\ryzom_installer_qt_r.exe %ROOTPATH%\..
if exist %ROOTPATH%\..\msvcp100.dll del %ROOTPATH%\..\msvcp100.dll
copy /Y %ROOTPATH%\msvcp100.dll %ROOTPATH%\..
if exist %ROOTPATH%\..\msvcr100.dll del %ROOTPATH%\..\msvcr100.dll
copy /Y %ROOTPATH%\msvcr100.dll %ROOTPATH%\..
)
:end

View file

@ -894,7 +894,7 @@ void CObjectInteger::inPlaceCopy(const CObjectInteger &src)
}
std::string CObjectInteger::doToString() const { return NLMISC::toString("%" NL_I64 "d", _Value); }
std::string CObjectInteger::doToString() const { return NLMISC::toString(_Value); }
void CObjectInteger::doSerialize(std::string& out, CSerializeContext& /* context */) const
{

View file

@ -3122,8 +3122,8 @@ static void setRyzomDebugDate(CRyzomDate &rd)
NLMISC_COMMAND(setDebugHour, "set the current debug hour", "<hour>")
{
if (args.size() != 1) return false;
int hour;
if (sscanf(args[0].c_str(), "%d", &hour) != 1) return false;
sint hour;
if (!fromString(args[0], hour)) return false;
CRyzomDate rd;
getRyzomDebugDate(rd);
rd.Time = fmodf(rd.Time, 1.f) + (float) hour;
@ -3134,8 +3134,8 @@ NLMISC_COMMAND(setDebugHour, "set the current debug hour", "<hour>")
NLMISC_COMMAND(setDebugDayOfYear, "set the current debug day of year (first day has index 1)", "<day>")
{
if (args.size() != 1) return false;
int day;
if (sscanf(args[0].c_str(), "%d", &day) != 1) return false;
sint day;
if (!fromString(args[0], day)) return false;
CRyzomDate rd;
getRyzomDebugDate(rd);
rd.Day = day - 1; // for the user, days start at '1'

View file

@ -1002,7 +1002,7 @@ ENTITY_VARIABLE(Money, "Money")
if (get)
{
value = toString("%"NL_I64"u", c->getMoney());
value = toString(c->getMoney());
}
else
{
@ -1054,7 +1054,7 @@ ENTITY_VARIABLE(MoneyGuild, "MoneyGuild")
if (get)
{
value = toString("%"NL_I64"u", guild->getMoney());
value = toString(guild->getMoney());
}
else
{

View file

@ -3916,7 +3916,8 @@ NLMISC_COMMAND( db, "Display or set the value of a property in the database", "<
{
// Set
sint64 value;
sscanf( args[2].c_str(), "%"NL_I64"d", &value );
fromString(args[2], value);
if ( (args.size() > 3) && (args[3]!="0") )
{
res = e->_PropertyDatabase.x_setPropButDontSend( entry, value );

View file

@ -1011,7 +1011,7 @@ NLMISC_COMMAND(getMoney, "get money of player", "<uid>")
{
GET_ACTIVE_CHARACTER
string value = toString("%"NL_I64"u", c->getMoney());
string value = toString(c->getMoney());
log.displayNL(value.c_str());

View file

@ -379,8 +379,12 @@ void clientAuthentication(CMessage &msgin, TSockId from, CCallbackNetBase &netba
{
if (!Clients[i]->BadLogin) // don't allow new login attempt while this flag is set
{
// escape login
char escapedLogin[100];
size_t len = mysql_real_escape_string(DatabaseConnection, escapedLogin, login.c_str(), login.length());
// make a db request to to db to see if password is valid
std::string queryStr = toString("SELECT Password FROM user where Login='%s'", login.c_str());
std::string queryStr = toString("SELECT Password FROM user where Login='%s'", escapedLogin);
int result = mysql_query(DatabaseConnection, queryStr.c_str());
if (result == 0)
{

View file

@ -1217,7 +1217,7 @@ NLMISC_COMMAND(dumpToXml, "dump the content of an object into an xml file", "<da
if (id == NLMISC::CEntityId::Unknown)
{
if (sscanf(args[1].c_str(), "%"NL_I64"u", &key) != 1)
if (!fromString(args[1], key))
{
log.displayNL("id '%s' is not recognized as an EntityId, an ObjectIndex nor a 64 bits raw key", args[1].c_str());
return false;

View file

@ -177,6 +177,11 @@ void CClientConfigDialog::onClickPlay()
clientFullPath += "ryzom_client";
#endif
#ifndef Q_OS_WIN32
// fix executable permissions under UNIX
QFile::setPermissions(clientFullPath, QFile::permissions(clientFullPath) | QFile::ExeGroup | QFile::ExeUser | QFile::ExeOther);
#endif
started = QProcess::startDetached(clientFullPath, arguments);
onClickOK();

View file

@ -1,9 +1,9 @@
version=3
version=4
[common]
installation_directory=
installer_filename_windows=ryzom_installer_qt_r.exe
installer_filename_osx=RyzomInstaller.app/Contents/MacOS/RyzomInstaller
installer_filename_osx="Ryzom Installer.app/Contents/MacOS/Ryzom Installer"
installer_filename_linux=ryzom_installer_qt
[product]

View file

@ -106,22 +106,35 @@ bool CConfigFile::load(const QString &filename)
m_productHelpUrl = settings.value("url_help").toString();
m_productComments = settings.value("comments").toString();
settings.endGroup();
}
settings.beginGroup("servers");
int serversCount = settings.value("size").toInt();
m_defaultServerIndex = settings.value("default").toInt();
settings.endGroup();
// only resize if added servers in local ryzom_installer.ini
CServers defaultServers = m_servers;
m_servers.resize(serversCount);
for (int i = 0; i < serversCount; ++i)
{
settings.beginGroup(QString("server_%1").arg(i));
CServer &server = m_servers[i];
settings.beginGroup(QString("server_%1").arg(i));
server.loadFromSettings(settings);
settings.endGroup();
if (useDefaultValues)
{
// search server with same ID and use these values
server.loadFromServers(defaultServers);
}
else
{
server.loadFromSettings(settings);
}
settings.endGroup();
}
// custom choices, always keep them
@ -307,7 +320,16 @@ QString CConfigFile::getDesktopDirectory() const
QString CConfigFile::getMenuDirectory() const
{
return QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation) + "/" + QApplication::applicationName();
QString applicationLocation;
#ifdef Q_OS_MAC
// QStandardPaths::ApplicationsLocation returns read-only location so fix it, will be installed in ~/Applications
applicationLocation = QStandardPaths::writableLocation(QStandardPaths::HomeLocation) + "/Applications";
#else
applicationLocation = QStandardPaths::writableLocation(QStandardPaths::ApplicationsLocation);
#endif
return applicationLocation + "/" + QApplication::applicationName();
}
bool CConfigFile::has64bitsOS()
@ -483,11 +505,6 @@ QString CConfigFile::getParentDirectory()
return current.absolutePath();
}
QString CConfigFile::getApplicationDirectory()
{
return QApplication::applicationDirPath();
}
QString CConfigFile::getOldInstallationDirectory()
{
// HKEY_CURRENT_USER/SOFTWARE/Nevrax/RyzomInstall/InstallId=1917716796 (string)
@ -718,21 +735,28 @@ bool CConfigFile::shouldCreateMenuShortcut() const
return !shortcutExists(profile.getClientMenuShortcutFullPath());
}
bool CConfigFile::shouldCopyInstaller() const
int CConfigFile::compareInstallersVersion() const
{
// returns 0 if same version, 1 if current installer is more recent, -1 if installed installer is more recent
QString installerDst = getInstallationDirectory() + "/" + m_installerFilename;
// if installer not found in installation directory, extract it from BNP
if (!QFile::exists(installerDst)) return true;
// if installer not found in installation directory
if (!QFile::exists(installerDst)) return 1;
QString installedVersion = getVersionFromExecutable(installerDst);
nlinfo("%s version is %s", Q2C(installerDst), Q2C(installedVersion));
QString newVersion = QApplication::applicationVersion();
QVersionNumber installedVer = QVersionNumber::fromString(installedVersion);
QVersionNumber newVer = QVersionNumber::fromString(newVersion);
// if version is greater, copy it
return newVer > installedVer;
// same version
if (newVer == installedVer) return 0;
// if version is greater or lower
return newVer > installedVer ? 1:-1;
}
QString CConfigFile::getInstallerCurrentFilePath() const
@ -744,15 +768,30 @@ QString CConfigFile::getInstallerCurrentFilePath() const
QString CConfigFile::getInstallerCurrentDirPath() const
{
// installer is always run from TEMP under Windows
return QApplication::applicationDirPath();
QString appDir = QApplication::applicationDirPath();
#ifdef Q_OS_MAC
QDir dir(appDir);
dir.cdUp(); // .. = Contents
dir.cdUp(); // .. = .app
dir.cdUp(); // .. = <parent>
// return absolute path
appDir = dir.absolutePath();
#endif
return appDir;
}
QString CConfigFile::getInstallerOriginalFilePath() const
QString CConfigFile::getInstallerInstalledFilePath() const
{
return getInstallerOriginalDirPath() + "/" + QFileInfo(QApplication::applicationFilePath()).fileName();
// return an empty string, if no Installer filename in config
if (m_installerFilename.isEmpty()) return "";
return getInstallerInstalledDirPath() + "/" + m_installerFilename;
}
QString CConfigFile::getInstallerOriginalDirPath() const
QString CConfigFile::getInstallerInstalledDirPath() const
{
return m_installationDirectory;
}
@ -802,7 +841,7 @@ QStringList CConfigFile::getInstallerRequiredFiles() const
#endif
// include current executable
files << QFileInfo(QApplication::applicationFilePath()).fileName();
files << QFileInfo(getInstallerCurrentFilePath()).fileName();
#elif defined(Q_OS_MAC)
// everything is in a directory
files << "Ryzom Installer.app";
@ -811,7 +850,7 @@ QStringList CConfigFile::getInstallerRequiredFiles() const
files << "ryzom_installer.png";
// include current executable
files << QFileInfo(QApplication::applicationFilePath()).fileName();
files << QFileInfo(getInstallerCurrentFilePath()).fileName();
#endif
return files;
@ -859,7 +898,7 @@ OperationStep CConfigFile::getInstallNextStep() const
if (!isRyzomInstalledIn(currentDirectory))
{
// Ryzom is in the same directory as Ryzom Installer
currentDirectory = getApplicationDirectory();
currentDirectory = getInstallerCurrentDirPath();
if (!isRyzomInstalledIn(currentDirectory))
{
@ -947,7 +986,8 @@ OperationStep CConfigFile::getInstallNextStep() const
}
}
if (shouldCopyInstaller()) return CopyInstaller;
// current installer more recent than installed one
if (compareInstallersVersion() == 1) return CopyInstaller;
// no default profile
if (profile.id.isEmpty())
@ -990,6 +1030,31 @@ OperationStep CConfigFile::getInstallNextStep() const
}
}
// current installer more recent than installed one
switch (compareInstallersVersion())
{
// current installer more recent, copy it
case 1: break;
// current installer older, launch the more recent installer
case -1: return LaunchInstalledInstaller;
// continue only if 0 and launched Installer is the installed one
default:
{
#ifdef Q_OS_WIN32
QString tempPath = QStandardPaths::writableLocation(QStandardPaths::TempLocation);
// check if launched from TEMP directory
bool rightPath = getInstallerCurrentDirPath().startsWith(tempPath);
#else
bool rightPath = false;
#endif
if (!rightPath && getInstallerCurrentFilePath() != getInstallerInstalledFilePath() && QFile::exists(getInstallerInstalledFilePath())) return LaunchInstalledInstaller;
}
}
return Done;
}

View file

@ -90,7 +90,6 @@ public:
// default directories
static QString getCurrentDirectory();
static QString getParentDirectory();
static QString getApplicationDirectory();
static QString getOldInstallationDirectory();
static QString getNewInstallationDirectory();
static QString getOldInstallationLanguage();
@ -104,7 +103,7 @@ public:
bool foundTemporaryFiles(const QString &directory) const;
bool shouldCreateDesktopShortcut() const;
bool shouldCreateMenuShortcut() const;
bool shouldCopyInstaller() const;
int compareInstallersVersion() const;
// installation choices
bool use64BitsClient() const;
@ -124,8 +123,8 @@ public:
QString getInstallerCurrentFilePath() const;
QString getInstallerCurrentDirPath() const;
QString getInstallerOriginalFilePath() const;
QString getInstallerOriginalDirPath() const;
QString getInstallerInstalledFilePath() const;
QString getInstallerInstalledDirPath() const;
QString getInstallerMenuShortcutFullPath() const;
QString getInstallerDesktopShortcutFullPath() const;

View file

@ -17,6 +17,7 @@
#include "stdpch.h"
#include "operation.h"
#include "downloader.h"
#include "utils.h"
#include "nel/misc/system_info.h"
#include "nel/misc/path.h"
@ -25,7 +26,7 @@
#define new DEBUG_NEW
#endif
CDownloader::CDownloader(QObject *parent, IOperationProgressListener *listener):QObject(parent), m_listener(listener), m_manager(NULL), m_reply(NULL), m_timer(NULL),
CDownloader::CDownloader(QObject *parent, IOperationProgressListener *listener):QObject(parent), m_listener(listener), m_manager(NULL), m_timer(NULL),
m_offset(0), m_size(0), m_supportsAcceptRanges(false), m_supportsContentRange(false),
m_downloadAfterHead(false), m_file(NULL)
{
@ -46,7 +47,7 @@ bool CDownloader::getHtmlPageContent(const QString &url)
if (url.isEmpty()) return false;
QNetworkRequest request(url);
request.setHeader(QNetworkRequest::UserAgentHeader, "Ryzom Installer/1.0");
request.setHeader(QNetworkRequest::UserAgentHeader, QString("Ryzom Installer/%1").arg(QApplication::applicationVersion()));
QNetworkReply *reply = m_manager->get(request);
@ -75,7 +76,7 @@ bool CDownloader::getFile()
{
if (m_fullPath.isEmpty() || m_url.isEmpty())
{
qDebug() << "You forget to call prepareFile before";
nlwarning("You forget to call prepareFile before");
return false;
}
@ -168,10 +169,10 @@ void CDownloader::getFileHead()
request.setRawHeader("Range", QString("bytes=%1-").arg(m_offset).toLatin1());
}
m_reply = m_manager->head(request);
QNetworkReply *reply = m_manager->head(request);
connect(m_reply, SIGNAL(finished()), SLOT(onHeadFinished()));
connect(m_reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(onError(QNetworkReply::NetworkError)));
connect(reply, SIGNAL(finished()), SLOT(onHeadFinished()));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(onError(QNetworkReply::NetworkError)));
startTimer();
}
@ -180,6 +181,16 @@ void CDownloader::downloadFile()
{
qint64 freeSpace = NLMISC::CSystemInfo::availableHDSpace(m_fullPath.toUtf8().constData());
if (freeSpace == 0)
{
if (m_listener)
{
QString error = qFromUtf8(NLMISC::formatErrorMessage(NLMISC::getLastError()));
m_listener->operationFail(tr("Error '%1' occured when trying to check free disk space on %2.").arg(error).arg(m_fullPath));
}
return;
}
if (freeSpace < m_size - m_offset)
{
// we have not enough free disk space to continue download
@ -201,12 +212,12 @@ void CDownloader::downloadFile()
request.setRawHeader("Range", QString("bytes=%1-%2").arg(m_offset).arg(m_size-1).toLatin1());
}
m_reply = m_manager->get(request);
QNetworkReply *reply = m_manager->get(request);
connect(m_reply, SIGNAL(finished()), SLOT(onDownloadFinished()));
connect(m_reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(onError(QNetworkReply::NetworkError)));
connect(m_reply, SIGNAL(downloadProgress(qint64, qint64)), SLOT(onDownloadProgress(qint64, qint64)));
connect(m_reply, SIGNAL(readyRead()), SLOT(onDownloadRead()));
connect(reply, SIGNAL(finished()), SLOT(onDownloadFinished()));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(onError(QNetworkReply::NetworkError)));
connect(reply, SIGNAL(downloadProgress(qint64, qint64)), SLOT(onDownloadProgress(qint64, qint64)));
connect(reply, SIGNAL(readyRead()), SLOT(onDownloadRead()));
if (m_listener) m_listener->operationStart();
@ -222,7 +233,7 @@ bool CDownloader::checkDownloadedFile()
void CDownloader::onTimeout()
{
qDebug() << "Timeout";
nlwarning("Timeout");
if (m_listener) m_listener->operationFail(tr("Timeout"));
}
@ -243,24 +254,35 @@ void CDownloader::onHeadFinished()
{
stopTimer();
int status = m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
QString redirection = m_reply->header(QNetworkRequest::LocationHeader).toString();
int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
QString url = reply->url().toString();
m_size = m_reply->header(QNetworkRequest::ContentLengthHeader).toInt();
m_lastModified = m_reply->header(QNetworkRequest::LastModifiedHeader).toDateTime().toUTC();
QString redirection = reply->header(QNetworkRequest::LocationHeader).toString();
QString acceptRanges = QString::fromLatin1(m_reply->rawHeader("Accept-Ranges"));
QString contentRange = QString::fromLatin1(m_reply->rawHeader("Content-Range"));
m_size = reply->header(QNetworkRequest::ContentLengthHeader).toInt();
m_lastModified = reply->header(QNetworkRequest::LastModifiedHeader).toDateTime().toUTC();
m_reply->deleteLater();
m_reply = NULL;
QString acceptRanges = QString::fromLatin1(reply->rawHeader("Accept-Ranges"));
QString contentRange = QString::fromLatin1(reply->rawHeader("Content-Range"));
reply->deleteLater();
nlinfo("HTTP status code %d on HEAD for %s", status, Q2C(url));
if (!redirection.isEmpty())
{
nlinfo("Redirected to %s", Q2C(redirection));
}
// redirection
if (status == 302)
if (status == 302 || status == 307)
{
if (redirection.isEmpty())
{
nlwarning("No redirection defined");
if (m_listener) m_listener->operationFail(tr("Redirection URL is not defined"));
return;
}
@ -287,6 +309,8 @@ void CDownloader::onHeadFinished()
if (!m_supportsAcceptRanges && acceptRanges == "bytes")
{
nlinfo("Server supports resume for %s", Q2C(url));
// server supports resume, part 1
m_supportsAcceptRanges = true;
@ -298,6 +322,7 @@ void CDownloader::onHeadFinished()
// server doesn't support resume or
// we requested range, but server always returns 200
// download from the beginning
nlwarning("Server doesn't support resume, download %s from the beginning", Q2C(url));
}
// we requested with a range
@ -316,20 +341,15 @@ void CDownloader::onHeadFinished()
// update offset and size
if (m_listener) m_listener->operationInit(m_offset, m_size);
nlinfo("Server supports resume for %s: offset %" NL_I64 "d, size %" NL_I64 "d", Q2C(url), m_offset, m_size);
}
else
{
qDebug() << "Unable to parse";
nlwarning("Unable to parse %s", Q2C(contentRange));
}
}
// error when download is not yet ready
else if (status == 307)
{
if (m_listener) m_listener->operationFail(tr("File is not available, please retry later (status code: %1)").arg(status));
return;
}
// other status
else
{
@ -341,7 +361,7 @@ void CDownloader::onHeadFinished()
{
if (checkDownloadedFile())
{
qDebug() << "same date and size";
nlwarning("Same date and size");
}
else
{
@ -356,8 +376,14 @@ void CDownloader::onHeadFinished()
void CDownloader::onDownloadFinished()
{
m_reply->deleteLater();
m_reply = NULL;
QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
QString url = reply->url().toString();
reply->deleteLater();
nlwarning("Download finished with HTTP status code %d when downloading %s", status, Q2C(url));
closeFile();
@ -366,6 +392,8 @@ void CDownloader::onDownloadFinished()
m_listener->operationStop();
}
else
{
if (QFileInfo(m_fullPath).size() == m_size)
{
bool ok = NLMISC::CFile::setFileModificationDate(m_fullPath.toUtf8().constData(), m_lastModified.toTime_t());
@ -373,20 +401,29 @@ void CDownloader::onDownloadFinished()
emit downloadDone();
}
else if (status == 206)
{
if (m_listener) m_listener->operationContinue();
}
else
{
if (m_listener) m_listener->operationFail(tr("HTTP error: %1").arg(status));
}
}
}
void CDownloader::onError(QNetworkReply::NetworkError error)
{
QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
nlwarning("Network error %s (%d) when downloading %s", Q2C(reply->errorString()), error, Q2C(m_url));
if (!m_listener) return;
if (error == QNetworkReply::OperationCanceledError)
{
m_listener->operationStop();
}
else
{
m_listener->operationFail(tr("Network error: %1").arg(error));
}
}
void CDownloader::onDownloadProgress(qint64 current, qint64 total)
@ -395,13 +432,17 @@ void CDownloader::onDownloadProgress(qint64 current, qint64 total)
if (!m_listener) return;
QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
m_listener->operationProgress(m_offset + current, m_url);
// abort download
if (m_listener->operationShouldStop() && m_reply) m_reply->abort();
if (m_listener->operationShouldStop() && reply) reply->abort();
}
void CDownloader::onDownloadRead()
{
if (m_file) m_file->write(m_reply->readAll());
QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
if (m_file && reply) m_file->write(reply->readAll());
}

View file

@ -76,7 +76,6 @@ protected:
bool checkDownloadedFile();
QNetworkAccessManager *m_manager;
QNetworkReply *m_reply;
QTimer *m_timer;
QString m_url;

View file

@ -63,90 +63,80 @@ bool CFilesCopier::exec()
FilesToCopy files;
// create the list of files to copy
CFilesCopier::getFilesList(files);
// copy them
return copyFiles(files);
}
void CFilesCopier::getFilesList(FilesToCopy &files)
void CFilesCopier::getFile(const QFileInfo &fileInfo, const QDir &srcDir, FilesToCopy &files) const
{
QDir dir(m_sourceDirectory);
// full path to file
QString fullPath = fileInfo.absoluteFilePath();
QFileInfoList entries = dir.entryInfoList(m_includeFilter);
QString relativePath = srcDir.relativeFilePath(fullPath);
foreach(const QFileInfo &entry, entries)
QFileInfo relativeFileInfo(relativePath);
// correct absolute path
if (relativeFileInfo.isAbsolute())
{
QString fullPath = entry.absoluteFilePath();
relativePath = relativeFileInfo.fileName();
}
QString dstPath = m_destinationDirectory + "/" + dir.relativeFilePath(fullPath);
// full path where to copy file
QString dstPath = m_destinationDirectory + "/" + relativePath;
if (entry.isDir())
if (fileInfo.isDir())
{
// create directory
QDir().mkpath(dstPath);
QDir subDir(fullPath);
QDirIterator it(subDir, QDirIterator::Subdirectories);
// get list of all files in directory
QFileInfoList entries = subDir.entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot);
while (it.hasNext())
// proces seach file recursively
foreach(const QFileInfo &entry, entries)
{
fullPath = it.next();
if (it.fileName().startsWith('.')) continue;
QFileInfo fileInfo = it.fileInfo();
dstPath = m_destinationDirectory + "/" + dir.relativeFilePath(fullPath);
if (fileInfo.isDir())
{
QDir().mkpath(dstPath);
}
else
{
FileToCopy file;
file.filename = it.fileName();
file.src = it.filePath();
file.dst = dstPath;
file.size = it.fileInfo().size();
file.date = it.fileInfo().lastModified().toTime_t();
file.permissions = it.fileInfo().permissions();
files << file;
}
getFile(entry, srcDir, files);
}
}
else
{
// add the file to list with all useful information
FileToCopy file;
file.filename = entry.fileName();
file.src = entry.filePath();
file.filename = fileInfo.fileName();
file.src = fileInfo.filePath();
file.dst = dstPath;
file.size = entry.size();
file.date = entry.lastModified().toTime_t();
file.permissions = entry.permissions();
file.size = fileInfo.size();
file.date = fileInfo.lastModified().toTime_t();
file.permissions = fileInfo.permissions();
files << file;
}
}
void CFilesCopier::getFilesList(FilesToCopy &files) const
{
QDir srcDir(m_sourceDirectory);
// only copy all files from filter
QFileInfoList entries = srcDir.entryInfoList(m_includeFilter);
foreach(const QFileInfo &entry, entries)
{
getFile(entry, srcDir, files);
}
// copy additional files
foreach(const QString &fullpath, m_files)
{
QFileInfo fileInfo(fullpath);
if (fileInfo.isFile())
{
FileToCopy file;
file.filename = fileInfo.fileName();
file.src = fileInfo.filePath();
file.dst = m_destinationDirectory + "/" + fileInfo.fileName();
file.size = fileInfo.size();
file.date = fileInfo.lastModified().toTime_t();
file.permissions = fileInfo.permissions();
files << file;
}
getFile(fileInfo, srcDir, files);
}
}
@ -186,7 +176,7 @@ bool CFilesCopier::copyFiles(const FilesToCopy &files)
if (!QFile::copy(file.src, file.dst))
{
if (m_listener) m_listener->operationFail(QApplication::tr("Unable to copy file %1").arg(file.src));
if (m_listener) m_listener->operationFail(QApplication::tr("Unable to copy file %1 to %2").arg(file.src).arg(file.dst));
return false;
}

View file

@ -54,7 +54,9 @@ protected:
typedef QList<FileToCopy> FilesToCopy;
void getFilesList(FilesToCopy &files);
void getFile(const QFileInfo &info, const QDir &srcDir, FilesToCopy &files) const;
void getFilesList(FilesToCopy &files) const;
bool copyFiles(const FilesToCopy &files);
IOperationProgressListener *m_listener;

View file

@ -91,6 +91,8 @@
bool Set7zFileAttrib(const QString &filename, uint32 fileAttributes)
{
if (filename.isEmpty()) return false;
bool attrReadOnly = (fileAttributes & FILE_ATTRIBUTE_READONLY) != 0;
bool attrHidden = (fileAttributes & FILE_ATTRIBUTE_HIDDEN) != 0;
bool attrSystem = (fileAttributes & FILE_ATTRIBUTE_SYSTEM) != 0;
@ -114,7 +116,7 @@ bool Set7zFileAttrib(const QString &filename, uint32 fileAttributes)
#ifdef Q_OS_WIN
SetFileAttributesW((wchar_t*)filename.utf16(), windowsAttributes);
#else
const char *name = filename.toUtf8().constData();
std::string name = filename.toUtf8().constData();
mode_t current_umask = umask(0); // get and set the umask
umask(current_umask); // restore the umask
@ -122,9 +124,9 @@ bool Set7zFileAttrib(const QString &filename, uint32 fileAttributes)
struct stat stat_info;
if (lstat(name, &stat_info) != 0)
if (lstat(name.c_str(), &stat_info) != 0)
{
nlwarning("Unable to get file attributes for %s", name);
nlwarning("Unable to get file attributes for %s", name.c_str());
return false;
}
@ -137,13 +139,13 @@ bool Set7zFileAttrib(const QString &filename, uint32 fileAttributes)
{
if (S_ISREG(stat_info.st_mode))
{
chmod(name, stat_info.st_mode & mask);
chmod(name.c_str(), stat_info.st_mode & mask);
}
else if (S_ISDIR(stat_info.st_mode))
{
// user/7za must be able to create files in this directory
stat_info.st_mode |= (S_IRUSR | S_IWUSR | S_IXUSR);
chmod(name, stat_info.st_mode & mask);
chmod(name.c_str(), stat_info.st_mode & mask);
}
}
}
@ -156,7 +158,7 @@ bool Set7zFileAttrib(const QString &filename, uint32 fileAttributes)
// octal!, clear write permission bits
stat_info.st_mode &= ~0222;
chmod(name, stat_info.st_mode & mask);
chmod(name.c_str(), stat_info.st_mode & mask);
}
#endif
@ -406,69 +408,101 @@ bool CFilesExtractor::extract7z()
QString path = QString::fromUtf16(temp);
QString filename = QFileInfo(path).fileName();
if (!isDir)
QString destPath = m_destinationDirectory + '/' + path;
// get uncompressed size
quint64 uncompressedSize = SzArEx_GetFileSize(&db, i);
// get modification time
quint32 modificationTime = 0;
if (SzBitWithVals_Check(&db.MTime, i))
{
modificationTime = convertWindowsFileTimeToUnixTimestamp(db.MTime.Vals[i]);
}
if (isDir)
{
QDir().mkpath(destPath);
continue;
}
// check if file exists
if (QFile::exists(destPath))
{
QFileInfo currentFileInfo(destPath);
// skip file if same size and same modification date
if (currentFileInfo.lastModified().toTime_t() == modificationTime && currentFileInfo.size() == uncompressedSize)
{
// update progress
totalUncompressed += uncompressedSize;
if (m_listener) m_listener->operationProgress(totalUncompressed, filename);
continue;
}
}
if (m_listener) m_listener->operationProgress(totalUncompressed, filename);
res = SzArEx_Extract(&db, &lookStream.s, i, &blockIndex, &outBuffer, &outBufferSize,
&offset, &outSizeProcessed, &allocImp, &allocTempImp);
if (res != SZ_OK) break;
}
QString destPath = m_destinationDirectory + '/' + path;
QDir dir;
if (isDir)
{
dir.mkpath(destPath);
continue;
}
dir.mkpath(QFileInfo(destPath).absolutePath());
// create file directory
QDir().mkpath(QFileInfo(destPath).absolutePath());
// create file
QFile outFile(destPath);
if (!outFile.open(QFile::WriteOnly))
{
error = QApplication::tr("Unable to open output file");
error = QApplication::tr("Unable to open output file %1").arg(destPath);
res = SZ_ERROR_FAIL;
break;
}
size_t processedSize = outFile.write((const char*)(outBuffer + offset), outSizeProcessed);
qint64 currentSizeToProcess = outSizeProcessed;
if (processedSize != outSizeProcessed)
do
{
error = QApplication::tr("Unable to write output file");
qint64 currentProcessedSize = outFile.write((const char*)(outBuffer + offset), currentSizeToProcess);
// errors only occur when returned size is -1
if (currentProcessedSize < 0) break;
offset += currentProcessedSize;
currentSizeToProcess -= currentProcessedSize;
}
while (currentSizeToProcess > 0);
if (offset != outSizeProcessed)
{
error = QApplication::tr("Unable to write output file %1 (%2 bytes written but expecting %3 bytes)").arg(destPath).arg(offset).arg(outSizeProcessed);
res = SZ_ERROR_FAIL;
break;
}
outFile.close();
totalUncompressed += SzArEx_GetFileSize(&db, i);
totalUncompressed += uncompressedSize;
if (m_listener) m_listener->operationProgress(totalUncompressed, filename);
// set attrinbutes
// set attributes
if (SzBitWithVals_Check(&db.Attribs, i))
{
Set7zFileAttrib(destPath, db.Attribs.Vals[i]);
}
// set modification time
if (SzBitWithVals_Check(&db.MTime, i))
{
char buffer[1024];
if (!NLMISC::CFile::setFileModificationDate(qToUtf8(destPath), convertWindowsFileTimeToUnixTimestamp(db.MTime.Vals[i])))
if (!NLMISC::CFile::setFileModificationDate(qToUtf8(destPath), modificationTime))
{
qDebug() << "Unable to change date of " << destPath;
}
}
}
IAlloc_Free(&allocImp, outBuffer);
}

View file

@ -21,6 +21,7 @@
#include "nel/misc/system_info.h"
#include "nel/misc/common.h"
#include "nel/misc/debug.h"
#ifdef DEBUG_NEW
#define new DEBUG_NEW
@ -40,7 +41,9 @@ CInstallDialog::CInstallDialog():QDialog()
clientArchGroupBox->setVisible(false);
clientArch64RadioButton->setChecked(true);
clientArch32RadioButton->setChecked(false);
#else
#elif defined(Q_OS_WIN32)
// both 32 and 64 bits are working under Windows 64 bits
// check whether OS architecture is 32 or 64 bits
if (CConfigFile::has64bitsOS())
{
@ -56,6 +59,21 @@ CInstallDialog::CInstallDialog():QDialog()
clientArch64RadioButton->setChecked(false);
clientArch32RadioButton->setChecked(true);
}
#else
// only use the current architecture for Linux
clientArchGroupBox->setVisible(false);
#ifdef _LP64
// only 64 bits is available
clientArch64RadioButton->setChecked(true);
clientArch32RadioButton->setChecked(false);
#else
// only 32 bits is available
clientArch64RadioButton->setChecked(false);
clientArch32RadioButton->setChecked(true);
#endif
#endif
const CServer &server = CConfigFile::getInstance()->getServer();
@ -114,9 +132,18 @@ void CInstallDialog::accept()
// check free disk space
qint64 freeSpace = NLMISC::CSystemInfo::availableHDSpace(m_dstDirectory.toUtf8().constData());
// shouldn't happen
if (freeSpace == 0)
{
int error = NLMISC::getLastError();
nlwarning("Error '%s' (%d) occured when trying to check free disk space on %s, continue anyway", NLMISC::formatErrorMessage(error).c_str(), error, Q2C(m_dstDirectory));
}
const CServer &server = CConfigFile::getInstance()->getServer();
if (freeSpace < server.dataUncompressedSize)
// compare with exact size of current directory
if (freeSpace && freeSpace < server.dataUncompressedSize)
{
QMessageBox::StandardButton res = QMessageBox::warning(this, tr("Not enough free disk space"), tr("You don't have enough free space on this disk, please make more space or choose a directory on another disk."));
return;

View file

@ -144,9 +144,17 @@ int main(int argc, char *argv[])
// instanciate ConfigFile
CConfigFile config;
OperationStep step = config.load() ? config.getInstallNextStep():DisplayNoServerError;
if (step == DisplayNoServerError)
bool res = config.load();
// init log
CLogHelper logHelper(config.getInstallationDirectory());
nlinfo("Launched %s", Q2C(config.getInstallerCurrentFilePath()));
OperationStep step = res ? config.getInstallNextStep():DisplayNoServerError;
if (res == DisplayNoServerError)
{
QMessageBox::critical(NULL, QApplication::tr("Error"), QApplication::tr("Unable to find ryzom_installer.ini"));
return 1;
@ -157,8 +165,10 @@ int main(int argc, char *argv[])
QString tempPath = QStandardPaths::writableLocation(QStandardPaths::TempLocation);
// check if launched from TEMP directory
if (step == Done && !QApplication::applicationDirPath().startsWith(tempPath))
if (step == Done && !config.getInstallerCurrentDirPath().startsWith(tempPath))
{
nlinfo("Not launched from TEMP directory");
// try to delete all temporary installers
QDir tempDir(tempPath);
@ -173,17 +183,25 @@ int main(int argc, char *argv[])
QDir dirToRemove(tempDir);
dirToRemove.cd(dir);
dirToRemove.removeRecursively();
nlinfo("Delete directory %s", Q2C(dir));
}
tempPath += QString("/ryzom_installer_%1").arg(QDateTime::currentMSecsSinceEpoch());
nlinfo("Creating directory %s", Q2C(tempPath));
// copy installer and required files to TEMP directory
if (QDir().mkdir(tempPath) && copyInstallerFiles(config.getInstallerRequiredFiles(), tempPath))
{
QString tempFile = tempPath + "/" + QFileInfo(QApplication::applicationFilePath()).fileName();
QString tempFile = tempPath + "/" + QFileInfo(config.getInstallerCurrentFilePath()).fileName();
nlinfo("Launching %s", Q2C(tempFile));
// launch copy in TEMP directory with same arguments
if (QProcess::startDetached(tempFile, QApplication::arguments())) return 0;
nlwarning("Unable to launch %s", Q2C(tempFile));
}
}
#endif
@ -193,6 +211,8 @@ int main(int argc, char *argv[])
if (parser.isSet(uninstallOption))
{
nlinfo("Uninstalling...");
SComponents components;
// add all servers by default
@ -227,6 +247,8 @@ int main(int argc, char *argv[])
if (step == ShowMigrateWizard)
{
nlinfo("Display migration dialog");
CMigrateDialog dialog;
if (!dialog.exec()) return 1;
@ -235,6 +257,8 @@ int main(int argc, char *argv[])
}
else if (step == ShowInstallWizard)
{
nlinfo("Display installation dialog");
CInstallDialog dialog;
if (!dialog.exec()) return 1;
@ -242,6 +266,10 @@ int main(int argc, char *argv[])
step = config.getInstallNextStep();
}
nlinfo("Next step is %s", Q2C(stepToString(step)));
bool restartInstaller = false;
if (step != Done)
{
COperationDialog dialog;
@ -252,15 +280,36 @@ int main(int argc, char *argv[])
step = config.getInstallNextStep();
if (step == Done)
nlinfo("Last step is %s", Q2C(stepToString(step)));
if (step == LaunchInstalledInstaller)
{
// restart more recent installed Installer version
restartInstaller = true;
}
else if (step == Done)
{
#if defined(Q_OS_WIN) && !defined(_DEBUG)
// restart Installer, so it could be copied in TEMP and allowed to update itself
if (QProcess::startDetached(QApplication::applicationFilePath(), QApplication::arguments())) return 0;
restartInstaller = true;
#endif
}
}
if (restartInstaller)
{
#ifndef _DEBUG
nlinfo("Restart Installer %s", Q2C(config.getInstallerInstalledFilePath()));
#ifndef Q_OS_WIN32
// fix executable permissions under UNIX
QFile::setPermissions(config.getInstallerInstalledFilePath(), QFile::permissions(config.getInstallerInstalledFilePath()) | QFile::ExeGroup | QFile::ExeUser | QFile::ExeOther);
#endif
if (QProcess::startDetached(config.getInstallerInstalledFilePath())) return 0;
#endif
}
CMainWindow mainWindow;
mainWindow.show();

View file

@ -137,11 +137,19 @@ void CMainWindow::onPlayClicked()
arguments << profile.id;
arguments << profile.arguments.split(' ');
#ifndef Q_OS_WIN32
QFile::setPermissions(executable, QFile::permissions(executable) | QFile::ExeGroup | QFile::ExeUser | QFile::ExeOther);
#endif
// launch the game with all arguments and from server root directory (to use right data)
bool started = QProcess::startDetached(executable, arguments, server.getDirectory());
// define this profile as default one
if (started)
{
CConfigFile::getInstance()->setDefaultProfileIndex(profileIndex);
CConfigFile::getInstance()->save();
}
}
void CMainWindow::onConfigureClicked()
@ -164,9 +172,17 @@ void CMainWindow::onConfigureClicked()
arguments << "-p";
arguments << profile.id;
#ifndef Q_OS_WIN32
QFile::setPermissions(executable, QFile::permissions(executable) | QFile::ExeGroup | QFile::ExeUser | QFile::ExeOther);
#endif
bool started = QProcess::startDetached(executable, arguments);
if (started)
{
CConfigFile::getInstance()->setDefaultProfileIndex(profileIndex);
CConfigFile::getInstance()->save();
}
}
void CMainWindow::onProfiles()

View file

@ -38,7 +38,7 @@ CMigrateDialog::CMigrateDialog():QDialog()
if (!CConfigFile::getInstance()->isRyzomInstalledIn(m_currentDirectory))
{
// Ryzom is in the same directory as Ryzom Installer
m_currentDirectory = CConfigFile::getInstance()->getApplicationDirectory();
m_currentDirectory = CConfigFile::getInstance()->getInstallerCurrentDirPath();
if (!CConfigFile::getInstance()->isRyzomInstalledIn(m_currentDirectory))
{
@ -54,7 +54,9 @@ CMigrateDialog::CMigrateDialog():QDialog()
clientArchGroupBox->setVisible(false);
clientArch64RadioButton->setChecked(true);
clientArch32RadioButton->setChecked(false);
#else
#elif defined(Q_OS_WIN32)
// both 32 and 64 bits are working under Windows 64 bits
// check whether OS architecture is 32 or 64 bits
if (CConfigFile::has64bitsOS())
{
@ -70,6 +72,21 @@ CMigrateDialog::CMigrateDialog():QDialog()
clientArch64RadioButton->setChecked(false);
clientArch32RadioButton->setChecked(true);
}
#else
// only use the current architecture for Linux
clientArchGroupBox->setVisible(false);
#ifdef _LP64
// only 64 bits is available
clientArch64RadioButton->setChecked(true);
clientArch32RadioButton->setChecked(false);
#else
// only 32 bits is available
clientArch64RadioButton->setChecked(false);
clientArch32RadioButton->setChecked(true);
#endif
#endif
const CServer &server = CConfigFile::getInstance()->getServer();
@ -130,8 +147,16 @@ void CMigrateDialog::accept()
// check free disk space
qint64 freeSpace = NLMISC::CSystemInfo::availableHDSpace(m_dstDirectory.toUtf8().constData());
// shouldn't happen
if (freeSpace == 0)
{
int error = NLMISC::getLastError();
nlwarning("Error '%s' (%d) occured when trying to check free disk space on %s, continue anyway", NLMISC::formatErrorMessage(error).c_str(), error, Q2C(m_dstDirectory));
}
// compare with exact size of current directory
if (freeSpace < getDirectorySize(m_currentDirectory, true))
if (freeSpace && freeSpace < getDirectorySize(m_currentDirectory, true))
{
QMessageBox::StandardButton res = QMessageBox::warning(this, tr("Not enough free disk space"), tr("You don't have enough free space on this disk, please make more space or choose a directory on another disk."));
return;

View file

@ -0,0 +1,55 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "stdpch.h"
#include "operation.h"
#ifdef DEBUG_NEW
#define new DEBUG_NEW
#endif
QString stepToString(OperationStep step)
{
static QStringList s_operations;
if (s_operations.isEmpty())
{
s_operations << "DisplayNoServerError"
<< "ShowInstallWizard"
<< "ShowMigrateWizard"
<< "DownloadData"
<< "ExtractDownloadedData"
<< "DownloadClient"
<< "ExtractDownloadedClient"
<< "CopyDataFiles"
<< "CopyProfileFiles"
<< "CleanFiles"
<< "ExtractBnpClient"
<< "CopyInstaller"
<< "LaunchInstalledInstaller"
<< "UninstallOldClient"
<< "CreateProfile"
<< "CreateProfileShortcuts"
<< "CreateAddRemoveEntry"
<< "Done";
}
QString res;
if (step >= 0 && step < s_operations.size()) res += s_operations[step];
return QString("%1 (%2)").arg(res).arg(step);
}

View file

@ -31,6 +31,7 @@ public:
virtual void operationProgress(qint64 current, const QString &filename) =0;
virtual void operationSuccess(qint64 total) =0;
virtual void operationFail(const QString &error) =0;
virtual void operationContinue() = 0;
virtual bool operationShouldStop() =0;
};
@ -64,6 +65,7 @@ enum OperationStep
CleanFiles,
ExtractBnpClient,
CopyInstaller,
LaunchInstalledInstaller,
UninstallOldClient,
CreateProfile,
CreateProfileShortcuts,
@ -71,6 +73,8 @@ enum OperationStep
Done
};
QString stepToString(OperationStep);
enum OperationType
{
OperationNone,

View file

@ -199,6 +199,7 @@ void COperationDialog::processInstallNextStep()
break;
case Done:
case LaunchInstalledInstaller:
acceptDelayed();
break;
@ -724,24 +725,26 @@ void COperationDialog::copyInstaller()
m_currentOperation = tr("Copying installer to new location...");
QString destinationDirectory = config->getInstallationDirectory();
QString newInstallerFullPath = config->getInstallerInstalledFilePath();
// rename old client to installer
QString newInstallerFilename = config->getInstallerFilename();
if (!newInstallerFilename.isEmpty())
if (!newInstallerFullPath.isEmpty())
{
QString oldInstallerFullPath = QApplication::applicationFilePath();
QString newInstallerFullPath = config->getInstallationDirectory() + "/" + newInstallerFilename;
QString destinationDirectory = config->getInstallationDirectory();
QString oldInstallerFullPath = config->getInstallerCurrentFilePath();
QString srcDir = config->getInstallerCurrentDirPath();
// always copy new installers
CFilesCopier copier(this);
copier.setIncludeFilter(config->getInstallerRequiredFiles());
#ifndef Q_OS_MAC
copier.addFile(oldInstallerFullPath);
copier.setSourceDirectory(config->getSrcServerDirectory().isEmpty() ? QApplication::applicationDirPath():config->getSrcServerDirectory());
#endif
copier.setSourceDirectory(srcDir);
copier.setDestinationDirectory(config->getInstallationDirectory());
copier.exec();
if (!copier.exec()) return;
#ifndef Q_OS_MAC
// copied file
oldInstallerFullPath = config->getInstallationDirectory() + "/" + QFileInfo(oldInstallerFullPath).fileName();
@ -754,6 +757,7 @@ void COperationDialog::copyInstaller()
// rename new installer with final name
QFile::rename(oldInstallerFullPath, newInstallerFullPath);
}
#endif
// create menu directory if defined
QString path = config->getMenuDirectory();
@ -931,13 +935,9 @@ bool COperationDialog::createAddRemoveEntry()
{
CConfigFile *config = CConfigFile::getInstance();
QString newInstallerFilename = config->getInstallerFilename();
QString newInstallerFullPath = config->getInstallerInstalledFilePath();
if (!newInstallerFilename.isEmpty())
{
QString newInstallerFullPath = config->getInstallationDirectory() + "/" + newInstallerFilename;
if (QFile::exists(newInstallerFullPath))
if (!newInstallerFullPath.isEmpty() && QFile::exists(newInstallerFullPath))
{
#ifdef Q_OS_WIN
QSettings settings("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Ryzom", QSettings::NativeFormat);
@ -961,7 +961,6 @@ bool COperationDialog::createAddRemoveEntry()
// ModifyPath
#endif
}
}
updateAddRemoveEntry();
@ -974,14 +973,12 @@ bool COperationDialog::updateAddRemoveEntry()
{
CConfigFile *config = CConfigFile::getInstance();
QString newInstallerFullPath = config->getInstallerInstalledFilePath();
if (!newInstallerFullPath.isEmpty() && QFile::exists(newInstallerFullPath))
{
QString newInstallerFilename = config->getInstallerFilename();
if (!newInstallerFilename.isEmpty())
{
QString newInstallerFullPath = config->getInstallationDirectory() + "/" + newInstallerFilename;
if (QFile::exists(newInstallerFullPath))
{
#ifdef Q_OS_WIN
QSettings settings("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Ryzom", QSettings::NativeFormat);
@ -995,7 +992,6 @@ bool COperationDialog::updateAddRemoveEntry()
settings.setValue("MinorVersion", versionTokens[1].toInt());
#endif
}
}
return true;
}
@ -1161,7 +1157,7 @@ void COperationDialog::deleteComponentsInstaller()
dir.removeRecursively();
}
path = config->getInstallerOriginalDirPath();
path = config->getInstallerInstalledDirPath();
QStringList files = config->getInstallerRequiredFiles();
foreach(const QString &file, files)
@ -1268,6 +1264,11 @@ void COperationDialog::operationFail(const QString &error)
emit fail(error);
}
void COperationDialog::operationContinue()
{
emit done();
}
bool COperationDialog::operationShouldStop()
{
QMutexLocker locker(&m_abortingMutex);

View file

@ -129,6 +129,7 @@ protected:
virtual void operationProgress(qint64 current, const QString &filename);
virtual void operationSuccess(qint64 total);
virtual void operationFail(const QString &error);
virtual void operationContinue();
virtual bool operationShouldStop();

View file

@ -269,7 +269,18 @@ void CProfilesDialog::onExecutableBrowseClicked()
if (executable.isEmpty()) executable = defaultExecutable;
executable = QFileDialog::getOpenFileName(this, tr("Please choose Ryzom client executable to launch"), executable, tr("Executables (*.exe)"));
QString filter;
#ifdef Q_OS_WIN32
filter = tr("Executables (*.exe)");
#else
filter = tr("Executables (*)");
#endif
QFileDialog open;
open.setFilter(QDir::Executable | QDir::NoDotAndDotDot | QDir::Files);
executable = open.getOpenFileName(this, tr("Please choose Ryzom client executable to launch"), executable, filter);
if (executable.isEmpty()) return;

View file

@ -52,6 +52,38 @@ void CServer::loadFromSettings(const QSettings &settings)
comments = settings.value("comments").toString();
}
void CServer::loadFromServers(const CServers &servers)
{
foreach(const CServer &server, servers)
{
if (server.id == id)
{
// found the same server
loadFromServer(server);
break;
}
}
}
void CServer::loadFromServer(const CServer &server)
{
// copy all members
id = server.id;
name = server.name;
displayUrl = server.displayUrl;
filesListUrl = server.filesListUrl;
dataDownloadUrl = server.dataDownloadUrl;
dataDownloadFilename = server.dataDownloadFilename;
dataCompressedSize = server.dataCompressedSize;
dataUncompressedSize = server.dataUncompressedSize;
clientDownloadUrl = server.clientDownloadUrl;
clientDownloadFilename = server.clientDownloadFilename;
clientFilename = server.clientFilename;
clientFilenameOld = server.clientFilenameOld;
configurationFilename = server.configurationFilename;
comments = server.comments;
}
void CServer::saveToSettings(QSettings &settings) const
{
settings.setValue("id", id);

View file

@ -19,6 +19,10 @@
#include "operation.h"
class CServer;
typedef QVector<CServer> CServers;
class CServer
{
public:
@ -44,6 +48,8 @@ public:
QString comments;
void loadFromSettings(const QSettings &settings);
void loadFromServers(const CServers &servers);
void loadFromServer(const CServer &server);
void saveToSettings(QSettings &settings) const;
// helpers
@ -55,6 +61,4 @@ public:
extern const CServer NoServer;
typedef QVector<CServer> CServers;
#endif

View file

@ -54,8 +54,10 @@
#include <string>
#include <nel/misc/types_nl.h>
#include <nel/misc/config_file.h>
#include "nel/misc/types_nl.h"
#include "nel/misc/debug.h"
#include "nel/misc/path.h"
#include "nel/misc/system_info.h"
#endif

View file

@ -408,6 +408,14 @@ QString appendShortcutExtension(const QString &shortcut)
QString getVersionFromExecutable(const QString &path)
{
// check if file exists
if (!QFile::exists(path)) return "";
#ifndef Q_OS_WIN32
// fix executable permissions under UNIX
QFile::setPermissions(path, QFile::permissions(path) | QFile::ExeGroup | QFile::ExeUser | QFile::ExeOther);
#endif
// launch executable with --version argument
QProcess process;
process.setProcessChannelMode(QProcess::MergedChannels);
@ -555,3 +563,51 @@ CCOMHelper::~CCOMHelper()
if (m_mustUninit) CoUninitialize();
#endif
}
CLogHelper::CLogHelper(const QString &logPath)
{
// disable nldebug messages in logs in Release
#ifdef NL_RELEASE
NLMISC::DisableNLDebug = true;
#endif
// don't create a file for the moment, we'll create it manually
NLMISC::createDebug(NULL, false);
// ryzom_installer.Log displayer
NLMISC::CFileDisplayer *LogDisplayer = new NLMISC::CFileDisplayer(qToUtf8(logPath) + "/ryzom_installer.log", true, "DEFAULT_FD");
NLMISC::DebugLog->addDisplayer(LogDisplayer);
NLMISC::InfoLog->addDisplayer(LogDisplayer);
NLMISC::WarningLog->addDisplayer(LogDisplayer);
NLMISC::ErrorLog->addDisplayer(LogDisplayer);
NLMISC::AssertLog->addDisplayer(LogDisplayer);
std::string type;
#ifdef NL_RELEASE
type = "RELEASE";
#else
type = "DEBUG";
#endif
// Display installer version
nlinfo("RYZOM INSTALLER VERSION: %s (%s)", Q2C(QApplication::applicationVersion()), type.c_str());
nlinfo("Memory: %s/%s", NLMISC::bytesToHumanReadable(NLMISC::CSystemInfo::availablePhysicalMemory()).c_str(), NLMISC::bytesToHumanReadable(NLMISC::CSystemInfo::totalPhysicalMemory()).c_str());
nlinfo("OS: %s", NLMISC::CSystemInfo::getOS().c_str());
nlinfo("Processor: %s", NLMISC::CSystemInfo::getProc().c_str());
}
CLogHelper::~CLogHelper()
{
NLMISC::IDisplayer *LogDisplayer = NLMISC::ErrorLog->getDisplayer("DEFAULT_FD");
if (LogDisplayer)
{
NLMISC::DebugLog->removeDisplayer(LogDisplayer);
NLMISC::InfoLog->removeDisplayer(LogDisplayer);
NLMISC::WarningLog->removeDisplayer(LogDisplayer);
NLMISC::ErrorLog->removeDisplayer(LogDisplayer);
NLMISC::AssertLog->removeDisplayer(LogDisplayer);
delete LogDisplayer;
}
}

View file

@ -58,6 +58,8 @@ QString qFromWide(const wchar_t *str);
// convert an QString to wchar_t*
wchar_t* qToWide(const QString &str);
#define Q2C(x) qToUtf8(x).c_str()
// check if a shortcut already exists (the extension will be added)
bool shortcutExists(const QString &shortcut);
@ -92,4 +94,12 @@ public:
~CCOMHelper();
};
// a little helper class to init/uninit log
class CLogHelper
{
public:
CLogHelper(const QString &logPath);
~CLogHelper();
};
#endif

View file

@ -39,85 +39,82 @@
<translation>Falscher Status-Code: %1</translation>
</message>
<message>
<location filename="../src/downloader.cpp" line="388"/>
<location filename="../src/downloader.cpp" line="382"/>
<source>HTTP error: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Network error: %1</source>
<translation>Netzwerk-Fehler: %1</translation>
<translation type="vanished">Netzwerk-Fehler: %1</translation>
</message>
</context>
<context>
<name>CInstallDialog</name>
<message>
<location filename="../src/installdialog.cpp" line="45"/>
<source>Old installation: %1</source>
<translation>Alte Installation: %1</translation>
<translation type="vanished">Alte Installation: %1</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="69"/>
<source>Internet (%1 to download)</source>
<translation>Internet (%1 herunterzuladen)</translation>
<translation type="vanished">Internet (%1 herunterzuladen)</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="70"/>
<location filename="../src/installdialog.cpp" line="80"/>
<source>Files will be installed to (requires %1):</source>
<translation>Dateien werden installiert nach (benötigt %1):</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="103"/>
<source>Please choose directory where Ryzom is currently installed.</source>
<translation>Bitte wähle das Verzeichnis, in dem Ryzom momentan installiert ist.</translation>
<translation type="vanished">Bitte wähle das Verzeichnis, in dem Ryzom momentan installiert ist.</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="109"/>
<source>Unable to find Ryzom</source>
<translation>Ryzom konnte nicht gefunden werden</translation>
<translation type="vanished">Ryzom konnte nicht gefunden werden</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="109"/>
<source>Unable to find Ryzom in selected directory. Please choose another one or cancel.</source>
<translation>Ryzom konnte im gewählten Verzeichnis nicht gefunden werden. Wähle bitte ein anderes Verzeichnis oder brich ab.</translation>
<translation type="vanished">Ryzom konnte im gewählten Verzeichnis nicht gefunden werden. Wähle bitte ein anderes Verzeichnis oder brich ab.</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="129"/>
<location filename="../src/installdialog.cpp" line="115"/>
<source>Please choose directory to install Ryzom in</source>
<translation>Bitte wähle ein Verzeichnis, in dem Ryzom installiert werden soll.</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="140"/>
<source>Another location: %1</source>
<translation>Ein anderer Ort: %1</translation>
<translation type="vanished">Ein anderer Ort: %1</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="140"/>
<source>Undefined</source>
<translation>Undefiniert</translation>
<translation type="vanished">Undefiniert</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="157"/>
<location filename="../src/installdialog.cpp" line="138"/>
<source>Not enough free disk space</source>
<translation>Nicht genügend freier Festplattenspeicher</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="157"/>
<location filename="../src/installdialog.cpp" line="138"/>
<source>You don&apos;t have enough free space on this disk, please make more space or choose a directory on another disk.</source>
<translation>Auf diesem Laufwerk ist nicht genügend freier Speicher verfügbar, bitte schaffe mehr Platz oder wähle ein Verzeichnis auf einem anderen Laufwerk.</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="185"/>
<location filename="../src/installdialog.cpp" line="157"/>
<source>Unable to write in directory</source>
<translation>In das Verzeichnis konnte nicht geschrieben werden</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="185"/>
<location filename="../src/installdialog.cpp" line="157"/>
<source>You don&apos;t have the permission to write in this directory with your current user account, please choose another directory.</source>
<translation>Du hast nicht die Berechtigungen, um mit deinem derzeitigen Benutzer-Konto in dieses Verzeichnis zu schreiben, bitte wähle ein anderes Verzeichnis.</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="191"/>
<location filename="../src/installdialog.cpp" line="166"/>
<source>Directory not empty</source>
<translation>Verzeichnist ist nicht leer</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="191"/>
<location filename="../src/installdialog.cpp" line="166"/>
<source>This directory is not empty, please choose another one.</source>
<translation>Dieses Verzeichnis ist nicht leer, bitte wähle ein anderes.</translation>
</message>
@ -125,27 +122,27 @@
<context>
<name>CMainWindow</name>
<message>
<location filename="../src/mainwindow.cpp" line="268"/>
<location filename="../src/mainwindow.cpp" line="270"/>
<source>About %1</source>
<translation>Über %1</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="270"/>
<location filename="../src/mainwindow.cpp" line="272"/>
<source>Program to install, download and manage Ryzom profiles.</source>
<translation>Programm, um Ryzom-Profile zu installieren, herunterzuladen und zu verwalten.</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="272"/>
<location filename="../src/mainwindow.cpp" line="274"/>
<source>Author: %1</source>
<translation>Autor: %1</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="273"/>
<location filename="../src/mainwindow.cpp" line="275"/>
<source>Copyright: %1</source>
<translation>Copyright: %1</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="274"/>
<location filename="../src/mainwindow.cpp" line="276"/>
<source>Support: %1</source>
<translation>Support: %1</translation>
</message>
@ -153,42 +150,42 @@
<context>
<name>CMigrateDialog</name>
<message>
<location filename="../src/migratedialog.cpp" line="66"/>
<location filename="../src/migratedialog.cpp" line="94"/>
<source>Files will be installed to (requires %1):</source>
<translation>Dateien werden installiert nach (benötigt %1):</translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="103"/>
<location filename="../src/migratedialog.cpp" line="131"/>
<source>Please choose directory to install Ryzom in</source>
<translation>Bitte wähle ein Verzeichnis, in dem Ryzom installiert werden soll.</translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="126"/>
<location filename="../src/migratedialog.cpp" line="153"/>
<source>Not enough free disk space</source>
<translation>Nicht genügend freier Festplattenspeicher</translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="126"/>
<location filename="../src/migratedialog.cpp" line="153"/>
<source>You don&apos;t have enough free space on this disk, please make more space or choose a directory on another disk.</source>
<translation>Auf diesem Laufwerk ist nicht genügend freier Speicher verfügbar, bitte schaffe mehr Platz oder wähle ein Verzeichnis auf einem anderen Laufwerk.</translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="154"/>
<location filename="../src/migratedialog.cpp" line="172"/>
<source>Unable to write in directory</source>
<translation>Kann nicht in dieses Verzeichnis schreiben</translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="154"/>
<location filename="../src/migratedialog.cpp" line="172"/>
<source>You don&apos;t have the permission to write in this directory with your current user account, please choose another directory.</source>
<translation>Du hast nicht die Berechtigungen, mit deinem derzeitigen Benutzer-Konto in dieses Verzeichnis zu schreiben, bitte wähle ein anderes Verzeichnis.</translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="160"/>
<location filename="../src/migratedialog.cpp" line="181"/>
<source>Directory not empty</source>
<translation>Verzeichnis ist nicht leer</translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="160"/>
<location filename="../src/migratedialog.cpp" line="181"/>
<source>This directory is not empty, please choose another one.</source>
<translation>Dieses Verzeichnis ist nicht leer, bitte wähle ein anderes.</translation>
</message>
@ -200,109 +197,109 @@
<translation type="vanished">Profile aktualisieren</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="261"/>
<location filename="../src/operationdialog.cpp" line="275"/>
<source>Updating profiles...</source>
<translation>Aktualisiere Profile...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="412"/>
<location filename="../src/operationdialog.cpp" line="428"/>
<source>Confirmation</source>
<translation>Bestätigung</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="412"/>
<location filename="../src/operationdialog.cpp" line="428"/>
<source>Warning, this server doesn&apos;t support resume! If you stop download now, you won&apos;t be able to resume it later.
Are you sure to abort download?</source>
<translation>Warnung: dieser Server unterstützt kein Fortsetzen! Wenn du jetzt den Download abbrichst, wirst du nicht in der Lage sein, ihn später wieder fortzusetzen.
Willst du den Download wirklich abbrechen?</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="437"/>
<location filename="../src/operationdialog.cpp" line="453"/>
<source>%p% (%v/%m KiB)</source>
<translation>%p% (%v/%m KiB)</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="497"/>
<location filename="../src/operationdialog.cpp" line="513"/>
<source>Error</source>
<translation>Fehler</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="518"/>
<location filename="../src/operationdialog.cpp" line="534"/>
<source>Downloading data required by server %1...</source>
<translation>Herunterzuladende Daten benötigt von Server %1...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="529"/>
<location filename="../src/operationdialog.cpp" line="545"/>
<source>Extracting data required by server %1...</source>
<translation>Zu extrahierende Daten benötigt von Server %1...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="551"/>
<location filename="../src/operationdialog.cpp" line="569"/>
<source>Downloading client required by server %1...</source>
<translation>Herunterzuladender Client benötigt von Server %1...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="562"/>
<location filename="../src/operationdialog.cpp" line="580"/>
<source>Extracting client required by server %1...</source>
<translation>Zu extrahierender Client benötigt von Server %1...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="589"/>
<location filename="../src/operationdialog.cpp" line="602"/>
<source>Copying data required by server %1...</source>
<translation>Zu kopierende Daten benötigt von Server %1...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="623"/>
<location filename="../src/operationdialog.cpp" line="631"/>
<source>Copying old profile to new location...</source>
<translation>Kopiere alte Profile zum neuen Zielort...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="658"/>
<location filename="../src/operationdialog.cpp" line="661"/>
<source>Extracting client to new location...</source>
<translation>Extrahiere Client an neuem Zielort...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="725"/>
<location filename="../src/operationdialog.cpp" line="726"/>
<source>Copying installer to new location...</source>
<translation>Kopiere Installer zum neuen Zielort...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="844"/>
<location filename="../src/operationdialog.cpp" line="847"/>
<source>Cleaning obsolete files...</source>
<translation>Bereinige überholte Dateien...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="859"/>
<location filename="../src/operationdialog.cpp" line="862"/>
<source>Creating default profile...</source>
<translation>Erstelle Standard-Profile...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="918"/>
<location filename="../src/operationdialog.cpp" line="921"/>
<source>Creating shortcuts for profile %1...</source>
<translation>Erstelle Verknüpfungen für Profile %1...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1022"/>
<location filename="../src/operationdialog.cpp" line="1007"/>
<source>Deleting client...</source>
<translation>Lösche Client...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1079"/>
<location filename="../src/operationdialog.cpp" line="1067"/>
<source>Adding profiles...</source>
<translation>Füge Profile hinzu...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1099"/>
<location filename="../src/operationdialog.cpp" line="1087"/>
<source>Deleting profiles...</source>
<translation>Lösche Profile...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1149"/>
<location filename="../src/operationdialog.cpp" line="1140"/>
<source>Deleting installer...</source>
<translation>Lösche Installer...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1191"/>
<location filename="../src/operationdialog.cpp" line="1192"/>
<source>Deleting downloaded files...</source>
<translation>Lösche heruntergeladene Dateien...</translation>
</message>
@ -352,12 +349,12 @@ Willst du den Download wirklich abbrechen?</translation>
<translation type="vanished">Kopiere Installer an neuen Ort</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="809"/>
<location filename="../src/operationdialog.cpp" line="812"/>
<source>Uninstall old client</source>
<translation>Deinstalliere alten Client</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="809"/>
<location filename="../src/operationdialog.cpp" line="812"/>
<source>An old version of Ryzom has been detected on this system, would you like to uninstall it to save space disk?</source>
<translation>Eine ältere Version von Ryzom wurde auf diesem System gefunden, möchtest du sie deinstallieren, um Festplattenspeicher zu sparen?</translation>
</message>
@ -382,7 +379,7 @@ Willst du den Download wirklich abbrechen?</translation>
<translation type="vanished">Lösche Client-Dateien</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1052"/>
<location filename="../src/operationdialog.cpp" line="1037"/>
<source>Unable to delete files for client %1</source>
<translation>Dateien für Client %1 konnten nicht gelöscht werden</translation>
</message>
@ -403,7 +400,7 @@ Willst du den Download wirklich abbrechen?</translation>
<translation type="vanished">Lösche Profil %1...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1128"/>
<location filename="../src/operationdialog.cpp" line="1116"/>
<source>Unable to delete files for profile %1</source>
<translation>Dateien für Profil %1 konnten nicht gelöscht werden</translation>
</message>
@ -419,24 +416,34 @@ Willst du den Download wirklich abbrechen?</translation>
<context>
<name>CProfilesDialog</name>
<message>
<location filename="../src/profilesdialog.cpp" line="71"/>
<location filename="../src/profilesdialog.cpp" line="69"/>
<source>Error</source>
<translation type="unfinished">Fehler</translation>
</message>
<message>
<location filename="../src/profilesdialog.cpp" line="86"/>
<source>Confirmation</source>
<translation>Bestätigung</translation>
</message>
<message>
<location filename="../src/profilesdialog.cpp" line="71"/>
<location filename="../src/profilesdialog.cpp" line="86"/>
<source>You&apos;re going to delete a profile, files won&apos;t be deleted and you&apos;ll have to do that manually.
Are you sure to delete this profile?</source>
<translation>Du bist dabei, ein Profil zu löschen. Es werden keine Dateien gelöscht, das musst du manuell tun.
Bist du sicher, dass du dieses Profil löschen willst?</translation>
</message>
<message>
<location filename="../src/profilesdialog.cpp" line="257"/>
<location filename="../src/profilesdialog.cpp" line="277"/>
<source>Executables (*)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/profilesdialog.cpp" line="283"/>
<source>Please choose Ryzom client executable to launch</source>
<translation>Bitte wähle die ausführbare Datei, um den Ryzom-Client zu starten</translation>
</message>
<message>
<location filename="../src/profilesdialog.cpp" line="257"/>
<location filename="../src/profilesdialog.cpp" line="275"/>
<source>Executables (*.exe)</source>
<translation>Ausführbare Dateien (*.exe)</translation>
</message>
@ -516,9 +523,8 @@ Folge den verschiedenen Schritten und wähle aus den Optionen, die dir angeboten
<translation>Zeige erweiterte Parameter (Experte)</translation>
</message>
<message>
<location filename="../ui/installdialog.ui" line="97"/>
<source>Files will be installed from:</source>
<translation>Dateien werden installiert von:</translation>
<translation type="vanished">Dateien werden installiert von:</translation>
</message>
<message>
<source>Old installation: %1</source>
@ -529,8 +535,7 @@ Folge den verschiedenen Schritten und wähle aus den Optionen, die dir angeboten
<translation type="vanished">Ein anderer Ort: %1</translation>
</message>
<message>
<location filename="../ui/installdialog.ui" line="128"/>
<location filename="../ui/installdialog.ui" line="167"/>
<location filename="../ui/installdialog.ui" line="111"/>
<source>Browse...</source>
<translation>Durchsuchen...</translation>
</message>
@ -547,22 +552,22 @@ Folge den verschiedenen Schritten und wähle aus den Optionen, die dir angeboten
<translation type="vanished">c:\</translation>
</message>
<message>
<location filename="../ui/installdialog.ui" line="160"/>
<location filename="../ui/installdialog.ui" line="104"/>
<source>Default</source>
<translation>Standard</translation>
</message>
<message>
<location filename="../ui/installdialog.ui" line="177"/>
<location filename="../ui/installdialog.ui" line="121"/>
<source>Do you prefer to use a 64 or 32 bit client?</source>
<translation>Möchtest du einen 64 bit oder 32 bit-Client verwenden?</translation>
</message>
<message>
<location filename="../ui/installdialog.ui" line="183"/>
<location filename="../ui/installdialog.ui" line="127"/>
<source>64 bit (recommended)</source>
<translation>64 bit (empfohlen)</translation>
</message>
<message>
<location filename="../ui/installdialog.ui" line="193"/>
<location filename="../ui/installdialog.ui" line="137"/>
<source>32 bit</source>
<translation>32 bit</translation>
</message>
@ -587,53 +592,53 @@ p, li { white-space: pre-wrap; }
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="86"/>
<location filename="../ui/mainwindow.ui" line="80"/>
<source>Atys</source>
<translation>Atys</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="94"/>
<location filename="../ui/mainwindow.ui" line="88"/>
<source>Play</source>
<translation>Spielen</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="101"/>
<location filename="../ui/mainwindow.ui" line="95"/>
<source>Configure</source>
<translation>Konfigurieren</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="121"/>
<location filename="../ui/mainwindow.ui" line="156"/>
<location filename="../ui/mainwindow.ui" line="115"/>
<location filename="../ui/mainwindow.ui" line="150"/>
<source>&amp;Settings</source>
<translation>&amp;Einstellungen</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="131"/>
<location filename="../ui/mainwindow.ui" line="125"/>
<source>&amp;Help</source>
<translation>&amp;Hilfe</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="141"/>
<location filename="../ui/mainwindow.ui" line="135"/>
<source>About Qt</source>
<translation>Über Qt</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="146"/>
<location filename="../ui/mainwindow.ui" line="140"/>
<source>About...</source>
<translation>Über...</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="151"/>
<location filename="../ui/mainwindow.ui" line="145"/>
<source>&amp;Profiles</source>
<translation>&amp;Profile</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="161"/>
<location filename="../ui/mainwindow.ui" line="155"/>
<source>&amp;Quit</source>
<translation>&amp;Beenden</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="166"/>
<location filename="../ui/mainwindow.ui" line="160"/>
<source>&amp;Uninstall</source>
<translation>&amp;Deinstallieren</translation>
</message>
@ -672,37 +677,37 @@ Drücke Weiter und folge den verschiedenen Schritten bis zum Ende.</translation>
<translation type="vanished">c:\</translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="107"/>
<location filename="../ui/migratedialog.ui" line="101"/>
<source>Default</source>
<translation>Standard</translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="114"/>
<location filename="../ui/migratedialog.ui" line="108"/>
<source>Browse...</source>
<translation>Durchsuchen...</translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="124"/>
<location filename="../ui/migratedialog.ui" line="118"/>
<source>Do you prefer to use a 64 or 32 bit client?</source>
<translation>Möchtest du einen 64 bit oder 32 bit-Client verwenden?</translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="130"/>
<location filename="../ui/migratedialog.ui" line="124"/>
<source>64 bit (recommended)</source>
<translation>64 bit (empfohlen)</translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="140"/>
<location filename="../ui/migratedialog.ui" line="134"/>
<source>32 bit</source>
<translation>32 bit</translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="168"/>
<location filename="../ui/migratedialog.ui" line="162"/>
<source>Continue</source>
<translation>Weiter</translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="175"/>
<location filename="../ui/migratedialog.ui" line="169"/>
<source>Quit</source>
<translation>Beenden</translation>
</message>
@ -873,69 +878,74 @@ Drücke Weiter und folge den verschiedenen Schritten bis zum Ende.</translation>
<translation>Selbstinstallation</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="300"/>
<location filename="../src/filesextractor.cpp" line="540"/>
<location filename="../src/filesextractor.cpp" line="322"/>
<location filename="../src/filesextractor.cpp" line="580"/>
<source>Unable to open %1</source>
<translation>%1 konnte nicht geöffnet werden</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="415"/>
<location filename="../src/filesextractor.cpp" line="437"/>
<source>Unable to open output file</source>
<translation>Ausgabe-Datei konnte nicht geöffnet werden</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="424"/>
<location filename="../src/filesextractor.cpp" line="446"/>
<source>Unable to write output file</source>
<translation>Ausgabe-Datei konnte nicht geschrieben werden</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="459"/>
<location filename="../src/filesextractor.cpp" line="467"/>
<location filename="../src/filesextractor.cpp" line="495"/>
<location filename="../src/filesextractor.cpp" line="503"/>
<source>7zip decoder doesn&apos;t support this archive</source>
<translation>7zip-Decoder unterstützt dieses Archiv nicht</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="463"/>
<location filename="../src/filesextractor.cpp" line="499"/>
<source>Unable to allocate memory</source>
<translation>Speicher konnte nicht zugewiesen werden</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="475"/>
<location filename="../src/filesextractor.cpp" line="507"/>
<source>File %1 is corrupted, unable to uncompress it</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="515"/>
<source>Error %1</source>
<translation>Fehler %1</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="502"/>
<location filename="../src/filesextractor.cpp" line="542"/>
<source>Unable to create directory %1</source>
<translation>Verzeichnis %1 konnte nicht erstellt werden</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="508"/>
<location filename="../src/filesextractor.cpp" line="548"/>
<source>Unable to set permissions of %1</source>
<translation>Berechtigungen für %1 konnten nicht gesetzt werden</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="617"/>
<location filename="../src/filesextractor.cpp" line="663"/>
<source>disk full</source>
<translation>Festplatte voll</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="621"/>
<location filename="../src/filesextractor.cpp" line="667"/>
<source>unable to write %1</source>
<translation>Konnte %1 nicht schreiben</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="625"/>
<location filename="../src/filesextractor.cpp" line="671"/>
<source>unable to read %1</source>
<translation>Konnte %1 nicht lesen</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="629"/>
<location filename="../src/filesextractor.cpp" line="675"/>
<source>failed (%1)</source>
<translation>Fehlgeschlagen (%1)</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="632"/>
<location filename="../src/filesextractor.cpp" line="678"/>
<source>Unable to unpack %1 to %2: %3</source>
<translation>Konnte %1 nicht nach %2 entpacken: %3</translation>
</message>
@ -944,36 +954,46 @@ Drücke Weiter und folge den verschiedenen Schritten bis zum Ende.</translation>
<source>Unable to copy file %1</source>
<translation>Konnte Datei %1 nicht kopieren</translation>
</message>
<message>
<location filename="../src/profile.cpp" line="58"/>
<source>Profile ID %1 is using invalid characters (only lowercase letters, numbers and underscore are allowed)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/profile.cpp" line="68"/>
<source>Profile name %1 is using invalid character %2 at position %3</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../src/utils.cpp" line="30"/>
<location filename="../src/utils.cpp" line="33"/>
<source>B</source>
<translation>B</translation>
</message>
<message>
<location filename="../src/utils.cpp" line="31"/>
<location filename="../src/utils.cpp" line="34"/>
<source>KiB</source>
<translation>KiB</translation>
</message>
<message>
<location filename="../src/utils.cpp" line="32"/>
<location filename="../src/utils.cpp" line="35"/>
<source>MiB</source>
<translation>MiB</translation>
</message>
<message>
<location filename="../src/utils.cpp" line="33"/>
<location filename="../src/utils.cpp" line="36"/>
<source>GiB</source>
<translation>GiB</translation>
</message>
<message>
<location filename="../src/utils.cpp" line="34"/>
<location filename="../src/utils.cpp" line="37"/>
<source>TiB</source>
<translation>TiB</translation>
</message>
<message>
<location filename="../src/utils.cpp" line="35"/>
<location filename="../src/utils.cpp" line="38"/>
<source>PiB</source>
<translation>PiB</translation>
</message>

View file

@ -39,85 +39,50 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/downloader.cpp" line="388"/>
<source>Network error: %1</source>
<location filename="../src/downloader.cpp" line="382"/>
<source>HTTP error: %1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CInstallDialog</name>
<message>
<location filename="../src/installdialog.cpp" line="45"/>
<source>Old installation: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="69"/>
<source>Internet (%1 to download)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="70"/>
<location filename="../src/installdialog.cpp" line="80"/>
<source>Files will be installed to (requires %1):</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="103"/>
<source>Please choose directory where Ryzom is currently installed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="109"/>
<source>Unable to find Ryzom</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="109"/>
<source>Unable to find Ryzom in selected directory. Please choose another one or cancel.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="129"/>
<location filename="../src/installdialog.cpp" line="115"/>
<source>Please choose directory to install Ryzom in</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="140"/>
<source>Another location: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="140"/>
<source>Undefined</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="157"/>
<location filename="../src/installdialog.cpp" line="138"/>
<source>Not enough free disk space</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="157"/>
<location filename="../src/installdialog.cpp" line="138"/>
<source>You don&apos;t have enough free space on this disk, please make more space or choose a directory on another disk.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="185"/>
<location filename="../src/installdialog.cpp" line="157"/>
<source>Unable to write in directory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="185"/>
<location filename="../src/installdialog.cpp" line="157"/>
<source>You don&apos;t have the permission to write in this directory with your current user account, please choose another directory.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="191"/>
<location filename="../src/installdialog.cpp" line="166"/>
<source>Directory not empty</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="191"/>
<location filename="../src/installdialog.cpp" line="166"/>
<source>This directory is not empty, please choose another one.</source>
<translation type="unfinished"></translation>
</message>
@ -125,27 +90,27 @@
<context>
<name>CMainWindow</name>
<message>
<location filename="../src/mainwindow.cpp" line="268"/>
<location filename="../src/mainwindow.cpp" line="270"/>
<source>About %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="270"/>
<location filename="../src/mainwindow.cpp" line="272"/>
<source>Program to install, download and manage Ryzom profiles.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="272"/>
<location filename="../src/mainwindow.cpp" line="274"/>
<source>Author: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="273"/>
<location filename="../src/mainwindow.cpp" line="275"/>
<source>Copyright: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="274"/>
<location filename="../src/mainwindow.cpp" line="276"/>
<source>Support: %1</source>
<translation type="unfinished"></translation>
</message>
@ -153,42 +118,42 @@
<context>
<name>CMigrateDialog</name>
<message>
<location filename="../src/migratedialog.cpp" line="66"/>
<location filename="../src/migratedialog.cpp" line="94"/>
<source>Files will be installed to (requires %1):</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="103"/>
<location filename="../src/migratedialog.cpp" line="131"/>
<source>Please choose directory to install Ryzom in</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="126"/>
<location filename="../src/migratedialog.cpp" line="153"/>
<source>Not enough free disk space</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="126"/>
<location filename="../src/migratedialog.cpp" line="153"/>
<source>You don&apos;t have enough free space on this disk, please make more space or choose a directory on another disk.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="154"/>
<location filename="../src/migratedialog.cpp" line="172"/>
<source>Unable to write in directory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="154"/>
<location filename="../src/migratedialog.cpp" line="172"/>
<source>You don&apos;t have the permission to write in this directory with your current user account, please choose another directory.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="160"/>
<location filename="../src/migratedialog.cpp" line="181"/>
<source>Directory not empty</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="160"/>
<location filename="../src/migratedialog.cpp" line="181"/>
<source>This directory is not empty, please choose another one.</source>
<translation type="unfinished"></translation>
</message>
@ -196,128 +161,128 @@
<context>
<name>COperationDialog</name>
<message>
<location filename="../src/operationdialog.cpp" line="261"/>
<location filename="../src/operationdialog.cpp" line="275"/>
<source>Updating profiles...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="412"/>
<location filename="../src/operationdialog.cpp" line="428"/>
<source>Confirmation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="412"/>
<location filename="../src/operationdialog.cpp" line="428"/>
<source>Warning, this server doesn&apos;t support resume! If you stop download now, you won&apos;t be able to resume it later.
Are you sure to abort download?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="437"/>
<location filename="../src/operationdialog.cpp" line="453"/>
<source>%p% (%v/%m KiB)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="497"/>
<location filename="../src/operationdialog.cpp" line="513"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="518"/>
<location filename="../src/operationdialog.cpp" line="534"/>
<source>Downloading data required by server %1...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="529"/>
<location filename="../src/operationdialog.cpp" line="545"/>
<source>Extracting data required by server %1...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="551"/>
<location filename="../src/operationdialog.cpp" line="569"/>
<source>Downloading client required by server %1...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="562"/>
<location filename="../src/operationdialog.cpp" line="580"/>
<source>Extracting client required by server %1...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="589"/>
<location filename="../src/operationdialog.cpp" line="602"/>
<source>Copying data required by server %1...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="623"/>
<location filename="../src/operationdialog.cpp" line="631"/>
<source>Copying old profile to new location...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="658"/>
<location filename="../src/operationdialog.cpp" line="661"/>
<source>Extracting client to new location...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="725"/>
<location filename="../src/operationdialog.cpp" line="726"/>
<source>Copying installer to new location...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="844"/>
<location filename="../src/operationdialog.cpp" line="847"/>
<source>Cleaning obsolete files...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="859"/>
<location filename="../src/operationdialog.cpp" line="862"/>
<source>Creating default profile...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="918"/>
<location filename="../src/operationdialog.cpp" line="921"/>
<source>Creating shortcuts for profile %1...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1022"/>
<location filename="../src/operationdialog.cpp" line="1007"/>
<source>Deleting client...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1079"/>
<location filename="../src/operationdialog.cpp" line="1067"/>
<source>Adding profiles...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1099"/>
<location filename="../src/operationdialog.cpp" line="1087"/>
<source>Deleting profiles...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1149"/>
<location filename="../src/operationdialog.cpp" line="1140"/>
<source>Deleting installer...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1191"/>
<location filename="../src/operationdialog.cpp" line="1192"/>
<source>Deleting downloaded files...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="809"/>
<location filename="../src/operationdialog.cpp" line="812"/>
<source>Uninstall old client</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="809"/>
<location filename="../src/operationdialog.cpp" line="812"/>
<source>An old version of Ryzom has been detected on this system, would you like to uninstall it to save space disk?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1052"/>
<location filename="../src/operationdialog.cpp" line="1037"/>
<source>Unable to delete files for client %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1128"/>
<location filename="../src/operationdialog.cpp" line="1116"/>
<source>Unable to delete files for profile %1</source>
<translation type="unfinished"></translation>
</message>
@ -325,23 +290,33 @@ Are you sure to abort download?</source>
<context>
<name>CProfilesDialog</name>
<message>
<location filename="../src/profilesdialog.cpp" line="71"/>
<location filename="../src/profilesdialog.cpp" line="69"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/profilesdialog.cpp" line="86"/>
<source>Confirmation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/profilesdialog.cpp" line="71"/>
<location filename="../src/profilesdialog.cpp" line="86"/>
<source>You&apos;re going to delete a profile, files won&apos;t be deleted and you&apos;ll have to do that manually.
Are you sure to delete this profile?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/profilesdialog.cpp" line="257"/>
<location filename="../src/profilesdialog.cpp" line="277"/>
<source>Executables (*)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/profilesdialog.cpp" line="283"/>
<source>Please choose Ryzom client executable to launch</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/profilesdialog.cpp" line="257"/>
<location filename="../src/profilesdialog.cpp" line="275"/>
<source>Executables (*.exe)</source>
<translation type="unfinished"></translation>
</message>
@ -417,33 +392,27 @@ Just follow the different steps and make your choice between the options presen
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/installdialog.ui" line="97"/>
<source>Files will be installed from:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/installdialog.ui" line="128"/>
<location filename="../ui/installdialog.ui" line="167"/>
<location filename="../ui/installdialog.ui" line="111"/>
<source>Browse...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/installdialog.ui" line="160"/>
<location filename="../ui/installdialog.ui" line="104"/>
<source>Default</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/installdialog.ui" line="177"/>
<location filename="../ui/installdialog.ui" line="121"/>
<source>Do you prefer to use a 64 or 32 bit client?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/installdialog.ui" line="183"/>
<location filename="../ui/installdialog.ui" line="127"/>
<source>64 bit (recommended)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/installdialog.ui" line="193"/>
<location filename="../ui/installdialog.ui" line="137"/>
<source>32 bit</source>
<translation type="unfinished"></translation>
</message>
@ -456,53 +425,53 @@ Just follow the different steps and make your choice between the options presen
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="86"/>
<location filename="../ui/mainwindow.ui" line="80"/>
<source>Atys</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="94"/>
<location filename="../ui/mainwindow.ui" line="88"/>
<source>Play</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="101"/>
<location filename="../ui/mainwindow.ui" line="95"/>
<source>Configure</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="121"/>
<location filename="../ui/mainwindow.ui" line="156"/>
<location filename="../ui/mainwindow.ui" line="115"/>
<location filename="../ui/mainwindow.ui" line="150"/>
<source>&amp;Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="131"/>
<location filename="../ui/mainwindow.ui" line="125"/>
<source>&amp;Help</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="141"/>
<location filename="../ui/mainwindow.ui" line="135"/>
<source>About Qt</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="146"/>
<location filename="../ui/mainwindow.ui" line="140"/>
<source>About...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="151"/>
<location filename="../ui/mainwindow.ui" line="145"/>
<source>&amp;Profiles</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="161"/>
<location filename="../ui/mainwindow.ui" line="155"/>
<source>&amp;Quit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="166"/>
<location filename="../ui/mainwindow.ui" line="160"/>
<source>&amp;Uninstall</source>
<translation type="unfinished"></translation>
</message>
@ -529,37 +498,37 @@ Just press Continue button and follow the different steps until everything is do
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="107"/>
<location filename="../ui/migratedialog.ui" line="101"/>
<source>Default</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="114"/>
<location filename="../ui/migratedialog.ui" line="108"/>
<source>Browse...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="124"/>
<location filename="../ui/migratedialog.ui" line="118"/>
<source>Do you prefer to use a 64 or 32 bit client?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="130"/>
<location filename="../ui/migratedialog.ui" line="124"/>
<source>64 bit (recommended)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="140"/>
<location filename="../ui/migratedialog.ui" line="134"/>
<source>32 bit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="168"/>
<location filename="../ui/migratedialog.ui" line="162"/>
<source>Continue</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="175"/>
<location filename="../ui/migratedialog.ui" line="169"/>
<source>Quit</source>
<translation type="unfinished"></translation>
</message>
@ -718,69 +687,74 @@ Just press Continue button and follow the different steps until everything is do
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="300"/>
<location filename="../src/filesextractor.cpp" line="540"/>
<location filename="../src/filesextractor.cpp" line="322"/>
<location filename="../src/filesextractor.cpp" line="580"/>
<source>Unable to open %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="415"/>
<location filename="../src/filesextractor.cpp" line="437"/>
<source>Unable to open output file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="424"/>
<location filename="../src/filesextractor.cpp" line="446"/>
<source>Unable to write output file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="459"/>
<location filename="../src/filesextractor.cpp" line="467"/>
<location filename="../src/filesextractor.cpp" line="495"/>
<location filename="../src/filesextractor.cpp" line="503"/>
<source>7zip decoder doesn&apos;t support this archive</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="463"/>
<location filename="../src/filesextractor.cpp" line="499"/>
<source>Unable to allocate memory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="475"/>
<location filename="../src/filesextractor.cpp" line="507"/>
<source>File %1 is corrupted, unable to uncompress it</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="515"/>
<source>Error %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="502"/>
<location filename="../src/filesextractor.cpp" line="542"/>
<source>Unable to create directory %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="508"/>
<location filename="../src/filesextractor.cpp" line="548"/>
<source>Unable to set permissions of %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="617"/>
<location filename="../src/filesextractor.cpp" line="663"/>
<source>disk full</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="621"/>
<location filename="../src/filesextractor.cpp" line="667"/>
<source>unable to write %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="625"/>
<location filename="../src/filesextractor.cpp" line="671"/>
<source>unable to read %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="629"/>
<location filename="../src/filesextractor.cpp" line="675"/>
<source>failed (%1)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="632"/>
<location filename="../src/filesextractor.cpp" line="678"/>
<source>Unable to unpack %1 to %2: %3</source>
<translation type="unfinished"></translation>
</message>
@ -789,36 +763,46 @@ Just press Continue button and follow the different steps until everything is do
<source>Unable to copy file %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/profile.cpp" line="58"/>
<source>Profile ID %1 is using invalid characters (only lowercase letters, numbers and underscore are allowed)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/profile.cpp" line="68"/>
<source>Profile name %1 is using invalid character %2 at position %3</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../src/utils.cpp" line="30"/>
<location filename="../src/utils.cpp" line="33"/>
<source>B</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/utils.cpp" line="31"/>
<location filename="../src/utils.cpp" line="34"/>
<source>KiB</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/utils.cpp" line="32"/>
<location filename="../src/utils.cpp" line="35"/>
<source>MiB</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/utils.cpp" line="33"/>
<location filename="../src/utils.cpp" line="36"/>
<source>GiB</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/utils.cpp" line="34"/>
<location filename="../src/utils.cpp" line="37"/>
<source>TiB</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/utils.cpp" line="35"/>
<location filename="../src/utils.cpp" line="38"/>
<source>PiB</source>
<translation type="unfinished"></translation>
</message>

View file

@ -39,85 +39,82 @@
<translation>Code de statut incorrect : %1</translation>
</message>
<message>
<location filename="../src/downloader.cpp" line="388"/>
<location filename="../src/downloader.cpp" line="382"/>
<source>HTTP error: %1</source>
<translation>Errreur HTTP : %1</translation>
</message>
<message>
<source>Network error: %1</source>
<translation>Erreur réseau : %1</translation>
<translation type="vanished">Erreur réseau : %1</translation>
</message>
</context>
<context>
<name>CInstallDialog</name>
<message>
<location filename="../src/installdialog.cpp" line="45"/>
<source>Old installation: %1</source>
<translation>Ancienne installation : %1</translation>
<translation type="vanished">Ancienne installation : %1</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="69"/>
<source>Internet (%1 to download)</source>
<translation>Internet (%1 à télécharger)</translation>
<translation type="vanished">Internet (%1 à télécharger)</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="70"/>
<location filename="../src/installdialog.cpp" line="80"/>
<source>Files will be installed to (requires %1):</source>
<translation>Les fichiers seront installés dans (%1 nécessaires) :</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="103"/>
<source>Please choose directory where Ryzom is currently installed.</source>
<translation>Veuillez choisir le répertoire Ryzom est actuellement installé.</translation>
<translation type="vanished">Veuillez choisir le répertoire Ryzom est actuellement installé.</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="109"/>
<source>Unable to find Ryzom</source>
<translation>Impossible de trouver Ryzom</translation>
<translation type="vanished">Impossible de trouver Ryzom</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="109"/>
<source>Unable to find Ryzom in selected directory. Please choose another one or cancel.</source>
<translation>Impossible de trouver Ryzom dans le répertoire sélectionné. Veuillez en choisir un autre ou annuler.</translation>
<translation type="vanished">Impossible de trouver Ryzom dans le répertoire sélectionné. Veuillez en choisir un autre ou annuler.</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="129"/>
<location filename="../src/installdialog.cpp" line="115"/>
<source>Please choose directory to install Ryzom in</source>
<translation>Veuillez choisir le répertoire Ryzom sera installé</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="140"/>
<source>Another location: %1</source>
<translation>Autre emplacement : %1</translation>
<translation type="vanished">Autre emplacement : %1</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="140"/>
<source>Undefined</source>
<translation>Non défini</translation>
<translation type="vanished">Non défini</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="157"/>
<location filename="../src/installdialog.cpp" line="138"/>
<source>Not enough free disk space</source>
<translation>Espace disque insuffisant</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="157"/>
<location filename="../src/installdialog.cpp" line="138"/>
<source>You don&apos;t have enough free space on this disk, please make more space or choose a directory on another disk.</source>
<translation>Vous ne disposez pas assez d&apos;espace libre sur ce disque, veuillez en libérer ou choisir un répertoire sur un autre disque.</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="185"/>
<location filename="../src/installdialog.cpp" line="157"/>
<source>Unable to write in directory</source>
<translation>Impossible d&apos;écrire dans le répertoire</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="185"/>
<location filename="../src/installdialog.cpp" line="157"/>
<source>You don&apos;t have the permission to write in this directory with your current user account, please choose another directory.</source>
<translation>Vous n&apos;avez pas la permission d&apos;écrire dans ce répertoire avec votre compte utilisateur courant, veuillez en choisir un autre.</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="191"/>
<location filename="../src/installdialog.cpp" line="166"/>
<source>Directory not empty</source>
<translation>Répertoire non vide</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="191"/>
<location filename="../src/installdialog.cpp" line="166"/>
<source>This directory is not empty, please choose another one.</source>
<translation>Ce répertoire n&apos;est pas vide, veuillez en choisir un autre.</translation>
</message>
@ -129,27 +126,27 @@
<context>
<name>CMainWindow</name>
<message>
<location filename="../src/mainwindow.cpp" line="268"/>
<location filename="../src/mainwindow.cpp" line="270"/>
<source>About %1</source>
<translation>À propos de %1</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="270"/>
<location filename="../src/mainwindow.cpp" line="272"/>
<source>Program to install, download and manage Ryzom profiles.</source>
<translation>Programme pour installer, télécharger et gérer les profils de Ryzom.</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="272"/>
<location filename="../src/mainwindow.cpp" line="274"/>
<source>Author: %1</source>
<translation>Auteur : %1</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="273"/>
<location filename="../src/mainwindow.cpp" line="275"/>
<source>Copyright: %1</source>
<translation>Copyright : %1</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="274"/>
<location filename="../src/mainwindow.cpp" line="276"/>
<source>Support: %1</source>
<translation>Assistance : %1</translation>
</message>
@ -157,42 +154,42 @@
<context>
<name>CMigrateDialog</name>
<message>
<location filename="../src/migratedialog.cpp" line="66"/>
<location filename="../src/migratedialog.cpp" line="94"/>
<source>Files will be installed to (requires %1):</source>
<translation>Les fichiers seront installés dans (%1 nécessaires) :</translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="103"/>
<location filename="../src/migratedialog.cpp" line="131"/>
<source>Please choose directory to install Ryzom in</source>
<translation>Veuillez choisir le répertoire installer Ryzom</translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="126"/>
<location filename="../src/migratedialog.cpp" line="153"/>
<source>Not enough free disk space</source>
<translation>Espace disque insuffisant</translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="126"/>
<location filename="../src/migratedialog.cpp" line="153"/>
<source>You don&apos;t have enough free space on this disk, please make more space or choose a directory on another disk.</source>
<translation>Vous ne disposez pas assez d&apos;espace libre sur ce disque, veuillez en libérer ou choisir un répertoire sur un autre disque.</translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="154"/>
<location filename="../src/migratedialog.cpp" line="172"/>
<source>Unable to write in directory</source>
<translation>Impossible d&apos;écrire dans le répertoire</translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="154"/>
<location filename="../src/migratedialog.cpp" line="172"/>
<source>You don&apos;t have the permission to write in this directory with your current user account, please choose another directory.</source>
<translation>Vous n&apos;avez pas la permission d&apos;écrire dans ce répertoire avec votre compte utilisateur courant, veuillez en choisir un autre.</translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="160"/>
<location filename="../src/migratedialog.cpp" line="181"/>
<source>Directory not empty</source>
<translation>Répertoire non vide</translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="160"/>
<location filename="../src/migratedialog.cpp" line="181"/>
<source>This directory is not empty, please choose another one.</source>
<translation>Ce répertoire n&apos;est pas vide, veuillez en choisir un autre.</translation>
</message>
@ -208,109 +205,109 @@
<translation type="vanished">Mettre à jour les profils</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="261"/>
<location filename="../src/operationdialog.cpp" line="275"/>
<source>Updating profiles...</source>
<translation>Mise à jour des profils...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="412"/>
<location filename="../src/operationdialog.cpp" line="428"/>
<source>Confirmation</source>
<translation>Confirmation</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="412"/>
<location filename="../src/operationdialog.cpp" line="428"/>
<source>Warning, this server doesn&apos;t support resume! If you stop download now, you won&apos;t be able to resume it later.
Are you sure to abort download?</source>
<translation>Attention, ce serveur ne supporte pas la reprise de téléchargement ! Si vous arrêtez le téléchargement maintenant, vous ne pourrez pas le poursuivre ultérieurement.
Êtes-vous sûr d&apos;interrompre le téléchargement ?</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="437"/>
<location filename="../src/operationdialog.cpp" line="453"/>
<source>%p% (%v/%m KiB)</source>
<translation>%p% (%v/%m Kio)</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="497"/>
<location filename="../src/operationdialog.cpp" line="513"/>
<source>Error</source>
<translation>Erreur</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="518"/>
<location filename="../src/operationdialog.cpp" line="534"/>
<source>Downloading data required by server %1...</source>
<translation>Téléchargement des données nécessaires pour le serveur %1...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="529"/>
<location filename="../src/operationdialog.cpp" line="545"/>
<source>Extracting data required by server %1...</source>
<translation>Extraction des données nécessaires pour le serveur %1...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="551"/>
<location filename="../src/operationdialog.cpp" line="569"/>
<source>Downloading client required by server %1...</source>
<translation>Téléchargement du client nécessaire pour le serveur %1...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="562"/>
<location filename="../src/operationdialog.cpp" line="580"/>
<source>Extracting client required by server %1...</source>
<translation>Extraction du client nécessaire pour le serveur %1...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="589"/>
<location filename="../src/operationdialog.cpp" line="602"/>
<source>Copying data required by server %1...</source>
<translation>Copie des données nécessaires pour le serveur %1...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="623"/>
<location filename="../src/operationdialog.cpp" line="631"/>
<source>Copying old profile to new location...</source>
<translation>Copie de l&apos;ancien profil vers un nouvel emplacement...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="658"/>
<location filename="../src/operationdialog.cpp" line="661"/>
<source>Extracting client to new location...</source>
<translation>Extraction du client vers un nouvel emplacement...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="725"/>
<location filename="../src/operationdialog.cpp" line="726"/>
<source>Copying installer to new location...</source>
<translation>Copie de l&apos;installateur vers un nouvel emplacement...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="844"/>
<location filename="../src/operationdialog.cpp" line="847"/>
<source>Cleaning obsolete files...</source>
<translation>Nettoyage des fichiers obsolètes...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="859"/>
<location filename="../src/operationdialog.cpp" line="862"/>
<source>Creating default profile...</source>
<translation>Création du profil par défaut...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="918"/>
<location filename="../src/operationdialog.cpp" line="921"/>
<source>Creating shortcuts for profile %1...</source>
<translation>Création des raccourcis pour le profil %1...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1022"/>
<location filename="../src/operationdialog.cpp" line="1007"/>
<source>Deleting client...</source>
<translation>Suppression du client...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1079"/>
<location filename="../src/operationdialog.cpp" line="1067"/>
<source>Adding profiles...</source>
<translation>Ajout des profils...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1099"/>
<location filename="../src/operationdialog.cpp" line="1087"/>
<source>Deleting profiles...</source>
<translation>Suppression des profils...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1149"/>
<location filename="../src/operationdialog.cpp" line="1140"/>
<source>Deleting installer...</source>
<translation>Suppression de l&apos;installateur...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1191"/>
<location filename="../src/operationdialog.cpp" line="1192"/>
<source>Deleting downloaded files...</source>
<translation>Suppression des fichiers téléchargés...</translation>
</message>
@ -359,12 +356,12 @@ Are you sure to abort download?</source>
<translation type="vanished">Copier l&apos;installateur vers un nouvel emplacement</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="809"/>
<location filename="../src/operationdialog.cpp" line="812"/>
<source>Uninstall old client</source>
<translation>Désinstaller l&apos;ancien client</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="809"/>
<location filename="../src/operationdialog.cpp" line="812"/>
<source>An old version of Ryzom has been detected on this system, would you like to uninstall it to save space disk?</source>
<translation>Une ancienne version de Ryzom a é détectée sur ce système, souhaitez-vous la désinstaller afin de libérer de l&apos;espace disque ?</translation>
</message>
@ -389,7 +386,7 @@ Are you sure to abort download?</source>
<translation type="vanished">Supprimer les fichiers du client</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1052"/>
<location filename="../src/operationdialog.cpp" line="1037"/>
<source>Unable to delete files for client %1</source>
<translation>Impossible de supprimer les fichiers du client %1</translation>
</message>
@ -410,7 +407,7 @@ Are you sure to abort download?</source>
<translation type="vanished">Suppression du profil %1 en cours...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1128"/>
<location filename="../src/operationdialog.cpp" line="1116"/>
<source>Unable to delete files for profile %1</source>
<translation>Impossible de supprimer les fichiers du profil %1</translation>
</message>
@ -426,24 +423,34 @@ Are you sure to abort download?</source>
<context>
<name>CProfilesDialog</name>
<message>
<location filename="../src/profilesdialog.cpp" line="71"/>
<location filename="../src/profilesdialog.cpp" line="69"/>
<source>Error</source>
<translation>Erreur</translation>
</message>
<message>
<location filename="../src/profilesdialog.cpp" line="86"/>
<source>Confirmation</source>
<translation>Confirmation</translation>
</message>
<message>
<location filename="../src/profilesdialog.cpp" line="71"/>
<location filename="../src/profilesdialog.cpp" line="86"/>
<source>You&apos;re going to delete a profile, files won&apos;t be deleted and you&apos;ll have to do that manually.
Are you sure to delete this profile?</source>
<translation>Vous êtes sur le point de supprimer un profil, les fichiers ne seront pas supprimés et vous devrez le faire manuellement.
Êtes-vous sûr de supprimer ce profil ?</translation>
</message>
<message>
<location filename="../src/profilesdialog.cpp" line="257"/>
<location filename="../src/profilesdialog.cpp" line="277"/>
<source>Executables (*)</source>
<translation>Exécutables (*)</translation>
</message>
<message>
<location filename="../src/profilesdialog.cpp" line="283"/>
<source>Please choose Ryzom client executable to launch</source>
<translation>Veuillez choisir l&apos;exécutable du client de Ryzom à lancer</translation>
</message>
<message>
<location filename="../src/profilesdialog.cpp" line="257"/>
<location filename="../src/profilesdialog.cpp" line="275"/>
<source>Executables (*.exe)</source>
<translation>Exécutables (*.exe)</translation>
</message>
@ -523,9 +530,8 @@ Vous n&apos;avez qu&apos;à suivre les différentes étapes et faire un choix en
<translation>Afficher les paramètres avancés (expert)</translation>
</message>
<message>
<location filename="../ui/installdialog.ui" line="97"/>
<source>Files will be installed from:</source>
<translation>Les fichiers seront installés à partir de :</translation>
<translation type="vanished">Les fichiers seront installés à partir de :</translation>
</message>
<message>
<source>Old installation: %1</source>
@ -536,8 +542,7 @@ Vous n&apos;avez qu&apos;à suivre les différentes étapes et faire un choix en
<translation type="vanished">Autre emplacement : %1</translation>
</message>
<message>
<location filename="../ui/installdialog.ui" line="128"/>
<location filename="../ui/installdialog.ui" line="167"/>
<location filename="../ui/installdialog.ui" line="111"/>
<source>Browse...</source>
<translation>Parcourir...</translation>
</message>
@ -558,22 +563,22 @@ Vous n&apos;avez qu&apos;à suivre les différentes étapes et faire un choix en
<translation type="vanished">c:\</translation>
</message>
<message>
<location filename="../ui/installdialog.ui" line="160"/>
<location filename="../ui/installdialog.ui" line="104"/>
<source>Default</source>
<translation>Défaut</translation>
</message>
<message>
<location filename="../ui/installdialog.ui" line="177"/>
<location filename="../ui/installdialog.ui" line="121"/>
<source>Do you prefer to use a 64 or 32 bit client?</source>
<translation>Préférez-vous utiliser un client 64 ou 32 bits ?</translation>
</message>
<message>
<location filename="../ui/installdialog.ui" line="183"/>
<location filename="../ui/installdialog.ui" line="127"/>
<source>64 bit (recommended)</source>
<translation>64 bits (recommandé)</translation>
</message>
<message>
<location filename="../ui/installdialog.ui" line="193"/>
<location filename="../ui/installdialog.ui" line="137"/>
<source>32 bit</source>
<translation>32 bits</translation>
</message>
@ -598,53 +603,53 @@ p, li { white-space: pre-wrap; }
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="86"/>
<location filename="../ui/mainwindow.ui" line="80"/>
<source>Atys</source>
<translation>Atys</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="94"/>
<location filename="../ui/mainwindow.ui" line="88"/>
<source>Play</source>
<translation>Jouer</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="101"/>
<location filename="../ui/mainwindow.ui" line="95"/>
<source>Configure</source>
<translation>Configurer</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="121"/>
<location filename="../ui/mainwindow.ui" line="156"/>
<location filename="../ui/mainwindow.ui" line="115"/>
<location filename="../ui/mainwindow.ui" line="150"/>
<source>&amp;Settings</source>
<translation>&amp;Préférences</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="131"/>
<location filename="../ui/mainwindow.ui" line="125"/>
<source>&amp;Help</source>
<translation>&amp;Aide</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="141"/>
<location filename="../ui/mainwindow.ui" line="135"/>
<source>About Qt</source>
<translation>À propos de Qt</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="146"/>
<location filename="../ui/mainwindow.ui" line="140"/>
<source>About...</source>
<translation>À propos de...</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="151"/>
<location filename="../ui/mainwindow.ui" line="145"/>
<source>&amp;Profiles</source>
<translation>&amp;Profils</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="161"/>
<location filename="../ui/mainwindow.ui" line="155"/>
<source>&amp;Quit</source>
<translation>&amp;Quitter</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="166"/>
<location filename="../ui/mainwindow.ui" line="160"/>
<source>&amp;Uninstall</source>
<translation>&amp;Désinstaller</translation>
</message>
@ -683,37 +688,37 @@ Vous n&apos;avez qu&apos;à cliquer sur Suivant et suivre les différentes étap
<translation type="vanished">c:\</translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="107"/>
<location filename="../ui/migratedialog.ui" line="101"/>
<source>Default</source>
<translation>Défaut</translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="114"/>
<location filename="../ui/migratedialog.ui" line="108"/>
<source>Browse...</source>
<translation>Parcourir...</translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="124"/>
<location filename="../ui/migratedialog.ui" line="118"/>
<source>Do you prefer to use a 64 or 32 bit client?</source>
<translation>Préférez-vous utiliser un client 64 ou 32 bits ?</translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="130"/>
<location filename="../ui/migratedialog.ui" line="124"/>
<source>64 bit (recommended)</source>
<translation>64 bits (recommandé)</translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="140"/>
<location filename="../ui/migratedialog.ui" line="134"/>
<source>32 bit</source>
<translation>32 bits</translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="168"/>
<location filename="../ui/migratedialog.ui" line="162"/>
<source>Continue</source>
<translation>Suivant</translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="175"/>
<location filename="../ui/migratedialog.ui" line="169"/>
<source>Quit</source>
<translation>Quitter</translation>
</message>
@ -884,69 +889,74 @@ Vous n&apos;avez qu&apos;à cliquer sur Suivant et suivre les différentes étap
<translation>S&apos;auto-installer</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="300"/>
<location filename="../src/filesextractor.cpp" line="540"/>
<location filename="../src/filesextractor.cpp" line="322"/>
<location filename="../src/filesextractor.cpp" line="580"/>
<source>Unable to open %1</source>
<translation>Impossible d&apos;ouvrir %1</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="415"/>
<location filename="../src/filesextractor.cpp" line="437"/>
<source>Unable to open output file</source>
<translation>Impossible d&apos;ouvrir le fichier de sortie</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="424"/>
<location filename="../src/filesextractor.cpp" line="446"/>
<source>Unable to write output file</source>
<translation>Impossible d&apos;écrire le fichier de sortie</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="459"/>
<location filename="../src/filesextractor.cpp" line="467"/>
<location filename="../src/filesextractor.cpp" line="495"/>
<location filename="../src/filesextractor.cpp" line="503"/>
<source>7zip decoder doesn&apos;t support this archive</source>
<translation>Le décodeur 7zip n&apos;est pas compatible avec cette archive</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="463"/>
<location filename="../src/filesextractor.cpp" line="499"/>
<source>Unable to allocate memory</source>
<translation>Impossible d&apos;allouer la mémoire</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="475"/>
<location filename="../src/filesextractor.cpp" line="507"/>
<source>File %1 is corrupted, unable to uncompress it</source>
<translation>Le fichier %1 est corrompu, impossible de le décompresser</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="515"/>
<source>Error %1</source>
<translation>Erreur %1</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="502"/>
<location filename="../src/filesextractor.cpp" line="542"/>
<source>Unable to create directory %1</source>
<translation>Impossible de créer le répertoire %1</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="508"/>
<location filename="../src/filesextractor.cpp" line="548"/>
<source>Unable to set permissions of %1</source>
<translation>Impossible de définir les permissions de %1</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="617"/>
<location filename="../src/filesextractor.cpp" line="663"/>
<source>disk full</source>
<translation>disque plein</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="621"/>
<location filename="../src/filesextractor.cpp" line="667"/>
<source>unable to write %1</source>
<translation>impossible d&apos;écrire %1</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="625"/>
<location filename="../src/filesextractor.cpp" line="671"/>
<source>unable to read %1</source>
<translation>impossible de lire %1</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="629"/>
<location filename="../src/filesextractor.cpp" line="675"/>
<source>failed (%1)</source>
<translation>échec (%1)</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="632"/>
<location filename="../src/filesextractor.cpp" line="678"/>
<source>Unable to unpack %1 to %2: %3</source>
<translation>Impossible d&apos;extraire %1 vers %2 : %3 </translation>
</message>
@ -955,36 +965,46 @@ Vous n&apos;avez qu&apos;à cliquer sur Suivant et suivre les différentes étap
<source>Unable to copy file %1</source>
<translation>Impossible de copier le fichier %1</translation>
</message>
<message>
<location filename="../src/profile.cpp" line="58"/>
<source>Profile ID %1 is using invalid characters (only lowercase letters, numbers and underscore are allowed)</source>
<translation>L&apos;identifiant du profil %1 utilise des caractères invalides (seuls les lettres, chiffres et underscore sont autorisés)l</translation>
</message>
<message>
<location filename="../src/profile.cpp" line="68"/>
<source>Profile name %1 is using invalid character %2 at position %3</source>
<translation>Le nom du profil %1 utilise un caractère invalide %2 à la position %3</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../src/utils.cpp" line="30"/>
<location filename="../src/utils.cpp" line="33"/>
<source>B</source>
<translation>o</translation>
</message>
<message>
<location filename="../src/utils.cpp" line="31"/>
<location filename="../src/utils.cpp" line="34"/>
<source>KiB</source>
<translation>Kio</translation>
</message>
<message>
<location filename="../src/utils.cpp" line="32"/>
<location filename="../src/utils.cpp" line="35"/>
<source>MiB</source>
<translation>Mio</translation>
</message>
<message>
<location filename="../src/utils.cpp" line="33"/>
<location filename="../src/utils.cpp" line="36"/>
<source>GiB</source>
<translation>Gio</translation>
</message>
<message>
<location filename="../src/utils.cpp" line="34"/>
<location filename="../src/utils.cpp" line="37"/>
<source>TiB</source>
<translation>Tio</translation>
</message>
<message>
<location filename="../src/utils.cpp" line="35"/>
<location filename="../src/utils.cpp" line="38"/>
<source>PiB</source>
<translation>Pio</translation>
</message>

View file

@ -39,85 +39,82 @@
<translation>Некорректный код состояния: %1</translation>
</message>
<message>
<location filename="../src/downloader.cpp" line="388"/>
<location filename="../src/downloader.cpp" line="382"/>
<source>HTTP error: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Network error: %1</source>
<translation>Ошибка сети: %1</translation>
<translation type="vanished">Ошибка сети: %1</translation>
</message>
</context>
<context>
<name>CInstallDialog</name>
<message>
<location filename="../src/installdialog.cpp" line="45"/>
<source>Old installation: %1</source>
<translation>Предыдущая установка: %1</translation>
<translation type="vanished">Предыдущая установка: %1</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="69"/>
<source>Internet (%1 to download)</source>
<translation>Интернет (%1 для загрузки)</translation>
<translation type="vanished">Интернет (%1 для загрузки)</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="70"/>
<location filename="../src/installdialog.cpp" line="80"/>
<source>Files will be installed to (requires %1):</source>
<translation>Файлы будут установлены в (требуется %1):</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="103"/>
<source>Please choose directory where Ryzom is currently installed.</source>
<translation>Пожалуйста, выберите директорию, в которой установен Ryzom.</translation>
<translation type="vanished">Пожалуйста, выберите директорию, в которой установен Ryzom.</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="109"/>
<source>Unable to find Ryzom</source>
<translation>Невозможно найти Ryzom</translation>
<translation type="vanished">Невозможно найти Ryzom</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="109"/>
<source>Unable to find Ryzom in selected directory. Please choose another one or cancel.</source>
<translation>Невозможно найти Ryzom в выбранной директории. Пожалуйста, выберите другую директорию или отмену.</translation>
<translation type="vanished">Невозможно найти Ryzom в выбранной директории. Пожалуйста, выберите другую директорию или отмену.</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="129"/>
<location filename="../src/installdialog.cpp" line="115"/>
<source>Please choose directory to install Ryzom in</source>
<translation>Пожалуйста, выберите директорию для установки Ryzom</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="140"/>
<source>Another location: %1</source>
<translation>Другое местоположение: %1</translation>
<translation type="vanished">Другое местоположение: %1</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="140"/>
<source>Undefined</source>
<translation>Не определено</translation>
<translation type="vanished">Не определено</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="157"/>
<location filename="../src/installdialog.cpp" line="138"/>
<source>Not enough free disk space</source>
<translation>Недостаточно свободного места</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="157"/>
<location filename="../src/installdialog.cpp" line="138"/>
<source>You don&apos;t have enough free space on this disk, please make more space or choose a directory on another disk.</source>
<translation>Недостаточно свободного места на выбранном диске, пожалуйста освободите место на диске или выберите директорию на другом диске.</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="185"/>
<location filename="../src/installdialog.cpp" line="157"/>
<source>Unable to write in directory</source>
<translation>Невозможно осуществить запись в директорию</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="185"/>
<location filename="../src/installdialog.cpp" line="157"/>
<source>You don&apos;t have the permission to write in this directory with your current user account, please choose another directory.</source>
<translation>У вашего текущего пользоввателя нет права записи в эту директорию, пожалуйста, выберите другую директорию.</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="191"/>
<location filename="../src/installdialog.cpp" line="166"/>
<source>Directory not empty</source>
<translation>Директория не является пустой</translation>
</message>
<message>
<location filename="../src/installdialog.cpp" line="191"/>
<location filename="../src/installdialog.cpp" line="166"/>
<source>This directory is not empty, please choose another one.</source>
<translation>Эта директория не является пустой, пожалуйста, выберите другую.</translation>
</message>
@ -125,27 +122,27 @@
<context>
<name>CMainWindow</name>
<message>
<location filename="../src/mainwindow.cpp" line="268"/>
<location filename="../src/mainwindow.cpp" line="270"/>
<source>About %1</source>
<translation>О %1</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="270"/>
<location filename="../src/mainwindow.cpp" line="272"/>
<source>Program to install, download and manage Ryzom profiles.</source>
<translation>Программа для установки, загрузки и управления профилями Ryzom.</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="272"/>
<location filename="../src/mainwindow.cpp" line="274"/>
<source>Author: %1</source>
<translation>Автор: %1</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="273"/>
<location filename="../src/mainwindow.cpp" line="275"/>
<source>Copyright: %1</source>
<translation>Копирайт: %1</translation>
</message>
<message>
<location filename="../src/mainwindow.cpp" line="274"/>
<location filename="../src/mainwindow.cpp" line="276"/>
<source>Support: %1</source>
<translation>Поддержка: %1</translation>
</message>
@ -153,42 +150,42 @@
<context>
<name>CMigrateDialog</name>
<message>
<location filename="../src/migratedialog.cpp" line="66"/>
<location filename="../src/migratedialog.cpp" line="94"/>
<source>Files will be installed to (requires %1):</source>
<translation>Файлы будут установлены в (требуется %1):</translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="103"/>
<location filename="../src/migratedialog.cpp" line="131"/>
<source>Please choose directory to install Ryzom in</source>
<translation>Пожалуйста, выберете директорию для установки Ryzom</translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="126"/>
<location filename="../src/migratedialog.cpp" line="153"/>
<source>Not enough free disk space</source>
<translation>Недостаточно свободного места</translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="126"/>
<location filename="../src/migratedialog.cpp" line="153"/>
<source>You don&apos;t have enough free space on this disk, please make more space or choose a directory on another disk.</source>
<translation>Недостаточно свободного места на выбранном диске, пожалуйста освободите место на диске или выберите директорию на другом диске.</translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="154"/>
<location filename="../src/migratedialog.cpp" line="172"/>
<source>Unable to write in directory</source>
<translation>Невозможно осуществить запись в директорию</translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="154"/>
<location filename="../src/migratedialog.cpp" line="172"/>
<source>You don&apos;t have the permission to write in this directory with your current user account, please choose another directory.</source>
<translation>У вашего текущего пользоввателя нет права записи в эту директорию, пожалуйста, выберите другую директорию.</translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="160"/>
<location filename="../src/migratedialog.cpp" line="181"/>
<source>Directory not empty</source>
<translation>Директория не является пустой</translation>
</message>
<message>
<location filename="../src/migratedialog.cpp" line="160"/>
<location filename="../src/migratedialog.cpp" line="181"/>
<source>This directory is not empty, please choose another one.</source>
<translation>Эта директория не является пустой, пожалуйста, выберите другую.</translation>
</message>
@ -196,108 +193,108 @@
<context>
<name>COperationDialog</name>
<message>
<location filename="../src/operationdialog.cpp" line="261"/>
<location filename="../src/operationdialog.cpp" line="275"/>
<source>Updating profiles...</source>
<translation>Обновление профилей...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="412"/>
<location filename="../src/operationdialog.cpp" line="428"/>
<source>Confirmation</source>
<translation>Подтверждение</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="412"/>
<location filename="../src/operationdialog.cpp" line="428"/>
<source>Warning, this server doesn&apos;t support resume! If you stop download now, you won&apos;t be able to resume it later.
Are you sure to abort download?</source>
<translation>Внимание, данный сервер не поддерживает возобновление загрузки! Если вы сейчас прервете загрузку, вы не сможете возобновить ее позднее. Вы уверены, что хотите прервать загрузку?</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="437"/>
<location filename="../src/operationdialog.cpp" line="453"/>
<source>%p% (%v/%m KiB)</source>
<translation>%p% (%v/%m Кб)</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="497"/>
<location filename="../src/operationdialog.cpp" line="513"/>
<source>Error</source>
<translation>Ошибка</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="518"/>
<location filename="../src/operationdialog.cpp" line="534"/>
<source>Downloading data required by server %1...</source>
<translation>Загрузка данных, необходимых серверу %1...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="529"/>
<location filename="../src/operationdialog.cpp" line="545"/>
<source>Extracting data required by server %1...</source>
<translation>Извлечение данных, необходимых серверу %1...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="551"/>
<location filename="../src/operationdialog.cpp" line="569"/>
<source>Downloading client required by server %1...</source>
<translation>Загрузка клиента, необходимого серверу %1...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="562"/>
<location filename="../src/operationdialog.cpp" line="580"/>
<source>Extracting client required by server %1...</source>
<translation>Извлечение файлов клиента, необходимых серверу %1...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="589"/>
<location filename="../src/operationdialog.cpp" line="602"/>
<source>Copying data required by server %1...</source>
<translation>Копирование данных, необходимых серверу %1...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="623"/>
<location filename="../src/operationdialog.cpp" line="631"/>
<source>Copying old profile to new location...</source>
<translation>Копирование предыдущего профиля в новое местоположение...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="658"/>
<location filename="../src/operationdialog.cpp" line="661"/>
<source>Extracting client to new location...</source>
<translation>Извлечение файлов клиента в новое местоположение...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="725"/>
<location filename="../src/operationdialog.cpp" line="726"/>
<source>Copying installer to new location...</source>
<translation>Копирование инсталлятора в новое местоположение...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="844"/>
<location filename="../src/operationdialog.cpp" line="847"/>
<source>Cleaning obsolete files...</source>
<translation>Удаление устаревших файлов...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="859"/>
<location filename="../src/operationdialog.cpp" line="862"/>
<source>Creating default profile...</source>
<translation>Создание профиля по умолчанию...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="918"/>
<location filename="../src/operationdialog.cpp" line="921"/>
<source>Creating shortcuts for profile %1...</source>
<translation>Создание ярлыков для профиля %1...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1022"/>
<location filename="../src/operationdialog.cpp" line="1007"/>
<source>Deleting client...</source>
<translation>Удаление клиента...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1079"/>
<location filename="../src/operationdialog.cpp" line="1067"/>
<source>Adding profiles...</source>
<translation>Добавление профилей...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1099"/>
<location filename="../src/operationdialog.cpp" line="1087"/>
<source>Deleting profiles...</source>
<translation>Удаление профилей...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1149"/>
<location filename="../src/operationdialog.cpp" line="1140"/>
<source>Deleting installer...</source>
<translation>Удаление инсталлятора...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1191"/>
<location filename="../src/operationdialog.cpp" line="1192"/>
<source>Deleting downloaded files...</source>
<translation>Удаление загруженных файлов...</translation>
</message>
@ -334,12 +331,12 @@ Are you sure to abort download?</source>
<translation type="vanished">Копирование %1...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="809"/>
<location filename="../src/operationdialog.cpp" line="812"/>
<source>Uninstall old client</source>
<translation>Удалить предыдущую версию клиента</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="809"/>
<location filename="../src/operationdialog.cpp" line="812"/>
<source>An old version of Ryzom has been detected on this system, would you like to uninstall it to save space disk?</source>
<translation>В системе обнаружена предыдущая версия Ryzom, вы хотите удалить ее чтобы освободить место на диске?</translation>
</message>
@ -360,7 +357,7 @@ Are you sure to abort download?</source>
<translation type="vanished">Удалить файлы клиента</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1052"/>
<location filename="../src/operationdialog.cpp" line="1037"/>
<source>Unable to delete files for client %1</source>
<translation>Невозможно удалить файлы клиента %1</translation>
</message>
@ -381,7 +378,7 @@ Are you sure to abort download?</source>
<translation type="vanished">Удаление профиля %1...</translation>
</message>
<message>
<location filename="../src/operationdialog.cpp" line="1128"/>
<location filename="../src/operationdialog.cpp" line="1116"/>
<source>Unable to delete files for profile %1</source>
<translation>Невозможно удалить файлы профиля %1</translation>
</message>
@ -397,23 +394,33 @@ Are you sure to abort download?</source>
<context>
<name>CProfilesDialog</name>
<message>
<location filename="../src/profilesdialog.cpp" line="71"/>
<location filename="../src/profilesdialog.cpp" line="69"/>
<source>Error</source>
<translation type="unfinished">Ошибка</translation>
</message>
<message>
<location filename="../src/profilesdialog.cpp" line="86"/>
<source>Confirmation</source>
<translation>Подтверждение</translation>
</message>
<message>
<location filename="../src/profilesdialog.cpp" line="71"/>
<location filename="../src/profilesdialog.cpp" line="86"/>
<source>You&apos;re going to delete a profile, files won&apos;t be deleted and you&apos;ll have to do that manually.
Are you sure to delete this profile?</source>
<translation>Вы собираетесь удалить профиль, файлы профиля не будут удалены автоматически и их необходимо удалить вручную. Вы уверены, что хотите удалить этот профиль?</translation>
</message>
<message>
<location filename="../src/profilesdialog.cpp" line="257"/>
<location filename="../src/profilesdialog.cpp" line="277"/>
<source>Executables (*)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/profilesdialog.cpp" line="283"/>
<source>Please choose Ryzom client executable to launch</source>
<translation>Пожалуйста, выберете исполняемый файл для запуска клиента Ryzom</translation>
</message>
<message>
<location filename="../src/profilesdialog.cpp" line="257"/>
<location filename="../src/profilesdialog.cpp" line="275"/>
<source>Executables (*.exe)</source>
<translation>Исполняемые файлы (*.exe)</translation>
</message>
@ -493,9 +500,8 @@ Just follow the different steps and make your choice between the options presen
<translation>Показать расширенные параметры</translation>
</message>
<message>
<location filename="../ui/installdialog.ui" line="97"/>
<source>Files will be installed from:</source>
<translation>Файлы будут установлены из:</translation>
<translation type="vanished">Файлы будут установлены из:</translation>
</message>
<message>
<source>Old installation: %1</source>
@ -506,8 +512,7 @@ Just follow the different steps and make your choice between the options presen
<translation type="vanished">Другое местоположение: %1</translation>
</message>
<message>
<location filename="../ui/installdialog.ui" line="128"/>
<location filename="../ui/installdialog.ui" line="167"/>
<location filename="../ui/installdialog.ui" line="111"/>
<source>Browse...</source>
<translation>Открыть...</translation>
</message>
@ -524,22 +529,22 @@ Just follow the different steps and make your choice between the options presen
<translation type="vanished">C:\</translation>
</message>
<message>
<location filename="../ui/installdialog.ui" line="160"/>
<location filename="../ui/installdialog.ui" line="104"/>
<source>Default</source>
<translation>По умолчанию</translation>
</message>
<message>
<location filename="../ui/installdialog.ui" line="177"/>
<location filename="../ui/installdialog.ui" line="121"/>
<source>Do you prefer to use a 64 or 32 bit client?</source>
<translation>Вы предпочитаете использовать 64-битный или 32-битный клиент?</translation>
</message>
<message>
<location filename="../ui/installdialog.ui" line="183"/>
<location filename="../ui/installdialog.ui" line="127"/>
<source>64 bit (recommended)</source>
<translation>64-битный (рекомендуемый)</translation>
</message>
<message>
<location filename="../ui/installdialog.ui" line="193"/>
<location filename="../ui/installdialog.ui" line="137"/>
<source>32 bit</source>
<translation>32-битный</translation>
</message>
@ -564,53 +569,53 @@ p, li { white-space: pre-wrap; }
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="86"/>
<location filename="../ui/mainwindow.ui" line="80"/>
<source>Atys</source>
<translation>Atys</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="94"/>
<location filename="../ui/mainwindow.ui" line="88"/>
<source>Play</source>
<translation>Играть</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="101"/>
<location filename="../ui/mainwindow.ui" line="95"/>
<source>Configure</source>
<translation>Настроить</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="121"/>
<location filename="../ui/mainwindow.ui" line="156"/>
<location filename="../ui/mainwindow.ui" line="115"/>
<location filename="../ui/mainwindow.ui" line="150"/>
<source>&amp;Settings</source>
<translation>&amp;Настройки</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="131"/>
<location filename="../ui/mainwindow.ui" line="125"/>
<source>&amp;Help</source>
<translation>&amp;Помощь</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="141"/>
<location filename="../ui/mainwindow.ui" line="135"/>
<source>About Qt</source>
<translation>О Qt</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="146"/>
<location filename="../ui/mainwindow.ui" line="140"/>
<source>About...</source>
<translation>О...</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="151"/>
<location filename="../ui/mainwindow.ui" line="145"/>
<source>&amp;Profiles</source>
<translation>&amp;Профили</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="161"/>
<location filename="../ui/mainwindow.ui" line="155"/>
<source>&amp;Quit</source>
<translation>&amp;Выход</translation>
</message>
<message>
<location filename="../ui/mainwindow.ui" line="166"/>
<location filename="../ui/mainwindow.ui" line="160"/>
<source>&amp;Uninstall</source>
<translation>&amp;Удалить</translation>
</message>
@ -649,37 +654,37 @@ Just press Continue button and follow the different steps until everything is do
<translation type="vanished">C:\</translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="107"/>
<location filename="../ui/migratedialog.ui" line="101"/>
<source>Default</source>
<translation>По умолчанию</translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="114"/>
<location filename="../ui/migratedialog.ui" line="108"/>
<source>Browse...</source>
<translation>Открыть...</translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="124"/>
<location filename="../ui/migratedialog.ui" line="118"/>
<source>Do you prefer to use a 64 or 32 bit client?</source>
<translation>Вы предпочитаете использовать 64-битный или 32-битный клиент?</translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="130"/>
<location filename="../ui/migratedialog.ui" line="124"/>
<source>64 bit (recommended)</source>
<translation>64-битный (рекомендуемый)</translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="140"/>
<location filename="../ui/migratedialog.ui" line="134"/>
<source>32 bit</source>
<translation>32-битный</translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="168"/>
<location filename="../ui/migratedialog.ui" line="162"/>
<source>Continue</source>
<translation>Продолжить</translation>
</message>
<message>
<location filename="../ui/migratedialog.ui" line="175"/>
<location filename="../ui/migratedialog.ui" line="169"/>
<source>Quit</source>
<translation>Выход</translation>
</message>
@ -850,69 +855,74 @@ Just press Continue button and follow the different steps until everything is do
<translation>Установится</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="300"/>
<location filename="../src/filesextractor.cpp" line="540"/>
<location filename="../src/filesextractor.cpp" line="322"/>
<location filename="../src/filesextractor.cpp" line="580"/>
<source>Unable to open %1</source>
<translation>Невозможно открыть %1</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="415"/>
<location filename="../src/filesextractor.cpp" line="437"/>
<source>Unable to open output file</source>
<translation>Невозможно открыть выходной файл</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="424"/>
<location filename="../src/filesextractor.cpp" line="446"/>
<source>Unable to write output file</source>
<translation>Невозможно записать выходной файл</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="459"/>
<location filename="../src/filesextractor.cpp" line="467"/>
<location filename="../src/filesextractor.cpp" line="495"/>
<location filename="../src/filesextractor.cpp" line="503"/>
<source>7zip decoder doesn&apos;t support this archive</source>
<translation>Архиватор 7zip не поддерживает данный тип архива</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="463"/>
<location filename="../src/filesextractor.cpp" line="499"/>
<source>Unable to allocate memory</source>
<translation>Невозможно выделить память</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="475"/>
<location filename="../src/filesextractor.cpp" line="507"/>
<source>File %1 is corrupted, unable to uncompress it</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="515"/>
<source>Error %1</source>
<translation>Ошибка %1</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="502"/>
<location filename="../src/filesextractor.cpp" line="542"/>
<source>Unable to create directory %1</source>
<translation>Невозможно создать директорию %1</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="508"/>
<location filename="../src/filesextractor.cpp" line="548"/>
<source>Unable to set permissions of %1</source>
<translation>Невозможно назначить права объекта %1</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="617"/>
<location filename="../src/filesextractor.cpp" line="663"/>
<source>disk full</source>
<translation>диск переполнен</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="621"/>
<location filename="../src/filesextractor.cpp" line="667"/>
<source>unable to write %1</source>
<translation>невозможно записать %1</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="625"/>
<location filename="../src/filesextractor.cpp" line="671"/>
<source>unable to read %1</source>
<translation>невозможно прочитать %1</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="629"/>
<location filename="../src/filesextractor.cpp" line="675"/>
<source>failed (%1)</source>
<translation>неуспешно (%1)</translation>
</message>
<message>
<location filename="../src/filesextractor.cpp" line="632"/>
<location filename="../src/filesextractor.cpp" line="678"/>
<source>Unable to unpack %1 to %2: %3</source>
<translation>Невозможно разархивировать %1 в %2: %3</translation>
</message>
@ -921,36 +931,46 @@ Just press Continue button and follow the different steps until everything is do
<source>Unable to copy file %1</source>
<translation>Невозможно скопировать файл %1</translation>
</message>
<message>
<location filename="../src/profile.cpp" line="58"/>
<source>Profile ID %1 is using invalid characters (only lowercase letters, numbers and underscore are allowed)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/profile.cpp" line="68"/>
<source>Profile name %1 is using invalid character %2 at position %3</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<location filename="../src/utils.cpp" line="30"/>
<location filename="../src/utils.cpp" line="33"/>
<source>B</source>
<translation>Б</translation>
</message>
<message>
<location filename="../src/utils.cpp" line="31"/>
<location filename="../src/utils.cpp" line="34"/>
<source>KiB</source>
<translation>КиБ</translation>
</message>
<message>
<location filename="../src/utils.cpp" line="32"/>
<location filename="../src/utils.cpp" line="35"/>
<source>MiB</source>
<translation>МиБ</translation>
</message>
<message>
<location filename="../src/utils.cpp" line="33"/>
<location filename="../src/utils.cpp" line="36"/>
<source>GiB</source>
<translation>ГиБ</translation>
</message>
<message>
<location filename="../src/utils.cpp" line="34"/>
<location filename="../src/utils.cpp" line="37"/>
<source>TiB</source>
<translation>ТиБ</translation>
</message>
<message>
<location filename="../src/utils.cpp" line="35"/>
<location filename="../src/utils.cpp" line="38"/>
<source>PiB</source>
<translation>ПиБ</translation>
</message>

View file

@ -69,12 +69,6 @@ Just follow the different steps and make your choice between the options presen
</item>
<item>
<widget class="QFrame" name="advancedFrame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QVBoxLayout" name="advancedMainLayout">
<property name="spacing">
<number>6</number>

View file

@ -57,12 +57,6 @@ p, li { white-space: pre-wrap; }
</item>
<item>
<widget class="QFrame" name="configurationFrame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="configurationLayout" stretch="1,0,0">
<property name="leftMargin">
<number>0</number>

View file

@ -66,12 +66,6 @@ Just press Continue button and follow the different steps until everything is do
</item>
<item>
<widget class="QFrame" name="advancedFrame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QVBoxLayout" name="advancedMainLayout">
<property name="spacing">
<number>6</number>

View file

@ -66,6 +66,9 @@
</item>
<item>
<layout class="QFormLayout" name="formLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
</property>
<item row="0" column="0">
<widget class="QLabel" name="profileLabel">
<property name="text">