--- title: Designing UIs Declaratively order: 3 layout: page --- [[application.declarative]] = Designing UIs Declaratively Declarative definition of composites and even entire UIs makes it easy for developers and especially graphical designers to work on visual designs without any coding. Designs can be modified even while the application is running, as can be the associated themes. A design is a representation of a component hierarcy, which can be accessed from Java code to implement dynamic UI logic, as well as data binding. For example, considering the following layout in Java: [source, java] ---- VerticalLayout vertical = new VerticalLayout (); vertical.addComponent(new TextField("Name")); vertical.addComponent(new TextField("Street address")); vertical.addComponent(new TextField("Postal code")); layout.addComponent(vertical); ---- You could define it declaractively with the following equivalent design: [source, html] ---- ---- Declarative designs can be crafted by hand, but are most conveniently created with the Vaadin Designer. In the following, we first go through the syntax of the declarative design files, and then see how to use them in applications by binding them to data and handling user interaction events. [[application.declarative.syntax]] == Declarative Syntax A design is an HTML document with custom elements for representing components and their configuration. A design has a single root component inside the HTML body element. Enclosing [literal]#++++#, [literal]#++++#, and [literal]#++++# are optional, but necessary if you need to make namespace definitions for custom components. Other regular HTML elements may not be used in the file, except inside components that specifically accept HTML content. In a design, each nested element corresponds to a Vaadin component in a component tree. Components can have explicitly given IDs to enable binding them to variables in the Java code, as well as optional attributes. [source, html] ---- Hello! - How are you? ---- The DOCTYPE is not required, neither is the [literal]#++++#, or [literal]#++++# elements. Nevertheless, there may only be one design root element. The above design defines the same UI layout as done earlier with Java code, and illustrated in <>. [[application.declarative.elements]] == Component Elements HTML elements of the declarative syntax are directly mapped to Vaadin components according to their Java class names. The tag of a component element has a namespace prefix separated by a dash. Vaadin core components, which are defined in the [package]#com.vaadin.ui# package, have [literal]#++vaadin-++# prefix. The rest of an element tag is determined from the Java class name of the component, by making it lower-case, while adding a dash (`-`) before every previously upper-case letter as a word separator. For example, [classname]#ComboBox# component has declarative element tag [vaadinelement]#vaadin-combo-box#. [[application.declarative.elements.prefix]] === Component Prefix to Package Mapping You can use any components in a design: components extending Vaadin components, composite components, and add-on components. To do so, you need to define a mapping from an element prefix to the Java package of the component. The prefix is used as a sort of a namespace. The mappings are defined in `` elements in the HTML head. A [parameter]#content# attribute defines a mapping, in notation with a prefix separated from the corresponding Java package name with a colon, such as `my:com.example.myapp`. For example, consider that you have the following composite class [classname]#com.example.myapp.ExampleComponent#: [source, java] ---- package com.example.myapp; public class ExampleComponent extends CustomComponent { public ExampleComponent() { setCompositionRoot(new Label("I am an example.")); } } ---- You would make the package prefix mapping and then use the component as follows: [subs="normal"] ---- <!DOCTYPE html> <html> <head> **<meta name="package-mapping" content="my:com.example.myapp" />** </head> <body> <vaadin-vertical-layout> <vaadin-label><b>Hello!</b> - How are you?</vaadin-label> <!-- Use it here --> **<my-example-component/>** </vaadin-vertical-layout> </body> </html> ---- [[application.declarative.elements.inline]] === Inline Content and Data The element content can be used for certain default attributes, such as a button caption. For example: [source, html] ---- OK ---- Some components, such as selection components, allow defining inline data within the element. For example: [source, html] ---- ---- The declarative syntax of each component type is described in the JavaDoc API documentation of Vaadin. [[application.declarative.attributes]] == Component Attributes [[application.declarative.attributes.mapping]] === Attribute-to-Property Mapping Component properties are directly mapped to the attributes of the HTML elements according to the names of the properties. Attributes are written in lower-case letters and dash is used for word separation instead of upper-case letters in the Java methods, so that [literal]#++placeholder++# attribute is equivalent to [methodname]#setPlaceholder()#. For example, the __caption__ property, which you can set with [methodname]#setCaption()#, is represented as [literal]#++caption++# attribute. You can find the component properties by the setter methods in the link:https://vaadin.com/api/[JavaDoc API documentation] of the component classes. [source, html] ---- ---- [[application.declarative.attributes.parameters]] === Attribute Values Attribute parameters must be enclosed in quotes and the value given as a string must be convertible to the type of the property (string, integer, boolean, or enumeration). Object types are not supported. Some attribute names are given by a shorthand. For example, [parameter]#alternateText# property of the [classname]#Image# component, which you would set with [methodname]#setAlternateText()#, is given as the [literal]#++alt++# attribute. Boolean values must be either `true` or `false`. The value can be omitted, in which case `true` is assumed. For example, the [literal]#++enabled++# attribute is boolean and has default value "`true`", so `enabled="true"` and `enabled` and equivalent. [source, html] ---- OK ---- [[application.declarative.attributes.parent]] === Parent Component Settings Certain settings, such as a component's alignment in a layout, are not done in the component itself, but in the layout. Attributes prefixed with colon ( [literal]#++:++#) are passed to the containing component, with the component as a target parameter. For example, [literal]#++:expand="1"++# given for a component [parameter]#c# is equivalent to calling [methodname]#setExpandRatio(c, 1)# for the containing layout. [subs="normal"] ---- <vaadin-vertical-layout size-full> <!-- Align right in the containing layout --> <vaadin-label width-auto **:right**>Hello!</vaadin-label> <!-- Expands to take up all remaining vertical space --> <vaadin-horizontal-layout size-full **:expand**> <!-- Automatic width - shrinks horizontally --> <vaadin-radio-button-group width-auto height-full/> <!-- Expands horizontally to take remaining space --> <vaadin-grid size-full **:expand**/> </vaadin-horizontal-layout> </vaadin-vertical-layout> ---- [[application.declarative.identifiers]] == Component Identifiers Components can be identified by either an identifier or a caption. There are two types of identifiers: page-global and local. This allows accessing them from Java code and binding them to components, as described later in <>. The [literal]#++id++# attribute can be used to define a page-global identifier, which must be unique within the page. Another design or UI shown simultaneously in the same page may not have components sharing the same ID. Using global identifiers is therefore not recommended, except in special cases where uniqueness is ensured. The [literal]#++_id++# attribute defines a local identifier used only within the design. This is the recommended way to identifying components. [source, html] ---- ---- [[application.declarative.composite]] == Using Designs in Code The main use of declarative designs is in building application views, sub-views, dialogs, and forms through composition. The two main tasks are filling the designs with application data and handling user interaction events. [[application.declarative.composite.designroot]] === Binding to a Design Root You can bind any component container as the root component of a design with the [classname]#@DesignRoot# annotation. The class must match or extend the class of the root element in the design. The member variables are automatically initialized from the design according to the component identifiers (see <>), which must match the variable names. For example, the following class could be used to bind the design given earlier. [source, java] ---- @DesignRoot public class MyViewDesign extends VerticalLayout { RadioButtonGroup myRadioButtonGroup; Grid myGrid; public MyViewDesign() { Design.read("MyDeclarativeUI.html", this); // Show some (example) data myCheckBoxGroup.setItems("Venus", "Earth", "Mars"); myGrid.setItems( GridExample.generateContent()); // Some interaction myCheckBoxGroup.addValueChangeListener(event -> Notification.show("Selected " + event.getValue()); } } ---- The design root class must match or extend the root element class of the design. For example, earlier we had [literal]#++++# element in the HTML file, which can be bound to a class extending [classname]#VerticalLayout#. [[application.declarative.composite.using]] === Using a Design The fact that a component is defined declaratively is not visible in its API, so you can create and use such it just like any other component. For example, to use the previously defined design root component as the content of the entire UI: [source, java] ---- public class DeclarativeViewUI extends UI { @Override protected void init(VaadinRequest request) { setContent(new MyViewDesign()); } } ---- [[application.declarative.composite.viewnavigation]] === Designs in View Navigation To use a design in view navigation, as described in <>, you just need to implement the [interfacename]#View# interface. [source, java] ---- @DesignRoot public class MainView extends VerticalLayout implements View { public MainView() { Design.read(this); ... } ... } ... // Use the view by precreating it navigator.addView(MAINVIEW, new MainView()); ---- See <> for a complete example. d/noid/stable23-update-code-signing-crl'>automated/noid/stable23-update-code-signing-crl Nextcloud server, a safe home for all your data: https://github.com/nextcloud/serverwww-data
aboutsummaryrefslogtreecommitdiffstats
blob: fc78d41d103bc89d3e1dd7b493d8abd28218e1dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
{ "translations": {
    "Cannot write into \"config\" directory!" : "無法寫入 \"config\" 目錄!",
    "This can usually be fixed by giving the webserver write access to the config directory" : "允許網頁伺服器寫入 \"config\" 目錄通常可以解決這個問題",
    "Or, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it." : "或者,如果您比較希望保留 config.php 的唯讀狀態,請在該設定檔中將 \"config_is_read_only\" 設定為 true。",
    "See %s" : "見 %s",
    "This can usually be fixed by giving the webserver write access to the config directory." : "允許網頁伺服器寫入 \"config\" 目錄通常可以解決這個問題",
    "Or, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it. See %s" : "或者,如果您比較希望保留 config.php 的唯讀狀態,請在該設定檔中將 \"config_is_read_only\" 設定為 true。見%s",
    "The files of the app %1$s were not replaced correctly. Make sure it is a version compatible with the server." : "應用程式 %1$s 中的檔案沒有被正確取代,請確認它的版本與伺服器相容。",
    "Sample configuration detected" : "您目前正在使用範例設定",
    "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "您似乎直接複製了範例設定來使用,這樣的安裝很可能會無法運作,請閱讀說明文件後對 config.php 進行適當的修改",
    "Other activities" : "其它活動",
    "%1$s and %2$s" : "%1$s 和 %2$s",
    "%1$s, %2$s and %3$s" : "%1$s, %2$s 和 %3$s",
    "%1$s, %2$s, %3$s and %4$s" : "%1$s、%2$s、%3$s 和 %4$s",
    "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s、%2$s、%3$s、%4$s 和 %5$s",
    "Education Edition" : "教育版",
    "Enterprise bundle" : "企業組合包",
    "Groupware bundle" : "協作組合包",
    "Hub bundle" : "Hub 套裝",
    "Social sharing bundle" : "社交網絡組合包",
    "PHP %s or higher is required." : "需要 PHP %s 或更高版本",
    "PHP with a version lower than %s is required." : "需要 PHP 版本低於 %s ",
    "%sbit or higher PHP required." : "%s 或需要更高階版本的php",
    "The following architectures are supported: %s" : "支援下列架構:%s",
    "The following databases are supported: %s" : "支援下列資料庫:%s",
    "The command line tool %s could not be found" : "找不到命令列工具指令 %s",
    "The library %s is not available." : "套件庫 %s 無法使用",
    "Library %1$s with a version higher than %2$s is required - available version %3$s." : "需要使用 %2$s 版以上的 %1$s 函式庫,目前可用的版本是 %3$s",
    "Library %1$s with a version lower than %2$s is required - available version %3$s." : "需要使用 %2$s 版以下的 %1$s 函式庫,目前可用的版本是 %3$s",
    "The following platforms are supported: %s" : "支援下列平台:%s",
    "Server version %s or higher is required." : "需要伺服器版本 %s 或更高",
    "Server version %s or lower is required." : "需要伺服器版本 %s 或更低",
    "Logged in user must be an admin or sub admin" : "登入的使用者必須要是管理員或是子管理員",
    "Logged in user must be an admin" : "登入的使用者必須有管理員權限",
    "Wiping of device %s has started" : "已開始抹除裝置 %s ",
    "Wiping of device »%s« has started" : "已開始抹除裝置「%s」",
    "»%s« started remote wipe" : "「%s」開始遠端抹除",
    "Device or application »%s« has started the remote wipe process. You will receive another email once the process has finished" : "裝置或應用程式「%s」已開始遠端抹除的程序,完成後您將會收到另一封通知信",
    "Wiping of device %s has finished" : "裝置 %s 抹除完成",
    "Wiping of device »%s« has finished" : "裝置「%s」抹除完成",
    "»%s« finished remote wipe" : "裝置「%s」完成遠端抹除",
    "Device or application »%s« has finished the remote wipe process." : "裝置或應用程式「%s」已完成遠端抹除",
    "Remote wipe started" : "遠端抹除已開始",
    "A remote wipe was started on device %s" : "遠端抹除已經在裝置 %s 開始",
    "Remote wipe finished" : "遠端抹除已完成",
    "The remote wipe on %s has finished" : "%s 的遠端抹除已經完成",
    "Authentication" : "認證",
    "Unknown filetype" : "未知的檔案類型",
    "Invalid image" : "無效的圖片",
    "Avatar image is not square" : "頭像不是正方形",
    "today" : "今天",
    "tomorrow" : "明天",
    "yesterday" : "昨天",
    "_in %n day_::_in %n days_" : ["在 %n 天內"],
    "_%n day ago_::_%n days ago_" : ["%n 天前"],
    "next month" : "下個月",
    "last month" : "上個月",
    "_in %n month_::_in %n months_" : ["在 %n 月內"],
    "_%n month ago_::_%n months ago_" : ["%n 個月前"],
    "next year" : "明年",
    "last year" : "去年",
    "_in %n year_::_in %n years_" : ["%n 年後"],
    "_%n year ago_::_%n years ago_" : ["%n 年前"],
    "_in %n hour_::_in %n hours_" : ["%n 小時後"],
    "_%n hour ago_::_%n hours ago_" : ["%n 小時前"],
    "_in %n minute_::_in %n minutes_" : ["%n 分鐘後"],
    "_%n minute ago_::_%n minutes ago_" : ["%n 分鐘前"],
    "in a few seconds" : "幾秒後",
    "seconds ago" : "幾秒前",
    "Empty file" : "空檔案",
    "Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "名為 %s 的模組不存在,請在應用程式設定中啟用,或是聯絡系統管理員",
    "File already exists" : "檔案已存在",
    "Failed to create file from template" : "無法從範本建立檔案",
    "Templates" : "範本",
    "File name is a reserved word" : "檔案名稱是保留字",
    "File name contains at least one invalid character" : "檔案名稱含有不允許的字元",
    "File name is too long" : "檔案名稱太長",
    "Dot files are not allowed" : "不允許小數點開頭的檔案",
    "Empty filename is not allowed" : "不允許空白的檔名",
    "App \"%s\" cannot be installed because appinfo file cannot be read." : "應用程式 \"%s\" 無法安裝,因為無法讀取 appinfo 檔案。",
    "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "應用程式 \"%s\" 無法安裝,因為該應用程式不相容於目前版本的伺服器。",
    "__language_name__" : "正體中文(臺灣)",
    "This is an automatically sent email, please do not reply." : "此為自動寄送的電子郵件,請不要回覆。",
    "Help" : "說明",
    "Apps" : "應用程式",
    "Settings" : "設定",
    "Log out" : "登出",
    "Users" : "使用者",
    "Unknown user" : "未知的使用者",
    "Additional settings" : "其他設定",
    "%s enter the database username and name." : "%s 輸入資料庫名稱及使用者名稱",
    "%s enter the database username." : "%s 輸入資料庫使用者名稱",
    "%s enter the database name." : "%s 輸入資料庫名稱",
    "%s you may not use dots in the database name" : "%s 資料庫名稱不能包含小數點",
    "MySQL username and/or password not valid" : "MySQL 使用者名稱或密碼不正確",
    "You need to enter details of an existing account." : "您必須輸入現有帳號的資訊",
    "Oracle connection could not be established" : "無法建立 Oracle 資料庫連線",
    "Oracle username and/or password not valid" : "Oracle 用戶名和/或密碼無效",
    "PostgreSQL username and/or password not valid" : "PostgreSQL 用戶名和/或密碼無效",
    "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "不支援 Mac OS X 而且 %s 在這個平台上面無法正常運作,請自行衡量風險後使用!",
    "For the best results, please consider using a GNU/Linux server instead." : "請考慮使用 GNU/Linux 伺服器以獲得最佳體驗",
    "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "看起來 %s 是在 32 位元的 PHP 環境運行,並且 php.ini 中被設置了 open_basedir 參數,這將讓超過 4GB 的檔案操作發生問題,強烈建議您更改設定。",
    "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "請移除 php.ini 中的 open_basedir 設定,或是改用 64 位元的 PHP",
    "Set an admin username." : "設定管理員帳號",
    "Set an admin password." : "設定管理員密碼",
    "Can't create or write into the data directory %s" : "無法建立或寫入資料目錄 %s",
    "Sharing backend %s must implement the interface OCP\\Share_Backend" : "分享後端 %s 必須實作 OCP\\Share_Backend 界面",
    "Sharing backend %s not found" : "找不到分享後端 %s",
    "Sharing backend for %s not found" : "找不到 %s 的分享後端",
    "%1$s shared »%2$s« with you and wants to add:" : "%1$s 與您分享了 %2$s ,且想要加入:",
    "%1$s shared »%2$s« with you and wants to add" : "%1$s 與您分享了 %2$s ,且想要加入",
    "»%s« added a note to a file shared with you" : "%s 在與您分享的檔案中加入了註解",
    "Open »%s«" : "開啟 »%s«",
    "%1$s via %2$s" : "%1$s 由 %2$s",
    "You are not allowed to share %s" : "你不被允許分享 %s",
    "Can’t increase permissions of %s" : "無法增加 %s 的權限",
    "Files can’t be shared with delete permissions" : "無法分享具有刪除權限的檔案",
    "Files can’t be shared with create permissions" : "無法分享具有新建權限的檔案",
    "Expiration date is in the past" : "到期日為過去的日期",
    "Can’t set expiration date more than %s days in the future" : "到期日不能設定為 %s 天以後的日期",
    "Sharing is only allowed with group members" : "僅允許與群組成員分享",
    "Sharing %s failed, because this item is already shared with user %s" : "分享 %s 失敗,因為此項目已與使用者 %s 分享",
    "%1$s shared »%2$s« with you" : "%1$s 與您分享了 %2$s",
    "%1$s shared »%2$s« with you." : "%1$s 與您分享了 %2$s",
    "Click the button below to open it." : "點下方連結開啟",
    "The requested share does not exist anymore" : "該分享已經不存在",
    "Could not find category \"%s\"" : "找不到分類:\"%s\"",
    "Sunday" : "週日",
    "Monday" : "週一",
    "Tuesday" : "週二",
    "Wednesday" : "週三",
    "Thursday" : "週四",
    "Friday" : "週五",
    "Saturday" : "週六",
    "Sun." : "日",
    "Mon." : "一",
    "Tue." : "二",
    "Wed." : "三",
    "Thu." : "四",
    "Fri." : "五",
    "Sat." : "六",
    "Su" : "日",
    "Mo" : "一",
    "Tu" : "二",
    "We" : "三",
    "Th" : "四",
    "Fr" : "五",
    "Sa" : "六",
    "January" : "一月",
    "February" : "二月",
    "March" : "三月",
    "April" : "四月",
    "May" : "五月",
    "June" : "六月",
    "July" : "七月",
    "August" : "八月",
    "September" : "九月",
    "October" : "十月",
    "November" : "十一月",
    "December" : "十二月",
    "Jan." : "一月",
    "Feb." : "二月",
    "Mar." : "三月",
    "Apr." : "四月",
    "May." : "五月",
    "Jun." : "六月",
    "Jul." : "七月",
    "Aug." : "八月",
    "Sep." : "九月",
    "Oct." : "十月",
    "Nov." : "十一月",
    "Dec." : "十二月",
    "The user limit has been reached and the user was not created." : "已達使用者限制,所以未建立使用者。",
    "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "使用者名稱當中只能包含下列字元:\"a-z\", \"A-Z\", \"0-9\", 和 \"_.@-'\"",
    "A valid username must be provided" : "必須提供一個有效的用戶名",
    "Username contains whitespace at the beginning or at the end" : "用戶名的開頭或結尾有空白",
    "Username must not consist of dots only" : "使用者名稱不能只包含小數點",
    "Username is invalid because files already exist for this user" : "使用者名稱無效,因為使用者的檔案已經存在",
    "A valid password must be provided" : "須提供有效的密碼",
    "The username is already being used" : "這個使用者名稱已經有人使用了",
    "Could not create user" : "無法建立使用者",
    "User disabled" : "使用者已停用",
    "Login canceled by app" : "應用程式取消了登入",
    "App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "應用程式 \"%1$s\" 無法被安裝,缺少下列所需元件: %2$s",
    "a safe home for all your data" : "您資料的安全屋",
    "File is currently busy, please try again later" : "檔案目前忙碌中,請稍候再試",
    "Can't read file" : "無法讀取檔案",
    "Application is not enabled" : "應用程式未啟用",
    "Authentication error" : "認證錯誤",
    "Token expired. Please reload page." : "Token 過期,請重新整理頁面。",
    "No database drivers (sqlite, mysql, or postgresql) installed." : "沒有安裝資料庫驅動程式 (sqlite, mysql, 或 postgresql)",
    "Cannot write into \"config\" directory" : "無法寫入 config 目錄",
    "This can usually be fixed by giving the webserver write access to the config directory. See %s" : "允許網頁伺服器寫入 \"config\" 目錄通常可以解決這個問題,詳見 %s",
    "Cannot write into \"apps\" directory" : "無法寫入 apps 目錄",
    "This can usually be fixed by giving the webserver write access to the apps directory or disabling the appstore in the config file." : "允許網頁伺服器寫入 \"apps\" 目錄或是在設定檔中停用應用程式商店通常可以解決這個問題",
    "Cannot create \"data\" directory" : "無法建立 \"data\" 目錄",
    "This can usually be fixed by giving the webserver write access to the root directory. See %s" : "開放網頁伺服器存取根目錄通常就可以修正這個問題,詳見 %s",
    "Permissions can usually be fixed by giving the webserver write access to the root directory. See %s." : "開放網頁伺服器存取根目錄通常就可以修正權限問題,詳見 %s",
    "Setting locale to %s failed" : "設定語系為 %s 失敗",
    "Please install one of these locales on your system and restart your webserver." : "請在系統中安裝這些語系的其中一個,然後重啓網頁伺服器",
    "PHP module %s not installed." : "未安裝 PHP 模組 %s",
    "Please ask your server administrator to install the module." : "請詢問系統管理員來安裝這些模組",
    "PHP setting \"%s\" is not set to \"%s\"." : "PHP 設定值 \"%s\" 沒有被設定為 \"%s\"",
    "Adjusting this setting in php.ini will make Nextcloud run again" : "調整 php.ini 中的設定,使 Nextcloud 重新運作",
    "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload 應該要被設定成 \"0\" 而不是目前的設定 \"%s\" ",
    "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "為了修正這個問題,請到 php.ini 將 <code>mbstring.func_overload</code> 的值改為 <code>0</code>",
    "libxml2 2.7.0 is at least required. Currently %s is installed." : "libxml2 版本最低需求為 2.7.0。目前安裝版本為 %s 。",
    "To fix this issue update your libxml2 version and restart your web server." : "修正方式為更新您的 libxml2 為 2.7.0 以上版本,再重啟網頁伺服器。",
    "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP 已經設定成「剪除 inline doc block」模式,這將會使幾個核心應用程式無法使用",
    "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "這大概是由快取或是加速器像是 Zend OPcache, eAccelerator 造成的",
    "PHP modules have been installed, but they are still listed as missing?" : "你已經安裝了指定的 PHP 模組,可是還是顯示為找不到嗎?",
    "Please ask your server administrator to restart the web server." : "請聯絡您的系統管理員重新啟動網頁伺服器",
    "PostgreSQL >= 9 required" : "需要 PostgreSQL 版本 >= 9",
    "Please upgrade your database version" : "請升級您的資料庫版本",
    "Your data directory is readable by other users" : "您的資料目錄可以被其他使用者讀取",
    "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "請將該目錄權限設定為 0770 ,以免其他使用者讀取目錄列表",
    "Your data directory must be an absolute path" : "您的資料目錄必須為絕對路徑",
    "Check the value of \"datadirectory\" in your configuration" : "請檢查您的設定檔中 \"datadirectory\" 的值",
    "Your data directory is invalid" : "您的資料目錄無效",
    "Ensure there is a file called \".ocdata\" in the root of the data directory." : "請確保資料目錄最上層有一個 \".ocdata\" 檔案",
    "Action \"%s\" not supported or implemented." : "操作 \"%s\" 並未支援,或是尚未實作",
    "Authentication failed, wrong token or provider ID given" : "認證失敗,提供了錯誤的 token 或是 provider ID",
    "Parameters missing in order to complete the request. Missing Parameters: \"%s\"" : "欠缺完成請求所需的參數: \"%s\"",
    "ID \"%1$s\" already used by cloud federation provider \"%2$s\"" : "ID \"%1$s\" 已經被另一個雲端聯盟供應者 \"%2$s\" 所使用",
    "Cloud Federation Provider with ID: \"%s\" does not exist." : "ID 為「%s」的雲端聯盟提供者不存在。",
    "Could not obtain lock type %d on \"%s\"." : "無法取得鎖定:類型 %d ,檔案 %s",
    "Storage unauthorized. %s" : "儲存空間未經授權。%s",
    "Storage incomplete configuration. %s" : "儲存空間配置尚未完成。%s",
    "Storage connection error. %s" : "儲存空間連線錯誤。%s",
    "Storage is temporarily not available" : "儲存空間暫時無法使用",
    "Storage connection timeout. %s" : "儲存空間連線逾時。%s",
    "Following databases are supported: %s" : "支援下列資料庫: %s",
    "Following platforms are supported: %s" : "支援下列平台: %s",
    "Invalid Federated Cloud ID" : "無效的雲端聯邦 ID"
},"pluralForm" :"nplurals=1; plural=0;"
}