1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-03 17:59:33 +02:00

interface language option

This commit is contained in:
Nikolay Pultsin 2013-03-07 07:59:03 +04:00
parent 061c9d9b68
commit 4a2909b19f
69 changed files with 374 additions and 113 deletions

View file

@ -1,6 +1,7 @@
===== 1.7.4 (Mar ??, 2013) ===== ===== 1.7.4 (Mar ??, 2013) =====
* Book/bookmark deserializer: SAX instead of our own XML parser * Book/bookmark deserializer: SAX instead of our own XML parser
* Georgian localization (by Bookland.ge) * Georgian localization (by Bookland.ge)
* Interface language option
===== 1.7.3 (Mar 04, 2013) ===== ===== 1.7.3 (Mar 04, 2013) =====
* Library service does not work in background after program closing * Library service does not work in background after program closing

View file

@ -12,5 +12,6 @@
<p>უფრო მეტი ინფორმაციისთვის პროგრამა FBReader-ის შესახებ, ასევე, სხვადასხვა მოწყობილობებისთვის ვერსიების გადმოსაწერად ეწვიეთ<a l:href="http://www.fbreader.org/FBReaderJ">ჩვენ საიტს</a>.</p> <p>უფრო მეტი ინფორმაციისთვის პროგრამა FBReader-ის შესახებ, ასევე, სხვადასხვა მოწყობილობებისთვის ვერსიების გადმოსაწერად ეწვიეთ<a l:href="http://www.fbreader.org/FBReaderJ">ჩვენ საიტს</a>.</p>
<p>შეტყობინებეი ახალი ვერსიების და სხვა ინფორმაციების შესახებ ქვეყნდება <a l:href="http://twitter.com/fbreader_ru">twitter'ზე</a>.</p> <p>შეტყობინებეი ახალი ვერსიების და სხვა ინფორმაციების შესახებ ქვეყნდება <a l:href="http://twitter.com/fbreader_ru">twitter'ზე</a>.</p>
<p>თუ გსურთ ავტორებთან დაკავშირება, <a l:href="mailto:contact@geometerplus.com">მოგვწერეთ</a> ელექტრონული წერილი.</p> <p>თუ გსურთ ავტორებთან დაკავშირება, <a l:href="mailto:contact@geometerplus.com">მოგვწერეთ</a> ელექტრონული წერილი.</p>
<p>ქართული თარგმანის ავტორია კომპანია წიგნის სამყარო <a href="www.bookland.ge">www.bookland.ge</a>.</p>
</body> </body>
</FictionBook> </FictionBook>

View file

@ -288,6 +288,7 @@
</node> </node>
<node name="appearance" value="Выгляд"> <node name="appearance" value="Выгляд">
<node name="summary" value="Налады экрану, паліцы стану, сьвятла кнопак"/> <node name="summary" value="Налады экрану, паліцы стану, сьвятла кнопак"/>
<node name="language" value="Interface language" toBeTranslated="true"/>
<node name="screenOrientation" value="Арыентацыя экрану"> <node name="screenOrientation" value="Арыентацыя экрану">
<node name="system" value="Сыстэмная"/> <node name="system" value="Сыстэмная"/>
<node name="sensor" value="Адпаведна з арыентацыяй прылады"/> <node name="sensor" value="Адпаведна з арыентацыяй прылады"/>
@ -322,8 +323,8 @@
</node> </node>
<node name="dontTurnScreenOff" value="Не даваць экрану гаснуць"> <node name="dontTurnScreenOff" value="Не даваць экрану гаснуць">
<node name="0" value="Заўсёды"/> <node name="0" value="Заўсёды"/>
<node name="25" value="Калі зарад батарэі большы за 25%"/> <node name="25" value="Калі зарад батарэі большы за 25%%"/>
<node name="50" value="Калі зарад батарэі большы за 50%"/> <node name="50" value="Калі зарад батарэі большы за 50%%"/>
<node name="100" value="Ніколі"/> <node name="100" value="Ніколі"/>
</node> </node>
<node name="dontTurnScreenOffDuringCharging" value="Не даваць экрану гаснуць падчас зараджаньня"> <node name="dontTurnScreenOffDuringCharging" value="Не даваць экрану гаснуць падчас зараджаньня">

View file

@ -287,6 +287,7 @@
</node> </node>
<node name="appearance" value="Външен вид"> <node name="appearance" value="Външен вид">
<node name="summary" value="Екран за настройки, статус бар, светещи бутони"/> <node name="summary" value="Екран за настройки, статус бар, светещи бутони"/>
<node name="language" value="Interface language" toBeTranslated="true"/>
<node name="screenOrientation" value="Ориентация на екрана"> <node name="screenOrientation" value="Ориентация на екрана">
<node name="system" value="системна"/> <node name="system" value="системна"/>
<node name="sensor" value="зависи от ориентацията на устройството"/> <node name="sensor" value="зависи от ориентацията на устройството"/>

View file

@ -286,6 +286,7 @@
</node> </node>
<node name="appearance" value="Apariència"> <node name="appearance" value="Apariència">
<node name="summary" value="Ajustes de pantalla, barra de estado, luz de botones" toBeTranslated="true"/> <node name="summary" value="Ajustes de pantalla, barra de estado, luz de botones" toBeTranslated="true"/>
<node name="language" value="Interface language" toBeTranslated="true"/>
<node name="screenOrientation" value="Orientació de la pantalla"> <node name="screenOrientation" value="Orientació de la pantalla">
<node name="system" value="Sistema"/> <node name="system" value="Sistema"/>
<node name="sensor" value="Sensible a la orientación del dispositivo" toBeTranslated="true"/> <node name="sensor" value="Sensible a la orientación del dispositivo" toBeTranslated="true"/>

View file

@ -291,6 +291,7 @@
</node> </node>
<node name="appearance" value="Vzhled"> <node name="appearance" value="Vzhled">
<node name="summary" value="Otáčení, stavový řádek"/> <node name="summary" value="Otáčení, stavový řádek"/>
<node name="language" value="Interface language" toBeTranslated="true"/>
<node name="screenOrientation" value="Orientace obrazovky"> <node name="screenOrientation" value="Orientace obrazovky">
<node name="system" value="Systém"/> <node name="system" value="Systém"/>
<node name="sensor" value="Podle orientace zařízení"/> <node name="sensor" value="Podle orientace zařízení"/>

View file

@ -276,6 +276,7 @@
</node> </node>
<node name="appearance" value="Aussehen"> <node name="appearance" value="Aussehen">
<node name="summary" value="Ausrichtung, Statuszeile"/> <node name="summary" value="Ausrichtung, Statuszeile"/>
<node name="language" value="Interface language" toBeTranslated="true"/>
<node name="screenOrientation" value="Bildschirm Ausrichtung"> <node name="screenOrientation" value="Bildschirm Ausrichtung">
<node name="system" value="System"/> <node name="system" value="System"/>
<node name="sensor" value="Sensor"/> <node name="sensor" value="Sensor"/>

View file

@ -282,6 +282,7 @@
</node> </node>
<node name="appearance" value="Appearance"> <node name="appearance" value="Appearance">
<node name="summary" value="Display settings, status bar, button lights"/> <node name="summary" value="Display settings, status bar, button lights"/>
<node name="language" value="Interface language"/>
<node name="screenOrientation" value="Screen orientation"> <node name="screenOrientation" value="Screen orientation">
<node name="system" value="System"/> <node name="system" value="System"/>
<node name="sensor" value="Device orientation sensitive"/> <node name="sensor" value="Device orientation sensitive"/>

View file

@ -286,6 +286,7 @@
</node> </node>
<node name="appearance" value="Apariencia"> <node name="appearance" value="Apariencia">
<node name="summary" value="Ajustes de pantalla, barra de estado, luz de botones"/> <node name="summary" value="Ajustes de pantalla, barra de estado, luz de botones"/>
<node name="language" value="Interface language" toBeTranslated="true"/>
<node name="screenOrientation" value="Orientación de la pantalla"> <node name="screenOrientation" value="Orientación de la pantalla">
<node name="system" value="Sistema"/> <node name="system" value="Sistema"/>
<node name="sensor" value="Sensible a la orientación del dispositivo"/> <node name="sensor" value="Sensible a la orientación del dispositivo"/>

View file

@ -275,6 +275,7 @@
</node> </node>
<node name="appearance" value="Apparence"> <node name="appearance" value="Apparence">
<node name="summary" value="Rotation, barre de statut"/> <node name="summary" value="Rotation, barre de statut"/>
<node name="language" value="Interface language" toBeTranslated="true"/>
<node name="screenOrientation" value="Orientation de l'écran"> <node name="screenOrientation" value="Orientation de l'écran">
<node name="system" value="Système"/> <node name="system" value="Système"/>
<node name="sensor" value="Détectée par les capteurs"/> <node name="sensor" value="Détectée par les capteurs"/>

View file

@ -272,6 +272,7 @@
</node> </node>
<node name="appearance" value="Aparencia"> <node name="appearance" value="Aparencia">
<node name="summary" value="Rotación, barra de estado"/> <node name="summary" value="Rotación, barra de estado"/>
<node name="language" value="Interface language" toBeTranslated="true"/>
<node name="screenOrientation" value="Screen orientation" toBeTranslated="true"> <node name="screenOrientation" value="Screen orientation" toBeTranslated="true">
<node name="system" value="System" toBeTranslated="true"/> <node name="system" value="System" toBeTranslated="true"/>
<node name="sensor" value="Device orientation sensitive" toBeTranslated="true"/> <node name="sensor" value="Device orientation sensitive" toBeTranslated="true"/>

View file

@ -272,6 +272,7 @@
</node> </node>
<node name="appearance" value="Megjelenés"> <node name="appearance" value="Megjelenés">
<node name="summary" value="Elforgatás, állapotsor"/> <node name="summary" value="Elforgatás, állapotsor"/>
<node name="language" value="Interface language" toBeTranslated="true"/>
<node name="screenOrientation" value="Kijelző iránya"> <node name="screenOrientation" value="Kijelző iránya">
<node name="system" value="Rendszerbeállítás"/> <node name="system" value="Rendszerbeállítás"/>
<node name="sensor" value="A készülék irányától függ"/> <node name="sensor" value="A készülék irányától függ"/>

View file

@ -273,6 +273,7 @@
</node> </node>
<node name="appearance" value="Aspetto"> <node name="appearance" value="Aspetto">
<node name="summary" value="Rotazione, barra di stato"/> <node name="summary" value="Rotazione, barra di stato"/>
<node name="language" value="Interface language" toBeTranslated="true"/>
<node name="screenOrientation" value="Screen orientation" toBeTranslated="true"> <node name="screenOrientation" value="Screen orientation" toBeTranslated="true">
<node name="system" value="System" toBeTranslated="true"/> <node name="system" value="System" toBeTranslated="true"/>
<node name="sensor" value="Device orientation sensitive" toBeTranslated="true"/> <node name="sensor" value="Device orientation sensitive" toBeTranslated="true"/>

View file

@ -287,6 +287,7 @@
</node> </node>
<node name="appearance" value="გარეგნობა"> <node name="appearance" value="გარეგნობა">
<node name="summary" value="ეკრანი, სტატუს ბარი, ღილაკების განათება"/> <node name="summary" value="ეკრანი, სტატუს ბარი, ღილაკების განათება"/>
<node name="language" value="Interface language" toBeTranslated="true"/>
<node name="screenOrientation" value="ეკრანის ორიენტაცია"> <node name="screenOrientation" value="ეკრანის ორიენტაცია">
<node name="system" value="სისტემური"/> <node name="system" value="სისტემური"/>
<node name="sensor" value="დამოკიდებულია მოწყობილობის ორიენტაციაზე"/> <node name="sensor" value="დამოკიდებულია მოწყობილობის ორიენტაციაზე"/>

View file

@ -282,6 +282,7 @@
</node> </node>
<node name="appearance" value="Utseende"> <node name="appearance" value="Utseende">
<node name="summary" value="Visningsinnstillinger, statuslinje, knappelys"/> <node name="summary" value="Visningsinnstillinger, statuslinje, knappelys"/>
<node name="language" value="Interface language" toBeTranslated="true"/>
<node name="screenOrientation" value="Visningsretning"> <node name="screenOrientation" value="Visningsretning">
<node name="system" value="System"/> <node name="system" value="System"/>
<node name="sensor" value="Følger retningen til enhet"/> <node name="sensor" value="Følger retningen til enhet"/>

View file

@ -282,6 +282,7 @@
</node> </node>
<node name="appearance" value="Weergave"> <node name="appearance" value="Weergave">
<node name="summary" value="Draaien, statusbalk"/> <node name="summary" value="Draaien, statusbalk"/>
<node name="language" value="Interface language" toBeTranslated="true"/>
<node name="screenOrientation" value="Schermorientatie"> <node name="screenOrientation" value="Schermorientatie">
<node name="system" value="Systeem"/> <node name="system" value="Systeem"/>
<node name="sensor" value="Afhankelijk van stand apparaat"/> <node name="sensor" value="Afhankelijk van stand apparaat"/>

View file

@ -272,6 +272,7 @@
</node> </node>
<node name="appearance" value="Wygląd"> <node name="appearance" value="Wygląd">
<node name="summary" value="Rotacja i pasek statusu"/> <node name="summary" value="Rotacja i pasek statusu"/>
<node name="language" value="Interface language" toBeTranslated="true"/>
<node name="screenOrientation" value="Screen orientation" toBeTranslated="true"> <node name="screenOrientation" value="Screen orientation" toBeTranslated="true">
<node name="system" value="System" toBeTranslated="true"/> <node name="system" value="System" toBeTranslated="true"/>
<node name="sensor" value="Device orientation sensitive" toBeTranslated="true"/> <node name="sensor" value="Device orientation sensitive" toBeTranslated="true"/>

View file

@ -284,6 +284,7 @@
</node> </node>
<node name="appearance" value="Aparência"> <node name="appearance" value="Aparência">
<node name="summary" value="Definições do visor, barra de status, luzes das teclas"/> <node name="summary" value="Definições do visor, barra de status, luzes das teclas"/>
<node name="language" value="Interface language" toBeTranslated="true"/>
<node name="screenOrientation" value="Orientação da tela"> <node name="screenOrientation" value="Orientação da tela">
<node name="system" value="Sistema"/> <node name="system" value="Sistema"/>
<node name="sensor" value="Orientação do dispositivo sensível"/> <node name="sensor" value="Orientação do dispositivo sensível"/>

View file

@ -272,6 +272,7 @@
</node> </node>
<node name="appearance" value="Aspect"> <node name="appearance" value="Aspect">
<node name="summary" value="Rotire, bara de stare"/> <node name="summary" value="Rotire, bara de stare"/>
<node name="language" value="Interface language" toBeTranslated="true"/>
<node name="screenOrientation" value="Orientarea ecranului"> <node name="screenOrientation" value="Orientarea ecranului">
<node name="system" value="Sistem"/> <node name="system" value="Sistem"/>
<node name="sensor" value="Device orientation sensitive" toBeTranslated="true"/> <node name="sensor" value="Device orientation sensitive" toBeTranslated="true"/>

View file

@ -287,6 +287,7 @@
</node> </node>
<node name="appearance" value="Внешний вид"> <node name="appearance" value="Внешний вид">
<node name="summary" value="Экран, строка состояния, подсветка кнопок"/> <node name="summary" value="Экран, строка состояния, подсветка кнопок"/>
<node name="language" value="Язык интерфейса"/>
<node name="screenOrientation" value="Ориентация экрана"> <node name="screenOrientation" value="Ориентация экрана">
<node name="system" value="системная"/> <node name="system" value="системная"/>
<node name="sensor" value="зависит от ориентации устройства"/> <node name="sensor" value="зависит от ориентации устройства"/>

View file

