Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск стрингов в ява классах, Поиск стрингов в ява классах 
:(
    Опции темы
Kizja
Дата 22.4.2008, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 15.7.2007

Репутация: нет
Всего: нет



Привет всем, кто-нибудь знает, как решить такую проблему:

Допустим есть какой-нибудь проект и надо его перевести на другой язык – ну например, если веб приложение, то все заголовки, названия кнопок, ошибки, эксепшены итд. Т.е. другими словами надо пройти все *.java файлы и найти в них интересующие стринги – естественно не собирать всё подряд, а именно те стринговые значения, которые являются фразой и нуждаются в последствие в переводе. 

Слышал про antlr, нашёл в интернете примерно такую программу, которая проходит файл и находит всё что там есть, но как сделать, чтобы она не тупо всё находила, а именно то, что надо: 

Код

import java.io.File;
import java.io.FileInputStream;

import org.apache.ws.jaxme.js.jparser.JavaLexer;
import org.apache.ws.jaxme.js.jparser.JavaRecognizer;
import org.apache.ws.jaxme.js.jparser.JavaTokenTypes;

import antlr.ASTFactory;
import antlr.collections.AST;

public class JavaEmitter implements JavaTokenTypes {
    private final static int ROOT_ID = 0;

    public static void main(String[] args) {
            if (args.length != 1) {
                System.err.println("Usage: java JavaEmitter MyFile.java");
                System.exit(1);
            }
            String fileName = args[0];

        File file = new File(fileName);
        if (!file.exists()) {
            System.err.println("File does not exist:" + fileName);
            System.exit(1);
        }
        if (!file.isFile()) {
            System.err.println("File is not a regular file:" + fileName);
            System.exit(1);
        }
        try {
            FileInputStream fis = new FileInputStream(fileName);
            // Create a scanner that reads from the input stream passed to us
            JavaLexer lexer = new JavaLexer(fis);
            lexer.setFilename(fileName);

            // Create a parser that reads from the scanner
            JavaRecognizer parser = new JavaRecognizer(lexer);
            parser.setFilename(fileName);

            // start parsing at the compilationUnit rule
            parser.compilationUnit();

            // Create a root AST node with id 0, and its child is the AST produced by the parser:
            ASTFactory factory = new ASTFactory();
            AST root = factory.create(ROOT_ID, "AST ROOT");
            root.setFirstChild(parser.getAST());

            // Look at the AST if you want, by uncommenting the line below:
            showTree(root);
        } catch (Exception e) {
            System.err.println("parser exception: " + e);
            e.printStackTrace(); // so we can get stack trace        
        }
    }

    private static void showTree(AST t) {
        if (t == null)
            return;
        
        System.err.println("text:" + t.getText() + " type=" + t.getType());
        
        AST child = t.getFirstChild();
        showTree(child);
        AST next = t.getNextSibling();
        showTree(next);
    }
}


Может кто-то сталкивался с подобной задачей или хотя бы есть идеи как это сделать? Проблема в том, что эти стринги могут относится к разным местам – например, если один и тот же стринг, скажем в методе setTitle(„Home page“); то его надо находить, а если это логи Logger.debug(„Home page“); то такой стринг интереса не представляет и браться не должен.
PM MAIL   Вверх
LSD
Дата 22.4.2008, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Вообще задача интернационализации приложения, решается обычно не так. Все строковые значения которые требуется переводить, выносятся в resource bundle, затем для каждого поддерживаемого языка создается свой bundle.

Любая приличная IDE умеет вытаскивать текст в resource bundle.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Kizja
Дата 22.4.2008, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 15.7.2007

Репутация: нет
Всего: нет



LSD, сам перевод работает - то, что я написал выше в задании, требуется, на сколько я понял, для контроля над тем, какие новые фразы, требуемые перевода добавились. Короче, одним словом, прогеры комитят код, а тем, кто занимается переводом влом его просматривать, кроме того здесь вступает в силу человеческий фактор и что-то может быть пропущено, и они хотят, чтобы в конечном счёте было что-то типа такого:

Есть файл с переводом, ищутся стринги из ява классов и сравниваются есть ли уже данная фраза среди переведённых или же нету, т.е. допустим в итоге после окончания программы, должен получиться результат типа:

Главная страница = Main page (нашёл стринг в ява классе и соответсвие в переводах)
Новости = ??? (нашёл стринг новости, но среди переводов не нашёл соответствие этому стрингу - News)

Как бы суть проблемы не в том, что надо перевести, а суть в том, что надо выковырить нужные стринги из  ява файлов.
PM MAIL   Вверх
AlexeyVorotnikov
Дата 22.4.2008, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 18.6.2007
Где: Москва

Репутация: 10
Всего: 18



А как отличать какие строчки надо переводить, а какие -- нет?


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
Kizja
Дата 22.4.2008, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 15.7.2007

Репутация: нет
Всего: нет



У меня пока что один вариант, который мне кажется разумным, хотя возможно он на самом деле и плохой: допустим будет тхт файл с именами классов, возможно так же там будут вместе с классами и методы, которые следует обрабатывать - это видимо получится очень длинный файл, если каждый конкретный метод будет там прописываться, но в тоже время от его увеличения, не прибавится проблем, т.е. просто программе надо будет больше информации переработать.
PM MAIL   Вверх
LSD
Дата 22.4.2008, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Kizja @  22.4.2008,  17:04 Найти цитируемый пост)
допустим будет тхт файл с именами классов, возможно так же там будут вместе с классами и методы, которые следует обрабатывать - это видимо получится очень длинный файл, если каждый конкретный метод будет там прописываться, но в тоже время от его увеличения, не прибавится проблем, т.е. просто программе надо будет больше информации переработать.

