Merge lp:~dobey/unity-scope-click/translated into lp:unity-scope-click

Proposed by dobey
Status: Merged
Approved by: dobey
Approved revision: 202
Merged at revision: 209
Proposed branch: lp:~dobey/unity-scope-click/translated
Merge into: lp:unity-scope-click
Diff against target: 297 lines (+114/-16)
11 files modified
CMakeLists.txt (+1/-0)
debian/control (+2/-0)
debian/rules (+1/-1)
po/CMakeLists.txt (+36/-0)
po/POTFILES.in (+1/-0)
po/genpotfiles.sh (+6/-0)
scope/click/CMakeLists.txt (+5/-0)
scope/click/click-i18n.h (+37/-0)
scope/click/preview.cpp (+15/-13)
scope/click/query.cpp (+4/-2)
scope/click/scope.cpp (+6/-0)
To merge this branch: bzr merge lp:~dobey/unity-scope-click/translated
Reviewer Review Type Date Requested Status
David Planella (community) Approve
PS Jenkins bot continuous-integration Approve
Alejandro J. Cura (community) Approve
Michal Hruby (community) Needs Information
Review via email: mp+214182@code.launchpad.net

Commit message

Add the _ macro definition.
Mark strings for translation.
Add build system support for translating the scope.
Add build dependency on intltool.

To post a comment you must log in.
Revision history for this message
Michal Hruby (mhr3) wrote :

Isn't this missing calls to setlocale() and bindtextdomain()?

review: Needs Information
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
201. By dobey

Add setlocale/bindtextdomain calls to enable the translations at runtime.

Revision history for this message
Alejandro J. Cura (alecu) wrote :

Looks good to me. +1

review: Approve
Revision history for this message
David Planella (dpm) wrote :

Looks good to me two, just a couple of things:

216 + {"label", scopes::Variant(_("Yes Uninstall"))}

Should this not be "Yes, uninstall"?

I understand this adds i18n support to the scope itself, but how are the translations of the app's desktop files in the dash page that shows the list of all apps going to be handled?

review: Needs Information
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Alejandro J. Cura (alecu) wrote :

> Looks good to me two, just a couple of things:
>
> 216 + {"label", scopes::Variant(_("Yes Uninstall"))}
>
> Should this not be "Yes, uninstall"?
>
> I understand this adds i18n support to the scope itself, but how are the
> translations of the app's desktop files in the dash page that shows the list
> of all apps going to be handled?

For installed apps, we plan to take the values from the .desktop file.
For apps in the store, we plan to send a Language header in the http request to the store webservices.
Both will come in further branches.

Revision history for this message
dobey (dobey) wrote :

> Looks good to me two, just a couple of things:
>
> 216 + {"label", scopes::Variant(_("Yes Uninstall"))}
>
> Should this not be "Yes, uninstall"?

The purpose of this branch isn't to change or correct strings, only to add the _() to existing ones. Hopefully next week we'll be deleting the preview that has this string anyway, so it will just go away.

> I understand this adds i18n support to the scope itself, but how are the
> translations of the app's desktop files in the dash page that shows the list
> of all apps going to be handled?

Pulling translations from installed click packages, or from the store, is a much more difficult thing to do, and this branch does not do that. Really, we will need translations for clicks to be in the manifest, so that we can use the translations while offline. Loading the translation domain for every installed program is also very expensive, so we really need to have those translations directly in the .desktop file. We need to discuss implementation details about that on a wider scale, so we can then fix the translations to work for packages as well as the scope itself.

Revision history for this message
Alejandro J. Cura (alecu) wrote :

> 216 + {"label", scopes::Variant(_("Yes Uninstall"))}
>
> Should this not be "Yes, uninstall"?

That string is bug #1234211; it was like that on the design documents and we (devs) agree it looks horrible. I'll re-check again to see if we have a better wording.

202. By dobey

Add use of dh-translations to package build.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
David Planella (dpm) wrote :

That answered my questions, LGTM!

For translations to be exposed in the upstream project and shared with the source package, I recommend committing the .pot file to the source tree, as we do with other Ubuntu upstreams. Launchpad does not support .pot autogeneration for cmake projects, so to enable automatic translation imports and exports, the .pot file has to be present in the source tree for LP.