@ -282,6 +282,7 @@
</node> </node>
<node name="appearance" value="Изглед"> <node name="appearance" value="Изглед">
<node name="summary" value="Приказ подешавања, траке стања и осветљења дугмади."/> <node name="summary" value="Приказ подешавања, траке стања и осветљења дугмади."/>
<node name="language" value="Interface language" toBeTranslated="true"/>
<node name="screenOrientation" value="Усмерење екрана"> <node name="screenOrientation" value="Усмерење екрана">
<node name="system" value="Систем"/> <node name="system" value="Систем"/>
<node name="sensor" value="Осетљивост на усмерење"/> <node name="sensor" value="Осетљивост на усмерење"/>

View file

@ -272,6 +272,7 @@
</node> </node>
<node name="appearance" value="ลักษณะการแสดงผล"> <node name="appearance" value="ลักษณะการแสดงผล">
<node name="summary" value="การหมุนหน้าจอ, แถบสถานะ"/> <node name="summary" value="การหมุนหน้าจอ, แถบสถานะ"/>
<node name="language" value="Interface language" toBeTranslated="true"/>
<node name="screenOrientation" value="Screen orientation" toBeTranslated="true"> <node name="screenOrientation" value="Screen orientation" toBeTranslated="true">
<node name="system" value="System" toBeTranslated="true"/> <node name="system" value="System" toBeTranslated="true"/>
<node name="sensor" value="Device orientation sensitive" toBeTranslated="true"/> <node name="sensor" value="Device orientation sensitive" toBeTranslated="true"/>

View file

@ -282,6 +282,7 @@
</node> </node>
<node name="appearance" value="Görünüm"> <node name="appearance" value="Görünüm">
<node name="summary" value="Ekran ayarları, durum çubuğu, düğme ışıkları"/> <node name="summary" value="Ekran ayarları, durum çubuğu, düğme ışıkları"/>
<node name="language" value="Interface language" toBeTranslated="true"/>
<node name="screenOrientation" value="Ekran döndürme"> <node name="screenOrientation" value="Ekran döndürme">
<node name="system" value="Sistem"/> <node name="system" value="Sistem"/>
<node name="sensor" value="Cihaz dönüş hassasiyeti"/> <node name="sensor" value="Cihaz dönüş hassasiyeti"/>

View file

@ -272,6 +272,7 @@
</node> </node>
<node name="appearance" value="Зовнішній вигляд"> <node name="appearance" value="Зовнішній вигляд">
<node name="summary" value="Орієнтація, панель стану"/> <node name="summary" value="Орієнтація, панель стану"/>
<node name="language" value="Interface language" toBeTranslated="true"/>
<node name="screenOrientation" value="Орієнтація екрану"> <node name="screenOrientation" value="Орієнтація екрану">
<node name="system" value="Системна"/> <node name="system" value="Системна"/>
<node name="sensor" value="Залежна від положення пристрою"/> <node name="sensor" value="Залежна від положення пристрою"/>

View file

@ -272,6 +272,7 @@
</node> </node>
<node name="appearance" value="Giao diện"> <node name="appearance" value="Giao diện">
<node name="summary" value="Xoay, thanh trạng thái"/> <node name="summary" value="Xoay, thanh trạng thái"/>
<node name="language" value="Interface language" toBeTranslated="true"/>
<node name="screenOrientation" value="Screen orientation" toBeTranslated="true"> <node name="screenOrientation" value="Screen orientation" toBeTranslated="true">
<node name="system" value="System" toBeTranslated="true"/> <node name="system" value="System" toBeTranslated="true"/>
<node name="sensor" value="Device orientation sensitive" toBeTranslated="true"/> <node name="sensor" value="Device orientation sensitive" toBeTranslated="true"/>

View file

@ -272,6 +272,7 @@
</node> </node>
<node name="appearance" value="呈现方式"> <node name="appearance" value="呈现方式">
<node name="summary" value="旋转,状态工具条"/> <node name="summary" value="旋转,状态工具条"/>
<node name="language" value="Interface language" toBeTranslated="true"/>
<node name="screenOrientation" value="屏幕方向"> <node name="screenOrientation" value="屏幕方向">
<node name="system" value="系统"/> <node name="system" value="系统"/>
<node name="sensor" value="感知设备方向"/> <node name="sensor" value="感知设备方向"/>

View file

@ -272,6 +272,7 @@
</node> </node>
<node name="appearance" value="外觀"> <node name="appearance" value="外觀">
<node name="summary" value="旋轉, 狀態列"/> <node name="summary" value="旋轉, 狀態列"/>
<node name="language" value="Interface language" toBeTranslated="true"/>
<node name="screenOrientation" value="Screen orientation" toBeTranslated="true"> <node name="screenOrientation" value="Screen orientation" toBeTranslated="true">
<node name="system" value="System" toBeTranslated="true"/> <node name="system" value="System" toBeTranslated="true"/>
<node name="sensor" value="Device orientation sensitive" toBeTranslated="true"/> <node name="sensor" value="Device orientation sensitive" toBeTranslated="true"/>

30
assets/resources/lang.xml Normal file
View file

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<node name="language-self">
<node name="be" value="Беларуская"/>
<node name="bg" value="Български"/>
<node name="ca" value="Català"/>
<node name="cs" value="Česky"/>
<node name="de" value="Deutsch"/>
<node name="en" value="English"/>
<node name="es" value="Español"/>
<node name="fr" value="Français"/>
<node name="gl" value="Galego"/>
<node name="hu" value="Magyar"/>
<node name="it" value="Italiano"/>
<node name="ka" value="ქართული"/>
<node name="nb" value="Norsk"/>
<node name="nl" value="Nederlands"/>
<node name="pl" value="Polski"/>
<node name="pt" value="Português"/>
<node name="ro" value="Romana"/>
<node name="ru" value="Русский"/>
<node name="sr" value="Српски"/>
<node name="th" value="ไทย"/>
<node name="tr" value="Türkçe"/>
<node name="uk" value="Українська"/>
<node name="vi" value="Tiếng Việt"/>
<node name="zh" value="中文"/>
<node name="zh_TW" value="Chinese (traditional)" toBeTranslated="true"/>
</node>
</resources>

View file

@ -65,6 +65,7 @@
<node name="zh" value="Кітайская мова"/> <node name="zh" value="Кітайская мова"/>
<node name="other" value="Іншая мова"/> <node name="other" value="Іншая мова"/>
<node name="multi" value="Некалькі моваў"/> <node name="multi" value="Некалькі моваў"/>
<node name="system" value="System" toBeTranslated="true"/>
</node> </node>
<node name="boolean3"> <node name="boolean3">
<node name="on" value="уключана"/> <node name="on" value="уключана"/>

View file

@ -64,6 +64,7 @@
<node name="zh" value="китайски"/> <node name="zh" value="китайски"/>
<node name="other" value="друг"/> <node name="other" value="друг"/>
<node name="multi" value="многоезичен"/> <node name="multi" value="многоезичен"/>
<node name="system" value="System" toBeTranslated="true"/>
</node> </node>
<node name="boolean3"> <node name="boolean3">
<node name="on" value="включи"/> <node name="on" value="включи"/>

View file

@ -68,6 +68,7 @@
<node name="zh" value="Chino" toBeTranslated="true"/> <node name="zh" value="Chino" toBeTranslated="true"/>
<node name="other" value="Otro" toBeTranslated="true"/> <node name="other" value="Otro" toBeTranslated="true"/>
<node name="multi" value="Multilingüe" toBeTranslated="true"/> <node name="multi" value="Multilingüe" toBeTranslated="true"/>
<node name="system" value="System" toBeTranslated="true"/>
</node> </node>
<node name="boolean3"> <node name="boolean3">
<node name="on" value="encès"/> <node name="on" value="encès"/>

View file

@ -65,6 +65,7 @@
<node name="zh" value="Čínsky"/> <node name="zh" value="Čínsky"/>
<node name="other" value="Jiný"/> <node name="other" value="Jiný"/>
<node name="multi" value="Vícejazyčná"/> <node name="multi" value="Vícejazyčná"/>
<node name="system" value="System" toBeTranslated="true"/>
</node> </node>
<node name="boolean3"> <node name="boolean3">
<node name="on" value="zap"/> <node name="on" value="zap"/>

View file