Интернационализация по русски, бесмысленная и беспощадная smile


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
AlexeyVorotnikov
Дата 22.4.2008, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 18.6.2007
Где: Москва

Репутация: 10
Всего: 18



Цитата(Kizja @ 22.4.2008,  17:04)
У меня пока что один вариант, который мне кажется разумным, хотя возможно он на самом деле и плохой: допустим будет тхт файл с именами классов, возможно так же там будут вместе с классами и методы, которые следует обрабатывать - это видимо получится очень длинный файл, если каждый конкретный метод будет там прописываться, но в тоже время от его увеличения, не прибавится проблем, т.е. просто программе надо будет больше информации переработать.

Что-то я не понял этой идеи...
Строчки-то как различать?


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
Kizja
Дата 22.4.2008, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 15.7.2007

Репутация: нет
Всего: нет



AlexeyVorotnikov, если запустить тот код, который я указывал выше и передать параметром класс, который содержит: 
Код

public class Test {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}


То в результате программа выдаст:

text:AST ROOT type=0
text:CLASS_DEF type=14
text:MODIFIERS type=5
text:public type=89
text:Test type=68
text:EXTENDS_CLAUSE type=18
text:IMPLEMENTS_CLAUSE type=19
text:OBJBLOCK type=6
text:METHOD_DEF type=9
text:MODIFIERS type=5
text:public type=89
text:static type=65
text:TYPE type=13
text:void type=78
text:main type=68
text:PARAMETERS type=20
text:PARAMETER_DEF type=21
text:MODIFIERS type=5
text:TYPE type=13
text:String type=68
text:[ type=17
text:args type=68
text:{ type=7
text:EXPR type=28
text:( type=27
text:. type=69
text:. type=69
text:System type=68
text:out type=68
text:println type=68
text:ELIST type=34
text:EXPR type=28
text:"Hello World" type=162

Где видно, что он нашёл стринг "Hello World", а перед этим видно в какой метод этот стринг параметром передавался: 
text:System type=68
text:out type=68
text:println type=68

System.out.println будет как бы ключом для поиска стринга, т.е. если он имеется в списке путей, подлежащих переводу, то "Hello world" должен браться, если нету, значит не должен. Возможно это корявый подход, но что-то ничего другого не придумал и здесь тоже никто ничего дельного не предложил, а ты может знаешь более хороший способ?
PM MAIL   Вверх
powerOn
Дата 22.4.2008, 21:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Мда... Эта тема отличный пример того, как не нужно проектировать приложения. Или того, что бывает с изначально криво-спроектированными приложениями где-то в середине процесса разработки.

Тут только один грамотный путь - это использовать Resource Bundles. Причём этот путь был протоптан настолько давно, что нужно было очень "постараться" чтобы с него свернуть... 

Цитата(Kizja @  22.4.2008,  16:40 Найти цитируемый пост)
Короче, одним словом, прогеры комитят код, а тем, кто занимается переводом влом его просматривать, кроме того здесь вступает в силу человеческий фактор и что-то может быть пропущено, и они хотят, чтобы в конечном счёте было что-то типа такого

А те кто занимается переводом в исходники вообще смотреть не должны. У них должен быть доступ к bundle-файлам и информация о ключах. И всё.
Ну а если нужно автоматизировать поиск пропущенных ключей или значений, то по bundle-файлам это сделать как 2 байта переслать.

Лично бы я, не пожалел времени переделать все на бандлы. Например в NetBeans есть мастер интернационализации, который помогает искать захардкоденые строки и выносить их в файлы локализации.




--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
math64
Дата 23.4.2008, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Цитата(powerOn @  22.4.2008,  21:00 Найти цитируемый пост)
А те кто занимается переводом в исходники вообще смотреть не должны

И получают перевод "train" как "поезд" вместо "тренировать" (хотя обычно переводчикам исходников или хотя бы работающей программы не дают и они в таких казусах чаще всего не виноваты)
PM   Вверх
iluvatar
Дата 23.4.2008, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 17.9.2007

Репутация: нет
Всего: 4



Намного лучше если переводчик будет читать код и разбираться в каком контексте используется эта константа в этом методе?
А еще придумали такую вещь как комментарий.

Это сообщение отредактировал(а) iluvatar - 23.4.2008, 08:37
PM MAIL ICQ   Вверх
powerOn
Дата 23.4.2008, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Цитата(math64 @  23.4.2008,  09:06 Найти цитируемый пост)
И получают перевод "train" как "поезд" вместо "тренировать" (хотя обычно переводчикам исходников или хотя бы работающей программы не дают и они в таких казусах чаще всего не виноваты) 

Это от таланта переводчика зависит.  smile А вообще должна быть документация по UI с описанием где и что должно быть. Да и этап тестирования никто не отменял.



--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0982 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.