For translations in the source package, dh-translations should already take care of everything.

review: Approve
Revision history for this message
dobey (dobey) wrote :

> For translations to be exposed in the upstream project and shared with the
> source package, I recommend committing the .pot file to the source tree, as we
> do with other Ubuntu upstreams. Launchpad does not support .pot autogeneration
> for cmake projects, so to enable automatic translation imports and exports,
> the .pot file has to be present in the source tree for LP.
>
> For translations in the source package, dh-translations should already take
> care of everything.

We won't be using LP translations on the upstream project, only on the package. We don't need to have 2 places to pull and then manually try to consolidate them. So we'll just rely on dh-translations and pulling the .po files from the Ubuntu translations once they are translated.

Revision history for this message
David Planella (dpm) wrote :

Note that there is no need to do manual work if you enable translations in
the upstream project. With translations sharing, translations done either
upstream or on the source package flow in either direction. Thus developers
don't even have to care. Adding automatic imports and exports gives the
benefit of having translations committed automatically upstream, regardless
of where they are done.

On the contrary, if you only enable translations in the source package
that's where you'll have to do manual work to get those translations back
to upstream: you'll need to request an export from LP, wait for an e-mail
with a zipped export and then manually commit those .po files to upstream.

Thus my recommendation is always to go for the first, which for developers
it's just a matter of committing the .pot file and then the rest works.

Cheers,
David.

On Wed, Apr 9, 2014 at 4:02 PM, Rodney Dawes <email address hidden>wrote:

> The proposal to merge lp:~dobey/unity-scope-click/translated into
> lp:unity-scope-click has been updated.
>
> Status: Needs review => Approved
>
> For more details, see:
>
> https://code.launchpad.net/~dobey/unity-scope-click/translated/+merge/214182
> --
>
> https://code.launchpad.net/~dobey/unity-scope-click/translated/+merge/214182
> You are reviewing the proposed merge of
> lp:~dobey/unity-scope-click/translated into lp:unity-scope-click.
>

Revision history for this message
dobey (dobey) wrote :

On Wed, 2014-04-09 at 14:27 +0000, David Planella wrote:
> Note that there is no need to do manual work if you enable translations in
> the upstream project. With translations sharing, translations done either
> upstream or on the source package flow in either direction. Thus developers
> don't even have to care. Adding automatic imports and exports gives the
> benefit of having translations committed automatically upstream, regardless
> of where they are done.

Unfortunately, it means keeping a generated file in version control, a
file which can oft easily result in conflicts when working on the
project. For projects with very little development, and/or very few
contributors, it's an OK option, because the potential for conflict is
limited, and it means getting new translations without worry. However,
it still means Launchpad is committing directly to the tree, without
warning, and that itself can result in annoyances that result in "manual
work" to resolve conflicts or criss-cross merge problems. Also, it means
having complex rules in the build system, so that the .pot file is
always properly updated in the source tree, as the template is generated
in the build tree, not the source tree, and the recommended way to use
cmake is to do builds under a separate build directory.

Even with the pot file in the tree, and Launchpad automatically
importing that, I don't think we'd want to have Launchpad committing
directly to the tree, so we'd still need to do manual imports of the
translations to the tree.

Revision history for this message
David Planella (dpm) wrote :

I don't want to keep arguing on this one, so I'll just add for the sake of
completion that Launchpad only commits .po files to the tree, it doesn't
update any other files.

On Wed, Apr 9, 2014 at 4:45 PM, Rodney Dawes <email address hidden>wrote:

> On Wed, 2014-04-09 at 14:27 +0000, David Planella wrote:
> > Note that there is no need to do manual work if you enable translations
> in
> > the upstream project. With translations sharing, translations done either
> > upstream or on the source package flow in either direction. Thus
> developers
> > don't even have to care. Adding automatic imports and exports gives the
> > benefit of having translations committed automatically upstream,
> regardless
> > of where they are done.
>
> Unfortunately, it means keeping a generated file in version control, a
> file which can oft easily result in conflicts when working on the
> project. For projects with very little development, and/or very few
> contributors, it's an OK option, because the potential for conflict is
> limited, and it means getting new translations without worry. However,
> it still means Launchpad is committing directly to the tree, without
> warning, and that itself can result in annoyances that result in "manual
> work" to resolve conflicts or criss-cross merge problems. Also, it means
> having complex rules in the build system, so that the .pot file is
> always properly updated in the source tree, as the template is generated
> in the build tree, not the source tree, and the recommended way to use
> cmake is to do builds under a separate build directory.
>
> Even with the pot file in the tree, and Launchpad automatically
> importing that, I don't think we'd want to have Launchpad committing
> directly to the tree, so we'd still need to do manual imports of the
> translations to the tree.
>
>
>
> --
>
> https://code.launchpad.net/~dobey/unity-scope-click/translated/+merge/214182
> You are reviewing the proposed merge of
> lp:~dobey/unity-scope-click/translated into lp:unity-scope-click.
>

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'CMakeLists.txt'
--- CMakeLists.txt 2014-03-24 14:04:38 +0000
+++ CMakeLists.txt 2014-04-04 16:41:17 +0000
@@ -36,6 +36,7 @@
36add_subdirectory(autopilot)36add_subdirectory(autopilot)
37add_subdirectory(scope)37add_subdirectory(scope)
38add_subdirectory(data)38add_subdirectory(data)
39add_subdirectory(po)
3940
40# Custom targets for the tests41# Custom targets for the tests
41add_custom_target (test42add_custom_target (test
4243
=== modified file 'debian/control'
--- debian/control 2014-04-02 14:44:39 +0000
+++ debian/control 2014-04-04 16:41:17 +0000
@@ -3,7 +3,9 @@
3Priority: optional3Priority: optional
4Build-Depends: cmake (>= 2.8.10),4Build-Depends: cmake (>= 2.8.10),
5 debhelper (>= 9),5 debhelper (>= 9),
6 dh-translations,
6 google-mock,7 google-mock,
8 intltool,
7 libglib2.0-dev (>= 2.32),9 libglib2.0-dev (>= 2.32),
8 libjsoncpp-dev,10 libjsoncpp-dev,
9 libubuntu-download-manager-client-dev,11 libubuntu-download-manager-client-dev,
1012
=== modified file 'debian/rules'
--- debian/rules 2014-03-24 19:18:13 +0000
+++ debian/rules 2014-04-04 16:41:17 +0000
@@ -13,7 +13,7 @@
13DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)13DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
1414
15%:15%:
16 dh $@ --buildsystem cmake --fail-missing16 dh $@ --buildsystem cmake --with translations --fail-missing
1717
18override_dh_auto_configure:18override_dh_auto_configure:
19 dh_auto_configure -- -DCMAKE_VERBOSE_MAKEFILE=ON19 dh_auto_configure -- -DCMAKE_VERBOSE_MAKEFILE=ON
2020
=== added directory 'po'
=== added file 'po/CMakeLists.txt'
--- po/CMakeLists.txt 1970-01-01 00:00:00 +0000
+++ po/CMakeLists.txt 2014-04-04 16:41:17 +0000
@@ -0,0 +1,36 @@
1include(FindGettext)
2find_program(GETTEXT_XGETTEXT_EXECUTABLE xgettext)
3find_program(INTLTOOL_UPDATE intltool-update)
4
5set(GETTEXT_PACKAGE ${PROJECT_NAME})
6set(POT_FILE ${GETTEXT_PACKAGE}.pot)
7execute_process(
8 COMMAND cat ${CMAKE_CURRENT_SOURCE_DIR}/LINGUAS
9 OUTPUT_VARIABLE LINGUAS
10 OUTPUT_STRIP_TRAILING_WHITESPACE
11)
12
13# Creates POTFILES
14add_custom_target(POTFILES ALL
15 COMMENT "Generating POTFILES"
16 COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/genpotfiles.sh ${CMAKE_SOURCE_DIR}
17)
18
19# Creates the .pot file containing the translations template
20add_custom_target(${POT_FILE} ALL
21 COMMENT "Generating translation template"
22 COMMAND XGETTEXT="${GETTEXT_XGETTEXT_EXECUTABLE}" srcdir="${CMAKE_CURRENT_SOURCE_DIR}" ${INTLTOOL_UPDATE} --gettext-package ${GETTEXT_PACKAGE} --pot
23 DEPENDS POTFILES
24)
25
26# Builds the binary translations catalog for each language
27# it finds source translations (*.po) for
28foreach(LANG ${LINGUAS})
29 list(APPEND PO_FILES "${LANG}.po")
30 gettext_process_po_files(${LANG} ALL PO_FILES "${LANG}.po")
31 set(INSTALL_DIR ${CMAKE_INSTALL_LOCALEDIR}/${LANG}/LC_MESSAGES)
32 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${LANG}.gmo
33 DESTINATION ${INSTALL_DIR}
34 RENAME ${DOMAIN}.mo
35 )
36endforeach(LANG)
037
=== added file 'po/LINGUAS'
=== added file 'po/POTFILES.in'
--- po/POTFILES.in 1970-01-01 00:00:00 +0000
+++ po/POTFILES.in 2014-04-04 16:41:17 +0000
@@ -0,0 +1,1 @@
1scope/click/preview.cpp
02
=== added file 'po/genpotfiles.sh'
--- po/genpotfiles.sh 1970-01-01 00:00:00 +0000
+++ po/genpotfiles.sh 2014-04-04 16:41:17 +0000
@@ -0,0 +1,6 @@
1#!/bin/sh
2
3sed '/^#/d
4 s/^[[].*] *//
5 /^[ ]*$/d' \
6 "`dirname ${0}`/POTFILES.in" | sed '$!s/$/ \\/' > POTFILES
07
=== modified file 'scope/click/CMakeLists.txt'
--- scope/click/CMakeLists.txt 2014-04-01 13:27:09 +0000
+++ scope/click/CMakeLists.txt 2014-04-04 16:41:17 +0000
@@ -4,6 +4,11 @@
4pkg_check_modules(JSON_CPP REQUIRED jsoncpp)4pkg_check_modules(JSON_CPP REQUIRED jsoncpp)
5pkg_check_modules(LIBURL_DISPATCHER REQUIRED url-dispatcher-1)5pkg_check_modules(LIBURL_DISPATCHER REQUIRED url-dispatcher-1)
66
7add_definitions(
8 -DGETTEXT_PACKAGE=\"${PROJECT_NAME}\"
9 -DGETTEXT_LOCALEDIR=\"${CMAKE_INSTALL_LOCALEDIR}\"
10)
11
7add_library(${SCOPE_LIB_UNVERSIONED} SHARED12add_library(${SCOPE_LIB_UNVERSIONED} SHARED
8 download-manager.cpp13 download-manager.cpp
9 index.cpp14 index.cpp
1015
=== added file 'scope/click/click-i18n.h'
--- scope/click/click-i18n.h 1970-01-01 00:00:00 +0000
+++ scope/click/click-i18n.h 2014-04-04 16:41:17 +0000
@@ -0,0 +1,37 @@
1/*
2 * Copyright (C) 2014 Canonical Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License version 3, as published
6 * by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranties of
10 * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
11 * PURPOSE. See the GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License along
14 * with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * In addition, as a special exception, the copyright holders give
17 * permission to link the code of portions of this program with the
18 * OpenSSL library under certain conditions as described in each
19 * individual source file, and distribute linked combinations
20 * including the two.
21 * You must obey the GNU General Public License in all respects
22 * for all of the code used other than OpenSSL. If you modify
23 * file(s) with this exception, you may extend this exception to your
24 * version of the file(s), but you are not obligated to do so. If you
25 * do not wish to do so, delete this exception statement from your
26 * version. If you delete this exception statement from all source
27 * files in the program, then also delete it here.
28 */
29
30#ifndef CLICKI18N_H
31#define CLICKI18N_H
32
33#include <libintl.h>
34
35#define _(value) dgettext(GETTEXT_PACKAGE, value)
36
37#endif
038
=== modified file 'scope/click/preview.cpp'
--- scope/click/preview.cpp 2014-04-02 12:01:34 +0000
+++ scope/click/preview.cpp 2014-04-04 16:41:17 +0000
@@ -41,6 +41,8 @@
41#include <iostream>41#include <iostream>
42#include <sstream>42#include <sstream>
4343
44#include "click-i18n.h"
45
44namespace click {46namespace click {
4547
46// Preview base class48// Preview base class
@@ -155,18 +157,18 @@
155157
156scopes::PreviewWidgetList Preview::downloadErrorWidgets()158scopes::PreviewWidgetList Preview::downloadErrorWidgets()
157{159{
158 return errorWidgets(scopes::Variant("Download Error"),160 return errorWidgets(scopes::Variant(_("Download Error")),
159 scopes::Variant("Download or install failed. Please try again."),161 scopes::Variant(_("Download or install failed. Please try again.")),
160 scopes::Variant(click::Preview::Actions::CLOSE_PREVIEW), // TODO see bug LP: #1289434162 scopes::Variant(click::Preview::Actions::CLOSE_PREVIEW), // TODO see bug LP: #1289434
161 scopes::Variant("Close"));163 scopes::Variant(_("Close")));
162}164}
163165
164scopes::PreviewWidgetList Preview::loginErrorWidgets()166scopes::PreviewWidgetList Preview::loginErrorWidgets()
165{167{
166 return errorWidgets(scopes::Variant("Login Error"),168 return errorWidgets(scopes::Variant(_("Login Error")),
167 scopes::Variant("Please log in to your Ubuntu One account."),169 scopes::Variant(_("Please log in to your Ubuntu One account.")),
168 scopes::Variant(click::Preview::Actions::OPEN_ACCOUNTS),170 scopes::Variant(click::Preview::Actions::OPEN_ACCOUNTS),
169 scopes::Variant("Go to Accounts"));171 scopes::Variant(_("Go to Accounts")));
170}172}
171173
172scopes::PreviewWidgetList Preview::errorWidgets(const scopes::Variant& title,174scopes::PreviewWidgetList Preview::errorWidgets(const scopes::Variant& title,
@@ -299,12 +301,12 @@
299 builder.add_tuple(301 builder.add_tuple(
300 {302 {
301 {"id", scopes::Variant(click::Preview::Actions::OPEN_CLICK)},303 {"id", scopes::Variant(click::Preview::Actions::OPEN_CLICK)},
302 {"label", scopes::Variant("Open")}304 {"label", scopes::Variant(_("Open"))}
303 });305 });
304 builder.add_tuple(306 builder.add_tuple(
305 {307 {
306 {"id", scopes::Variant(click::Preview::Actions::UNINSTALL_CLICK)},308 {"id", scopes::Variant(click::Preview::Actions::UNINSTALL_CLICK)},
307 {"label", scopes::Variant("Uninstall")}309 {"label", scopes::Variant(_("Uninstall"))}
308 });310 });
309 buttons.add_attribute_value("actions", builder.end());311 buttons.add_attribute_value("actions", builder.end());
310 widgets.push_back(buttons);312 widgets.push_back(buttons);
@@ -358,20 +360,20 @@
358 scopes::PreviewWidgetList widgets;360 scopes::PreviewWidgetList widgets;
359361
360 scopes::PreviewWidget header("hdr", "header");362 scopes::PreviewWidget header("hdr", "header");
361 header.add_attribute_value("title", scopes::Variant("Confirmation"));363 header.add_attribute_value("title", scopes::Variant(_("Confirmation")));
362 header.add_attribute_value("subtitle",364 header.add_attribute_value("subtitle",
363 scopes::Variant("Uninstalling this app will delete all the related information. Are you sure you want to uninstall?")); // TODO: wording needs review. see bug LP: #1234211365 scopes::Variant(_("Uninstalling this app will delete all the related information. Are you sure you want to uninstall?"))); // TODO: wording needs review. see bug LP: #1234211
364 widgets.push_back(header);366 widgets.push_back(header);
365367
366 scopes::PreviewWidget buttons("buttons", "actions");368 scopes::PreviewWidget buttons("buttons", "actions");
367 scopes::VariantBuilder builder;369 scopes::VariantBuilder builder;
368 builder.add_tuple({370 builder.add_tuple({
369 {"id", scopes::Variant(click::Preview::Actions::CLOSE_PREVIEW)}, // TODO: see bug LP: #1289434371 {"id", scopes::Variant(click::Preview::Actions::CLOSE_PREVIEW)}, // TODO: see bug LP: #1289434
370 {"label", scopes::Variant("Not anymore")}372 {"label", scopes::Variant(_("Not anymore"))}
371 });373 });
372 builder.add_tuple({374 builder.add_tuple({
373 {"id", scopes::Variant(click::Preview::Actions::CONFIRM_UNINSTALL)},375 {"id", scopes::Variant(click::Preview::Actions::CONFIRM_UNINSTALL)},
374 {"label", scopes::Variant("Yes Uninstall")}376 {"label", scopes::Variant(_("Yes Uninstall"))}
375 });377 });
376 buttons.add_attribute_value("actions", builder.end());378 buttons.add_attribute_value("actions", builder.end());
377 widgets.push_back(buttons);379 widgets.push_back(buttons);
@@ -410,7 +412,7 @@
410 builder.add_tuple(412 builder.add_tuple(
411 {413 {
412 {"id", scopes::Variant(click::Preview::Actions::INSTALL_CLICK)},414 {"id", scopes::Variant(click::Preview::Actions::INSTALL_CLICK)},
413 {"label", scopes::Variant("Install")},415 {"label", scopes::Variant(_("Install"))},
414 {"download_url", scopes::Variant(details.download_url)}416 {"download_url", scopes::Variant(details.download_url)}
415 });417 });
416 buttons.add_attribute_value("actions", builder.end());418 buttons.add_attribute_value("actions", builder.end());
417419
=== modified file 'scope/click/query.cpp'
--- scope/click/query.cpp 2014-04-03 13:08:47 +0000
+++ scope/click/query.cpp 2014-04-04 16:41:17 +0000
@@ -50,6 +50,8 @@
50#include<set>50#include<set>
51#include<sstream>51#include<sstream>
5252
53#include "click-i18n.h"
54
53namespace55namespace
54{56{
5557
@@ -136,7 +138,7 @@
136 replyProxy(replyProxy),138 replyProxy(replyProxy),
137 installedApplications(installedApplications),139 installedApplications(installedApplications),
138 renderer(categoryTemplate),140 renderer(categoryTemplate),
139 category(replyProxy->register_category("appstore", "Available", "", renderer)),141 category(replyProxy->register_category("appstore", _("Available"), "", renderer)),
140 queryUrl(queryUri) {142 queryUrl(queryUri) {
141 }143 }
142144
@@ -246,7 +248,7 @@
246 std::string categoryTemplate)248 std::string categoryTemplate)
247{249{
248 scopes::CategoryRenderer rdr(categoryTemplate);250 scopes::CategoryRenderer rdr(categoryTemplate);
249 auto cat = replyProxy->register_category("local", "My apps", "", rdr);251 auto cat = replyProxy->register_category("local", _("My apps"), "", rdr);
250252
251 // cat might be null when the underlying query got cancelled.253 // cat might be null when the underlying query got cancelled.
252 if (!cat)254 if (!cat)
253255
=== modified file 'scope/click/scope.cpp'
--- scope/click/scope.cpp 2014-03-21 04:31:34 +0000
+++ scope/click/scope.cpp 2014-04-04 16:41:17 +0000
@@ -39,6 +39,8 @@
39#include <QSharedPointer>39#include <QSharedPointer>
40#include <url-dispatcher.h>40#include <url-dispatcher.h>
4141
42#include "click-i18n.h"
43
42namespace44namespace
43{45{
44click::Interface& clickInterfaceInstance()46click::Interface& clickInterfaceInstance()
@@ -82,6 +84,10 @@
8284
83int click::Scope::start(std::string const&, scopes::RegistryProxy const&)85int click::Scope::start(std::string const&, scopes::RegistryProxy const&)
84{86{
87 setlocale(LC_ALL, "");
88 bindtextdomain(GETTEXT_PACKAGE, GETTEXT_LOCALEDIR);
89 bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
90
85 return VERSION;91 return VERSION;
86}92}
8793

Subscribers

People subscribed via source and target branches

to all changes: