package org.telegram.services ;
import org.apache.commons.io.IOUtils ;
import org.apache.http.HttpResponse ;
import org.apache.http.client.HttpClient ;
import org.apache.http.client.methods.HttpGet ;
import org.apache.http.conn.ssl.NoopHostnameVerifier ;
import org.apache.http.impl.client.CloseableHttpClient ;
import org.apache.http.impl.client.HttpClientBuilder ;
import org.telegram.BuildVars ;
import org.telegram.api.methods.SendDocument ;
import java.io.* ;
/ * *
* @author Ruben Bermudez
* @version 1 . 0
* @brief Service that allow transifex files download
* @date 21 of June of 2015
* /
public class TransifexService {
private static volatile BotLogger log = BotLogger . getLogger ( TransifexService . class . getName ( ) ) ;
private static final String BASEURLAndroid = "http://" + BuildVars . TRANSIFEXUSER + ":" + BuildVars . TRANSIFEXPASSWORD + "@www.transifex.com/api/2/project/telegram/resource/stringsxml-48/translation/@language?file" ; ///< Base url for REST
private static final String BASEURLiOS = "http://" + BuildVars . TRANSIFEXUSER + ":" + BuildVars . TRANSIFEXPASSWORD + "@www.transifex.com/api/2/project/iphone-1/resource/localizablestrings/translation/@language?file" ; ///< Base url for REST
private static final String BASEURLOSX = "http://" + BuildVars . TRANSIFEXUSER + ":" + BuildVars . TRANSIFEXPASSWORD + "@www.transifex.com/api/2/project/osx/resource/localizablestrings/translation/@language?file" ; ///< Base url for REST
private static final String BASEURLTDesktop = "http://" + BuildVars . TRANSIFEXUSER + ":" + BuildVars . TRANSIFEXPASSWORD + "@www.transifex.com/api/2/project/telegram-desktop/resource/langstrings/translation/@language?file" ; ///< Base url for REST
private static final String BASEURLTemplates = "http://" + BuildVars . TRANSIFEXUSER + ":" + BuildVars . TRANSIFEXPASSWORD + "@www.transifex.com/api/2/project/telegram-desktop/resource/tl_generaltxt/translation/@language?file" ; ///< Base url for REST
private static final String BASEURLWebogram = "http://" + BuildVars . TRANSIFEXUSER + ":" + BuildVars . TRANSIFEXPASSWORD + "@www.transifex.com/api/2/project/telegram-web/resource/en-usjson/translation/@language?file" ; ///< Base url for REST
private static final String BASEURLWP = "http://" + BuildVars . TRANSIFEXUSER + ":" + BuildVars . TRANSIFEXPASSWORD + "@www.transifex.com/api/2/project/wp-telegram-messenger-beta/resource/appresourcesresx/translation/@language?file" ; ///< Base url for REST
private static final int STATUS200 = 200 ;
private static final int BYTES1024 = 1024 ;
private static volatile TransifexService instance ; ///< Instance of this class
/ * *
* Constructor ( private due to singleton pattern )
* /
private TransifexService ( ) {
}
/ * *
* Singleton
*
* @return Return the instance of this class
* /
public static TransifexService getInstance ( ) {
TransifexService currentInstance ;
if ( instance = = null ) {
synchronized ( TransifexService . class ) {
if ( instance = = null ) {
instance = new TransifexService ( ) ;
}
currentInstance = instance ;
}
} else {
currentInstance = instance ;
}
return currentInstance ;
}
private String getFileAndroid ( String query ) {
String result = null ;
try {
CloseableHttpClient client = HttpClientBuilder . create ( ) . setSSLHostnameVerifier ( new NoopHostnameVerifier ( ) ) . build ( ) ;
HttpGet request = new HttpGet ( BASEURLAndroid . replace ( "@language" , query ) ) ;
HttpResponse response = client . execute ( request ) ;
BufferedReader rd = new BufferedReader ( new InputStreamReader ( response . getEntity ( ) . getContent ( ) , "UTF-8" ) ) ;
String line ;
String responseString = "" ;
while ( ( line = rd . readLine ( ) ) ! = null ) {
responseString + = line ;
}
if ( response . getStatusLine ( ) . getStatusCode ( ) = = STATUS200 ) {
result = responseString ;
}
} catch ( IOException e ) {
log . error ( e ) ;
}
return result ;
}
private byte [ ] getFileiOS ( String query ) {
byte [ ] result = null ;
try {
HttpClient client = HttpClientBuilder . create ( ) . build ( ) ;
HttpGet request = new HttpGet ( BASEURLiOS . replace ( "@language" , query ) ) ;
HttpResponse response = client . execute ( request ) ;
result = IOUtils . toByteArray ( new InputStreamReader ( response . getEntity ( ) . getContent ( ) , "UTF-16LE" ) ) ;
} catch ( IOException e ) {
log . error ( e ) ;
}
return result ;
}
private byte [ ] getFileOSX ( String query ) {
byte [ ] result = null ;
try {
HttpClient client = HttpClientBuilder . create ( ) . build ( ) ;
HttpGet request = new HttpGet ( BASEURLOSX . replace ( "@language" , query ) ) ;
HttpResponse response = client . execute ( request ) ;
result = IOUtils . toByteArray ( new InputStreamReader ( response . getEntity ( ) . getContent ( ) , "UTF-16LE" ) ) ;
} catch ( IOException e ) {
log . error ( e ) ;
}
return result ;
}
private byte [ ] getFileTDesktop ( String query ) {
byte [ ] result = null ;
try {
HttpClient client = HttpClientBuilder . create ( ) . build ( ) ;
HttpGet request = new HttpGet ( BASEURLTDesktop . replace ( "@language" , query ) ) ;
HttpResponse response = client . execute ( request ) ;
result = IOUtils . toByteArray ( new InputStreamReader ( response . getEntity ( ) . getContent ( ) , "UTF-16LE" ) ) ;
} catch ( IOException e ) {
log . error ( e ) ;
}
return result ;
}
public byte [ ] getFileTemplate ( String languageCode ) {
byte [ ] result = null ;
try {
HttpClient client = HttpClientBuilder . create ( ) . build ( ) ;
HttpGet request = new HttpGet ( BASEURLTemplates . replace ( "@language" , languageCode ) ) ;
HttpResponse response = client . execute ( request ) ;
result = IOUtils . toByteArray ( new InputStreamReader ( response . getEntity ( ) . getContent ( ) , "UTF-8" ) ) ;
} catch ( IOException e ) {
log . error ( e ) ;
}
return result ;
}
private byte [ ] getFileWebogram ( String query ) {
byte [ ] result = null ;
try {
HttpClient client = HttpClientBuilder . create ( ) . build ( ) ;
HttpGet request = new HttpGet ( BASEURLWebogram . replace ( "@language" , query ) ) ;
HttpResponse response = client . execute ( request ) ;
result = IOUtils . toByteArray ( new InputStreamReader ( response . getEntity ( ) . getContent ( ) , "UTF-16LE" ) ) ;
} catch ( IOException e ) {
log . error ( e ) ;
}
return result ;
}
private byte [ ] getFileWP ( String query ) {
byte [ ] result = null ;
try {
HttpClient client = HttpClientBuilder . create ( ) . build ( ) ;
HttpGet request = new HttpGet ( BASEURLWP . replace ( "@language" , query ) ) ;
HttpResponse response = client . execute ( request ) ;
result = IOUtils . toByteArray ( new InputStreamReader ( response . getEntity ( ) . getContent ( ) , "UTF-16LE" ) ) ;
} catch ( IOException e ) {
log . error ( e ) ;
}
return result ;
}
/ * *
* For languages that are composited of a regional part , change that part to uper case for transifex
* @param language Language received
* @return Language fixed
* /
private String fixCaseCompositedLanguages ( String language ) {
String [ ] parts = language . split ( "_" ) ;
if ( parts . length = = 1 ) {
language = parts [ 0 ] ;
} else {
language = parts [ 0 ] + "_" + parts [ 1 ] . toUpperCase ( ) ;
}
return language ;
}
/ * *
* Fetch the language file for support members of android
* @param language Language requested
* /
public SendDocument getAndroidSupportLanguageFile ( String language ) {
SendDocument sendDocument = null ;
try {
String file = getFileAndroid ( language ) ;
if ( file ! = null & & file . getBytes ( ) . length / BYTES1024 > = 10 ) {
file = file . replaceAll ( "\"LanguageName\"\\>(\\w*)\\<\\/string\\>" , "\"LanguageName\"\\>$1_1\\<\\/string\\>" ) . replaceAll ( "\"LanguageCode\"\\>(\\w*)\\<\\/string\\>" , "\"LanguageCode\"\\>$1_1\\<\\/string\\>" ) ;
try {
String fileName = "languages_Android_" + language + ".xml" ;
PrintWriter localFile = new PrintWriter ( fileName ) ;
localFile . print ( file ) ;
localFile . close ( ) ;
File fileToUpload = new File ( fileName ) ;
sendDocument = new SendDocument ( ) ;
sendDocument . setNewDocument ( fileToUpload . getAbsolutePath ( ) , fileName ) ;
} catch ( FileNotFoundException e ) {
log . error ( e ) ;
}
}
} catch ( Exception e ) {
log . error ( e ) ;
}
return sendDocument ;
}
/ * *
* Fetch the language file for Android
* @param language Language requested
* /
public SendDocument getAndroidLanguageFile ( String language ) {
SendDocument sendDocument = null ;
try {
String file = getFileAndroid ( language ) ;
if ( file ! = null & & file . getBytes ( ) . length / BYTES1024 > = 10 ) {
try {
String fileName = "languages_Android_" + language + ".xml" ;
PrintWriter localFile = new PrintWriter ( fileName ) ;
localFile . print ( file ) ;
localFile . close ( ) ;
File fileToUpload = new File ( fileName ) ;
sendDocument = new SendDocument ( ) ;
sendDocument . setNewDocument ( fileToUpload . getAbsolutePath ( ) , fileName ) ;
} catch ( FileNotFoundException e ) {
log . error ( e ) ;
}
}
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
return sendDocument ;
}
/ * *
* Fetch the language file for iOS
*
* @param language Language requested
* /
public SendDocument getiOSLanguageFile ( String language ) {
SendDocument sendDocument = null ;
try {
byte [ ] file = getFileiOS ( language ) ;
if ( file ! = null & & file . length / BYTES1024 > = 10 ) {
try {
String fileName = "languages_ios_" + language + ".strings" ;
File fileToUpload = new File ( fileName ) ;
FileOutputStream output = new FileOutputStream ( fileToUpload ) ;
IOUtils . write ( file , output ) ;
output . close ( ) ;
sendDocument = new SendDocument ( ) ;
sendDocument . setNewDocument ( fileToUpload . getAbsolutePath ( ) , fileName ) ;
} catch ( IOException e ) {
e . printStackTrace ( ) ;
}
}
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
return sendDocument ;
}
/ * *
* Fetch the language file for OSX
* @param language Language requested
* /
public SendDocument getOSXLanguageFile ( String language ) {
SendDocument sendDocument = null ;
try {
byte [ ] file = getFileOSX ( language ) ;
if ( file ! = null & & file . length / BYTES1024 > = 10 ) {
try {
String fileName = "languages_osx_" + language + ".strings" ;
File fileToUpload = new File ( fileName ) ;
FileOutputStream output = new FileOutputStream ( fileToUpload ) ;
IOUtils . write ( file , output ) ;
output . close ( ) ;
sendDocument = new SendDocument ( ) ;
sendDocument . setNewDocument ( fileToUpload . getAbsolutePath ( ) , fileName ) ;
} catch ( IOException e ) {
e . printStackTrace ( ) ;
}
}
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
return sendDocument ;
}
/ * *
* Fetch the language file for Tdesktop
* @param language Language requested
* /
public SendDocument getTdesktopLanguageFile ( String language ) {
SendDocument sendDocument = null ;
try {
byte [ ] file = getFileTDesktop ( language ) ;
if ( file ! = null & & file . length / BYTES1024 > = 10 ) {
try {
String fileName = "languages_tdesktop_" + language + ".strings" ;
File fileToUpload = new File ( fileName ) ;
FileOutputStream output = new FileOutputStream ( fileToUpload ) ;
IOUtils . write ( file , output ) ;
output . close ( ) ;
if ( fileToUpload . exists ( ) ) {
sendDocument = new SendDocument ( ) ;
sendDocument . setNewDocument ( fileToUpload . getAbsolutePath ( ) , fileName ) ;
}
} catch ( IOException e ) {
e . printStackTrace ( ) ;
}
}
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
return sendDocument ;
}
/ * *
* Fetch the language file for Webogram
* @param language Language requested
* /
public SendDocument getWebogramLanguageFile ( String language ) {
SendDocument sendDocument = null ;
try {
byte [ ] file = getFileWebogram ( language ) ;
if ( file ! = null & & file . length / BYTES1024 > = 10 ) {
try {
String fileName = "languages_webogram_" + language + ".json" ;
File fileToUpload = new File ( fileName ) ;
FileOutputStream output = new FileOutputStream ( fileToUpload ) ;
IOUtils . write ( file , output ) ;
output . close ( ) ;
if ( fileToUpload . exists ( ) ) {
sendDocument = new SendDocument ( ) ;
sendDocument . setNewDocument ( fileToUpload . getAbsolutePath ( ) , fileName ) ;
}
} catch ( IOException e ) {
e . printStackTrace ( ) ;
}
}
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
return sendDocument ;
}
/ * *
* Fetch the language file for WP
* @param language Language requested
* /
public SendDocument getWPLanguageFile ( String language ) {
SendDocument sendDocument = null ;
try {
byte [ ] file = getFileWP ( language ) ;
if ( file ! = null & & file . length / BYTES1024 > = 10 ) {
try {
String fileName = "languages_wp_" + language + ".xml" ;
File fileToUpload = new File ( fileName ) ;
FileOutputStream output = new FileOutputStream ( fileToUpload ) ;
IOUtils . write ( file , output ) ;
output . close ( ) ;
if ( fileToUpload . exists ( ) ) {
sendDocument = new SendDocument ( ) ;
sendDocument . setNewDocument ( fileToUpload . getAbsolutePath ( ) , fileName ) ;
}
} catch ( IOException e ) {
e . printStackTrace ( ) ;
}
}
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
return sendDocument ;
}
}