crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> перевод Q_PROPERTY
a_goodgirl
  опции профиля:
сообщение 7.7.2010, 12:30
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 35
Регистрация: 4.6.2009
Пользователь №: 801

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо всем, кто уже отвечал на вопросы! Возможно, ответы пригодились и еще кому-то :-)

Вот такой вопрос:
В неком классе есть обычные свойства, например:
Q_PROPERTY(QString fileName READ fileName WRITE setFileName)
Q_PROPERTY(QString filePath READ filePath WRITE setFilePath)

реализован свой property editor, усовершенствованный собрат такого же, как в дизайнере.
Прикрепленное изображение


Имя свойства берется из QMetaProperty->name().
Как сделать, чтобы можно было задать перевод свойства? Чтобы, например, было написано "Имя файла".

Может, кто-то посоветует, в какую сторону хотя бы рыть?
Начальник мне посоветовал попробовать переписать lupdate и lrelease. Там много букв..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 7.7.2010, 13:44
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(a_goodgirl @ 7.7.2010, 16:30) *
Может, кто-то посоветует, в какую сторону хотя бы рыть?
надо смотреть как это сделано в Дизайнере. Т.к. в дизайнере эти вещи в версиях 4.6 и выше переведены (если переводчики постарались)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 7.7.2010, 14:24
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(Litkevich Yuriy @ 7.7.2010, 14:44) *
Цитата(a_goodgirl @ 7.7.2010, 16:30) *
Может, кто-то посоветует, в какую сторону хотя бы рыть?
надо смотреть как это сделано в Дизайнере. Т.к. в дизайнере эти вещи в версиях 4.6 и выше переведены (если переводчики постарались)

У меня такого не наблюдается ни в QtCreator'e, ни в дизайнере.



Аналогичная тема без решения.
http://www.qtcentre.org/threads/29779-How-...language-change
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
a_goodgirl
  опции профиля:
сообщение 7.7.2010, 14:27
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 35
Регистрация: 4.6.2009
Пользователь №: 801

Спасибо сказали: 0 раз(а)




Репутация:   0  


К сожалению, нет :-(
У нас qt4.6.0 - не переведено..

Есть перевод для флагов, например. А имена свойств так и пишутся, как в Q_PROPERTY.

Прикрепленное изображение
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 7.7.2010, 14:44
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Если честно, то я бы расстроился переводу имен свойств, так как не смог бы найти в документации их описания.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 7.7.2010, 15:30
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(SABROG @ 7.7.2010, 18:44) *
сли честно, то я бы расстроился переводу имен свойств, так как не смог бы найти в документации их описания.
если бы свойства работали точно в соответствии с их названием (в первую очередь это относится к компоновке), то не было бы нужды их искать в документации. Вообще полный перевод был бы намного удобнее, но это трудно осуществимо.
Я, например, для себя многое перевёл:
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение


кое-что раскопал, например свойство горизонтального выравнивания создаётся так:
QtVariantProperty *alignH = addProperty(enumTypeId(), tr("Horizontal"));

Файл
%QTDIR%\tools\designer\src\components\propertyeditor\designerpropertymanager.cpp
строка 1799
(Qt 4.6.0)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
a_goodgirl
  опции профиля:
сообщение 7.7.2010, 16:25
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 35
Регистрация: 4.6.2009
Пользователь №: 801

Спасибо сказали: 0 раз(а)




Репутация:   0  


вы немного не понимаете сути проблемы. Речь идет совсем не о дизайнере - просто все видели в нем property editor и так проще объяснить, как он выглядит.
Классы написаны свои, пользовательские. Свойства у них могут быть какие угодно. Пользователь, который никогда дизайнера в глаза не видел и что такое qt не знает, должен видеть в приложении переведенные имена, а иначе это не имеет смысла (например, "Количество таблиц")
Property Editor работает так: для каждого типа (QVariant, могут быть собственные типы) определены фабрика и менеджер, есть map, связывающий тип свойства и фабрику(менеджер).

Например, свойство size имеет тип QSize. Конкретно для него релизован интерфейс QtSizePropertyManager, в котором "зашиты" width и height, и в этом локальном месте они обложены tr, поэтому мы видим "Ширина", "Высота".
void QtSizePropertyManager::initializeProperty(QtProperty *property)
{
    d_ptr->m_values[property] = QtSizePropertyManagerPrivate::Data();

    QtProperty *wProp = d_ptr->m_intPropertyManager->addProperty();
    wProp->setPropertyName(tr("Width"));
    d_ptr->m_intPropertyManager->setValue(wProp, 0);
    d_ptr->m_intPropertyManager->setMinimum(wProp, 0);
    d_ptr->m_propertyToW[property] = wProp;
    d_ptr->m_wToProperty[wProp] = property;
    property->addSubProperty(wProp);

    QtProperty *hProp = d_ptr->m_intPropertyManager->addProperty();
    hProp->setPropertyName(tr("Height"));
    d_ptr->m_intPropertyManager->setValue(hProp, 0);
    d_ptr->m_intPropertyManager->setMinimum(hProp, 0);
    d_ptr->m_propertyToH[property] = hProp;
    d_ptr->m_hToProperty[hProp] = property;
    property->addSubProperty(hProp);
}

Если задать свойство с именем Vasya типа QSize, то увидим в дереве то же самое
Vasya
Ширина
Высота

Речь же идет о том, что надо перевести слова size и Vasya, т.е. имена свойств, задаваемые в Q_PROPERTY.
В приведенным Вами примерах (на картинках) НИ ОДНО имя свойства не переведено.



property editor в общем тут совсем не при чем :-)

Хотелось бы как-то задавать свойству QMetaProperty имя, обложенное tr.
Например, понять, как работает макрос Q_PROPERTY - как он из строки кладет в некую структуру d класса QMetaProperty, откуда потом берется name()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 7.7.2010, 16:46
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(a_goodgirl @ 7.7.2010, 17:15) *
вы

Я то как раз это вижу. Похоже есть только один вариант - научить свой Property Editor читать какие-то дополнительные поля у объектов содержащих свойства. Соответственно где-то придется дублировать названия всех свойств, чтобы можно было применить функцию tr(). Пример из документации:

QString FriendlyConversation::greeting(int type)
{
     static const char *greeting_strings[] = {
         QT_TR_NOOP("Hello"),
         QT_TR_NOOP("Goodbye")
     };
     return tr(greeting_strings[type]);
}


Значит в своем объекте придется завести массив статических имен свойств:

class MyObject : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int value READ value WRITE setValue)
    Q_PROPERTY(QString text READ text WRITE setText)
public:
    MyObject(QObject* parent = 0) : QObject(parent) {}
    int value() const {return m_value;}
    void setValue(int value) {m_value = value;}
    QString text() const {return m_text;}
    void setText(const QString& text) {m_text = text;}
    QString localizedName(const char* propertyName)
    {
        static const char* properties[] =
        {
            QT_TR_NOOP("value"),
            QT_TR_NOOP("text")
        }
        for (int i = 0; i < sizeof(properties)/properties[0]; ++i)
            if (!qstrcmp(properties[i], propertyName))
                return tr(properties[i]);
    }
private:
    int m_value;
    QString m_text;
};


Недостаток в том, что имена свойств приходиться дублировать, подружить lupdate и moc в этом плане не получается, так как ни в одном из них нет возможности использовать аналог препроцессорных переменных.
---
Еще можно попробовать такой трюк:
class MyObject : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int value READ value WRITE setValue)
    Q_PROPERTY(QString text READ text WRITE setText)
#if 0
    QObject::tr("value");
    QObject::tr("text");
#endif
...
    QString localizedName(const char* propertyName)
    {
            return tr(propertyName);
    }


Сообщение отредактировал SABROG - 7.7.2010, 17:29
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
a_goodgirl
  опции профиля:
сообщение 7.7.2010, 18:05
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 35
Регистрация: 4.6.2009
Пользователь №: 801

Спасибо сказали: 0 раз(а)




Репутация:   0  


#if 0
    QObject::tr("value");
    QObject::tr("text");
#endif

не видит lupdate его.

Но и первый вариант что-то не получается.. Находит в цикле
for (int i = 0; i < sizeof(properties)/sizeof(properties[0]); ++i)

нужное имя, но (если печатать например в qDebug) - оно непереведенное, хотя вроде бы в лингвисте оно переведено.
Сейчас еще подумаю, где что может быть не так.

Хотя в таком виде вариант все равно не годится - в приложении уже около сотни классов, приделывать к каждому такую функцию - невозможно без какой-то оптимизации кода.



============================
первый вариант работает
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 7.7.2010, 18:05
Сообщение #10


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Для ускорения поиска можно ассоциативный контейнер std::map приделать. А как унифицировать функцию заполнения и поиска для всех классов... Тут приходит в голову только описать в виде макроса и вставить во все нужные классы (в статическую функцию класса). Первый вызов функции дополнительно ещё заполним мап, а все остальные - только произведут поиск
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


13 чел. читают эту тему (гостей: 13, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 21.12.2024, 3:05