.. index:: 
     single: Multi-language applications; Introduction

===========================
Multi-language Applications
===========================

There are many ways to create multi-language Ring application!

In this chapter we will learn about using the String2Constant tool

.. index:: 
     pair: Multi-language applications; Using String2Constant

Using String2Constant
=====================

Starting from Ring 1.8 we have the String2Constant application

You will find this tool in the ring/samples/tools/string2constant folder

Using this tool we can convert the source code to be based on constants instead of string literals

Then we can store constants in separate source code files that we can translate to different languages

Where we can have special file for each language, like (English.ring, Arabic.ring and so on)

Using this simple tool, the Form Designer is translated to Arabic language too just as an example.

.. image:: string2constant.png
	:alt: String2Constant 

.. index:: 
     pair: Multi-language applications; Form Designer Translation

Form Designer Translation
=========================

You will find the form designer application in the ring/applications/formdesigner folder

The files used for translation are stored in the ring/applications/formdesinger/translation folder

You will find two files

* Arabic.ring
* English.ring

You can check these files to get an idea about constants definition.

The next section from the English.ring file

.. code-block:: ring

	T_LANGUAGE = "english"
	T_LAYOUTDIRECTION = 0			# Left to Right

	T_FORMDESIGNER_FORMDESIGNER 		= "Form Designer"
	T_FORMDESIGNER_FORMTITLE 		= "Form1"

	T_FORMDESIGNER_FILE 			= "File"
	T_FORMDESIGNER_NEW 			= "New"
	T_FORMDESIGNER_OPEN 			= "Open"
	T_FORMDESIGNER_SAVE 			= "Save"
	T_FORMDESIGNER_SAVEAS 			= "Save As"
	T_FORMDESIGNER_CLOSE 			= "Close"

The form designer source code files will use these constants instead of typing the string literals 

the next section from the formdesigner/mainwindow/formdesignerview.ring

.. code-block:: ring

		# Create the Main Window and use the Mdi Area
			win = new qMainwindow() {
				setWindowTitle(T_FORMDESIGNER_FORMDESIGNER) # "Form Designer"
				setcentralWidget(this.oArea)
				setLayoutDirection(T_LAYOUTDIRECTION)
			}

* Using comments we can write the string literal to get more readable code.

* Using setLayoutDirection() method we can set the window direction to be Right To Left.

* Using the Load command, We can determine which translation file to use. 

.. index:: 
     pair: Multi-language applications; Forms Translation

Forms Translation
=================

After creating the form using the Form Designer, the View class will be generated.

We don't modify the view class, We just add the translation through the Controller class.

For example, we have the form file : ring/formdesigner/selobjects/selobjects.rform

.. image:: formtranslation1.png
	:alt: Form Translation 


And we add the translation through the Controller class using the next code

And we define the constants in English.ring and Arabic.ring

.. code-block:: ring 

	class selobjectsController from windowsControllerParent

		oView = new selobjectsView  {
			ListObjects.setselectionmode(QAbstractItemView_MultiSelection)
			win.setwindowmodality(2)
			# Translation
				win.setWindowTitle(T_FORMDESIGNER_SELOBJECTS_TITLE)
				win.setLayoutDirection(T_LAYOUTDIRECTION)
				labelobjects.setText(T_FORMDESIGNER_SELOBJECTS_OBJECTS)
				btnSelect.setText(T_FORMDESIGNER_SELOBJECTS_SELECT)
				btnClose.setText(T_FORMDESIGNER_SELOBJECTS_CLOSE)
		}