@ -67,6 +67,7 @@
<node name="zh" value="Chinesisch"/> <node name="zh" value="Chinesisch"/>
<node name="other" value="Andere"/> <node name="other" value="Andere"/>
<node name="multi" value="Mehrsprachig"/> <node name="multi" value="Mehrsprachig"/>
<node name="system" value="System" toBeTranslated="true"/>
</node> </node>
<node name="boolean3"> <node name="boolean3">
<node name="on" value="ein"/> <node name="on" value="ein"/>

View file

@ -64,6 +64,7 @@
<node name="zh" value="Chinese"/> <node name="zh" value="Chinese"/>
<node name="other" value="Other"/> <node name="other" value="Other"/>
<node name="multi" value="Multilanguage"/> <node name="multi" value="Multilanguage"/>
<node name="system" value="System"/>
</node> </node>
<node name="boolean3"> <node name="boolean3">
<node name="on" value="on"/> <node name="on" value="on"/>

View file

@ -69,6 +69,7 @@
<node name="zh" value="Chino"/> <node name="zh" value="Chino"/>
<node name="other" value="Otro"/> <node name="other" value="Otro"/>
<node name="multi" value="Multilingüe"/> <node name="multi" value="Multilingüe"/>
<node name="system" value="System" toBeTranslated="true"/>
</node> </node>
<node name="boolean3"> <node name="boolean3">
<node name="on" value="encendido"/> <node name="on" value="encendido"/>

View file

@ -69,6 +69,7 @@
<node name="zh" value="Chinois"/> <node name="zh" value="Chinois"/>
<node name="other" value="Autre"/> <node name="other" value="Autre"/>
<node name="multi" value="Multi-langage"/> <node name="multi" value="Multi-langage"/>
<node name="system" value="System" toBeTranslated="true"/>
</node> </node>
<node name="boolean3"> <node name="boolean3">
<node name="on" value="activé"/> <node name="on" value="activé"/>

View file

@ -64,6 +64,7 @@
<node name="zh" value="Chinés"/> <node name="zh" value="Chinés"/>
<node name="other" value="Outro"/> <node name="other" value="Outro"/>
<node name="multi" value="Multiidioma"/> <node name="multi" value="Multiidioma"/>
<node name="system" value="System" toBeTranslated="true"/>
</node> </node>
<node name="boolean3"> <node name="boolean3">
<node name="on" value="activado"/> <node name="on" value="activado"/>

View file

@ -65,6 +65,7 @@
<node name="zh" value="Kínai"/> <node name="zh" value="Kínai"/>
<node name="other" value="Egyéb"/> <node name="other" value="Egyéb"/>
<node name="multi" value="Többnyelvű"/> <node name="multi" value="Többnyelvű"/>
<node name="system" value="System" toBeTranslated="true"/>
</node> </node>
<node name="boolean3"> <node name="boolean3">
<node name="on" value="be"/> <node name="on" value="be"/>

View file

@ -65,6 +65,7 @@
<node name="zh" value="Cinese"/> <node name="zh" value="Cinese"/>
<node name="other" value="Altro"/> <node name="other" value="Altro"/>
<node name="multi" value="Multilanguage" toBeTranslated="true"/> <node name="multi" value="Multilanguage" toBeTranslated="true"/>
<node name="system" value="System" toBeTranslated="true"/>
</node> </node>
<node name="boolean3"> <node name="boolean3">
<node name="on" value="on"/> <node name="on" value="on"/>

View file

@ -47,7 +47,7 @@
<node name="hu" value="უნგრული"/> <node name="hu" value="უნგრული"/>
<node name="id" value="ინდონეზიური"/> <node name="id" value="ინდონეზიური"/>
<node name="it" value="იტალიური"/> <node name="it" value="იტალიური"/>
<node name="ka" value="Georgian" toBeTranslated="true"/> <node name="ka" value="ქართული"/>
<node name="lt" value="ლიტვური"/> <node name="lt" value="ლიტვური"/>
<node name="nl" value="ჰოლანდიური"/> <node name="nl" value="ჰოლანდიური"/>
<node name="nb" value="ნორვეგიული"/> <node name="nb" value="ნორვეგიული"/>
@ -64,6 +64,7 @@
<node name="zh" value="ჩინური"/> <node name="zh" value="ჩინური"/>
<node name="other" value="სხვა"/> <node name="other" value="სხვა"/>
<node name="multi" value="მრავალენოვანი"/> <node name="multi" value="მრავალენოვანი"/>
<node name="system" value="System" toBeTranslated="true"/>
</node> </node>
<node name="boolean3"> <node name="boolean3">
<node name="on" value="ჩართვა"/> <node name="on" value="ჩართვა"/>

View file

@ -64,6 +64,7 @@
<node name="zh" value="Kinesisk"/> <node name="zh" value="Kinesisk"/>
<node name="other" value="Annet"/> <node name="other" value="Annet"/>
<node name="multi" value="Flerspråklig"/> <node name="multi" value="Flerspråklig"/>
<node name="system" value="System" toBeTranslated="true"/>
</node> </node>
<node name="boolean3"> <node name="boolean3">
<node name="on" value="på"/> <node name="on" value="på"/>

View file

@ -65,6 +65,7 @@
<node name="zh" value="Chinees"/> <node name="zh" value="Chinees"/>
<node name="other" value="Anders"/> <node name="other" value="Anders"/>
<node name="multi" value="Meertalig"/> <node name="multi" value="Meertalig"/>
<node name="system" value="System" toBeTranslated="true"/>
</node> </node>
<node name="boolean3"> <node name="boolean3">
<node name="on" value="aan"/> <node name="on" value="aan"/>

View file

@ -64,6 +64,7 @@
<node name="zh" value="Chiński"/> <node name="zh" value="Chiński"/>
<node name="other" value="Inny"/> <node name="other" value="Inny"/>
<node name="multi" value="Wielojęzyczny"/> <node name="multi" value="Wielojęzyczny"/>
<node name="system" value="System" toBeTranslated="true"/>
</node> </node>
<node name="boolean3"> <node name="boolean3">
<node name="on" value="włączone"/> <node name="on" value="włączone"/>

View file

@ -64,6 +64,7 @@
<node name="zh" value="Chinês"/> <node name="zh" value="Chinês"/>
<node name="other" value="Outro"/> <node name="other" value="Outro"/>
<node name="multi" value="Multi-idioma"/> <node name="multi" value="Multi-idioma"/>
<node name="system" value="System" toBeTranslated="true"/>
</node> </node>
<node name="boolean3"> <node name="boolean3">
<node name="on" value="ligado"/> <node name="on" value="ligado"/>

View file

@ -64,6 +64,7 @@
<node name="zh" value="Chineza"/> <node name="zh" value="Chineza"/>
<node name="other" value="Altele"/> <node name="other" value="Altele"/>
<node name="multi" value="Multi limba"/> <node name="multi" value="Multi limba"/>
<node name="system" value="System" toBeTranslated="true"/>
</node> </node>
<node name="boolean3"> <node name="boolean3">
<node name="on" value="deschis"/> <node name="on" value="deschis"/>

View file

@ -64,6 +64,7 @@
<node name="zh" value="китайский"/> <node name="zh" value="китайский"/>
<node name="other" value="другой"/> <node name="other" value="другой"/>
<node name="multi" value="многоязычный"/> <node name="multi" value="многоязычный"/>
<node name="system" value="системный"/>
</node> </node>
<node name="boolean3"> <node name="boolean3">
<node name="on" value="включить"/> <node name="on" value="включить"/>

View file

@ -65,6 +65,7 @@
<node name="zh" value="кинески"/> <node name="zh" value="кинески"/>
<node name="other" value="други"/> <node name="other" value="други"/>
<node name="multi" value="вишејезични"/> <node name="multi" value="вишејезични"/>
<node name="system" value="System" toBeTranslated="true"/>
</node> </node>
<node name="boolean3"> <node name="boolean3">
<node name="on" value="укључено"/> <node name="on" value="укључено"/>

View file

@ -65,6 +65,7 @@
<node name="zh" value="จีน"/> <node name="zh" value="จีน"/>
<node name="other" value="อื่นๆ"/> <node name="other" value="อื่นๆ"/>
<node name="multi" value="หลายภาษา"/> <node name="multi" value="หลายภาษา"/>
<node name="system" value="System" toBeTranslated="true"/>
</node> </node>
<node name="boolean3"> <node name="boolean3">
<node name="on" value="เปิด"/> <node name="on" value="เปิด"/>

View file

@ -58,12 +58,13 @@
<node name="sv" value="Swedish" toBeTranslated="true"/> <node name="sv" value="Swedish" toBeTranslated="true"/>
<node name="ta" value="Tamil" toBeTranslated="true"/> <node name="ta" value="Tamil" toBeTranslated="true"/>
<node name="th" value="Thai" toBeTranslated="true"/> <node name="th" value="Thai" toBeTranslated="true"/>
<node name="tr" value="Türkçe" toBeTranslated="true"/> <node name="tr" value="Türkçe"/>
<node name="uk" value="Ukrainian" toBeTranslated="true"/> <node name="uk" value="Ukrainian" toBeTranslated="true"/>
<node name="vi" value="Vietnamese" toBeTranslated="true"/> <node name="vi" value="Vietnamese" toBeTranslated="true"/>
<node name="zh" value="Chinese" toBeTranslated="true"/> <node name="zh" value="Chinese" toBeTranslated="true"/>
<node name="other" value="Diğer"/> <node name="other" value="Diğer"/>
<node name="multi" value="Çoklu dil"/> <node name="multi" value="Çoklu dil"/>
<node name="system" value="System" toBeTranslated="true"/>
</node> </node>
<node name="boolean3"> <node name="boolean3">
<node name="on" value="açık"/> <node name="on" value="açık"/>

View file

@ -65,6 +65,7 @@
<node name="zh" value="китайська"/> <node name="zh" value="китайська"/>
<node name="other" value="інша"/> <node name="other" value="інша"/>
<node name="multi" value="Мультимовна"/> <node name="multi" value="Мультимовна"/>
<node name="system" value="System" toBeTranslated="true"/>
</node> </node>
<node name="boolean3"> <node name="boolean3">
<node name="on" value="увімкнути"/> <node name="on" value="увімкнути"/>

View file

@ -65,6 +65,7 @@
<node name="zh" value="Tiếng Tàu"/> <node name="zh" value="Tiếng Tàu"/>
<node name="other" value="Khác"/> <node name="other" value="Khác"/>
<node name="multi" value="Multilanguage" toBeTranslated="true"/> <node name="multi" value="Multilanguage" toBeTranslated="true"/>
<node name="system" value="System" toBeTranslated="true"/>
</node> </node>
<node name="boolean3"> <node name="boolean3">
<node name="on" value="bật"/> <node name="on" value="bật"/>

View file

@ -65,6 +65,7 @@
<node name="zh" value="中文"/> <node name="zh" value="中文"/>
<node name="other" value="其他"/> <node name="other" value="其他"/>
<node name="multi" value="多语言"/> <node name="multi" value="多语言"/>
<node name="system" value="System" toBeTranslated="true"/>
</node> </node>
<node name="boolean3"> <node name="boolean3">
<node name="on" value="开"/> <node name="on" value="开"/>

View file

@ -65,6 +65,7 @@
<node name="zh" value="中文"/> <node name="zh" value="中文"/>
<node name="other" value="其他"/> <node name="other" value="其他"/>
<node name="multi" value="多種語言"/> <node name="multi" value="多種語言"/>
<node name="system" value="System" toBeTranslated="true"/>
</node> </node>
<node name="boolean3"> <node name="boolean3">
<node name="on" value="開"/> <node name="on" value="開"/>

View file

