From eba4cf3c454fbfa05ea325473b2551889c1fdf74 Mon Sep 17 00:00:00 2001 From: Antoine Choppin Date: Tue, 31 May 2016 19:52:08 +0900 Subject: [PATCH 1/5] i18n support & Japanese translation --- .gitignore | 4 + TRANSLATION.md | 56 +++++ debian/control | 2 +- debian/kano-profile.install | 3 + debian/rules | 1 + kano_profile_gui/QuestInfo.py | 2 +- kano_registration_gui/GetData.py | 2 +- locale/ja/LC_MESSAGES/kano-tutorial.mo | Bin 0 -> 5328 bytes po/Makefile | 36 +++ po/PYPOTFILES | 14 ++ po/ja.po | 293 +++++++++++++++++++++++++ 11 files changed, 410 insertions(+), 3 deletions(-) create mode 100644 TRANSLATION.md create mode 100644 locale/ja/LC_MESSAGES/kano-tutorial.mo create mode 100644 po/Makefile create mode 100644 po/PYPOTFILES create mode 100644 po/ja.po diff --git a/.gitignore b/.gitignore index 186b0fd7..955ac70f 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ *.swp *.so* *.dylib +*~ # Ignore tags created by etags, ctags, gtags (GNU global) and cscope TAGS @@ -24,3 +25,6 @@ cscope.po.out # Ignore locked versions of original files media/images/environments/originals/**/*_locked.png media/images/badges/originals/**/*_locked.png + +.mo +po/messages.pot diff --git a/TRANSLATION.md b/TRANSLATION.md new file mode 100644 index 00000000..e2d77ef8 --- /dev/null +++ b/TRANSLATION.md @@ -0,0 +1,56 @@ +# Translation + +Translation files are found in the `po/` directory. + +## i18n not released yet + +Kano OS is not fully i18n-aware and locales are not installed for end users, yet. You can translate this application, but as of now, users will still see the default English message strings. + +## How to add a new translation + +In this example, we're going to add a French translation: + + # install your target locale `fr_FR.utf8` with: + sudo dpkg-reconfigure locales + + cd po/ + # create messages.pot + make messages + + # create fr.po from messages.pot: + msginit -l fr_FR.utf8 + + # now use your favourite editor to translate fr.po + + # build locale files: + make + +## How to make sure your code is i18n-aware + +Add the gettext `_()` macro to all the user-visible message strings in your Python. List the Python source files that contain message strings in `PYPOTFILES`. + +If you added new message strings or made changes to existing ones, do `make messages` to keep the template file up-to-date. + +After that, merge the existing translations with `make update` and ask your translators to update their translations. + +## gettext explained (in 20 seconds) + +* User-visible strings in the source are marked with a macro of your choice. Usually, it's `_()`. +* `xgettext` extracts these message strings from your sources and puts them into a template file. +* This template file, usually named `messages.pot`, contains all user-visible strings of the project, but no translations. +* Translators use `msginit` to copy the template file into a new *portable object* file for their language (explained above). +* The translations are put into `.po`. It's a plain-text file format, you can use any text editor. +* More convenient, specialized `.po`-editors and web-based tools such as Pootle exist, as well. +* If your template file changes, use `msgmerge` to merge your existing translations with the new template, then re-translate the updated messages. Beware of `msgmerge`'s "fuzzy" matches. +* `msgfmt` converts a `.po` file into a binary *message object* file. +* You don't link these `.mo` files with your application binary. +* The `.mo` files are bundled alongside with your software as part of the distribution package. +* During installation, the `.mo` files are copied into the system's locale directory, usually `/usr/share/locale`. +* On startup, your application will look for the message object file that it needs for the current system locale. +* The locale even allows you to provide region-specific translations, e.g. "colour" for en_UK vs "color" for en_US. +* At runtime, all user-visible strings are being replaced with the translations. +* If no message object was found for the system locale, the original strings will be shown. + +## To-Do + +Pootle or Transifex integration. diff --git a/debian/control b/debian/control index 661e6c36..82b5583e 100644 --- a/debian/control +++ b/debian/control @@ -5,7 +5,7 @@ Priority: optional Standards-Version: 3.9.4 Build-Depends: debhelper (>= 9), build-essential, pkg-config, libgtk2.0-dev, lxpanel (>= 0.7.0), libfm-dev, libkdesk-dev, libparson-dev, - python-dev, libkano-python-dev + python-dev, libkano-python-dev, gettext Package: kano-profile Architecture: all diff --git a/debian/kano-profile.install b/debian/kano-profile.install index 58b8cd92..00d4fbef 100644 --- a/debian/kano-profile.install +++ b/debian/kano-profile.install @@ -27,3 +27,6 @@ icon/kano-world.png usr/share/icons/Kano/66x66/apps lxpanel-plugin/kano_profile.so usr/lib/arm-linux-gnueabihf/lxpanel/plugins/ xdg/* usr/share/applications + +locale/* usr/share/locale/ + diff --git a/debian/rules b/debian/rules index e0e1f328..e7c7e369 100755 --- a/debian/rules +++ b/debian/rules @@ -1,6 +1,7 @@ #!/usr/bin/make -f %: + cd po && make dh $@ .PHONY: override_dh_strip diff --git a/kano_profile_gui/QuestInfo.py b/kano_profile_gui/QuestInfo.py index 6ebfc7a8..4554bd65 100644 --- a/kano_profile_gui/QuestInfo.py +++ b/kano_profile_gui/QuestInfo.py @@ -112,7 +112,7 @@ def create_reward_section(self): vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) background.add(vbox) - title = Gtk.Label("Rewards") + title = Gtk.Label(_("Rewards")) title.set_alignment(xalign=0.5, yalign=0.5) title.set_padding(xpad=10, ypad=10) title.get_style_context().add_class("reward_title") diff --git a/kano_registration_gui/GetData.py b/kano_registration_gui/GetData.py index 06bf05f9..6a97f024 100644 --- a/kano_registration_gui/GetData.py +++ b/kano_registration_gui/GetData.py @@ -146,7 +146,7 @@ def validate_username(self, widget=None, event=None): if len(username) == 0: self._username.label_success("") elif check_username(username): - self._username.label_success(_(""), "success") + self._username.label_success("", "success") else: self._username.label_success(_(" is invalid"), "fail") diff --git a/locale/ja/LC_MESSAGES/kano-tutorial.mo b/locale/ja/LC_MESSAGES/kano-tutorial.mo new file mode 100644 index 0000000000000000000000000000000000000000..429f4709e5b5c9a41b727322c02c5ac90d307d8e GIT binary patch literal 5328 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 literal 0 HcmV?d00001 diff --git a/po/Makefile b/po/Makefile new file mode 100644 index 00000000..616008cf --- /dev/null +++ b/po/Makefile @@ -0,0 +1,36 @@ +APPNAME=kano-tutorial +ORG="Kano Computing Ltd." + +MSGLANGS=$(notdir $(wildcard *po)) +MSGOBJS=$(addprefix ../locale/,$(MSGLANGS:.po=/LC_MESSAGES/$(APPNAME).mo)) + +.PHONY: clean_locales messages + +build: $(MSGOBJS) + +update: $(MSGLANGS) + +clean_locales: + rm -rf ../locale + +clean: clean_locales + rm -f messages.pot + +define run-xgettext +xgettext -f PYPOTFILES -L Python --force-po -o messages.pot \ + --package-name=$(APPNAME) --copyright-holder=$(ORG) +endef + +messages: + $(run-xgettext) + +messages.pot: + $(run-xgettext) + +%.po: messages.pot + msgmerge -N -U $*.po messages.pot + touch $*.po + +../locale/%/LC_MESSAGES/$(APPNAME).mo: clean_locales + mkdir -p $(dir $@) + msgfmt -c -o $@ $*.po diff --git a/po/PYPOTFILES b/po/PYPOTFILES new file mode 100644 index 00000000..0d511eb2 --- /dev/null +++ b/po/PYPOTFILES @@ -0,0 +1,14 @@ +../kano_login/components/logged_in.py +../kano_login/first_screen.py +../kano_login/login.py +../kano_login/swag_screen.py +../kano_profile_gui/badge_screen.py +../kano_profile_gui/character_screens.py +../kano_profile_gui/MenuBar.py +../kano_profile_gui/QuestInfo.py +../kano_profile_gui/projects.py +../kano_registration_gui/BirthdayWidget.py +../kano_registration_gui/GetData.py +../kano_registration_gui/PageControl.py +../kano_registration_gui/RegistrationScreen.py +../kano_registration_gui/TermsAndConditions.py diff --git a/po/ja.po b/po/ja.po new file mode 100644 index 00000000..8f163b26 --- /dev/null +++ b/po/ja.po @@ -0,0 +1,293 @@ +# Japanese translations for kano-tutorial package. +# Copyright (C) 2016 Kano Computing Ltd. +# This file is distributed under the same license as the kano-tutorial package. +# Choppin Antoine , 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: kano-tutorial\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-05-31 09:01+0900\n" +"PO-Revision-Date: 2016-05-19 20:29+0900\n" +"Last-Translator: Choppin Antoine \n" +"Language-Team: Japanese\n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../kano_login/components/logged_in.py:24 ../kano_login/login.py:258 +msgid "OK" +msgstr "了解" + +#: ../kano_login/components/logged_in.py:28 +msgid "Logged in!" +msgstr "ログイン完了!" + +#: ../kano_login/components/logged_in.py:28 +msgid "You're already logged in" +msgstr "すでにログイン中" + +#: ../kano_login/components/logged_in.py:46 +msgid "Logged out!" +msgstr "ログアウト完了!" + +#: ../kano_login/first_screen.py:34 +msgid "Create" +msgstr "作成" + +#: ../kano_login/first_screen.py:35 +msgid "Skip" +msgstr "飛ばす" + +#: ../kano_login/first_screen.py:36 +msgid "I have a profile" +msgstr "すでにプロフィールを持っている" + +#: ../kano_login/first_screen.py:37 +msgid "Now let's make your online Profile" +msgstr "君のオンラインプロフィールを作ろう" + +#: ../kano_login/first_screen.py:38 +msgid "So you can save badges, games, and projects" +msgstr "そうすれば、バッジ、ゲーム、プロジェクトなどを保存できるようになる" + +#: ../kano_login/first_screen.py:121 +msgid "Oops! You need Internet to make a profile" +msgstr "おっと、プロフィールを作るにはインターネットが必要だよ" + +#: ../kano_login/first_screen.py:123 +msgid "But you can skip this if you have no connection right now" +msgstr "でもインターネット接続がなければ、これを飛ばして進められる" + +#: ../kano_login/first_screen.py:127 +msgid "Connect" +msgstr "接続する" + +#: ../kano_login/first_screen.py:128 +msgid "Register later" +msgstr "後で登録する" + +#: ../kano_login/login.py:52 ../kano_login/login.py:80 +msgid "Login" +msgstr "ログイン" + +#: ../kano_login/login.py:53 +msgid "Enter your username and password" +msgstr "ユーザー名とパスワードを入力して下さい" + +#: ../kano_login/login.py:64 +msgid "Username" +msgstr "ユーザー名" + +#: ../kano_login/login.py:65 ../kano_login/login.py:127 +#: ../kano_registration_gui/GetData.py:91 +msgid "Password" +msgstr "パスワード" + +#: ../kano_login/login.py:81 +msgid "Create New" +msgstr "新規作成" + +#: ../kano_login/login.py:82 +msgid "Forgotten password?" +msgstr "パスワード忘れた?" + +#: ../kano_login/login.py:108 +msgid " Username: " +msgstr " ユーザー名: " + +#: ../kano_login/login.py:176 +msgid "You don't have internet!" +msgstr "インターネット接続がない!" + +#: ../kano_login/login.py:178 +msgid "Connect with wifi or ethernet and try again" +msgstr "WiFiかイーサーネットで接続し、やり直して下さい" + +#: ../kano_login/login.py:197 +#: ../kano_registration_gui/RegistrationScreen.py:117 +msgid "Houston, we have a problem" +msgstr "ヒューストン、問題だ!" + +#: ../kano_login/login.py:245 ../kano_login/login.py:339 +msgid "Success!" +msgstr "成功!" + +#: ../kano_login/login.py:246 +msgid "You're in - online features now enabled." +msgstr "入れた - オンライン機能が使用可能" + +#: ../kano_login/login.py:292 +msgid "Reset your password" +msgstr "パスワードリセット" + +#: ../kano_login/login.py:293 +msgid "We'll send a new password to your email" +msgstr "新しいパスワードをメールで送ります" + +#: ../kano_login/login.py:298 +msgid "Email" +msgstr "メール" + +#: ../kano_login/login.py:315 +msgid "Reset password" +msgstr "パスワードをリセットする" + +#: ../kano_login/login.py:340 +msgid "Sent new password to your email" +msgstr "新しいパスワードをメールで送りました" + +#: ../kano_login/login.py:342 +msgid "Go to login screen" +msgstr "ログイン画面へ" + +#: ../kano_login/login.py:343 ../kano_login/login.py:349 +msgid "Quit" +msgstr "終了" + +#: ../kano_login/login.py:346 +msgid "Something went wrong!" +msgstr "失敗しました!" + +#: ../kano_login/login.py:350 +msgid "Try again" +msgstr "やり直す" + +#: ../kano_login/swag_screen.py:28 +#: ../kano_registration_gui/RegistrationScreen.py:136 +msgid "Profile activated!" +msgstr "プロフィールが有効です!" + +#: ../kano_login/swag_screen.py:30 +msgid "" +"Now you can share stuff, build your character, and connect with friends! " +"You've earned some rewards…" +msgstr "" +"これで作品を共有したり、キャラクターを作ったり、仲間と連絡を取り合ったりする" +"ことができる!" + +#: ../kano_login/swag_screen.py:35 ../kano_login/swag_screen.py:44 +msgid "Let's go" +msgstr "レッツゴー" + +#: ../kano_login/swag_screen.py:37 +msgid "No online profile - for now." +msgstr "オンライン・プロフィール無し(今のところ)" + +#: ../kano_login/swag_screen.py:39 +msgid "" +"Your profile stores all your rewards, projects, and challenges. But fear not " +"- we'll save everything for when you have internet." +msgstr "" +"君の全ての賞やプロジェクトやチャレンジなどがプロフィールに保存される。" +"でも大丈夫。インターネットに繋がるまでに全て取っておくよ。" + +#: ../kano_profile_gui/badge_screen.py:45 +msgid "Next page" +msgstr "次のページへ" + +#: ../kano_profile_gui/badge_screen.py:49 +#: ../kano_profile_gui/badge_screen.py:245 +msgid "Previous" +msgstr "前のページへ" + +#: ../kano_profile_gui/badge_screen.py:249 +msgid "Back to grid" +msgstr "一覧へ戻る" + +#: ../kano_profile_gui/badge_screen.py:253 +#: ../kano_registration_gui/PageControl.py:27 +msgid "Next" +msgstr "次へ" + +#: ../kano_profile_gui/character_screens.py:34 +msgid "Edit" +msgstr "編集" + +#: ../kano_profile_gui/character_screens.py:109 +msgid "Save changes" +msgstr "修正を保存" + +#: ../kano_profile_gui/character_screens.py:118 +msgid "Discard" +msgstr "修正を破棄" + +#: ../kano_profile_gui/MenuBar.py:164 +msgid "Level {}" +msgstr "レベル{}" + +#: ../kano_profile_gui/QuestInfo.py:115 +msgid "Rewards" +msgstr "賞" + +#: ../kano_profile_gui/projects.py:86 +msgid "Make" +msgstr "作成" + +#: ../kano_registration_gui/BirthdayWidget.py:65 +msgid "Birthday" +msgstr "誕生日" + +#: ../kano_registration_gui/BirthdayWidget.py:146 +msgid " date is in the future" +msgstr " 将来の日付" + +#: ../kano_registration_gui/BirthdayWidget.py:150 +msgid " year out of range" +msgstr " 年は範囲外" + +#: ../kano_registration_gui/BirthdayWidget.py:152 +msgid " is valid" +msgstr " 有効" + +#: ../kano_registration_gui/GetData.py:96 +msgid "Show password" +msgstr "パスワードを表示" + +#: ../kano_registration_gui/GetData.py:102 +msgid "Email Address" +msgstr "メールアドレス" + +#: ../kano_registration_gui/GetData.py:138 +msgid " looks good!" +msgstr " よさそう!" + +#: ../kano_registration_gui/GetData.py:140 +msgid " is not valid" +msgstr " 無効" + +#: ../kano_registration_gui/GetData.py:151 +msgid " is invalid" +msgstr " 無効" + +#: ../kano_registration_gui/GetData.py:226 +msgid "Terms and conditions" +msgstr "規約と条件" + +#: ../kano_registration_gui/PageControl.py:26 +msgid "Back" +msgstr "戻る" + +#: ../kano_registration_gui/RegistrationScreen.py:40 +msgid "Kano World" +msgstr "Kanoワールド" + +#: ../kano_registration_gui/RegistrationScreen.py:41 +msgid "Choose a cool name and secure password" +msgstr "かっこいい名前と難しいパスワードを選ぼう" + +#: ../kano_registration_gui/RegistrationScreen.py:50 +msgid "Join Kano World" +msgstr "Kanoワールドに参加する" + +#: ../kano_registration_gui/RegistrationScreen.py:137 +msgid "" +"Now you can share stuff, build your character, and connect with friends." +msgstr "" +"これで作品を共有したり、キャラクターを作ったり、仲間と連絡を取り合ったりすることができる。" + +#: ../kano_registration_gui/TermsAndConditions.py:25 +msgid "I agree to the terms and conditions" +msgstr "規約と条件に同意します" From 5d92577e115846b9d60e880d26513c8f54f41f3c Mon Sep 17 00:00:00 2001 From: Antoine Choppin Date: Tue, 31 May 2016 21:25:27 +0900 Subject: [PATCH 2/5] Fix translations. Add missing translations. --- kano_profile_gui/MenuBar.py | 12 ++++---- kano_world/functions.py | 20 ++++++------- kano_world/share.py | 16 +++++----- kano_world/share_helpers.py | 2 +- po/PYPOTFILES | 4 +++ po/ja.po | 59 +++++++++++++++++++++++++++++++++---- 6 files changed, 83 insertions(+), 30 deletions(-) diff --git a/kano_profile_gui/MenuBar.py b/kano_profile_gui/MenuBar.py index 9bfa1f23..fae5d6f6 100644 --- a/kano_profile_gui/MenuBar.py +++ b/kano_profile_gui/MenuBar.py @@ -43,14 +43,14 @@ def __init__(self, win_width, quests): # Home button self.home_button = HomeButton() self.home_button.connect("clicked", self.emit_home_signal) - self.home_button.connect("clicked", self.set_selected_wrapper, "CHARACTER") + self.home_button.connect("clicked", self.set_selected_wrapper, _("CHARACTER")) hbox.pack_start(self.home_button, False, False, 0) close_button = self._create_cross_button() hbox.pack_end(close_button, False, False, 0) close_button.connect("clicked", self.close_window) - name_array = ['BADGES', 'CHARACTER'] # TODO: add 'QUESTS' to enable + name_array = [_('BADGES'), _('CHARACTER')] # TODO: add 'QUESTS' to enable for name in name_array: button = MenuButton(name, self._quests) button.connect("clicked", self.emit_menu_signal, name) @@ -61,19 +61,19 @@ def __init__(self, win_width, quests): self.buttons[name] = {} self.buttons[name]["button"] = button - if name == "QUESTS": + if name == _("QUESTS"): # check the notification image button.check_for_notification() # HACKY: avoiding packing the label divider after the last element - if name != "CHARACTER": + if name != _("CHARACTER"): label = self._create_divider_label() hbox.pack_end(label, False, False, 0) attach_cursor_events(button) # initialise with the CHARACTER button selected - self.set_selected("CHARACTER") + self.set_selected(_("CHARACTER")) def _create_divider_label(self): label = Gtk.Label("|") @@ -97,7 +97,7 @@ def emit_menu_signal(self, widget, name): self.emit("menu-button-clicked", name) def emit_home_signal(self, widget): - self.emit('home-button-clicked', 'CHARACTER') + self.emit('home-button-clicked', _('CHARACTER')) def get_selected_button(self): return self.selected diff --git a/kano_world/functions.py b/kano_world/functions.py index 50b40646..e410de17 100644 --- a/kano_world/functions.py +++ b/kano_world/functions.py @@ -30,7 +30,7 @@ def login(login_name, password): if success: return login_register_data(data) else: - return False, 'Cannot log in, problem: {}'.format(text) + return False, _('Cannot log in, problem: {}').format(text) def register(email, username, password, marketing_enabled=False): @@ -49,7 +49,7 @@ def register(email, username, password, marketing_enabled=False): if success: return login_register_data(data) else: - return False, 'Cannot register, problem: {}'.format(text) + return False, _('Cannot register, problem: {}').format(text) def login_register_data(data): @@ -74,7 +74,7 @@ def login_register_data(data): glob_session = KanoWorldSession(profile['token']) return True, None except Exception as e: - return False, 'We cannot reach the Kano server. Try again in a few minutes. Error = {}'.format(str(e)) + return False, _('We cannot reach the Kano server. Try again in a few minutes. Error = {}').format(str(e)) def is_registered(): @@ -105,9 +105,9 @@ def login_using_token(): global glob_session if not is_registered(): - return False, 'Not registered!' + return False, _('Not registered!') if not has_token(): - return False, 'No token!' + return False, _('No token!') try: profile = load_profile() @@ -119,7 +119,7 @@ def login_using_token(): def sync(): if not glob_session: - return False, 'You are not logged in!' + return False, _('You are not logged in!') success, value = glob_session.upload_profile_stats() if not success: @@ -146,21 +146,21 @@ def sync(): def backup_content(file_path): if not glob_session: - return False, 'You are not logged in!' + return False, _('You are not logged in!') return glob_session.backup_content(file_path) def restore_content(file_path): if not glob_session: - return False, 'You are not logged in!' + return False, _('You are not logged in!') return glob_session.restore_content(file_path) def upload_tracking_data(): if not glob_session: - return False, 'You are not logged in!' + return False, _('You are not logged in!') success, value = glob_session.upload_tracking_data() if not success: @@ -230,7 +230,7 @@ def reset_password(email): def mark_notification_read(n_id): if not glob_session: - return False, 'You are not logged in!' + return False, _('You are not logged in!') success, text, data = request_wrapper( 'post', diff --git a/kano_world/share.py b/kano_world/share.py index fc418b0d..b52e1789 100644 --- a/kano_world/share.py +++ b/kano_world/share.py @@ -54,7 +54,7 @@ def post_comment(share_id, comment): glob_session = get_glob_session() if not glob_session: - return False, 'You are not logged in!' + return False, _('You are not logged in!') return glob_session.post_comment(share_id, comment) @@ -63,7 +63,7 @@ def like_share(share_id): glob_session = get_glob_session() if not glob_session: - return False, 'You are not logged in!' + return False, _('You are not logged in!') return glob_session.like_share(share_id) @@ -72,7 +72,7 @@ def unlike_share(share_id): glob_session = get_glob_session() if not glob_session: - return False, 'You are not logged in!' + return False, _('You are not logged in!') return glob_session.unlike_share(share_id) @@ -81,7 +81,7 @@ def get_following(): glob_session = get_glob_session() if not glob_session: - return False, 'You are not logged in!' + return False, _('You are not logged in!') user_id = get_kano_world_id() return glob_session.get_users_following(user_id) @@ -91,7 +91,7 @@ def follow_user(user_id): glob_session = get_glob_session() if not glob_session: - return False, 'You are not logged in!' + return False, _('You are not logged in!') return glob_session.follow_user(user_id) @@ -100,7 +100,7 @@ def unfollow_user(user_id): glob_session = get_glob_session() if not glob_session: - return False, 'You are not logged in!' + return False, _('You are not logged in!') return glob_session.unfollow_user(user_id) @@ -108,7 +108,7 @@ def unfollow_user(user_id): def upload_share(file_path, title, app_name): glob_session = get_glob_session() if not glob_session: - return False, 'You are not logged in!' + return False, _('You are not logged in!') return glob_session.upload_share(file_path, title, app_name) @@ -116,7 +116,7 @@ def upload_share(file_path, title, app_name): def delete_share(share_id): glob_session = get_glob_session() if not glob_session: - return False, 'You are not logged in!' + return False, _('You are not logged in!') return glob_session.delete_share(share_id) diff --git a/kano_world/share_helpers.py b/kano_world/share_helpers.py index 8d79b42b..23ad2a50 100644 --- a/kano_world/share_helpers.py +++ b/kano_world/share_helpers.py @@ -30,6 +30,6 @@ def login_and_share(file_path, title, app_name): run_cmd('kano-login -r') success, unused = login_using_token() if not success: - return False, 'Cannot login' + return False, _('Cannot login') return upload_share(file_path, title, app_name) diff --git a/po/PYPOTFILES b/po/PYPOTFILES index 0d511eb2..e6a5c490 100644 --- a/po/PYPOTFILES +++ b/po/PYPOTFILES @@ -12,3 +12,7 @@ ../kano_registration_gui/PageControl.py ../kano_registration_gui/RegistrationScreen.py ../kano_registration_gui/TermsAndConditions.py +../kano_world/functions.py +../kano_world/session.py +../kano_world/share.py +../kano_world/share_helpers.py diff --git a/po/ja.po b/po/ja.po index 8f163b26..fbc52dcd 100644 --- a/po/ja.po +++ b/po/ja.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: kano-tutorial\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-31 09:01+0900\n" +"POT-Creation-Date: 2016-05-31 21:22+0900\n" "PO-Revision-Date: 2016-05-19 20:29+0900\n" "Last-Translator: Choppin Antoine \n" "Language-Team: Japanese\n" @@ -51,7 +51,7 @@ msgstr "君のオンラインプロフィールを作ろう" #: ../kano_login/first_screen.py:38 msgid "So you can save badges, games, and projects" -msgstr "そうすれば、バッジ、ゲーム、プロジェクトなどを保存できるようになる" +msgstr "バッジ、ゲーム、プロジェクトなどを保存できるようになる" #: ../kano_login/first_screen.py:121 msgid "Oops! You need Internet to make a profile" @@ -109,7 +109,7 @@ msgstr "WiFiかイーサーネットで接続し、やり直して下さい" #: ../kano_login/login.py:197 #: ../kano_registration_gui/RegistrationScreen.py:117 msgid "Houston, we have a problem" -msgstr "ヒューストン、問題だ!" +msgstr "あれあれ、問題発生!" #: ../kano_login/login.py:245 ../kano_login/login.py:339 msgid "Success!" @@ -181,7 +181,7 @@ msgid "" "Your profile stores all your rewards, projects, and challenges. But fear not " "- we'll save everything for when you have internet." msgstr "" -"君の全ての賞やプロジェクトやチャレンジなどがプロフィールに保存される。" +"君の全ての賞やプロジェクトやチャレンジがプロフィールに保存される。\n" "でも大丈夫。インターネットに繋がるまでに全て取っておくよ。" #: ../kano_profile_gui/badge_screen.py:45 @@ -214,6 +214,20 @@ msgstr "修正を保存" msgid "Discard" msgstr "修正を破棄" +#: ../kano_profile_gui/MenuBar.py:46 ../kano_profile_gui/MenuBar.py:53 +#: ../kano_profile_gui/MenuBar.py:69 ../kano_profile_gui/MenuBar.py:76 +#: ../kano_profile_gui/MenuBar.py:100 +msgid "CHARACTER" +msgstr "キャラクター" + +#: ../kano_profile_gui/MenuBar.py:53 +msgid "BADGES" +msgstr "バッジ" + +#: ../kano_profile_gui/MenuBar.py:64 +msgid "QUESTS" +msgstr "クエスト" + #: ../kano_profile_gui/MenuBar.py:164 msgid "Level {}" msgstr "レベル{}" @@ -286,8 +300,43 @@ msgstr "Kanoワールドに参加する" msgid "" "Now you can share stuff, build your character, and connect with friends." msgstr "" -"これで作品を共有したり、キャラクターを作ったり、仲間と連絡を取り合ったりすることができる。" +"これで作品を共有したり、キャラクターを作ったり、仲間と連絡を取り合ったりする" +"ことができる。" #: ../kano_registration_gui/TermsAndConditions.py:25 msgid "I agree to the terms and conditions" msgstr "規約と条件に同意します" + +#: ../kano_world/functions.py:33 +msgid "Cannot log in, problem: {}" +msgstr "ログイン出来ません: {}" + +#: ../kano_world/functions.py:52 +msgid "Cannot register, problem: {}" +msgstr "登録出来ません: {}" + +#: ../kano_world/functions.py:77 +msgid "We cannot reach the Kano server. Try again in a few minutes. Error = {}" +msgstr "Kanoサーバーに接続できません。数分後に再度やってみてください。 {}" + +#: ../kano_world/functions.py:108 +msgid "Not registered!" +msgstr "登録されていません!" + +#: ../kano_world/functions.py:110 +msgid "No token!" +msgstr "トークンがありません!" + +#: ../kano_world/functions.py:122 ../kano_world/functions.py:149 +#: ../kano_world/functions.py:156 ../kano_world/functions.py:163 +#: ../kano_world/functions.py:233 ../kano_world/share.py:57 +#: ../kano_world/share.py:66 ../kano_world/share.py:75 +#: ../kano_world/share.py:84 ../kano_world/share.py:94 +#: ../kano_world/share.py:103 ../kano_world/share.py:111 +#: ../kano_world/share.py:119 +msgid "You are not logged in!" +msgstr "ログインしていません!" + +#: ../kano_world/share_helpers.py:33 +msgid "Cannot login" +msgstr "ログインできません" From f834ba7bc99173c4ae64297a05f16ae0bc1f8589 Mon Sep 17 00:00:00 2001 From: Antoine Choppin Date: Wed, 1 Jun 2016 08:08:04 +0900 Subject: [PATCH 3/5] Fix issue with menu bar --- kano_profile_gui/MenuBar.py | 14 +++++++------- locale/ja/LC_MESSAGES/kano-tutorial.mo | Bin 5328 -> 6050 bytes 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/kano_profile_gui/MenuBar.py b/kano_profile_gui/MenuBar.py index fae5d6f6..c8b58a72 100644 --- a/kano_profile_gui/MenuBar.py +++ b/kano_profile_gui/MenuBar.py @@ -43,16 +43,16 @@ def __init__(self, win_width, quests): # Home button self.home_button = HomeButton() self.home_button.connect("clicked", self.emit_home_signal) - self.home_button.connect("clicked", self.set_selected_wrapper, _("CHARACTER")) + self.home_button.connect("clicked", self.set_selected_wrapper, "CHARACTER") hbox.pack_start(self.home_button, False, False, 0) close_button = self._create_cross_button() hbox.pack_end(close_button, False, False, 0) close_button.connect("clicked", self.close_window) - name_array = [_('BADGES'), _('CHARACTER')] # TODO: add 'QUESTS' to enable + name_array = [N_('BADGES'), N_('CHARACTER')] # TODO: add 'QUESTS' to enable for name in name_array: - button = MenuButton(name, self._quests) + button = MenuButton(_(name), self._quests) button.connect("clicked", self.emit_menu_signal, name) button.connect("clicked", self.set_selected_wrapper, name) hbox.pack_end(button, False, False, 0) @@ -61,19 +61,19 @@ def __init__(self, win_width, quests): self.buttons[name] = {} self.buttons[name]["button"] = button - if name == _("QUESTS"): + if name == "QUESTS": # check the notification image button.check_for_notification() # HACKY: avoiding packing the label divider after the last element - if name != _("CHARACTER"): + if name != "CHARACTER": label = self._create_divider_label() hbox.pack_end(label, False, False, 0) attach_cursor_events(button) # initialise with the CHARACTER button selected - self.set_selected(_("CHARACTER")) + self.set_selected("CHARACTER") def _create_divider_label(self): label = Gtk.Label("|") @@ -97,7 +97,7 @@ def emit_menu_signal(self, widget, name): self.emit("menu-button-clicked", name) def emit_home_signal(self, widget): - self.emit('home-button-clicked', _('CHARACTER')) + self.emit('home-button-clicked', 'CHARACTER') def get_selected_button(self): return self.selected diff --git a/locale/ja/LC_MESSAGES/kano-tutorial.mo b/locale/ja/LC_MESSAGES/kano-tutorial.mo index 429f4709e5b5c9a41b727322c02c5ac90d307d8e..e3c37896f3dc62407a4e61f5ccdb58aa0d3c6d11 100644 GIT binary patch delta 2332 zcmZ|PX>3$g7{>84NP(8J4W$UU+{#)hTMLL)C>1K35-BAZBA5b~Qh{k13NE12J41jd zTO5lig0dqJgfIc5G@v1pC~EK%F)?a9OdI$B(dY+aApW1}ZAB7K=DokW&3Vsx@45GC z?!FO`pM&k|4DAKt5n^3CV_f{HJsVne2V*jEC1&G0*ct1v3+}~qJb}9J90u_+@-siO zQCGjBt|ze*{((;$6ET0YqYlP&G^Q^Wp>CXq8c+oe!u80{9Ah&S6Ubl9FPMQ%$j|)F zMhWj=8s0+TgYvgH|AlY-V7t)6*@|}t*^(<5+ z7NZg`!>(BE8$r!@E2={KP!&Fkk;mCN%Z^HP4b?#sRpOi23$vM?66awSjzPv|ru*m1 za0(#z7 z|NIVA1@@pG*N2v4EMQ5DN(R^*EqhaJr@%tjYBq5k+j zD&ao=_yjKC_#$d1kFmlu!&20ut3f5$g(LAap2sE(;8+qJ2$Jtqb|hXyQpC zm(c4$h1!~CsP-tKZ^3jzv(#ec5vM-egHRuy$%NJr1v0&fX@puHF@n%z(d#{fP-XSX zMxJA%=c(0re;e)}Xfd@meFO4|j;$w<W#+Y9^J3LRB@+@~R4_GL+|3hpQGYcUKfTYu~=_ zQe~+1AnaCDuBvgv|G6_Uzr%q*Z>OeenH$P6GwH7NHg|DO;$FwWfwVa#v&&}3`=|d^ z;w);(7WqZe(g(b(8=8$D^G2W%{n+}O~x`=IqMSnnenjo)tEsUqBehxHCy zZ%f-9rn&z7jm@Y2=YQUN*4uBrxb@caOK#tiOswlt5a{bgZFIA3+17f=x@|Z1Zf>q` zX#U`n#J6211SZUC#8tbtC`OKV|Idjf`{UluR;aJJuwzq4gvilZL$*!2t~7BMjjS^y6F9b)PU3f1-x)r~K^?;}ni_u?h=u zzA-V=%uXsDhj9^}LVo4}n*a`?&Obp7_zD@@jG!hkiUs%?r(uYTHGw%e6Dx2oZo#Rz z57Y4w26(MLIb{1d+r(>;W6E5Vq9S>j^?(vaU(xQPA%t90ILJfG!^RDNhcYfIO z4f2-EH`FT_Pb2@jF_q~zVFuP{OV9=vj>-iXUUqdW|hp^L#TxGBbcJcptTpJPJzvv1RP&#v0U$Hhah0v7F;pRBd#l27H8NIEsUqPDN1??qpSb zY6S!dbtevH2BB=|GgQ+AnTLup=Kk@hQxDPSqc)pR+Up3l9HO4kiYtg&gu4pV>Q&Xu z$Nk<((7&dypqN-nsIFAZYFfEkMBl$wRq7u8->7&dn(CsGpyu4~SN+x6(0Gk*{meuC zM@+O@c2*L~=zOA_P}cZ>+yVr%j94-;BfWxDLVpyi3AN?KDtC{Hw%StKtamAm_Tkhk zKD*vu=(F|)epr3MV*6vT)R$aVRb95!&I@(;te$X(eKdW&Z&u>0lep$29y$jfIEiCU z!gdbC$2w1c>OJYid+ZNWYkl^v%rT$Ulr@|Y?{?xxoOqXWkdwE$&??BjY|V}=w}!$| V>wM%y(oHAcZ{_C{TbpvW{Q+_Ds}}$O From 40c3df9713c5ee411519c7719ae15de682254f4b Mon Sep 17 00:00:00 2001 From: Antoine Choppin Date: Wed, 1 Jun 2016 08:11:57 +0900 Subject: [PATCH 4/5] Remove .mo file committed by mistake --- .gitignore | 2 +- locale/ja/LC_MESSAGES/kano-tutorial.mo | Bin 6050 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 locale/ja/LC_MESSAGES/kano-tutorial.mo diff --git a/.gitignore b/.gitignore index 955ac70f..91f99136 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ *.swp *.so* *.dylib +*.mo *~ # Ignore tags created by etags, ctags, gtags (GNU global) and cscope @@ -26,5 +27,4 @@ cscope.po.out media/images/environments/originals/**/*_locked.png media/images/badges/originals/**/*_locked.png -.mo po/messages.pot diff --git a/locale/ja/LC_MESSAGES/kano-tutorial.mo b/locale/ja/LC_MESSAGES/kano-tutorial.mo deleted file mode 100644 index e3c37896f3dc62407a4e61f5ccdb58aa0d3c6d11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6050 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 l4)@bF From 34eebe3ca9cc441c181fb87d35a2fc43e00ef0aa Mon Sep 17 00:00:00 2001 From: Antoine Choppin Date: Wed, 6 Jul 2016 22:14:25 +0900 Subject: [PATCH 5/5] Add missing translations --- po/Makefile | 2 +- po/ja.po | 30 ++++++++++++++++++++---------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/po/Makefile b/po/Makefile index 616008cf..aecd0992 100644 --- a/po/Makefile +++ b/po/Makefile @@ -18,7 +18,7 @@ clean: clean_locales define run-xgettext xgettext -f PYPOTFILES -L Python --force-po -o messages.pot \ - --package-name=$(APPNAME) --copyright-holder=$(ORG) + --keyword=N_ --package-name=$(APPNAME) --copyright-holder=$(ORG) endef messages: diff --git a/po/ja.po b/po/ja.po index fbc52dcd..bf756255 100644 --- a/po/ja.po +++ b/po/ja.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: kano-tutorial\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-31 21:22+0900\n" +"POT-Creation-Date: 2016-07-06 22:09+0900\n" "PO-Revision-Date: 2016-05-19 20:29+0900\n" "Last-Translator: Choppin Antoine \n" "Language-Team: Japanese\n" @@ -214,19 +214,13 @@ msgstr "修正を保存" msgid "Discard" msgstr "修正を破棄" -#: ../kano_profile_gui/MenuBar.py:46 ../kano_profile_gui/MenuBar.py:53 -#: ../kano_profile_gui/MenuBar.py:69 ../kano_profile_gui/MenuBar.py:76 -#: ../kano_profile_gui/MenuBar.py:100 -msgid "CHARACTER" -msgstr "キャラクター" - #: ../kano_profile_gui/MenuBar.py:53 msgid "BADGES" msgstr "バッジ" -#: ../kano_profile_gui/MenuBar.py:64 -msgid "QUESTS" -msgstr "クエスト" +#: ../kano_profile_gui/MenuBar.py:53 +msgid "CHARACTER" +msgstr "キャラクター" #: ../kano_profile_gui/MenuBar.py:164 msgid "Level {}" @@ -256,6 +250,19 @@ msgstr " 年は範囲外" msgid " is valid" msgstr " 有効" +#: ../kano_registration_gui/BirthdayWidget.py:235 +msgid "Oops!" +msgstr "おっと!" + +#: ../kano_registration_gui/BirthdayWidget.py:236 +msgid "You haven't entered a valid birthday" +msgstr "有効な誕生日を記入していません" + +#: ../kano_registration_gui/BirthdayWidget.py:279 +#, python-brace-format +msgid "There's a problem - {0}" +msgstr "問題が発生しました - {0}" + #: ../kano_registration_gui/GetData.py:96 msgid "Show password" msgstr "パスワードを表示" @@ -340,3 +347,6 @@ msgstr "ログインしていません!" #: ../kano_world/share_helpers.py:33 msgid "Cannot login" msgstr "ログインできません" + +#~ msgid "QUESTS" +#~ msgstr "クエスト"