Update copyright headers
[qt:qt.git] / doc / src / declarative / righttoleft.qdoc
1 /****************************************************************************
2 **
3 ** Copyright (C) 2015 The Qt Company Ltd.
4 ** Contact: http://www.qt.io/licensing/
5 **
6 ** This file is part of the documentation of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:FDL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see http://www.qt.io/terms-conditions. For further
15 ** information use the contact form at http://www.qt.io/contact-us.
16 **
17 ** GNU Free Documentation License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Free
19 ** Documentation License version 1.3 as published by the Free Software
20 ** Foundation and appearing in the file included in the packaging of
21 ** this file.  Please review the following information to ensure
22 ** the GNU Free Documentation License version 1.3 requirements
23 ** will be met: http://www.gnu.org/copyleft/fdl.html.
24 ** $QT_END_LICENSE$
25 **
26 ****************************************************************************/
27
28 /*!
29 \page qml-righttoleft.html
30 \title QML Right-to-left User Interfaces
31
32 \section1 Overview
33
34 This chapter discusses different approaches and options available for implementing right-to-left
35 language support for Qt Quick applications. Some common right-to-left languages include Arabic, Hebrew,
36 Persian and Urdu. Most changes include making sure that text translated to right-to-left languages
37 is properly aligned to the right, and horizontally ordered content in views, lists and grids flows
38 correctly from the right to left.
39
40 In right-to-left language speaking cultures, people naturally scan and read graphic elements and text
41 from the right to left. The general rule of thumb is that content (like photos, videos and maps) is not
42 mirrored, but positioning of the content (like application layouts and the flow of visual elements) is
43 mirrored. For example, photos shown in chronological order should flow from right to left, the
44 low end range of the horizontal sliders should be located at the right side of the slider, and
45 text lines should should be aligned to the right side of the available text area. The location of visual
46 elements should not be mirrored when the position is related to a content; for example, when a
47 position marker is shown to indicate a location on a map. Also, there are some special cases you may
48 need to take into account where right-to-left language speakers are used to left-to-right
49 positioning, for example when using number dialers in phones and media play, pause, rewind and
50 forward buttons in music players.
51
52 \section1 Text Alignment
53
54 (This applies to the \l Text, \l TextInput and \l TextEdit elements.)
55
56 When the horizontal alignment of a text item is not explicitly set, the text element is
57 automatically aligned to the natural reading direction of the text. By default left-to-right text
58 like English is aligned to the left side of the text area, and right-to-left text like Arabic is
59 aligned to the right side of the text area. The alignment of a text element with empty text takes
60 its alignment cue from \l QApplication::keyboardInputDirection(), which is based on the active
61 system locale.
62
63 This default locale-based alignment can be overriden by setting the \c horizontalAlignment
64 property for the text element, or by enabling layout mirroring using the \l LayoutMirroring attached
65 property, which causes any explicit left and right horizontal alignments to be mirrored.
66 Note that when \l LayoutMirroring is set, the \c horizontalAlignment property value remains unchanged;
67 use the property \c LayoutMirroring.enabled instead to query whether the mirroring is in effect.
68
69 \snippet doc/src/snippets/declarative/righttoleft.qml 0
70
71 \section1 Layout direction of positioners and views
72
73 (This applies to the \l Row, \l Grid, \l Flow, \l ListView and \l GridView elements.)
74
75 From Qt Quick 1.1 onwards, elements used for horizontal positioning and model views have gained a \c layoutDirection
76 property for controlling the horizontal direction of the layouts. Setting \c layoutDirection to
77 \c Qt.RightToLeft causes items to be laid out from the right to left. By default Qt Quick follows
78 the left-to-right layout direction.
79
80 The horizontal layout direction can also be reversed through the \l LayoutMirroring attached property.
81 This causes the effective \c layoutDirection of positioners and views to be mirrored. Note though that the actual
82 value of the \c layoutDirection property will remain unchanged; use the property \c LayoutMirroring.enabled instead
83 to query whether the mirroring is in effect.
84
85 \snippet doc/src/snippets/declarative/righttoleft.qml 1
86
87 \section1 Layout mirroring
88
89 The attached property \l LayoutMirroring is provided as a convenience for easily implementing right-to-left
90 support for existing left-to-right Qt Quick applications. It mirrors the behavior of \l {anchor-layout}
91 {Item anchors}, the layout direction of \l{Using QML Positioner and Repeater Items}{positioners} and
92 model views, and the explicit text alignment of QML text elements.
93
94 You can enable layout mirroring for a particular \l Item:
95
96 \snippet doc/src/snippets/declarative/righttoleft.qml 2
97
98 Or set all child elements to also inherit the layout direction:
99
100 \snippet doc/src/snippets/declarative/righttoleft.qml 3
101
102 Applying mirroring in this manner does not change the actual value of the relevant anchor,
103 \c layoutDirection or \c horizontalAlignment properties. The separate read-only property
104 \c effectiveLayoutDirection can be used to query the effective layout
105 direction of positioners and model views that takes the mirroring into account. Similarly the \l Text,
106 \l TextInput and \l TextEdit elements have gained the read-only property \c effectiveHorizontalAlignment
107 for querying the effective visual alignment of text. For anchors, the read only
108 \l {Item::anchors.top}{anchors.mirrored} property reflects whether anchors have been mirrored.
109
110 Note that application layouts and animations that are defined using \l {Item::}{x} property values (as
111 opposed to anchors or positioner elements) are not affected by the \l LayoutMirroring attached property.
112 Therefore, adding right-to-left support to these types of layouts may require some code changes to your application,
113 especially in views that rely on both the anchors and x coordinate-based positioning. Here is one way to use
114 the \l LayoutMirroring attached property to apply mirroring to an item that is positioned using \l {Item::}{x}
115 coordinates:
116
117 \snippet doc/src/snippets/declarative/righttoleft.qml 4
118
119 Not all layouts should necessarily be mirrored. There are cases where a visual element is positioned to
120 the right side of the screen for improved one-handed use, because most people are right-handed, and not
121 because of the reading direction. In the case that a child element should not be affected by mirroring,
122 set the \l {LayoutMirroring::enabled}{LayoutMirroring.enabled} property for that element to false.
123
124 Qt Quick is designed for developing animated, fluid user interfaces. When mirroring your application, remember to test that
125 the animations and transitions continue to work as expected. If you do not have the resources to add
126 right-to-left support for your application, it may be better to just keep the application layouts left
127 aligned and just make sure that text is translated and aligned properly.
128
129 \section1 Mirroring icons
130
131 (This applies to \l Image, \l BorderImage and \l AnimatedImage elements.)
132
133 Most images do not need to be mirrored, but some directional icons, such as arrows, may need to be mirrored.
134 The painting of these icons can be mirrored with a dedicated \c mirror property introduced in Qt Quick 1.1:
135
136 \snippet doc/src/snippets/declarative/righttoleft.qml 5
137
138 \section1 Default layout direction
139
140 The \l {QML:Qt::application}{Qt.application.layoutDirection} property can be used to query the active layout direction of the
141 application. It is based on QApplication::layoutDirection(), which most commonly determines the layout
142 direction from the active language translation file.
143
144 To define the layout direction for a particular locale, declare the dedicated string literal
145 \c QT_LAYOUT_DIRECTION in context \c QApplication as either "LTR" or "RTL".
146
147 You can do this by first introducing this line
148
149 \code
150 QT_TRANSLATE_NOOP("QApplication", "QT_LAYOUT_DIRECTION");
151 \endcode
152
153 somewhere in your QML source code and calling \c lupdate to generate the translation source file.
154
155 \code
156 lupdate myapp.qml -ts myapp.ts
157 \endcode
158
159 This will append the following declaration to the translation file, where you can fill in either "LTR" or
160 "RTL" as the translation for the locale.
161
162 \code
163 <context>
164     <name>QApplication</name>
165     <message>
166         <location filename="myapp.qml" line="33"/>
167         <source>QT_LAYOUT_DIRECTION</source>
168         <translation type="unfinished">RTL</translation>
169     </message>
170 </context>
171 \endcode
172
173 You can test that the layout direction works as expected by running your Qt Quick application with
174 the compiled translation file:
175
176 \code
177 qmlviewer myapp.qml -translation myapp.qm
178 \endcode
179
180 You can test your application in right-to-left layout direction simply by executing qmlviewer with a
181 command-line parameter "-reverse":
182
183 \code
184 qmlviewer myapp.qml -reverse
185 \endcode
186
187 The layout direction can also be set from C++ by calling the static function \l QApplication::setLayoutDirection():
188
189 \code
190 QApplication app(argc, argv);
191 app.setLayoutDirection(Qt::RightToLeft);
192 \endcode
193
194 */