Attend XDA's Second Annual Developer Conference, XDA:DevCon 2014!
5,811,035 Members 41,669 Now Online
XDA Developers Android and Mobile Development Forum

Linux bash script to easily translate apk files

Tip us?
 
sparkster84
Old
(Last edited by sparkster84; 27th January 2011 at 01:42 PM.)
#1  
sparkster84's Avatar
Junior Member - OP
Thanks Meter 4
Posts: 29
Join Date: Oct 2010
Default Linux bash script to easily translate apk files

Hi, guys. These days I have been translating a couple of chinese applications and I noticed is a very messy process if you don't have the correct tools to help you, so I created a simple bash script file to help us to translate.

The script just create a backup of the original apk file, and after that it creates the correct language dir if needed, it copies the original strings.xml if needed and automatically opens it to edit. After that, it recompiles and signs the package, and deletes all the garbage.

First of all, you need these files:
# - aapt
# - apktool.jar
# - emacs (you can use other editor)
# - correct framework
# (you can find it in your rom package
# rom-package/system/framework/framework-res.apk)
# - java
# - privatekey (*.pk8)
# - publickey.x509 (*.pem)
# - signapk.jar
# - unzip
# - zip

emacs, java, zip and unzip can be easily found with your favourite linux package system. The framework is in the correct directory into your favourite rom, and the other files can be found in their respectives packages, but don't worry, here you have the "easy way"

http://www.megaupload.com/?d=S2DXBO32

Well, when you have it installed, you just need to set the first parameter of the script (main_dir) and it should work, because the rest of the paths are relative. Enjoy .

EDIT: ups, I almost forget it. The syntax is "translate-apk.sh package.apk language-id".
Form example, to translate into french: translate-apk.sh package.apk fr


Code:
#!/bin/bash

#CAUTION: needed packages:
# - aapt
# - apktool.jar
# - emacs (you can use other editor)
# - correct framework
#     (you can find it in your rom package
#     rom-package/system/framework/framework-res.apk)
# - java
# - privatekey (*.pk8)
# - publickey.x509 (*.pem)
# - signapk.jar
# - unzip
# - zip


#VARIABLES-------------------------------------
#Main directory
main_dir="/home/sparkster/programas/apktranslation/"

#Translation files
aapt="$main_dir"/aapt
apktool="$main_dir"/apktool.jar
framework="$main_dir"/framework-res.apk
privatekey="$main_dir"/key.pk8
publickey="$main_dir"/certificate.pem
signapk="$main_dir"/signapk.jar

#Executables
java=java
text_editor=emacs
unzip=unzip
zip=zip