@ -8,6 +8,7 @@ fi
for file in ../../assets/resources/$part/*.xml; do for file in ../../assets/resources/$part/*.xml; do
xsltproc clean.xslt $file > `basename $file`; xsltproc clean.xslt $file > `basename $file`;
egrep "[^%]%[^%s01]" $file
done done
for file in *.xml; do for file in *.xml; do
diff $file en.xml > `basename $file .xml`.diff; diff $file en.xml > `basename $file .xml`.diff;

View file

@ -529,6 +529,7 @@ public final class FBReader extends Activity {
case REQUEST_PREFERENCES: case REQUEST_PREFERENCES:
case REQUEST_BOOK_INFO: case REQUEST_BOOK_INFO:
if (resultCode != RESULT_DO_NOTHING) { if (resultCode != RESULT_DO_NOTHING) {
invalidateOptionsMenu();
final Book book = BookInfoActivity.bookByIntent(data); final Book book = BookInfoActivity.bookByIntent(data);
if (book != null) { if (book != null) {
getCollection().bindToService(this, new Runnable() { getCollection().bindToService(this, new Runnable() {

View file

@ -39,6 +39,7 @@ import org.geometerplus.zlibrary.core.filesystem.ZLPhysicalFile;
import org.geometerplus.zlibrary.core.image.ZLImage; import org.geometerplus.zlibrary.core.image.ZLImage;
import org.geometerplus.zlibrary.core.image.ZLLoadableImage; import org.geometerplus.zlibrary.core.image.ZLLoadableImage;
import org.geometerplus.zlibrary.core.resources.ZLResource; import org.geometerplus.zlibrary.core.resources.ZLResource;
import org.geometerplus.zlibrary.core.language.Language;
import org.geometerplus.zlibrary.core.language.ZLLanguageUtil; import org.geometerplus.zlibrary.core.language.ZLLanguageUtil;
import org.geometerplus.zlibrary.ui.android.R; import org.geometerplus.zlibrary.ui.android.R;
@ -261,9 +262,9 @@ public class BookInfoActivity extends Activity {
setupInfoPair(R.id.book_tags, "tags", buffer, tagNames.size()); setupInfoPair(R.id.book_tags, "tags", buffer, tagNames.size());
String language = book.getLanguage(); String language = book.getLanguage();
if (!ZLLanguageUtil.languageCodes().contains(language)) { if (!ZLLanguageUtil.languageCodes().contains(language)) {
language = ZLLanguageUtil.OTHER_LANGUAGE_CODE; language = Language.OTHER_CODE;
} }
setupInfoPair(R.id.book_language, "language", ZLLanguageUtil.languageName(language)); setupInfoPair(R.id.book_language, "language", new Language(language).Name);
} }
private void setupAnnotation(Book book) { private void setupAnnotation(Book book) {

View file

@ -25,6 +25,7 @@ import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.DialogInterface; import android.content.DialogInterface;
import org.geometerplus.zlibrary.core.language.Language;
import org.geometerplus.zlibrary.core.language.ZLLanguageUtil; import org.geometerplus.zlibrary.core.language.ZLLanguageUtil;
import org.geometerplus.zlibrary.core.resources.ZLResource; import org.geometerplus.zlibrary.core.resources.ZLResource;
@ -42,16 +43,20 @@ public class LanguageFilterAction extends RootAction {
public void run(NetworkTree tree) { public void run(NetworkTree tree) {
final NetworkLibrary library = NetworkLibrary.Instance(); final NetworkLibrary library = NetworkLibrary.Instance();
final List<String> allLanguageCodes = library.languageCodes(); final List<Language> allLanguages = new ArrayList<Language>();
Collections.sort(allLanguageCodes, new ZLLanguageUtil.CodeComparator()); for (String code : library.languageCodes()) {
allLanguages.add(new Language(code));
}
Collections.sort(allLanguages);
final Collection<String> activeLanguageCodes = library.activeLanguageCodes(); final Collection<String> activeLanguageCodes = library.activeLanguageCodes();
final CharSequence[] languageNames = new CharSequence[allLanguageCodes.size()]; final CharSequence[] languageNames = new CharSequence[allLanguages.size()];
final boolean[] checked = new boolean[allLanguageCodes.size()]; final boolean[] checked = new boolean[allLanguages.size()];
for (int i = 0; i < allLanguageCodes.size(); ++i) { int index = 0;
final String code = allLanguageCodes.get(i); for (Language language : allLanguages) {
languageNames[i] = ZLLanguageUtil.languageName(code); languageNames[index] = language.Name;
checked[i] = activeLanguageCodes.contains(code); checked[index] = activeLanguageCodes.contains(language.Code);
++index;
} }
final DialogInterface.OnMultiChoiceClickListener listener = final DialogInterface.OnMultiChoiceClickListener listener =
@ -66,13 +71,17 @@ public class LanguageFilterAction extends RootAction {
.setTitle(dialogResource.getResource("languageFilterDialog").getResource("title").getValue()) .setTitle(dialogResource.getResource("languageFilterDialog").getResource("title").getValue())
.setPositiveButton(dialogResource.getResource("button").getResource("ok").getValue(), new DialogInterface.OnClickListener() { .setPositiveButton(dialogResource.getResource("button").getResource("ok").getValue(), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
final TreeSet<String> newActiveCodes = new TreeSet<String>(new ZLLanguageUtil.CodeComparator()); final TreeSet<Language> newActiveLanguages = new TreeSet<Language>();
for (int i = 0; i < checked.length; ++i) { for (int i = 0; i < checked.length; ++i) {
if (checked[i]) { if (checked[i]) {
newActiveCodes.add(allLanguageCodes.get(i)); newActiveLanguages.add(allLanguages.get(i));
} }
} }
library.setActiveLanguageCodes(newActiveCodes); final List<String> codes = new ArrayList<String>(newActiveLanguages.size());
for (Language language : newActiveLanguages) {
codes.add(language.Code);
}
library.setActiveLanguageCodes(codes);
library.synchronize(); library.synchronize();
} }
}) })

View file

@ -26,6 +26,7 @@ import android.content.Intent;
import org.geometerplus.zlibrary.core.filesystem.ZLFile; import org.geometerplus.zlibrary.core.filesystem.ZLFile;
import org.geometerplus.zlibrary.core.encodings.Encoding; import org.geometerplus.zlibrary.core.encodings.Encoding;
import org.geometerplus.zlibrary.core.language.Language;
import org.geometerplus.zlibrary.core.language.ZLLanguageUtil; import org.geometerplus.zlibrary.core.language.ZLLanguageUtil;
import org.geometerplus.zlibrary.core.resources.ZLResource; import org.geometerplus.zlibrary.core.resources.ZLResource;
@ -57,40 +58,35 @@ class BookTitlePreference extends ZLStringPreference {
} }
} }
class LanguagePreference extends ZLStringListPreference { class BookLanguagePreference extends LanguagePreference {
private final Book myBook; private final Book myBook;
LanguagePreference(Context context, ZLResource rootResource, String resourceKey, Book book) { private static List<Language> languages() {
super(context, rootResource, resourceKey); final TreeSet<Language> set = new TreeSet<Language>();
myBook = book; for (String code : ZLTextHyphenator.Instance().languageCodes()) {
final TreeSet<String> set = new TreeSet<String>(new ZLLanguageUtil.CodeComparator()); set.add(new Language(code));
set.addAll(ZLTextHyphenator.Instance().languageCodes());
set.add(ZLLanguageUtil.OTHER_LANGUAGE_CODE);
final int size = set.size();
String[] codes = new String[size];
String[] names = new String[size];
int index = 0;
for (String code : set) {
codes[index] = code;
names[index] = ZLLanguageUtil.languageName(code);
++index;
} }
setLists(codes, names); set.add(new Language(Language.OTHER_CODE));
return new ArrayList<Language>(set);
}
BookLanguagePreference(Context context, ZLResource rootResource, String resourceKey, Book book) {
super(context, rootResource, resourceKey, languages());
myBook = book;
final String language = myBook.getLanguage(); final String language = myBook.getLanguage();
if (language == null || !setInitialValue(language)) { if (language == null || !setInitialValue(language)) {
setInitialValue(ZLLanguageUtil.OTHER_LANGUAGE_CODE); setInitialValue(Language.OTHER_CODE);
} }
} }
@Override @Override
protected void onDialogClosed(boolean result) { protected void init() {
super.onDialogClosed(result); }
if (result) {
final String value = getValue(); @Override
myBook.setLanguage(value.length() > 0 ? value : null); protected void setLanguage(String code) {
((EditBookInfoActivity)getContext()).updateResult(); myBook.setLanguage(code.length() > 0 ? code : null);
} ((EditBookInfoActivity)getContext()).updateResult();
} }
} }
@ -186,7 +182,7 @@ public class EditBookInfoActivity extends ZLPreferenceActivity {
myInitialized = true; myInitialized = true;
addPreference(new BookTitlePreference(EditBookInfoActivity.this, Resource, "title", myBook)); addPreference(new BookTitlePreference(EditBookInfoActivity.this, Resource, "title", myBook));
addPreference(new LanguagePreference(EditBookInfoActivity.this, Resource, "language", myBook)); addPreference(new BookLanguagePreference(EditBookInfoActivity.this, Resource, "language", myBook));
addPreference(new EncodingPreference(EditBookInfoActivity.this, Resource, "encoding", myBook)); addPreference(new EncodingPreference(EditBookInfoActivity.this, Resource, "encoding", myBook));
} }
}); });

View file

@ -0,0 +1,58 @@
/*
* Copyright (C) 2009-2013 Geometer Plus <contact@geometerplus.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*/
package org.geometerplus.android.fbreader.preferences;
import java.util.*;
import android.content.Context;
import org.geometerplus.zlibrary.core.language.Language;
import org.geometerplus.zlibrary.core.resources.ZLResource;
abstract class LanguagePreference extends ZLStringListPreference {
LanguagePreference(
Context context, ZLResource rootResource, String resourceKey, List<Language> languages
) {
super(context, rootResource, resourceKey);
final int size = languages.size();
String[] codes = new String[size];
String[] names = new String[size];
int index = 0;
for (Language l : languages) {
codes[index] = l.Code;
names[index] = l.Name;
++index;
}
setLists(codes, names);
init();
}
@Override
protected void onDialogClosed(boolean result) {
super.onDialogClosed(result);
if (result) {
setLanguage(getValue());
}
}
protected abstract void init();
protected abstract void setLanguage(String code);
}

View file

@ -20,11 +20,13 @@
package org.geometerplus.android.fbreader.preferences; package org.geometerplus.android.fbreader.preferences;
import android.content.Intent; import android.content.Intent;
import android.net.Uri;
import android.view.KeyEvent; import android.view.KeyEvent;
import org.geometerplus.zlibrary.core.application.ZLKeyBindings; import org.geometerplus.zlibrary.core.application.ZLKeyBindings;
import org.geometerplus.zlibrary.core.options.ZLIntegerOption; import org.geometerplus.zlibrary.core.options.ZLIntegerOption;
import org.geometerplus.zlibrary.core.options.ZLIntegerRangeOption; import org.geometerplus.zlibrary.core.options.ZLIntegerRangeOption;
import org.geometerplus.zlibrary.core.resources.ZLResource;
import org.geometerplus.zlibrary.text.view.style.*; import org.geometerplus.zlibrary.text.view.style.*;
@ -83,6 +85,24 @@ public class PreferenceActivity extends ZLPreferenceActivity {
directoriesScreen.addOption(Paths.WallpapersDirectoryOption(), "wallpapers"); directoriesScreen.addOption(Paths.WallpapersDirectoryOption(), "wallpapers");
final Screen appearanceScreen = createPreferenceScreen("appearance"); final Screen appearanceScreen = createPreferenceScreen("appearance");
appearanceScreen.addPreference(new LanguagePreference(
this, appearanceScreen.Resource, "language", ZLResource.languages()
) {
@Override
protected void init() {
setInitialValue(ZLResource.LanguageOption.getValue());
}
@Override
protected void setLanguage(String code) {
if (!code.equals(ZLResource.LanguageOption.getValue())) {
ZLResource.LanguageOption.setValue(code);
startActivity(new Intent(
Intent.ACTION_VIEW, Uri.parse("fbreader-action:preferences#appearance")
));
}
}
});
appearanceScreen.addPreference(new ZLStringChoicePreference( appearanceScreen.addPreference(new ZLStringChoicePreference(
this, appearanceScreen.Resource, "screenOrientation", this, appearanceScreen.Resource, "screenOrientation",
androidLibrary.OrientationOption, androidLibrary.allOrientations() androidLibrary.OrientationOption, androidLibrary.allOrientations()

View file

@ -21,7 +21,7 @@ package org.geometerplus.fbreader.network;
import java.util.*; import java.util.*;
import org.geometerplus.zlibrary.core.language.ZLLanguageUtil; import org.geometerplus.zlibrary.core.language.Language;
import org.geometerplus.zlibrary.core.network.ZLNetworkRequest; import org.geometerplus.zlibrary.core.network.ZLNetworkRequest;
import org.geometerplus.fbreader.network.urlInfo.*; import org.geometerplus.fbreader.network.urlInfo.*;
@ -141,7 +141,7 @@ public abstract class AbstractNetworkLink implements INetworkLink {
} }
private static int getLanguageOrder(String language) { private static int getLanguageOrder(String language) {
if (ZLLanguageUtil.MULTI_LANGUAGE_CODE.equals(language)) { if (Language.MULTI_CODE.equals(language)) {
return 1; return 1;
} }
if (language.equals(Locale.getDefault().getLanguage())) { if (language.equals(Locale.getDefault().getLanguage())) {

View file

@ -26,8 +26,10 @@ import org.geometerplus.zlibrary.core.library.ZLibrary;
import org.geometerplus.zlibrary.core.util.ZLNetworkUtil; import org.geometerplus.zlibrary.core.util.ZLNetworkUtil;
import org.geometerplus.zlibrary.core.util.MimeType; import org.geometerplus.zlibrary.core.util.MimeType;
import org.geometerplus.zlibrary.core.image.ZLImage; import org.geometerplus.zlibrary.core.image.ZLImage;
import org.geometerplus.zlibrary.core.options.ZLStringListOption;
import org.geometerplus.zlibrary.core.options.ZLStringOption; import org.geometerplus.zlibrary.core.options.ZLStringOption;
import org.geometerplus.zlibrary.core.network.ZLNetworkException; import org.geometerplus.zlibrary.core.network.ZLNetworkException;
import org.geometerplus.zlibrary.core.language.Language;
import org.geometerplus.zlibrary.core.language.ZLLanguageUtil; import org.geometerplus.zlibrary.core.language.ZLLanguageUtil;
import org.geometerplus.zlibrary.core.resources.ZLResource; import org.geometerplus.zlibrary.core.resources.ZLResource;
@ -99,44 +101,42 @@ public class NetworkLibrary {
return new ArrayList<String>(languageSet); return new ArrayList<String>(languageSet);
} }
private ZLStringOption myActiveLanguageCodesOption; private ZLStringListOption myActiveLanguageCodesOption;
private ZLStringOption activeLanguageCodesOption() { private ZLStringListOption activeLanguageCodesOption() {
if (myActiveLanguageCodesOption == null) { if (myActiveLanguageCodesOption == null) {
final TreeSet<String> defaultCodes = new TreeSet<String>(new ZLLanguageUtil.CodeComparator());
defaultCodes.addAll(ZLibrary.Instance().defaultLanguageCodes());
myActiveLanguageCodesOption = myActiveLanguageCodesOption =
new ZLStringOption( new ZLStringListOption(
"Options", "Options",
"ActiveLanguages", "ActiveLanguages",
commaSeparatedString(defaultCodes) ZLibrary.Instance().defaultLanguageCodes(),
","
); );
} }
return myActiveLanguageCodesOption; return myActiveLanguageCodesOption;
} }
public Collection<String> activeLanguageCodes() { public List<String> activeLanguageCodes() {
return Arrays.asList(activeLanguageCodesOption().getValue().split(",")); return activeLanguageCodesOption().getValue();
} }
public void setActiveLanguageCodes(Collection<String> codes) { public void setActiveLanguageCodes(Collection<String> codes) {
final TreeSet<String> allCodes = new TreeSet<String>(new ZLLanguageUtil.CodeComparator()); final TreeSet<String> allCodes = new TreeSet<String>();
allCodes.addAll(ZLibrary.Instance().defaultLanguageCodes()); allCodes.addAll(ZLibrary.Instance().defaultLanguageCodes());
allCodes.removeAll(languageCodes()); allCodes.removeAll(languageCodes());
allCodes.addAll(codes); allCodes.addAll(codes);
activeLanguageCodesOption().setValue(commaSeparatedString(allCodes));
invalidateChildren();
}
private String commaSeparatedString(Collection<String> codes) { // sort codes
final StringBuilder builder = new StringBuilder(); final TreeSet<Language> languages = new TreeSet<Language>();
for (String code : codes) { for (String code : allCodes) {
builder.append(code); languages.add(new Language(code));
builder.append(",");
} }
if (builder.length() > 0) { final ArrayList<String> codesList = new ArrayList<String>(languages.size());
builder.delete(builder.length() - 1, builder.length()); for (Language l : languages) {
codesList.add(l.Code);
} }
return builder.toString();
activeLanguageCodesOption().setValue(codesList);
invalidateChildren();
} }
List<INetworkLink> activeLinks() { List<INetworkLink> activeLinks() {

View file

@ -0,0 +1,77 @@
/*
* Copyright (C) 2009-2013 Geometer Plus <contact@geometerplus.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*/
package org.geometerplus.zlibrary.core.language;
import org.geometerplus.zlibrary.core.resources.ZLResource;
public class Language implements Comparable<Language> {
public static final String OTHER_CODE = "other";
public static final String MULTI_CODE = "multi";
public static final String SYSTEM_CODE = "system";
private static enum Order {
Before,
Normal,
After
}
public final String Code;
public final String Name;
private final String mySortKey;
private final Order myOrder;
public Language(String code) {
this(code, ZLResource.resource("language").getResource(code).getValue());
}
public Language(String code, String name) {
Code = code;
Name = name;
mySortKey = name;
if (SYSTEM_CODE.equals(code)) {
myOrder = Order.Before;
} else if (MULTI_CODE.equals(code) || OTHER_CODE.equals(code)) {
myOrder = Order.After;
} else {
myOrder = Order.Normal;
}
}
public int compareTo(Language other) {
final int diff = myOrder.compareTo(other.myOrder);
return diff != 0 ? diff : mySortKey.compareTo(other.mySortKey);
}
@Override
public boolean equals(Object lang) {
if (this == lang) {
return true;
}
if (!(lang instanceof Language)) {
return false;
}
return Code.equals(((Language)lang).Code);
}
@Override
public int hashCode() {
return Code.hashCode();
}
}

View file

@ -25,41 +25,11 @@ import org.geometerplus.zlibrary.core.filesystem.*;
import org.geometerplus.zlibrary.core.resources.ZLResource; import org.geometerplus.zlibrary.core.resources.ZLResource;
public abstract class ZLLanguageUtil { public abstract class ZLLanguageUtil {
public static final String OTHER_LANGUAGE_CODE = "other";
public static final String MULTI_LANGUAGE_CODE = "multi";
private static ArrayList<String> ourLanguageCodes = new ArrayList<String>(); private static ArrayList<String> ourLanguageCodes = new ArrayList<String>();
private ZLLanguageUtil() { private ZLLanguageUtil() {
} }
public static class CodeComparator implements Comparator<String> {
public int compare(String code0, String code1) {
if (code0 == null) {
return code1 == null ? 0 : -1;
}
if (code1 == null) {
return 1;
}
if (code0.equals(code1)) {
return 0;
}
if (MULTI_LANGUAGE_CODE.equals(code0)) {
return 1;
}
if (MULTI_LANGUAGE_CODE.equals(code1)) {
return -1;
}
if (OTHER_LANGUAGE_CODE.equals(code0)) {
return 1;
}
if (OTHER_LANGUAGE_CODE.equals(code1)) {
return -1;
}
return languageName(code0).compareTo(languageName(code1));
}
}
public static String defaultLanguageCode() { public static String defaultLanguageCode() {
return Locale.getDefault().getLanguage(); return Locale.getDefault().getLanguage();
} }
@ -86,10 +56,6 @@ public abstract class ZLLanguageUtil {
return Collections.unmodifiableList(ourLanguageCodes); return Collections.unmodifiableList(ourLanguageCodes);
} }
public static String languageName(String code) {
return ZLResource.resource("language").getResource(code).getValue();
}
public static ZLFile patternsFile() { public static ZLFile patternsFile() {
return ZLResourceFile.createResourceFile("languagePatterns"); return ZLResourceFile.createResourceFile("languagePatterns");
} }

View file

@ -19,7 +19,7 @@
package org.geometerplus.zlibrary.core.library; package org.geometerplus.zlibrary.core.library;
import java.util.Collection; import java.util.List;
import org.geometerplus.zlibrary.core.filesystem.ZLResourceFile; import org.geometerplus.zlibrary.core.filesystem.ZLResourceFile;
import org.geometerplus.zlibrary.core.options.ZLStringOption; import org.geometerplus.zlibrary.core.options.ZLStringOption;
@ -55,7 +55,7 @@ public abstract class ZLibrary {
abstract public int getDisplayDPI(); abstract public int getDisplayDPI();
abstract public int getPixelWidth(); abstract public int getPixelWidth();
abstract public int getPixelHeight(); abstract public int getPixelHeight();
abstract public Collection<String> defaultLanguageCodes(); abstract public List<String> defaultLanguageCodes();
abstract public boolean supportsAllOrientations(); abstract public boolean supportsAllOrientations();
public String[] allOrientations() { public String[] allOrientations() {

View file

@ -19,9 +19,37 @@
package org.geometerplus.zlibrary.core.resources; package org.geometerplus.zlibrary.core.resources;
import java.util.*;
import org.geometerplus.zlibrary.core.filesystem.ZLFile;
import org.geometerplus.zlibrary.core.filesystem.ZLResourceFile;
import org.geometerplus.zlibrary.core.language.Language;
import org.geometerplus.zlibrary.core.options.ZLStringOption;
abstract public class ZLResource { abstract public class ZLResource {
public final String Name; public final String Name;
public static final ZLStringOption LanguageOption =
new ZLStringOption("LookNFeel", "Language", Language.SYSTEM_CODE);
private static final List<Language> ourLanguages = new LinkedList<Language>();
public static List<Language> languages() {
if (ourLanguages.isEmpty()) {
final ZLResource resource = ZLResource.resource("language-self");
final ZLFile dir = ZLResourceFile.createResourceFile("resources/application");
for (ZLFile file : dir.children()) {
final String name = file.getShortName();
if (name.endsWith(".xml")) {
final String code = name.substring(0, name.length() - 4);
ourLanguages.add(new Language(code, resource.getResource(code).getValue()));
}
}
ourLanguages.add(new Language(Language.SYSTEM_CODE));
Collections.sort(ourLanguages);
}
return Collections.unmodifiableList(ourLanguages);
}
public static ZLResource resource(String key) { public static ZLResource resource(String key) {
ZLTreeResource.buildTree(); ZLTreeResource.buildTree();
if (ZLTreeResource.ourRoot == null) { if (ZLTreeResource.ourRoot == null) {

View file

@ -21,9 +21,10 @@ package org.geometerplus.zlibrary.core.resources;
import java.util.*; import java.util.*;
import org.geometerplus.zlibrary.core.filesystem.*;
import org.geometerplus.zlibrary.core.language.Language;
import org.geometerplus.zlibrary.core.xml.ZLStringMap; import org.geometerplus.zlibrary.core.xml.ZLStringMap;
import org.geometerplus.zlibrary.core.xml.ZLXMLReaderAdapter; import org.geometerplus.zlibrary.core.xml.ZLXMLReaderAdapter;
import org.geometerplus.zlibrary.core.filesystem.*;
final class ZLTreeResource extends ZLResource { final class ZLTreeResource extends ZLResource {
private static interface Condition { private static interface Condition {
@ -132,20 +133,39 @@ final class ZLTreeResource extends ZLResource {
} }
} }
private static void setInterfaceLanguage() {
final String custom = LanguageOption.getValue();
final String language;
final String country;
if (Language.SYSTEM_CODE.equals(custom)) {
final Locale locale = Locale.getDefault();
language = locale.getLanguage();
country = locale.getCountry();
} else {
final int index = custom.indexOf('_');
if (index == -1) {
language = custom;
country = null;
} else {
language = custom.substring(0, index);
country = custom.substring(index + 1);
}
}
if ((language != null && !language.equals(ourLanguage)) ||
(country != null && !country.equals(ourCountry))) {
ourLanguage = language;
ourCountry = country;
loadData();
}
}
private static void updateLanguage() { private static void updateLanguage() {
final long timeStamp = System.currentTimeMillis(); final long timeStamp = System.currentTimeMillis();
if (timeStamp > ourTimeStamp + 1000) { if (timeStamp > ourTimeStamp + 1000) {
synchronized (ourLock) { synchronized (ourLock) {
if (timeStamp > ourTimeStamp + 1000) { if (timeStamp > ourTimeStamp + 1000) {
ourTimeStamp = timeStamp; ourTimeStamp = timeStamp;
final String language = Locale.getDefault().getLanguage(); setInterfaceLanguage();
final String country = Locale.getDefault().getCountry();
if ((language != null && !language.equals(ourLanguage)) ||
(country != null && !country.equals(ourCountry))) {
ourLanguage = language;
ourCountry = country;
loadData();
}
} }
} }
} }
@ -154,6 +174,7 @@ final class ZLTreeResource extends ZLResource {
private static void loadData(ResourceTreeReader reader, String fileName) { private static void loadData(ResourceTreeReader reader, String fileName) {
reader.readDocument(ourRoot, ZLResourceFile.createResourceFile("resources/zlibrary/" + fileName)); reader.readDocument(ourRoot, ZLResourceFile.createResourceFile("resources/zlibrary/" + fileName));
reader.readDocument(ourRoot, ZLResourceFile.createResourceFile("resources/application/" + fileName)); reader.readDocument(ourRoot, ZLResourceFile.createResourceFile("resources/application/" + fileName));
reader.readDocument(ourRoot, ZLResourceFile.createResourceFile("resources/lang.xml"));
} }
private static void loadData() { private static void loadData() {

View file

@ -21,6 +21,7 @@ package org.geometerplus.zlibrary.text.hyphenation;
import java.util.*; import java.util.*;
import org.geometerplus.zlibrary.core.language.Language;
import org.geometerplus.zlibrary.core.language.ZLLanguageUtil; import org.geometerplus.zlibrary.core.language.ZLLanguageUtil;
import org.geometerplus.zlibrary.core.filesystem.ZLFile; import org.geometerplus.zlibrary.core.filesystem.ZLFile;
import org.geometerplus.zlibrary.core.filesystem.ZLResourceFile; import org.geometerplus.zlibrary.core.filesystem.ZLResourceFile;
@ -54,7 +55,7 @@ final class ZLTextTeXHyphenator extends ZLTextHyphenator {
} }
public void load(String language) { public void load(String language) {
if (language == null || ZLLanguageUtil.OTHER_LANGUAGE_CODE.equals(language)) { if (language == null || Language.OTHER_CODE.equals(language)) {
language = ZLLanguageUtil.defaultLanguageCode(); language = ZLLanguageUtil.defaultLanguageCode();
} }
if (language == null || language.equals(myLanguage)) { if (language == null || language.equals(myLanguage)) {

View file

@ -188,7 +188,7 @@ public final class ZLAndroidLibrary extends ZLibrary {
} }
@Override @Override
public Collection<String> defaultLanguageCodes() { public List<String> defaultLanguageCodes() {
final TreeSet<String> set = new TreeSet<String>(); final TreeSet<String> set = new TreeSet<String>();
set.add(Locale.getDefault().getLanguage()); set.add(Locale.getDefault().getLanguage());
final TelephonyManager manager = (TelephonyManager)myApplication.getSystemService(Context.TELEPHONY_SERVICE); final TelephonyManager manager = (TelephonyManager)myApplication.getSystemService(Context.TELEPHONY_SERVICE);
@ -211,7 +211,7 @@ public final class ZLAndroidLibrary extends ZLibrary {
} }
} }
set.add("multi"); set.add("multi");
return set; return new ArrayList<String>(set);
} }
@Override @Override