#ERROR CHECK------------------------------------
#Syntax check
if [ $# != 2 ] ; then
   echo "SYNTAX: translate-apk.sh app.apk language-id"
   echo "EXAMPLE: translate-apk.sh myapp.apk en"
   echo "EXAMPLE: translate-apk.sh yourapp.apk fr"
else

   #Temp directory check
   if [[ ! -d backup ]]  ; then
      mkdir backup
   fi

   #Save original apk

   echo "--creating original package backup"

   cp "$1" backup/

   echo "--original package backup complete"

   echo "--installing framework"

   "$java" -jar "$apktool" if "$framework"

   echo "--framework installed"

   echo "--decoding apk"

   "$java" -jar "$apktool" d -f "$1" decoded

   echo "--apk decoded in "$main_dir"/decoded"

   #Language directory check
   if [[ ! -d decoded/res/values-"$2" ]]  ; then
      mkdir decoded/res/values-"$2"
      cp decoded/res/values/strings.xml decoded/res/values-"$2"/
   fi

   cut -d\> -f2 decoded/res/values-"$2"/strings.xml > temp.xml
   cut -d\< -f1 temp.xml > temp2.xml

   echo
   echo
   echo "--Press ENTER when the translation is ready"

   "$text_editor" decoded/res/values-"$2"/strings.xml &
   "$text_editor" temp2.xml &

   read

   echo "--encoding apk"

   "$aapt" p -f -F temp -I "$framework" -S decoded/res -M decoded/AndroidManifest.xml
   
   echo "--apk encoded"

   echo "--transferring resources.arsc"

   unzip temp resources.arsc
   zip "$1" resources.arsc

   echo "--resources.arsc transferred"

   signed_name=${1%.*apk}-signed.apk

   "$java" -jar "$signapk" "$publickey" "$privatekey" "$1" "$signed_name"

   echo "--package signed"
   echo "--cleaning"

   rm temp
   rm temp.xml
   rm temp2.xml
   rm resources.arsc
   rm "$1"
   rm -fr decoded

   echo "--translation finished"
   echo
   echo
   echo
   echo "--Also your hard drive has just been formatted"
   sleep 3
   echo "--Just kidding"
fi
The Following User Says Thank You to sparkster84 For This Useful Post: [ Click to Expand ]
 
sparkster84
Old
#2  
sparkster84's Avatar
Junior Member - OP
Thanks Meter 4
Posts: 29
Join Date: Oct 2010
Hi again, folks. I have just done a little improvement of the script. Now it also displays the original strings separated into rows, so you can easily cut and paste them into google translate or something similar. The script is edited in the first post.
 
sparkster84
Old
(Last edited by sparkster84; 27th January 2011 at 03:17 PM.)
#3  
sparkster84's Avatar
Junior Member - OP
Thanks Meter 4
Posts: 29
Join Date: Oct 2010
Hi again and again. I have just found an application that I can't install after signing it (Love meters or somuthing similar, a chinese market). If I find out what is happening with that, I'll change the script to solve it. Time to guess what is happening :P

EDIT: well, I made a little test and as I thought the problem is not in the signing but in the apk itself, so maybe I should change the method to translate this.
 
sparkster84
Old
#4  
sparkster84's Avatar
Junior Member - OP
Thanks Meter 4
Posts: 29
Join Date: Oct 2010
I have been all day trying to solve that problem, but it seems it's an application issue, so it's not my script's fault, and I am not able to solve it.

If anybody wants to try, I will be happy to have a solution to this problem. This is the ·&%("%&·$ apk:

http://www.megaupload.com/?d=J3ZH8N46


EDIT: I also paste the spanish translation, of strings.xml just in case it helps :P

Code:
<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <string name="app_name">Metros amor</string>
    <string name="status_downloading">Descargar</string>
    <string name="status_paused">Pausado</string>
    <string name="status_downloaded">Descargado</string>
    <string name="status_installed">Instalado</string>
    <string name="status_hasupdate">Actualizaciones</string>
    <string name="status_downloading_action">Cancelar</string>
    <string name="status_downloaded_action">Instalación</string>
    <string name="status_installed_action">Desinstalar</string>
    <string name="status_hasupdate_action">Actualizar</string>
    <string name="processing">Procesando...</string>
    <string name="confirm">Confirmar</string>
    <string name="register_welcome">Regístrate</string>
    <string name="login_welcome">Acceder</string>
    <string name="use_welcome">Saltar</string>
    <string name="welcome_1">Aplicaciones y juegos!</string>
    <string name="welcome_2">Miembros registrados muy pronto!</string>
    <string name="welcome_3">Estad pendientes!</string>
    <string name="welcome">Bienvenido a metros amor</string>
    <string name="write">Por favor, rellena</string>
    <string name="comment_top">COmentarios</string>
    <string name="error_happen_on_downloading">Error en la descarga. Reintentar</string>
    <string name="welcome_choose">Seleccione categoría (modificable en configuración)</string>
    <string name="downloaded_notification">Aimi Ti te mostrará:</string>
    <string name="cate1">Varios juegos</string>
    <string name="cate2">Lectura</string>
    <string name="cate3">Cartas</string>
    <string name="cate4">Jugador</string>
    <string name="cate5">RPG</string>
    <string name="cate6">Acción</string>
    <string name="cate7">Info sobre SW</string>
    <string name="cate8">Online</string>
    <string name="cate9">Estrategia</string>
    <string name="downloading_notification">Para iniciar la descarga~</string>
    <string name="installing_notification">Descarga completada. Haga click en instalar.</string>
    <string name="aimi_update_notification">%1$s nueva versión. Click para ver</string>
    <string name="download_count">%1$s descargas</string>
    <string name="app_has_update_notification_title">%1$s actualización disponible</string>
    <string name="app_has_update_notification_context">Nueva versión. Haga click en actualizar</string>
    <string name="callback_notification_title">Información</string>
    <string name="callback_notification_context">Nuevo software. Haga click en la vista</string>
    <string name="network_error_msg">Fallo de red. Reintentar</string>
    <string name="prompt_title">Consejos</string>
    <string name="quit_confirm">Salir de metros amor?</string>
    <string name="yes">Sí</string>
    <string name="no">No</string>
    <string name="app_detail">Apps</string>
    <string name="comment_list">Comentarios</string>
    <string name="related_app">Programas relacionados</string>
    <string name="no_update_item">No hay actualización</string>
    <string name="jump">Saltar</string>
    <string name="menu_help">Acerca de</string>
    <string name="menu_setting">Opciones</string>
    <string name="submit">Enviar</string>
    <string name="menu_suggestion">Sugerencias</string>
    <string name="suggestion_awake">Metros amor acepta sugerencias\nSi no te has registrado, introduce tu correo electrónico para poder responderte.</string>
    <string name="sendsuggestion_susseccful">Sugerencia enviada</string>
    <string name="sendsuggestion_failed">Error en la sugerencia</string>
    <string name="content_null">Por favor, rellena la sugerencia</string>
    <string name="menu_exit">Salir</string>
    <string name="about_silver">Metros amor tiene su propia divisa, almacenada en cada cuenta</string>
    <string name="about_silver_question">Utilizar plata?</string>
    <string name="about_silver_answer">Al llegar a una cierta cantidad de plata se puede utilizar para cambiar por regalos o comprar juegos reales</string>
    <string name="about_silver_question2">Cómo puedo ganar monedas?</string>
    <string name="about_silver_answer2">Subiendo apps, invitando a tus amigos, opinando sobre el software...</string>
    <string name="get_it">Entiendo</string>
    <string name="tabtitle_new">Nuevo</string>
    <string name="tabtitle_hot">Más descargado</string>
    <string name="menu_find_pwd">Olvidaste tu pass?</string>
    <string name="menu_modify_pwd">Cambiar contraseña</string>
    <string name="menu_logout">Desconectar</string>
    <string name="menu_account">Menú personal</string>
    <string name="tabtitle_suggested_new">Supongo que como</string>
    <string name="tabtitle_suggested_hot">Nuevo</string>
    <string name="tabtitle_suggested_others_download">Descargar noticias</string>
    <string name="tabtitle_rank_week">Top semanal</string>
    <string name="tabtitle_rank_month">Top mensual</string>
    <string name="tabtitle_rank_all">Comienzo</string>
    <string name="tabtitle_cate_app">Apps</string>
    <string name="tabtitle_cate_game">Juegos</string>
    <string name="tabtitle_cate_chart">Temas</string>
    <string name="tabtitle_downloading">Supongo que como</string>
    <string name="tabtitle_downloaded">Mis descargas</string>
    <string name="tabtitle_searchresult">Resultados</string>
    <string name="price">%1$s monedas</string>
    <string name="title_text_seperator">></string>
    <string name="free">Gratis</string>
    <string name="languagetext">Idioma: %1$s</string>
    <string name="versiontext">Ver: %1$s</string>
    <string name="sizetext">Tamaño: %1$s</string>
    <string name="author">Autor: %1$s</string>
    <string name="no_version">N/A</string>
    <string name="rating_count">Necesario %1$s para participar</string>
    <string name="comment_count">%1$s comentarios</string>
    <string name="language_chinese">Chino</string>
    <string name="language_english">Inglés</string>
    <string name="rate_app">Quiero comentar</string>
    <string name="view_rating">Ver comentarios</string>
    <string name="loading_bg_text">Cargando</string>
    <string name="email">email</string>
    <string name="user_name">Usuario (email):</string>
    <string name="user_password">Pass:</string>
    <string name="user_login">Entrar</string>
    <string name="user_findback_pwd">Pass olvidado?</string>
    <string name="user_register">Hasta</string>
    <string name="cate_newest_app_name">Última actualización: %1$s</string>
    <string name="cate_app_count">%1$s</string>
    <string name="rating_up">Principio!</string>
    <string name="rating_down">Paso!</string>
    <string name="charge_list_test">Recarga de forma</string>
    <string name="charge_cardnumber">Número de tarjeta de recarga:</string>
    <string name="charge_password">Contraseña de la tarjeta:</string>
    <string name="charge_amount">Cantidad</string>
    <string name="charge">Recarga</string>
    <string name="user_info_name">Cuenta: %1$s</string>
    <string name="user_info_nickname">Hola, %1$s</string>
    <string name="user_info_phone">Teléfono: %1$s</string>
    <string name="user_info_gold">Balance: %1$s米</string>
    <string name="user_info_score">Puntuación</string>
    <string name="user_info_what_is_gold">Qué es el oro?</string>
    <string name="user_info_what_is_score">Qué es la puntuación?</string>
    <string name="user_info_editinfo">Editar info</string>
    <string name="user_info_consumelog">Horóscopos</string>
    <string name="user_info_invite">Personalizar la piel</string>
    <string name="user_info_charge">Recarga</string>
    <string name="user_info_casino">Buscar actualizaciones</string>
    <string name="user_info_changepwd">Cambiar contraseña</string>
    <string name="user_info__logout">Desconectar</string>
    <string name="user_info_casino_result">Versión actual instalada</string>
    <string name="invite_info1">Invitar a un amigo proporciona una recompensa de 100 platas. También una oportunidad para dibujar.</string>
    <string name="invite_info2">NOTA: No te olvides de recordar a tus amigos que hagan click en la dirección que recibieron, si no no serás recompensado.</string>
    <string name="invite_btn">Invitar a amigos</string>
    <string name="search_moreapp">Buscar en línea</string>
    <string name="comment_user_label">Usuarios:</string>
    <string name="comment_time_label" />
    <string name="comment_rating_up">Comienzo</string>
    <string name="comment_rating_down">Final</string>
    <string name="comment_rating">Quiero comentar</string>
    <string name="next_hot_key">Más populares</string>
    <string name="groupheader_downloading">Descargar en (%1$s)</string>
    <string name="groupheader_installed">Instalada (%1$s)</string>
    <string name="groupheader_update">Actualizaciones disponibles (%1$s)</string>
    <string name="groupheader_downloaded">Descargado no se instala (%1$s)</string>
    <string name="input_username">Usuario (email):</string>
    <string name="input_password">Pass:</string>
    <string name="repeat_password">Repetir pass:</string>
    <string name="not_set" />
    <string name="input_phone">Teléfono:</string>
    <string name="input_nickname">Nick:</string>
    <string name="upload_user_info_Btn">Enviado</string>
    <string name="set_userinfo_success">Enviado con éxito</string>
    <string name="set_userinfo_fail">Confirmación fallida. Reintentar.</string>
    <string name="bottom_button_download">Descargar</string>
    <string name="bottom_button_comment">Comentarios</string>
    <string name="bottom_button_install">Instalar</string>
    <string name="bottom_button_uninstall">Desinstalar</string>
    <string name="bottom_button_update">Actualizar</string>
    <string name="bottom_button_launch">Abrir</string>
    <string name="bottom_button_delete">Eliminar</string>
    <string name="register_success">Registrado con éxito</string>
    <string name="register_fail">Error en el registro. Reintentar</string>
    <string name="show_more_screenshots">Ver más shots</string>
    <string name="error_select_channel">Seleccionar el modo de recarga</string>
    <string name="charge_successful">Recarga exitosa.</string>
    <string name="pay_successful">Pago exitoso.</string>
    <string name="empty_downloading_list">Vacío? Ve a recomendaciones</string>
    <string name="empty_downloaded_list">Vacío? Acción rápida!</string>
    <string name="firsttime_prompt">Hola, hoy es %1$s, cargando...</string>
    <string name="error_pay_failed">Pago fallido. Reintentar.</string>
    <string name="error_pay_wrong_appid">Pago fallido. La aplicación podría ser ilegal</string>
    <string name="error_pay_no_balance">Tu saldo (%1$s monedas) es insuficiente, por favor recarga</string>
    <string name="error_charge_wrong_card">Número de tarjeta incorrecto</string>
    <string name="error_charge_wrong_number">Contraseña incorrecta</string>
    <string name="error_charge_no_balance">Saldo insuficiente</string>
    <string name="error_charge_wrong_amount">Recarga no! Completar la recarga canal correcto blablabla montón de texto cantidad errónea</string>
    <string name="error_charge_wrong_type">Tipo de tarjeta incorrecto</string>
    <string name="error_charge_failed">Recarga fallida</string>
    <string name="error_login_wrong_name">Usuario inexistente</string>
    <string name="error_login_wrong_pwd">Contraseña incorrecta</string>
    <string name="login_failed">Error de acceso</string>
    <string name="error_charge_list">Error en la recarga</string>
    <string name="error_relate_list">Error</string>
    <string name="login_hint_pay_login">Necesita prestar %1s metros. Para garantizar la seguridad en cuenta ingrese o regístrese gratis.</string>
    <string name="login_hint_pay_pwd">Necesita prestar %1s metros.\nPara garantizar la seguridad en cuenta, introduzca pass.</string>
    <string name="login_hint_download">Para descargar más? Ingrese o regístrese.</string>
    <string name="login_hint_comment">Iniciar sesión para comentar</string>
    <string name="login_hint_session_timeout">Tiempo de inicio de sesión caducado</string>
    <string name="login_hint_welcome">Bienvenido</string>
    <string name="error_find_pwd_wrong_email">Email no certificado. Reintentar</string>
    <string name="find_pwd_failed">El pass no funciona? Contacta con atención al cliente</string>
    <string name="find_pwd_successful">Contraseña enviada al email.</string>
    <string name="find_pwd_edit_email">Introduzca su email</string>
    <string name="error_search_failed">Búsqueda infructuosa</string>
    <string name="error_search_no_app">No se ha encontrado. Volver a ver mañana!</string>
    <string name="change_pwd_old_pwd">Contraseña antigua</string>
    <string name="change_pwd_new_pwd">Contraseña nueva</string>
    <string name="change_pwd_new_pwd_confirm">Confirmar</string>
    <string name="change_pwd">Enviado</string>
    <string name="change_pwd_successful">Contraseña cambiada con éxito</string>
    <string name="change_pwd_failed">Error en el cambio de contraseña</string>
    <string name="error_change_pwd_wrong_old">Contraseña original incorrecta</string>
    <string name="get_comments_failed">No se pudo obtener comentarios.</string>
    <string name="get_comments_no_comment">No hay comentarios. Sé el primero...</string>
    <string name="get_my_rating_failed">Error al seguir comentario</string>
    <string name="comment_failed">Error al comentar</string>
    <string name="comment_successful">Comentario añadido</string>
    <string name="comment_no_comment">El comentario no puede estar vacío.</string>
    <string name="comment_grade_successful">Valorado con éxito</string>
    <string name="comment_grade_failed">Error en la valoración</string>
    <string name="comment">Enviado</string>
    <string name="comment_modify">Modificar</string>
    <string name="comment_add">Comentario:</string>
    <string name="comment_hint">La evaluación de cada aplicación por primera vez da una medalla de plata.</string>
    <string name="rate_1star">Muy pobre</string>
    <string name="rate_2star">Pobre</string>
    <string name="rate_3star">Buena</string>
    <string name="rate_4star">Recomendable</string>
    <string name="rate_5star">Muy recomendable</string>
    <string name="rate_no_star">Sin puntuación</string>
    <string name="rate_need_select">No se ha seleccionado valoración</string>
    <string name="dialog_title_choose_share_option">Compartir-%1$s</string>
    <string name="share_via_sms">Compartir a través de SMS</string>
    <string name="share_via_email">Enviar por correo</string>
    <string name="share_via_sms_content">Hola, estoy en la tienda de software descargado amor metros %1$s, grandes, ir a descargarlo. (Ver: aimi8.com / d. más emocionante, por favor visite el medidor de amor aimi8.com)</string>
    <string name="share_via_email_subject">%1$s--%2$s feliz de compartir</string>
    <string name="share_via_email_sharer">Metros amor</string>
    <string name="share_via_email_content">Hola, estoy en la tienda de software descargado amor metros %1$s, muy buena. También puede ir a la tienda buscando cosas de software amor metros que quieras Oh, dirección Ver: http://www.aimi8.com/d - ir a visitar a la más emocionante que http://www.aimi8.com)</string>
    <string name="share_content">Hola, estoy en la tienda de software descargado amor metros %1$s, muy buena ah, la dirección de descarga: http://aimi8.com/aimi8/app/%2$s_1_0.html - metros amor más emocionante ir a visitar a su http://www.aimi8.com</string>
    <string name="error_http_timeout">Error de red.</string>
    <string name="version_id">Ver: %1$s</string>
    <string name="version_about">(c)2010 SmarterMob Inc.</string>
    <string name="service_hotline">Servicio: KeFu@smartermob.com</string>
    <string name="corporate_name">Y la nueva abeja Rui (Beijing) Technology Co., Ltd.</string>
    <string name="web_support">web: www.aimi8.com</string>
    <string name="newbee_support">Producciones abeja y nosequé</string>
    <string name="newbee_name">Más movidas de derechos</string>
    <string name="newbee_hotline">servicio: KeFu@smartermob.com</string>
    <string name="error_null_name">El nombre de usuario no puede estar vacío</string>
    <string name="error_null_pwd">La contraseña no puede estar vacía</string>
    <string name="error_null_email">El email no puede estar vacío</string>
    <string name="error_null_card_number">La tarjeta de recarga no puede estar vacía</string>
    <string name="error_null_card_pwd">La contraseña de la tarjeta no puede estar vacía</string>
    <string name="error_null_card_amount">La cantidad no puede estar vacía</string>
    <string name="error_name_not_email">El nombre no es un email válido</string>
    <string name="error_pwd_not_match">Las contraseñas no coinciden</string>
    <string name="error_email_not_email">El email no es válido</string>
    <string name="error_phone_not_phone">Formato de teléfono incorrecto</string>
    <string name="choose_email_client">Seleccionar la forma de contacto</string>
    <string name="choose_share_client">Seleccionar forma de compartir</string>
    <string name="setting_cate_market">Configuración de la tienda</string>
    <string name="setting_download_icon">Icono de descargas</string>
    <string name="setting_download_icon_summary">No mostrar imágenes para ahorrar tráfico</string>
    <string name="setting_update_notification">Notificar actualizaciones</string>
    <string name="setting_update_notification_summary">Notifica automáticamente las actualizaciones</string>
    <string name="setting_voice_notification">Ajustes de sonido y vibración</string>
    <string name="setting_voice_notification_summary">Notifica las descargas</string>
    <string name="setting_clear_memory_title">Borrar caché</string>
    <string name="setting_clear_memory_content">Borrar la caché puede ahorrar espacio de la tarjeta, pero hará que haya más tráfico de datos. Desactivar?</string>
    <string name="update_download">Descargar la nueva versión</string>
    <string name="update_install">Instalar la nueva versión</string>
    <string name="bigsize_file">Se va a descargar una gran cantidad de datos. Se recomienda WiFi</string>
    <string name="continue_download">Continuar</string>
    <string name="cancel">Cancelar</string>
    <string name="download_time_sec">%1$s segundos</string>
    <string name="download_time_min">%1$s minutos</string>
    <string name="download_time_hour">%1$s horas</string>
    <string name="download_time_day">%1$s días</string>
    <string name="select_favor_cate_null">Seleccione categorías</string>
    <string name="my_favor_cate">Seleccione las apps que le interesan</string>
    <string name="my_favor_cate_summary">Sus opciones pueden mejorar la búsqueda de aplicaciones</string>
    <string name="network_setting">Configuración de red</string>
    <string name="no_network">Comprobar que la red está correctamente configurada</string>
    <string name="coming_soon">Característica no disponible todavía</string>
    <string name="daily_recommend">Recomendación diaria</string>
    <string name="menu_recommend">Recomendación de hoy</string>
    <string name="today_recommend">Recomendación de hoy:</string>
    <string name="date_recommend">%1$s recomendado:</string>
    <string name="no_recommend">No hay recomendaciones</string>
    <string name="recommend_bottom_button_download">Descargar ahora</string>
    <string name="error_not_found_recommend_app">Aplicación inexistente!</string>
    <string name="rating_unit">%1$s puntos</string>
    <string name="rating_no_score">Sin puntuación</string>
</resources>
 
sparkster84
Old
#5  
sparkster84's Avatar
Junior Member - OP
Thanks Meter 4
Posts: 29
Join Date: Oct 2010
I surrend, I cannot fin the problem with that application. Anyway I tried the script with another couple of apps and it works correctly. I also changed it a little, so now it uses less files. You can download the new script here:

http://www.megaupload.com/?d=HHD7J8O2
The Following User Says Thank You to sparkster84 For This Useful Post: [ Click to Expand ]
Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes