diff --git a/ConfigManager.py b/ConfigManager.py index bc9831a..90178ac 100644 --- a/ConfigManager.py +++ b/ConfigManager.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- #ConfigManager -#Copyright (C) 2019-2022 yamahubuki +#Copyright (C) 2019-2020 yamahubuki import os import configparser @@ -15,7 +15,6 @@ def __init__(self): self.identifier="ConfigManager" self.log=getLogger(self.identifier) self.log.debug("Create config instance") - self.fileName = None def read(self,fileName): self.fileName=fileName @@ -54,12 +53,6 @@ def write(self): self.log.error("save failed.") return errorCodes.ACCESS_DENIED - def getFileName(self): - return self.fileName - - def getAbsFileName(self): - return os.path.abspath(self.fileName) - def __getitem__(self,key): try: return ConfigSection(super().__getitem__(key)) diff --git a/DefaultSettings.py b/DefaultSettings.py index 7493007..6fdd267 100644 --- a/DefaultSettings.py +++ b/DefaultSettings.py @@ -19,7 +19,8 @@ def get(): config["view"]={ "font": "bold 'MS ゴシック' 22 windows-932", "colorMode":"normal", - "textwrapping":"off" + "textwrapping":"off", + "enableMultiline":False, } config["speech"]={ "reader" : "AUTO" diff --git a/constants.py b/constants.py index a503898..ef77f19 100644 --- a/constants.py +++ b/constants.py @@ -9,8 +9,8 @@ APP_FULL_NAME = "windows Native Peing Connector"#アプリケーションの完全な名前 APP_NAME="NPC"#アプリケーションの名前 APP_ICON = None -APP_VERSION="1.3.2" -APP_LAST_RELEASE_DATE="2022-02-02" +APP_VERSION="1.4.0" +APP_LAST_RELEASE_DATE="2023-04-29" APP_COPYRIGHT_YEAR="2021" APP_LICENSE="Apache License 2.0" APP_DEVELOPERS="yamahubuki, ACT Laboratory" diff --git a/locale/en-us/LC_MESSAGES/messages.mo b/locale/en-us/LC_MESSAGES/messages.mo index b53d496..46d6203 100644 Binary files a/locale/en-us/LC_MESSAGES/messages.mo and b/locale/en-us/LC_MESSAGES/messages.mo differ diff --git a/locale/en-us/LC_MESSAGES/messages.po b/locale/en-us/LC_MESSAGES/messages.po index 9cafbf0..e1f21e4 100644 --- a/locale/en-us/LC_MESSAGES/messages.po +++ b/locale/en-us/LC_MESSAGES/messages.po @@ -7,17 +7,24 @@ msgid "" msgstr "" "Project-Id-Version: NPC\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-12-18 14:44+0900\n" -"PO-Revision-Date: 2021-12-18 14:47+0900\n" +"POT-Creation-Date: 2023-04-29 23:44+0900\n" +"PO-Revision-Date: 2023-04-29 23:46+0900\n" "Last-Translator: \n" "Language-Team: \n" "Language: en_US\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.0.1\n" +"X-Generator: Poedit 3.2.2\n" -#: AppBase.py:45 +#: app.py:82 views\main.py:677 +msgid "" +"設定の保存に失敗しました。下記のファイルへのアクセスが可能であることを確認し" +"てください。" +msgstr "" +"Failed to save settings. Make sure you can access to the following files:" + +#: AppBase.py:48 msgid "" "ログ機能の初期化に失敗しました。下記のファイルへのアクセスが可能であることを" "確認してください。" @@ -25,6 +32,18 @@ msgstr "" "Failed to initialize logger. Make sure you have permission to access to the " "following file:" +#: AppBase.py:57 +msgid "音声エンジンエラー" +msgstr "Speech Synthesizer Error" + +#: AppBase.py:57 +msgid "" +"音声読み上げ機能の初期化に失敗したため、読み上げ機能を使用できません。出力先" +"の変更をお試しください。" +msgstr "" +"Failed to initialize speech function. You cannot use speech. Please try to " +"change speech output." + #: keymapHandlerBase.py:696 keymapHandlerBase.py:726 #, python-format msgid "%s は存在しないキーです。" @@ -99,9 +118,9 @@ msgstr "Open a user's page in a &browser" msgid "登録済みユーザリスト(&L)" msgstr "Registered Users &List" -#: menuItemsDic.py:24 views\main.py:290 -msgid "Twitterのフォローリストから一括登録" -msgstr "Add Users from Twitter's Following List" +#: menuItemsDic.py:24 views\main.py:308 +msgid "ユーザの一括追加" +msgstr "Add users in bulk" #: menuItemsDic.py:25 msgid "終了(&X)" @@ -181,24 +200,6 @@ msgstr "delete" msgid "列の並び替え(&R)" msgstr "&Reorder Columns" -#: twitterService.py:36 -msgid "" -"認証に成功しました。このウィンドウを閉じて、アプリケーションに戻ってくださ" -"い。" -msgstr "" -"Authorization successful. Close this window and go back to the application." - -#: twitterService.py:37 -msgid "認証に失敗しました。もう一度お試しください。" -msgstr "Authorization failed. Please try again." - -#: twitterService.py:38 -msgid "" -"しばらくしても画面が切り替わらない場合は、別のブラウザでお試しください。" -msgstr "" -"If the screen does not change after a while, open this page in another " -"browser." - #: update.py:50 update.py:59 update.py:73 update.py:79 update.py:90 #: update.py:98 update.py:103 update.py:108 update.py:160 #: views\updateDialog.py:39 @@ -284,7 +285,7 @@ msgid "受信しない" msgstr "Do not receive" #: views\accountSettingsDialog.py:34 views\globalKeyConfig.py:75 -#: views\settingsDialog.py:61 +#: views\settingsDialog.py:57 msgid "設定" msgstr "settings" @@ -328,19 +329,19 @@ msgstr "Unanswered questions" msgid "アーカイブ済みの質問" msgstr "Archived Questions" -#: views\answerDialog.py:87 +#: views\answerDialog.py:90 msgid "回答の入力" msgstr "Enter answers" -#: views\answerDialog.py:93 +#: views\answerDialog.py:96 msgid "回答完了" msgstr "Answer complete" -#: views\answerDialog.py:93 +#: views\answerDialog.py:96 msgid "回答が送信されました。" msgstr "An answer has been sent." -#: views\answerDialog.py:96 +#: views\answerDialog.py:99 msgid "" "指定された質問が存在しないか、通信に失敗しました。以下の対処をお試しくださ" "い。\n" @@ -360,11 +361,11 @@ msgstr "" "Try again after a while.\n" "If this issue could not be resolved, contact to the developers." -#: views\answerDialog.py:100 +#: views\answerDialog.py:103 msgid "質問をアーカイブ" msgstr "Archive questions" -#: views\answerDialog.py:100 +#: views\answerDialog.py:103 #, python-format msgid "" "以下の質問をアーカイブしますか?\n" @@ -375,11 +376,11 @@ msgstr "" "\n" "%s" -#: views\answerDialog.py:108 +#: views\answerDialog.py:111 msgid "質問を元に戻す" msgstr "Undo a question" -#: views\answerDialog.py:108 +#: views\answerDialog.py:111 #, python-format msgid "" "以下の質問を元に戻しますか?\n" @@ -434,12 +435,12 @@ msgstr "&Register" #: views\candidateUserListDialog.py:48 views\KeyValueSettingDialogBase.py:84 #: views\KeyValueSettingDialogBase.py:275 views\listConfigurationDialog.py:60 -#: views\searchConditionDialog.py:38 views\settingsDialog.py:115 -#: views\SimpleInputDialog.py:40 views\updateDialog.py:45 +#: views\searchConditionDialog.py:38 views\settingsDialog.py:110 +#: views\SimpleInputDialog.py:56 views\updateDialog.py:45 msgid "キャンセル" msgstr "cancel" -#: views\candidateUserListDialog.py:63 views\main.py:240 +#: views\candidateUserListDialog.py:63 views\main.py:239 #: views\userListDialog.py:79 msgid "ユーザの削除" msgstr "Delete a user" @@ -493,7 +494,7 @@ msgstr "shortcut" msgid "識別子" msgstr "identifier" -#: views\globalKeyConfig.py:31 views\main.py:489 +#: views\globalKeyConfig.py:31 views\main.py:475 msgid "ショートカットキーの設定" msgstr "Shortcut Key Configuration" @@ -502,7 +503,7 @@ msgstr "Shortcut Key Configuration" #: views\globalKeyConfig.py:120 views\globalKeyConfig.py:128 #: views\globalKeyConfig.py:138 views\globalKeyConfig.py:143 #: views\keyConfig.py:57 views\KeyValueSettingDialogBase.py:333 -#: views\main.py:667 views\main.py:680 +#: views\main.py:659 views\main.py:672 msgid "なし" msgstr "None" @@ -546,7 +547,7 @@ msgstr "register set contents" msgid "このショートカットは変更できません。" msgstr "This shortcut cannot be modified." -#: views\globalKeyConfig.py:127 views\globalKeyConfig.py:130 views\main.py:477 +#: views\globalKeyConfig.py:127 views\globalKeyConfig.py:130 views\main.py:463 msgid "設定完了" msgstr "Setup has been completed" @@ -593,7 +594,7 @@ msgstr "&Delete" #: views\KeyValueSettingDialogBase.py:83 views\KeyValueSettingDialogBase.py:274 #: views\listConfigurationDialog.py:59 views\searchConditionDialog.py:37 -#: views\SimpleInputDialog.py:39 +#: views\SimpleInputDialog.py:55 msgid "OK" msgstr "OK" @@ -667,43 +668,39 @@ msgstr "&Hide headers on the screen" msgid "全ての列を非表示にすることはできません。" msgstr "Not all columns can be hidden." -#: views\main.py:181 +#: views\main.py:184 msgid "ファイル(&F)" msgstr "&File" -#: views\main.py:182 +#: views\main.py:185 msgid "フィルタ(&I)" msgstr "F&ilter" -#: views\main.py:183 +#: views\main.py:186 msgid "アカウント(&A)" msgstr "&Account" -#: views\main.py:184 +#: views\main.py:187 msgid "オプション(&O)" msgstr "&Options" -#: views\main.py:185 +#: views\main.py:188 msgid "ヘルプ(&H)" msgstr "&Help" -#: views\main.py:199 +#: views\main.py:202 msgid "ユーザの追加" msgstr "Add a user" -#: views\main.py:199 +#: views\main.py:202 msgid "peingページURLまたはTwitterユーザ名" msgstr "peing page URL or twitter user name" -#: views\main.py:211 -msgid "指定されたユーザは既に登録済みです。" -msgstr "The specified user is already registered." - -#: views\main.py:218 +#: views\main.py:216 msgid "ユーザ追加" msgstr "Add user" -#: views\main.py:218 +#: views\main.py:216 #, python-format msgid "" "以下のユーザを追加しますか?\n" @@ -716,11 +713,11 @@ msgstr "" "ID:%(id)d\n" "%(name)s (%(account)s)" -#: views\main.py:222 views\main.py:379 +#: views\main.py:221 views\main.py:365 msgid "登録完了" msgstr "Registeration Completed" -#: views\main.py:222 +#: views\main.py:221 msgid "" "ユーザの登録に成功しました。今回登録したユーザの回答を表示するには、ビューを" "再読み込みしてください。" @@ -728,11 +725,7 @@ msgstr "" "The user was successfully registered. To view the answers of the users who " "registered this time, please reload the view." -#: views\main.py:225 -msgid "ユーザの登録に失敗しました。" -msgstr "User registration failed." - -#: views\main.py:240 views\userListDialog.py:79 +#: views\main.py:239 views\userListDialog.py:79 #, python-format msgid "" "以下のユーザの登録と、過去の回答履歴を削除しますか?\n" @@ -744,95 +737,46 @@ msgstr "" "\n" "%s" -#: views\main.py:253 +#: views\main.py:252 msgid "" "このユーザは既に退会したか、peingIDを変更しているため開くことができません。" msgstr "" "This user cannot be opened because he has already unsubscribed or changed " "his peingID." -#: views\main.py:271 +#: views\main.py:270 msgid "出力先ファイルの指定" msgstr "Specify destination file" -#: views\main.py:271 +#: views\main.py:270 msgid "CSVファイル(*.csv) | *.csv; | すべてのファイル(*.*) | *.*" msgstr "CSV file (*.csv) | *.csv; | All files (*.*) | *.*" #: views\main.py:290 -msgid "Twitterアカウントの認証のため、ブラウザの操作を待っています。" -msgstr "Waiting for browser..." - -#: views\main.py:297 -msgid "" -"Twitterの認証に失敗しました。ブラウザ上で認証を拒否した、時間がかかりすぎた、" -"またはインターネット接続に問題がある可能性があります。" -msgstr "" -"Twitter authentication failed. Your browser may have refused to " -"authenticate, took too long, or you may have a problem with your Internet " -"connection." - -#: views\main.py:303 msgid "対象ユーザの指定" msgstr "specify users" -#: views\main.py:303 -msgid "" -"フォロー中のユーザを取得するアカウントの@からはじまるアカウント名を入力してく" -"ださい。\n" -"後悔アカウント、認証に用いたアカウント、\n" -"または認証に用いたアカウントがフォローしている非公開アカウントを指定できま" -"す。" -msgstr "" -"Enter the account name that starts with @, the account you want to get " -"following users for.\n" -"Regret accounts, accounts used for authentication,\n" -"Or you can specify a private account that the account you used to " -"authenticate follows." - -#: views\main.py:314 -msgid "フォローリストを取得しています。" -msgstr "Retrieving following users data" - -#: views\main.py:318 -msgid "" -"Twitterからフォローリストを取得できませんでした。指定したユーザが存在しない" -"か、フォローしていない非公開アカウントである可能性があります。" -msgstr "" -"Failed to get a follow list from Twitter. The specified user may not exist " -"or may be a private account that you do not follow." - -#: views\main.py:320 -msgid "" -"Twitterからフォローリストを取得できませんでした。しばらくたってから再度お試し" -"ください。状況が改善しない場合には、開発者までお問い合わせください。" -msgstr "" -"Failed to get a follow list from Twitter. Please try again after a while. If " -"the situation does not improve, contact the developer." - -#: views\main.py:325 +#: views\main.py:291 msgid "" -"Twitterからフォローリストを取得できませんでした。まだ誰もフォローしていないア" -"カウントであるか、通信回数の上限に達しています。後者の場合には、15分以上待っ" -"てから再度お試しください。" +"対象アカウントの@からはじまるアカウント名を、\n" +"改行区切りで入力してください。" msgstr "" -"Failed to get a follow list from Twitter. It's an account that no one has " -"followed yet, or you're at the maximum number of communications. In the " -"latter case, wait at least 15 minutes and try again." +"Enter the account name of the target account starting with @,\n" +"separated by line breaks." -#: views\main.py:328 +#: views\main.py:308 msgid "登録済みユーザのリストを取得しています。" msgstr "Retrieving registered users data" -#: views\main.py:340 +#: views\main.py:326 msgid "Peingへの登録状況を調べています。" msgstr "Checking the status of registration with Peing." -#: views\main.py:354 +#: views\main.py:340 msgid "通信エラー" msgstr "Communication error" -#: views\main.py:354 +#: views\main.py:340 msgid "" "Peingとの通信でエラーが発生しました。インターネット接続を確認し、しばらくたっ" "てから再度お試しください。状況が改善しない場合は、Twitterでのフォロー数が多す" @@ -848,21 +792,21 @@ msgstr "" "After closing this message, you will see a list of any accounts that were " "able to be retrieved by the time this error occurred." -#: views\main.py:359 +#: views\main.py:345 msgid "処理終了" msgstr "End of processing" -#: views\main.py:359 +#: views\main.py:345 msgid "一括登録を試みましたが、登録の候補となるユーザが見つかりませんでした。" msgstr "" "I tried to register in bulk, but I couldn't find a potential user to " "register." -#: views\main.py:374 +#: views\main.py:360 msgid "指定されたユーザを登録しています。" msgstr "Adding specified users." -#: views\main.py:379 +#: views\main.py:365 msgid "" "ユーザの一括登録に成功しました。今回登録したユーザの回答を表示するには、" "ビューを再読み込みしてください。" @@ -870,7 +814,7 @@ msgstr "" "The user was successfully registered. To view the answers of the users who " "registered this time, please reload the view." -#: views\main.py:445 views\main.py:454 views\main.py:463 +#: views\main.py:431 views\main.py:440 views\main.py:449 msgid "" "質問の取得に失敗しました。以下の対処をお試しください。\n" "\n" @@ -884,7 +828,7 @@ msgstr "" "Take a while and redo the operation.\n" "If this problem does not be resolved, contact to the developer." -#: views\main.py:473 +#: views\main.py:459 msgid "" "ログインまたはアカウント設定の取得に失敗しました。以下の対処をお試しくださ" "い。\n" @@ -902,23 +846,23 @@ msgstr "" "Try again after a while.\n" "If this issue does not resolved, contact to developers." -#: views\main.py:477 +#: views\main.py:463 msgid "設定しました。" msgstr "Configured." -#: views\main.py:548 +#: views\main.py:534 msgid "準備中" msgstr "Preparing" -#: views\main.py:548 +#: views\main.py:534 msgid "回答データを取得しています" msgstr "Retrieving answer data" -#: views\main.py:568 +#: views\main.py:554 msgid "登録ユーザの更新除外について" msgstr "About update exclusions for registered users" -#: views\main.py:568 +#: views\main.py:554 #, python-format msgid "" "登録していた以下のユーザは、アカウント名が変更されたか、削除されました。その" @@ -937,24 +881,24 @@ msgstr "" "\n" "Applicable user: %s" -#: views\main.py:593 +#: views\main.py:582 msgid "質問を投稿" msgstr "Post a &question" -#: views\main.py:593 +#: views\main.py:582 #, python-format msgid "%sさんへの質問内容" msgstr "question to %s" -#: views\main.py:605 +#: views\main.py:594 msgid "投稿完了" msgstr "Post completed" -#: views\main.py:605 +#: views\main.py:594 msgid "質問を投稿しました。" msgstr "Your question successfully posted." -#: views\main.py:620 +#: views\main.py:609 msgid "" "指定されたユーザが存在しないか、通信に失敗しました。以下の対処をお試しくださ" "い。\n" @@ -971,7 +915,7 @@ msgstr "" "Please try again after a while.\n" "If the problem is not resolved, please contact to the developer." -#: views\main.py:622 +#: views\main.py:611 msgid "" "Twitterとの通信でエラーが発生しました。指定したユーザ名が間違っているか、イン" "ターネット接続に問題が発生した可能性があります。" @@ -980,7 +924,7 @@ msgstr "" "may be incorrect or you may have experienced problems with your Internet " "connection." -#: views\main.py:624 +#: views\main.py:613 msgid "" "ログインに失敗しました。設定されたアカウント情報に誤りがあります。\n" "\n" @@ -996,7 +940,7 @@ msgstr "" "If you can login on your browser, the website might change. Contact to the " "developer.\n" -#: views\main.py:626 +#: views\main.py:615 msgid "" "ログインに失敗しました。ログインに際して権限の認可が要求されています。同じID" "でブラウザからログインした後、再度お試しください。" @@ -1004,7 +948,7 @@ msgstr "" "Failed to login. Authentication is required. After login on your browser, " "try again." -#: views\main.py:628 +#: views\main.py:617 msgid "" "ログインに失敗しました。Peingのサーバやお使いのインターネット接続に障害が発生" "している可能性があります。ブラウザから同じIDでログインできるか確認してくださ" @@ -1018,7 +962,7 @@ msgstr "" "the specifications of the site, so please contact the developer with this " "message and the type of ID you used." -#: views\main.py:630 +#: views\main.py:619 msgid "" "ログインに失敗しました。Twitterのサーバやお使いのインターネット接続に障害が発" "生している可能性があります。ブラウザから同じIDでログインできるか確認してくだ" @@ -1032,7 +976,7 @@ msgstr "" "the specifications of the site, so please contact the developer with this " "message and the type of ID you used." -#: views\main.py:632 +#: views\main.py:621 msgid "" "不明なエラーの為、ログインに失敗しました。サイトの仕様変更や、お使いのイン" "ターネット接続の障害が考えられます。まずは、ブラウザから同じIDでログインでき" @@ -1047,7 +991,7 @@ msgstr "" "the specifications of the site, so please contact the developer with this " "message and the type of ID you used." -#: views\main.py:634 +#: views\main.py:623 msgid "" "ログインに失敗しました。ログインに際してRECAPTCHA(ロボットでないことの確認)が" "要求されています。同じIDでブラウザからログインした後、再度お試しください。" @@ -1055,7 +999,11 @@ msgstr "" "Login failed. RECAPTCHA (confirmation that you are not a robot) is required " "when logging in. Log in from your browser with the same ID and try again." -#: views\main.py:636 +#: views\main.py:625 +msgid "指定されたユーザは既に登録済みです。" +msgstr "The specified user is already registered." + +#: views\main.py:627 #, python-format msgid "" "不明なエラー%(code)dが発生しました。大変お手数ですが、本ソフトの実行ファイル" @@ -1065,7 +1013,7 @@ msgstr "" "attaching the information generated in the directory %(log)s the execution " "file of this software." -#: views\main.py:691 +#: views\main.py:684 msgid "" "この機能を利用するには、ログインが必要です。\n" "[オプション]→[設定]にて、アカウント情報を設定してください。詳細は、readme.txt" @@ -1075,6 +1023,16 @@ msgstr "" "Configure account from settings on the options menu. See readme.txt for " "further information." +#: views\main.py:700 +#, python-format +msgid "%d個中%d個目を選択中" +msgstr "Selecting %d of %d" + +#: views\main.py:702 +#, python-format +msgid "%d個表示中、選択項目なし" +msgstr "%d displayed, no selections" + #: views\progress.py:35 msgid "中止(&C)" msgstr "&Cancel" @@ -1120,107 +1078,120 @@ msgstr "to" msgid "詳細を表示(&D)" msgstr "View &Details" -#: views\settingsDialog.py:46 +#: views\settingsDialog.py:42 msgid "標準" msgstr "normal" -#: views\settingsDialog.py:47 +#: views\settingsDialog.py:43 msgid "ダーク" msgstr "Dark" -#: views\settingsDialog.py:50 +#: views\settingsDialog.py:46 msgid "画面幅で折り返し" msgstr "Wrap by screen width" -#: views\settingsDialog.py:51 +#: views\settingsDialog.py:47 msgid "折り返さない" msgstr "Don't wrap" -#: views\settingsDialog.py:72 +#: views\settingsDialog.py:68 msgid "カテゴリ選択" msgstr "Category selection" -#: views\settingsDialog.py:75 +#: views\settingsDialog.py:71 msgid "一般" msgstr "general" -#: views\settingsDialog.py:76 +#: views\settingsDialog.py:72 msgid "起動時に最新の情報を取得する" msgstr "Get the latest information at startup" -#: views\settingsDialog.py:78 +#: views\settingsDialog.py:74 msgid "次回起動時にフィルタの状況を維持" msgstr "Keep the filter status" -#: views\settingsDialog.py:80 +#: views\settingsDialog.py:76 msgid "次回起動時にカーソルの位置を復元" msgstr "Recover cursor position when startup" -#: views\settingsDialog.py:82 +#: views\settingsDialog.py:78 msgid "ログ記録レベル(&L)" msgstr "&Logging Level" -#: views\settingsDialog.py:86 +#: views\settingsDialog.py:82 msgid "ログイン" msgstr "Login" -#: views\settingsDialog.py:87 -msgid "利用するIDの種類" -msgstr "Types of IDs to use" - -#: views\settingsDialog.py:90 +#: views\settingsDialog.py:85 msgid "パスワード(&P)" msgstr "&Password" -#: views\settingsDialog.py:92 +#: views\settingsDialog.py:87 msgid "ログインした状態で質問する" msgstr "Ask questions while logged in" -#: views\settingsDialog.py:99 +#: views\settingsDialog.py:91 msgid "表示/言語" msgstr "Display/Language" -#: views\settingsDialog.py:100 +#: views\settingsDialog.py:92 msgid "言語(&L)" msgstr "&Language" -#: views\settingsDialog.py:101 +#: views\settingsDialog.py:93 msgid "画面表示モード(&D)" msgstr "Screen &Display Mode" -#: views\settingsDialog.py:102 +#: views\settingsDialog.py:94 msgid "テキストの折り返し(&W)" msgstr "Text &Wrap" -#: views\settingsDialog.py:105 +#: views\settingsDialog.py:95 +msgid "複数行の質問・回答を入力可能にする" +msgstr "Allow multiple lines of questions and answers" + +#: views\settingsDialog.py:100 msgid "ネットワーク" msgstr "network" -#: views\settingsDialog.py:106 +#: views\settingsDialog.py:101 msgid "起動時に更新を確認(&U)" msgstr "Automatically Check for &Update" -#: views\settingsDialog.py:107 +#: views\settingsDialog.py:102 msgid "プロキシサーバーの情報を手動で設定する(&M)" msgstr "&Manually set up proxy server information" -#: views\settingsDialog.py:108 +#: views\settingsDialog.py:103 msgid "サーバーURL" msgstr "Server URL" -#: views\settingsDialog.py:110 +#: views\settingsDialog.py:105 msgid "ポート番号" msgstr "Port number" -#: views\settingsDialog.py:145 +#: views\settingsDialog.py:140 msgid "IDとPWは両方を入力するか、両方を空欄としてください。" msgstr "Enter both ID and PW, or leave both blank." -#: views\settingsDialog.py:149 +#: views\settingsDialog.py:144 msgid "" "ログインした状態で質問をする場合には、IDとパスワードを入力してください。" msgstr "To ask questions while loged in, enter your ID and password." +#: views\SimpleInputDialog.py:87 views\SimpleInputDialog.py:96 +msgid "入力内容に誤りがあります。" +msgstr "There is an error in the information you entered." + +#: views\SimpleInputDialog.py:87 +#, python-format +msgid "行: %d" +msgstr "Line: %d" + +#: views\SimpleInputDialog.py:92 +msgid "有効な値が入力されていません。" +msgstr "You have not entered a valid value." + #: views\updateDialog.py:23 #, python-format msgid "アップデート - %s" @@ -1314,6 +1285,81 @@ msgstr "See the included license.txt for licensing / copyright information." msgid "閉じる" msgstr "close" +#~ msgid "Twitterのフォローリストから一括登録" +#~ msgstr "Add Users from Twitter's Following List" + +#~ msgid "" +#~ "認証に成功しました。このウィンドウを閉じて、アプリケーションに戻ってくださ" +#~ "い。" +#~ msgstr "" +#~ "Authorization successful. Close this window and go back to the " +#~ "application." + +#~ msgid "認証に失敗しました。もう一度お試しください。" +#~ msgstr "Authorization failed. Please try again." + +#~ msgid "" +#~ "しばらくしても画面が切り替わらない場合は、別のブラウザでお試しください。" +#~ msgstr "" +#~ "If the screen does not change after a while, open this page in another " +#~ "browser." + +#~ msgid "ユーザの登録に失敗しました。" +#~ msgstr "User registration failed." + +#~ msgid "Twitterアカウントの認証のため、ブラウザの操作を待っています。" +#~ msgstr "Waiting for browser..." + +#~ msgid "" +#~ "Twitterの認証に失敗しました。ブラウザ上で認証を拒否した、時間がかかりすぎ" +#~ "た、またはインターネット接続に問題がある可能性があります。" +#~ msgstr "" +#~ "Twitter authentication failed. Your browser may have refused to " +#~ "authenticate, took too long, or you may have a problem with your Internet " +#~ "connection." + +#~ msgid "" +#~ "フォロー中のユーザを取得するアカウントの@からはじまるアカウント名を入力し" +#~ "てください。\n" +#~ "後悔アカウント、認証に用いたアカウント、\n" +#~ "または認証に用いたアカウントがフォローしている非公開アカウントを指定できま" +#~ "す。" +#~ msgstr "" +#~ "Enter the account name that starts with @, the account you want to get " +#~ "following users for.\n" +#~ "Regret accounts, accounts used for authentication,\n" +#~ "Or you can specify a private account that the account you used to " +#~ "authenticate follows." + +#~ msgid "フォローリストを取得しています。" +#~ msgstr "Retrieving following users data" + +#~ msgid "" +#~ "Twitterからフォローリストを取得できませんでした。指定したユーザが存在しな" +#~ "いか、フォローしていない非公開アカウントである可能性があります。" +#~ msgstr "" +#~ "Failed to get a follow list from Twitter. The specified user may not " +#~ "exist or may be a private account that you do not follow." + +#~ msgid "" +#~ "Twitterからフォローリストを取得できませんでした。しばらくたってから再度お" +#~ "試しください。状況が改善しない場合には、開発者までお問い合わせください。" +#~ msgstr "" +#~ "Failed to get a follow list from Twitter. Please try again after a while. " +#~ "If the situation does not improve, contact the developer." + +#~ msgid "" +#~ "Twitterからフォローリストを取得できませんでした。まだ誰もフォローしていな" +#~ "いアカウントであるか、通信回数の上限に達しています。後者の場合には、15分以" +#~ "上待ってから再度お試しください。" +#~ msgstr "" +#~ "Failed to get a follow list from Twitter. It's an account that no one has " +#~ "followed yet, or you're at the maximum number of communications. In the " +#~ "latter case, wait at least 15 minutes and try again." + +#~ msgid "利用するIDの種類" +#~ msgstr "Types of IDs to use" + #~ msgid "フィルタ(&F)" #~ msgstr "&Filter" diff --git a/locale/ja-jp/LC_MESSAGES/messages.po b/locale/ja-jp/LC_MESSAGES/messages.po index f25e2f9..a07ff4c 100644 --- a/locale/ja-jp/LC_MESSAGES/messages.po +++ b/locale/ja-jp/LC_MESSAGES/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: NPC\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-12-18 14:44+0900\n" +"POT-Creation-Date: 2023-04-29 23:44+0900\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,12 +17,28 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: AppBase.py:45 +#: app.py:82 views\main.py:677 +msgid "" +"設定の保存に失敗しました。下記のファイルへのアクセスが可能であることを確認し" +"てください。" +msgstr "" + +#: AppBase.py:48 msgid "" "ログ機能の初期化に失敗しました。下記のファイルへのアクセスが可能であることを" "確認してください。" msgstr "" +#: AppBase.py:57 +msgid "音声エンジンエラー" +msgstr "" + +#: AppBase.py:57 +msgid "" +"音声読み上げ機能の初期化に失敗したため、読み上げ機能を使用できません。出力先" +"の変更をお試しください。" +msgstr "" + #: keymapHandlerBase.py:696 keymapHandlerBase.py:726 #, python-format msgid "%s は存在しないキーです。" @@ -97,8 +113,8 @@ msgstr "" msgid "登録済みユーザリスト(&L)" msgstr "" -#: menuItemsDic.py:24 views\main.py:290 -msgid "Twitterのフォローリストから一括登録" +#: menuItemsDic.py:24 views\main.py:308 +msgid "ユーザの一括追加" msgstr "" #: menuItemsDic.py:25 @@ -179,21 +195,6 @@ msgstr "" msgid "列の並び替え(&R)" msgstr "" -#: twitterService.py:36 -msgid "" -"認証に成功しました。このウィンドウを閉じて、アプリケーションに戻ってくださ" -"い。" -msgstr "" - -#: twitterService.py:37 -msgid "認証に失敗しました。もう一度お試しください。" -msgstr "" - -#: twitterService.py:38 -msgid "" -"しばらくしても画面が切り替わらない場合は、別のブラウザでお試しください。" -msgstr "" - #: update.py:50 update.py:59 update.py:73 update.py:79 update.py:90 #: update.py:98 update.py:103 update.py:108 update.py:160 #: views\updateDialog.py:39 @@ -274,7 +275,7 @@ msgid "受信しない" msgstr "" #: views\accountSettingsDialog.py:34 views\globalKeyConfig.py:75 -#: views\settingsDialog.py:61 +#: views\settingsDialog.py:57 msgid "設定" msgstr "" @@ -318,19 +319,19 @@ msgstr "" msgid "アーカイブ済みの質問" msgstr "" -#: views\answerDialog.py:87 +#: views\answerDialog.py:90 msgid "回答の入力" msgstr "" -#: views\answerDialog.py:93 +#: views\answerDialog.py:96 msgid "回答完了" msgstr "" -#: views\answerDialog.py:93 +#: views\answerDialog.py:96 msgid "回答が送信されました。" msgstr "" -#: views\answerDialog.py:96 +#: views\answerDialog.py:99 msgid "" "指定された質問が存在しないか、通信に失敗しました。以下の対処をお試しくださ" "い。\n" @@ -342,11 +343,11 @@ msgid "" "・問題が解決しない場合、開発者までお問い合わせください。" msgstr "" -#: views\answerDialog.py:100 +#: views\answerDialog.py:103 msgid "質問をアーカイブ" msgstr "" -#: views\answerDialog.py:100 +#: views\answerDialog.py:103 #, python-format msgid "" "以下の質問をアーカイブしますか?\n" @@ -354,11 +355,11 @@ msgid "" "%s" msgstr "" -#: views\answerDialog.py:108 +#: views\answerDialog.py:111 msgid "質問を元に戻す" msgstr "" -#: views\answerDialog.py:108 +#: views\answerDialog.py:111 #, python-format msgid "" "以下の質問を元に戻しますか?\n" @@ -408,12 +409,12 @@ msgstr "" #: views\candidateUserListDialog.py:48 views\KeyValueSettingDialogBase.py:84 #: views\KeyValueSettingDialogBase.py:275 views\listConfigurationDialog.py:60 -#: views\searchConditionDialog.py:38 views\settingsDialog.py:115 -#: views\SimpleInputDialog.py:40 views\updateDialog.py:45 +#: views\searchConditionDialog.py:38 views\settingsDialog.py:110 +#: views\SimpleInputDialog.py:56 views\updateDialog.py:45 msgid "キャンセル" msgstr "" -#: views\candidateUserListDialog.py:63 views\main.py:240 +#: views\candidateUserListDialog.py:63 views\main.py:239 #: views\userListDialog.py:79 msgid "ユーザの削除" msgstr "" @@ -464,7 +465,7 @@ msgstr "" msgid "識別子" msgstr "" -#: views\globalKeyConfig.py:31 views\main.py:489 +#: views\globalKeyConfig.py:31 views\main.py:475 msgid "ショートカットキーの設定" msgstr "" @@ -473,7 +474,7 @@ msgstr "" #: views\globalKeyConfig.py:120 views\globalKeyConfig.py:128 #: views\globalKeyConfig.py:138 views\globalKeyConfig.py:143 #: views\keyConfig.py:57 views\KeyValueSettingDialogBase.py:333 -#: views\main.py:667 views\main.py:680 +#: views\main.py:659 views\main.py:672 msgid "なし" msgstr "" @@ -513,7 +514,7 @@ msgstr "" msgid "このショートカットは変更できません。" msgstr "" -#: views\globalKeyConfig.py:127 views\globalKeyConfig.py:130 views\main.py:477 +#: views\globalKeyConfig.py:127 views\globalKeyConfig.py:130 views\main.py:463 msgid "設定完了" msgstr "" @@ -558,7 +559,7 @@ msgstr "" #: views\KeyValueSettingDialogBase.py:83 views\KeyValueSettingDialogBase.py:274 #: views\listConfigurationDialog.py:59 views\searchConditionDialog.py:37 -#: views\SimpleInputDialog.py:39 +#: views\SimpleInputDialog.py:55 msgid "OK" msgstr "" @@ -632,43 +633,39 @@ msgstr "" msgid "全ての列を非表示にすることはできません。" msgstr "" -#: views\main.py:181 +#: views\main.py:184 msgid "ファイル(&F)" msgstr "" -#: views\main.py:182 +#: views\main.py:185 msgid "フィルタ(&I)" msgstr "" -#: views\main.py:183 +#: views\main.py:186 msgid "アカウント(&A)" msgstr "" -#: views\main.py:184 +#: views\main.py:187 msgid "オプション(&O)" msgstr "" -#: views\main.py:185 +#: views\main.py:188 msgid "ヘルプ(&H)" msgstr "" -#: views\main.py:199 +#: views\main.py:202 msgid "ユーザの追加" msgstr "" -#: views\main.py:199 +#: views\main.py:202 msgid "peingページURLまたはTwitterユーザ名" msgstr "" -#: views\main.py:211 -msgid "指定されたユーザは既に登録済みです。" -msgstr "" - -#: views\main.py:218 +#: views\main.py:216 msgid "ユーザ追加" msgstr "" -#: views\main.py:218 +#: views\main.py:216 #, python-format msgid "" "以下のユーザを追加しますか?\n" @@ -677,21 +674,17 @@ msgid "" "%(name)s(%(account)s)" msgstr "" -#: views\main.py:222 views\main.py:379 +#: views\main.py:221 views\main.py:365 msgid "登録完了" msgstr "" -#: views\main.py:222 +#: views\main.py:221 msgid "" "ユーザの登録に成功しました。今回登録したユーザの回答を表示するには、ビューを" "再読み込みしてください。" msgstr "" -#: views\main.py:225 -msgid "ユーザの登録に失敗しました。" -msgstr "" - -#: views\main.py:240 views\userListDialog.py:79 +#: views\main.py:239 views\userListDialog.py:79 #, python-format msgid "" "以下のユーザの登録と、過去の回答履歴を削除しますか?\n" @@ -699,78 +692,42 @@ msgid "" "%s" msgstr "" -#: views\main.py:253 +#: views\main.py:252 msgid "" "このユーザは既に退会したか、peingIDを変更しているため開くことができません。" msgstr "" -#: views\main.py:271 +#: views\main.py:270 msgid "出力先ファイルの指定" msgstr "" -#: views\main.py:271 +#: views\main.py:270 msgid "CSVファイル(*.csv) | *.csv; | すべてのファイル(*.*) | *.*" msgstr "" #: views\main.py:290 -msgid "Twitterアカウントの認証のため、ブラウザの操作を待っています。" -msgstr "" - -#: views\main.py:297 -msgid "" -"Twitterの認証に失敗しました。ブラウザ上で認証を拒否した、時間がかかりすぎた、" -"またはインターネット接続に問題がある可能性があります。" -msgstr "" - -#: views\main.py:303 msgid "対象ユーザの指定" msgstr "" -#: views\main.py:303 +#: views\main.py:291 msgid "" -"フォロー中のユーザを取得するアカウントの@からはじまるアカウント名を入力してく" -"ださい。\n" -"後悔アカウント、認証に用いたアカウント、\n" -"または認証に用いたアカウントがフォローしている非公開アカウントを指定できま" -"す。" +"対象アカウントの@からはじまるアカウント名を、\n" +"改行区切りで入力してください。" msgstr "" -#: views\main.py:314 -msgid "フォローリストを取得しています。" -msgstr "" - -#: views\main.py:318 -msgid "" -"Twitterからフォローリストを取得できませんでした。指定したユーザが存在しない" -"か、フォローしていない非公開アカウントである可能性があります。" -msgstr "" - -#: views\main.py:320 -msgid "" -"Twitterからフォローリストを取得できませんでした。しばらくたってから再度お試し" -"ください。状況が改善しない場合には、開発者までお問い合わせください。" -msgstr "" - -#: views\main.py:325 -msgid "" -"Twitterからフォローリストを取得できませんでした。まだ誰もフォローしていないア" -"カウントであるか、通信回数の上限に達しています。後者の場合には、15分以上待っ" -"てから再度お試しください。" -msgstr "" - -#: views\main.py:328 +#: views\main.py:308 msgid "登録済みユーザのリストを取得しています。" msgstr "" -#: views\main.py:340 +#: views\main.py:326 msgid "Peingへの登録状況を調べています。" msgstr "" -#: views\main.py:354 +#: views\main.py:340 msgid "通信エラー" msgstr "" -#: views\main.py:354 +#: views\main.py:340 msgid "" "Peingとの通信でエラーが発生しました。インターネット接続を確認し、しばらくたっ" "てから再度お試しください。状況が改善しない場合は、Twitterでのフォロー数が多す" @@ -780,25 +737,25 @@ msgid "" "あれば一覧が表示されます。" msgstr "" -#: views\main.py:359 +#: views\main.py:345 msgid "処理終了" msgstr "" -#: views\main.py:359 +#: views\main.py:345 msgid "一括登録を試みましたが、登録の候補となるユーザが見つかりませんでした。" msgstr "" -#: views\main.py:374 +#: views\main.py:360 msgid "指定されたユーザを登録しています。" msgstr "" -#: views\main.py:379 +#: views\main.py:365 msgid "" "ユーザの一括登録に成功しました。今回登録したユーザの回答を表示するには、" "ビューを再読み込みしてください。" msgstr "" -#: views\main.py:445 views\main.py:454 views\main.py:463 +#: views\main.py:431 views\main.py:440 views\main.py:449 msgid "" "質問の取得に失敗しました。以下の対処をお試しください。\n" "\n" @@ -807,7 +764,7 @@ msgid "" "・問題が解決しない場合、開発者までお問い合わせください。" msgstr "" -#: views\main.py:473 +#: views\main.py:459 msgid "" "ログインまたはアカウント設定の取得に失敗しました。以下の対処をお試しくださ" "い。\n" @@ -819,23 +776,23 @@ msgid "" "・問題が解決しない場合、開発者までお問い合わせください。" msgstr "" -#: views\main.py:477 +#: views\main.py:463 msgid "設定しました。" msgstr "" -#: views\main.py:548 +#: views\main.py:534 msgid "準備中" msgstr "" -#: views\main.py:548 +#: views\main.py:534 msgid "回答データを取得しています" msgstr "" -#: views\main.py:568 +#: views\main.py:554 msgid "登録ユーザの更新除外について" msgstr "" -#: views\main.py:568 +#: views\main.py:554 #, python-format msgid "" "登録していた以下のユーザは、アカウント名が変更されたか、削除されました。その" @@ -847,24 +804,24 @@ msgid "" "該当ユーザ:%s" msgstr "" -#: views\main.py:593 +#: views\main.py:582 msgid "質問を投稿" msgstr "" -#: views\main.py:593 +#: views\main.py:582 #, python-format msgid "%sさんへの質問内容" msgstr "" -#: views\main.py:605 +#: views\main.py:594 msgid "投稿完了" msgstr "" -#: views\main.py:605 +#: views\main.py:594 msgid "質問を投稿しました。" msgstr "" -#: views\main.py:620 +#: views\main.py:609 msgid "" "指定されたユーザが存在しないか、通信に失敗しました。以下の対処をお試しくださ" "い。\n" @@ -875,13 +832,13 @@ msgid "" "・問題が解決しない場合、開発者までお問い合わせください。" msgstr "" -#: views\main.py:622 +#: views\main.py:611 msgid "" "Twitterとの通信でエラーが発生しました。指定したユーザ名が間違っているか、イン" "ターネット接続に問題が発生した可能性があります。" msgstr "" -#: views\main.py:624 +#: views\main.py:613 msgid "" "ログインに失敗しました。設定されたアカウント情報に誤りがあります。\n" "\n" @@ -891,13 +848,13 @@ msgid "" "このメッセージと使用したIDの種類を添えて開発者までお問い合わせください。\n" msgstr "" -#: views\main.py:626 +#: views\main.py:615 msgid "" "ログインに失敗しました。ログインに際して権限の認可が要求されています。同じID" "でブラウザからログインした後、再度お試しください。" msgstr "" -#: views\main.py:628 +#: views\main.py:617 msgid "" "ログインに失敗しました。Peingのサーバやお使いのインターネット接続に障害が発生" "している可能性があります。ブラウザから同じIDでログインできるか確認してくださ" @@ -906,7 +863,7 @@ msgid "" "で、このメッセージと利用したIDの種類を添えて開発者までお問い合わせください。" msgstr "" -#: views\main.py:630 +#: views\main.py:619 msgid "" "ログインに失敗しました。Twitterのサーバやお使いのインターネット接続に障害が発" "生している可能性があります。ブラウザから同じIDでログインできるか確認してくだ" @@ -915,7 +872,7 @@ msgid "" "で、このメッセージと利用したIDの種類を添えて開発者までお問い合わせください。" msgstr "" -#: views\main.py:632 +#: views\main.py:621 msgid "" "不明なエラーの為、ログインに失敗しました。サイトの仕様変更や、お使いのイン" "ターネット接続の障害が考えられます。まずは、ブラウザから同じIDでログインでき" @@ -924,26 +881,40 @@ msgid "" "で、このメッセージと利用したIDの種類を添えて開発者までお問い合わせください。" msgstr "" -#: views\main.py:634 +#: views\main.py:623 msgid "" "ログインに失敗しました。ログインに際してRECAPTCHA(ロボットでないことの確認)が" "要求されています。同じIDでブラウザからログインした後、再度お試しください。" msgstr "" -#: views\main.py:636 +#: views\main.py:625 +msgid "指定されたユーザは既に登録済みです。" +msgstr "" + +#: views\main.py:627 #, python-format msgid "" "不明なエラー%(code)dが発生しました。大変お手数ですが、本ソフトの実行ファイル" "のあるディレクトリに生成された%(log)sを添付し、作者までご連絡ください。" msgstr "" -#: views\main.py:691 +#: views\main.py:684 msgid "" "この機能を利用するには、ログインが必要です。\n" "[オプション]→[設定]にて、アカウント情報を設定してください。詳細は、readme.txt" "をご確認ください。" msgstr "" +#: views\main.py:700 +#, python-format +msgid "%d個中%d個目を選択中" +msgstr "" + +#: views\main.py:702 +#, python-format +msgid "%d個表示中、選択項目なし" +msgstr "" + #: views\progress.py:35 msgid "中止(&C)" msgstr "" @@ -988,107 +959,120 @@ msgstr "" msgid "詳細を表示(&D)" msgstr "" -#: views\settingsDialog.py:46 +#: views\settingsDialog.py:42 msgid "標準" msgstr "" -#: views\settingsDialog.py:47 +#: views\settingsDialog.py:43 msgid "ダーク" msgstr "" -#: views\settingsDialog.py:50 +#: views\settingsDialog.py:46 msgid "画面幅で折り返し" msgstr "" -#: views\settingsDialog.py:51 +#: views\settingsDialog.py:47 msgid "折り返さない" msgstr "" -#: views\settingsDialog.py:72 +#: views\settingsDialog.py:68 msgid "カテゴリ選択" msgstr "" -#: views\settingsDialog.py:75 +#: views\settingsDialog.py:71 msgid "一般" msgstr "" -#: views\settingsDialog.py:76 +#: views\settingsDialog.py:72 msgid "起動時に最新の情報を取得する" msgstr "" -#: views\settingsDialog.py:78 +#: views\settingsDialog.py:74 msgid "次回起動時にフィルタの状況を維持" msgstr "" -#: views\settingsDialog.py:80 +#: views\settingsDialog.py:76 msgid "次回起動時にカーソルの位置を復元" msgstr "" -#: views\settingsDialog.py:82 +#: views\settingsDialog.py:78 msgid "ログ記録レベル(&L)" msgstr "" -#: views\settingsDialog.py:86 +#: views\settingsDialog.py:82 msgid "ログイン" msgstr "" -#: views\settingsDialog.py:87 -msgid "利用するIDの種類" -msgstr "" - -#: views\settingsDialog.py:90 +#: views\settingsDialog.py:85 msgid "パスワード(&P)" msgstr "" -#: views\settingsDialog.py:92 +#: views\settingsDialog.py:87 msgid "ログインした状態で質問する" msgstr "" -#: views\settingsDialog.py:99 +#: views\settingsDialog.py:91 msgid "表示/言語" msgstr "" -#: views\settingsDialog.py:100 +#: views\settingsDialog.py:92 msgid "言語(&L)" msgstr "" -#: views\settingsDialog.py:101 +#: views\settingsDialog.py:93 msgid "画面表示モード(&D)" msgstr "" -#: views\settingsDialog.py:102 +#: views\settingsDialog.py:94 msgid "テキストの折り返し(&W)" msgstr "" -#: views\settingsDialog.py:105 +#: views\settingsDialog.py:95 +msgid "複数行の質問・回答を入力可能にする" +msgstr "" + +#: views\settingsDialog.py:100 msgid "ネットワーク" msgstr "" -#: views\settingsDialog.py:106 +#: views\settingsDialog.py:101 msgid "起動時に更新を確認(&U)" msgstr "" -#: views\settingsDialog.py:107 +#: views\settingsDialog.py:102 msgid "プロキシサーバーの情報を手動で設定する(&M)" msgstr "" -#: views\settingsDialog.py:108 +#: views\settingsDialog.py:103 msgid "サーバーURL" msgstr "" -#: views\settingsDialog.py:110 +#: views\settingsDialog.py:105 msgid "ポート番号" msgstr "" -#: views\settingsDialog.py:145 +#: views\settingsDialog.py:140 msgid "IDとPWは両方を入力するか、両方を空欄としてください。" msgstr "" -#: views\settingsDialog.py:149 +#: views\settingsDialog.py:144 msgid "" "ログインした状態で質問をする場合には、IDとパスワードを入力してください。" msgstr "" +#: views\SimpleInputDialog.py:87 views\SimpleInputDialog.py:96 +msgid "入力内容に誤りがあります。" +msgstr "" + +#: views\SimpleInputDialog.py:87 +#, python-format +msgid "行: %d" +msgstr "" + +#: views\SimpleInputDialog.py:92 +msgid "有効な値が入力されていません。" +msgstr "" + #: views\updateDialog.py:23 #, python-format msgid "アップデート - %s" diff --git a/locale/messages.po b/locale/messages.po index f25e2f9..a07ff4c 100644 --- a/locale/messages.po +++ b/locale/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: NPC\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-12-18 14:44+0900\n" +"POT-Creation-Date: 2023-04-29 23:44+0900\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,12 +17,28 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: AppBase.py:45 +#: app.py:82 views\main.py:677 +msgid "" +"設定の保存に失敗しました。下記のファイルへのアクセスが可能であることを確認し" +"てください。" +msgstr "" + +#: AppBase.py:48 msgid "" "ログ機能の初期化に失敗しました。下記のファイルへのアクセスが可能であることを" "確認してください。" msgstr "" +#: AppBase.py:57 +msgid "音声エンジンエラー" +msgstr "" + +#: AppBase.py:57 +msgid "" +"音声読み上げ機能の初期化に失敗したため、読み上げ機能を使用できません。出力先" +"の変更をお試しください。" +msgstr "" + #: keymapHandlerBase.py:696 keymapHandlerBase.py:726 #, python-format msgid "%s は存在しないキーです。" @@ -97,8 +113,8 @@ msgstr "" msgid "登録済みユーザリスト(&L)" msgstr "" -#: menuItemsDic.py:24 views\main.py:290 -msgid "Twitterのフォローリストから一括登録" +#: menuItemsDic.py:24 views\main.py:308 +msgid "ユーザの一括追加" msgstr "" #: menuItemsDic.py:25 @@ -179,21 +195,6 @@ msgstr "" msgid "列の並び替え(&R)" msgstr "" -#: twitterService.py:36 -msgid "" -"認証に成功しました。このウィンドウを閉じて、アプリケーションに戻ってくださ" -"い。" -msgstr "" - -#: twitterService.py:37 -msgid "認証に失敗しました。もう一度お試しください。" -msgstr "" - -#: twitterService.py:38 -msgid "" -"しばらくしても画面が切り替わらない場合は、別のブラウザでお試しください。" -msgstr "" - #: update.py:50 update.py:59 update.py:73 update.py:79 update.py:90 #: update.py:98 update.py:103 update.py:108 update.py:160 #: views\updateDialog.py:39 @@ -274,7 +275,7 @@ msgid "受信しない" msgstr "" #: views\accountSettingsDialog.py:34 views\globalKeyConfig.py:75 -#: views\settingsDialog.py:61 +#: views\settingsDialog.py:57 msgid "設定" msgstr "" @@ -318,19 +319,19 @@ msgstr "" msgid "アーカイブ済みの質問" msgstr "" -#: views\answerDialog.py:87 +#: views\answerDialog.py:90 msgid "回答の入力" msgstr "" -#: views\answerDialog.py:93 +#: views\answerDialog.py:96 msgid "回答完了" msgstr "" -#: views\answerDialog.py:93 +#: views\answerDialog.py:96 msgid "回答が送信されました。" msgstr "" -#: views\answerDialog.py:96 +#: views\answerDialog.py:99 msgid "" "指定された質問が存在しないか、通信に失敗しました。以下の対処をお試しくださ" "い。\n" @@ -342,11 +343,11 @@ msgid "" "・問題が解決しない場合、開発者までお問い合わせください。" msgstr "" -#: views\answerDialog.py:100 +#: views\answerDialog.py:103 msgid "質問をアーカイブ" msgstr "" -#: views\answerDialog.py:100 +#: views\answerDialog.py:103 #, python-format msgid "" "以下の質問をアーカイブしますか?\n" @@ -354,11 +355,11 @@ msgid "" "%s" msgstr "" -#: views\answerDialog.py:108 +#: views\answerDialog.py:111 msgid "質問を元に戻す" msgstr "" -#: views\answerDialog.py:108 +#: views\answerDialog.py:111 #, python-format msgid "" "以下の質問を元に戻しますか?\n" @@ -408,12 +409,12 @@ msgstr "" #: views\candidateUserListDialog.py:48 views\KeyValueSettingDialogBase.py:84 #: views\KeyValueSettingDialogBase.py:275 views\listConfigurationDialog.py:60 -#: views\searchConditionDialog.py:38 views\settingsDialog.py:115 -#: views\SimpleInputDialog.py:40 views\updateDialog.py:45 +#: views\searchConditionDialog.py:38 views\settingsDialog.py:110 +#: views\SimpleInputDialog.py:56 views\updateDialog.py:45 msgid "キャンセル" msgstr "" -#: views\candidateUserListDialog.py:63 views\main.py:240 +#: views\candidateUserListDialog.py:63 views\main.py:239 #: views\userListDialog.py:79 msgid "ユーザの削除" msgstr "" @@ -464,7 +465,7 @@ msgstr "" msgid "識別子" msgstr "" -#: views\globalKeyConfig.py:31 views\main.py:489 +#: views\globalKeyConfig.py:31 views\main.py:475 msgid "ショートカットキーの設定" msgstr "" @@ -473,7 +474,7 @@ msgstr "" #: views\globalKeyConfig.py:120 views\globalKeyConfig.py:128 #: views\globalKeyConfig.py:138 views\globalKeyConfig.py:143 #: views\keyConfig.py:57 views\KeyValueSettingDialogBase.py:333 -#: views\main.py:667 views\main.py:680 +#: views\main.py:659 views\main.py:672 msgid "なし" msgstr "" @@ -513,7 +514,7 @@ msgstr "" msgid "このショートカットは変更できません。" msgstr "" -#: views\globalKeyConfig.py:127 views\globalKeyConfig.py:130 views\main.py:477 +#: views\globalKeyConfig.py:127 views\globalKeyConfig.py:130 views\main.py:463 msgid "設定完了" msgstr "" @@ -558,7 +559,7 @@ msgstr "" #: views\KeyValueSettingDialogBase.py:83 views\KeyValueSettingDialogBase.py:274 #: views\listConfigurationDialog.py:59 views\searchConditionDialog.py:37 -#: views\SimpleInputDialog.py:39 +#: views\SimpleInputDialog.py:55 msgid "OK" msgstr "" @@ -632,43 +633,39 @@ msgstr "" msgid "全ての列を非表示にすることはできません。" msgstr "" -#: views\main.py:181 +#: views\main.py:184 msgid "ファイル(&F)" msgstr "" -#: views\main.py:182 +#: views\main.py:185 msgid "フィルタ(&I)" msgstr "" -#: views\main.py:183 +#: views\main.py:186 msgid "アカウント(&A)" msgstr "" -#: views\main.py:184 +#: views\main.py:187 msgid "オプション(&O)" msgstr "" -#: views\main.py:185 +#: views\main.py:188 msgid "ヘルプ(&H)" msgstr "" -#: views\main.py:199 +#: views\main.py:202 msgid "ユーザの追加" msgstr "" -#: views\main.py:199 +#: views\main.py:202 msgid "peingページURLまたはTwitterユーザ名" msgstr "" -#: views\main.py:211 -msgid "指定されたユーザは既に登録済みです。" -msgstr "" - -#: views\main.py:218 +#: views\main.py:216 msgid "ユーザ追加" msgstr "" -#: views\main.py:218 +#: views\main.py:216 #, python-format msgid "" "以下のユーザを追加しますか?\n" @@ -677,21 +674,17 @@ msgid "" "%(name)s(%(account)s)" msgstr "" -#: views\main.py:222 views\main.py:379 +#: views\main.py:221 views\main.py:365 msgid "登録完了" msgstr "" -#: views\main.py:222 +#: views\main.py:221 msgid "" "ユーザの登録に成功しました。今回登録したユーザの回答を表示するには、ビューを" "再読み込みしてください。" msgstr "" -#: views\main.py:225 -msgid "ユーザの登録に失敗しました。" -msgstr "" - -#: views\main.py:240 views\userListDialog.py:79 +#: views\main.py:239 views\userListDialog.py:79 #, python-format msgid "" "以下のユーザの登録と、過去の回答履歴を削除しますか?\n" @@ -699,78 +692,42 @@ msgid "" "%s" msgstr "" -#: views\main.py:253 +#: views\main.py:252 msgid "" "このユーザは既に退会したか、peingIDを変更しているため開くことができません。" msgstr "" -#: views\main.py:271 +#: views\main.py:270 msgid "出力先ファイルの指定" msgstr "" -#: views\main.py:271 +#: views\main.py:270 msgid "CSVファイル(*.csv) | *.csv; | すべてのファイル(*.*) | *.*" msgstr "" #: views\main.py:290 -msgid "Twitterアカウントの認証のため、ブラウザの操作を待っています。" -msgstr "" - -#: views\main.py:297 -msgid "" -"Twitterの認証に失敗しました。ブラウザ上で認証を拒否した、時間がかかりすぎた、" -"またはインターネット接続に問題がある可能性があります。" -msgstr "" - -#: views\main.py:303 msgid "対象ユーザの指定" msgstr "" -#: views\main.py:303 +#: views\main.py:291 msgid "" -"フォロー中のユーザを取得するアカウントの@からはじまるアカウント名を入力してく" -"ださい。\n" -"後悔アカウント、認証に用いたアカウント、\n" -"または認証に用いたアカウントがフォローしている非公開アカウントを指定できま" -"す。" +"対象アカウントの@からはじまるアカウント名を、\n" +"改行区切りで入力してください。" msgstr "" -#: views\main.py:314 -msgid "フォローリストを取得しています。" -msgstr "" - -#: views\main.py:318 -msgid "" -"Twitterからフォローリストを取得できませんでした。指定したユーザが存在しない" -"か、フォローしていない非公開アカウントである可能性があります。" -msgstr "" - -#: views\main.py:320 -msgid "" -"Twitterからフォローリストを取得できませんでした。しばらくたってから再度お試し" -"ください。状況が改善しない場合には、開発者までお問い合わせください。" -msgstr "" - -#: views\main.py:325 -msgid "" -"Twitterからフォローリストを取得できませんでした。まだ誰もフォローしていないア" -"カウントであるか、通信回数の上限に達しています。後者の場合には、15分以上待っ" -"てから再度お試しください。" -msgstr "" - -#: views\main.py:328 +#: views\main.py:308 msgid "登録済みユーザのリストを取得しています。" msgstr "" -#: views\main.py:340 +#: views\main.py:326 msgid "Peingへの登録状況を調べています。" msgstr "" -#: views\main.py:354 +#: views\main.py:340 msgid "通信エラー" msgstr "" -#: views\main.py:354 +#: views\main.py:340 msgid "" "Peingとの通信でエラーが発生しました。インターネット接続を確認し、しばらくたっ" "てから再度お試しください。状況が改善しない場合は、Twitterでのフォロー数が多す" @@ -780,25 +737,25 @@ msgid "" "あれば一覧が表示されます。" msgstr "" -#: views\main.py:359 +#: views\main.py:345 msgid "処理終了" msgstr "" -#: views\main.py:359 +#: views\main.py:345 msgid "一括登録を試みましたが、登録の候補となるユーザが見つかりませんでした。" msgstr "" -#: views\main.py:374 +#: views\main.py:360 msgid "指定されたユーザを登録しています。" msgstr "" -#: views\main.py:379 +#: views\main.py:365 msgid "" "ユーザの一括登録に成功しました。今回登録したユーザの回答を表示するには、" "ビューを再読み込みしてください。" msgstr "" -#: views\main.py:445 views\main.py:454 views\main.py:463 +#: views\main.py:431 views\main.py:440 views\main.py:449 msgid "" "質問の取得に失敗しました。以下の対処をお試しください。\n" "\n" @@ -807,7 +764,7 @@ msgid "" "・問題が解決しない場合、開発者までお問い合わせください。" msgstr "" -#: views\main.py:473 +#: views\main.py:459 msgid "" "ログインまたはアカウント設定の取得に失敗しました。以下の対処をお試しくださ" "い。\n" @@ -819,23 +776,23 @@ msgid "" "・問題が解決しない場合、開発者までお問い合わせください。" msgstr "" -#: views\main.py:477 +#: views\main.py:463 msgid "設定しました。" msgstr "" -#: views\main.py:548 +#: views\main.py:534 msgid "準備中" msgstr "" -#: views\main.py:548 +#: views\main.py:534 msgid "回答データを取得しています" msgstr "" -#: views\main.py:568 +#: views\main.py:554 msgid "登録ユーザの更新除外について" msgstr "" -#: views\main.py:568 +#: views\main.py:554 #, python-format msgid "" "登録していた以下のユーザは、アカウント名が変更されたか、削除されました。その" @@ -847,24 +804,24 @@ msgid "" "該当ユーザ:%s" msgstr "" -#: views\main.py:593 +#: views\main.py:582 msgid "質問を投稿" msgstr "" -#: views\main.py:593 +#: views\main.py:582 #, python-format msgid "%sさんへの質問内容" msgstr "" -#: views\main.py:605 +#: views\main.py:594 msgid "投稿完了" msgstr "" -#: views\main.py:605 +#: views\main.py:594 msgid "質問を投稿しました。" msgstr "" -#: views\main.py:620 +#: views\main.py:609 msgid "" "指定されたユーザが存在しないか、通信に失敗しました。以下の対処をお試しくださ" "い。\n" @@ -875,13 +832,13 @@ msgid "" "・問題が解決しない場合、開発者までお問い合わせください。" msgstr "" -#: views\main.py:622 +#: views\main.py:611 msgid "" "Twitterとの通信でエラーが発生しました。指定したユーザ名が間違っているか、イン" "ターネット接続に問題が発生した可能性があります。" msgstr "" -#: views\main.py:624 +#: views\main.py:613 msgid "" "ログインに失敗しました。設定されたアカウント情報に誤りがあります。\n" "\n" @@ -891,13 +848,13 @@ msgid "" "このメッセージと使用したIDの種類を添えて開発者までお問い合わせください。\n" msgstr "" -#: views\main.py:626 +#: views\main.py:615 msgid "" "ログインに失敗しました。ログインに際して権限の認可が要求されています。同じID" "でブラウザからログインした後、再度お試しください。" msgstr "" -#: views\main.py:628 +#: views\main.py:617 msgid "" "ログインに失敗しました。Peingのサーバやお使いのインターネット接続に障害が発生" "している可能性があります。ブラウザから同じIDでログインできるか確認してくださ" @@ -906,7 +863,7 @@ msgid "" "で、このメッセージと利用したIDの種類を添えて開発者までお問い合わせください。" msgstr "" -#: views\main.py:630 +#: views\main.py:619 msgid "" "ログインに失敗しました。Twitterのサーバやお使いのインターネット接続に障害が発" "生している可能性があります。ブラウザから同じIDでログインできるか確認してくだ" @@ -915,7 +872,7 @@ msgid "" "で、このメッセージと利用したIDの種類を添えて開発者までお問い合わせください。" msgstr "" -#: views\main.py:632 +#: views\main.py:621 msgid "" "不明なエラーの為、ログインに失敗しました。サイトの仕様変更や、お使いのイン" "ターネット接続の障害が考えられます。まずは、ブラウザから同じIDでログインでき" @@ -924,26 +881,40 @@ msgid "" "で、このメッセージと利用したIDの種類を添えて開発者までお問い合わせください。" msgstr "" -#: views\main.py:634 +#: views\main.py:623 msgid "" "ログインに失敗しました。ログインに際してRECAPTCHA(ロボットでないことの確認)が" "要求されています。同じIDでブラウザからログインした後、再度お試しください。" msgstr "" -#: views\main.py:636 +#: views\main.py:625 +msgid "指定されたユーザは既に登録済みです。" +msgstr "" + +#: views\main.py:627 #, python-format msgid "" "不明なエラー%(code)dが発生しました。大変お手数ですが、本ソフトの実行ファイル" "のあるディレクトリに生成された%(log)sを添付し、作者までご連絡ください。" msgstr "" -#: views\main.py:691 +#: views\main.py:684 msgid "" "この機能を利用するには、ログインが必要です。\n" "[オプション]→[設定]にて、アカウント情報を設定してください。詳細は、readme.txt" "をご確認ください。" msgstr "" +#: views\main.py:700 +#, python-format +msgid "%d個中%d個目を選択中" +msgstr "" + +#: views\main.py:702 +#, python-format +msgid "%d個表示中、選択項目なし" +msgstr "" + #: views\progress.py:35 msgid "中止(&C)" msgstr "" @@ -988,107 +959,120 @@ msgstr "" msgid "詳細を表示(&D)" msgstr "" -#: views\settingsDialog.py:46 +#: views\settingsDialog.py:42 msgid "標準" msgstr "" -#: views\settingsDialog.py:47 +#: views\settingsDialog.py:43 msgid "ダーク" msgstr "" -#: views\settingsDialog.py:50 +#: views\settingsDialog.py:46 msgid "画面幅で折り返し" msgstr "" -#: views\settingsDialog.py:51 +#: views\settingsDialog.py:47 msgid "折り返さない" msgstr "" -#: views\settingsDialog.py:72 +#: views\settingsDialog.py:68 msgid "カテゴリ選択" msgstr "" -#: views\settingsDialog.py:75 +#: views\settingsDialog.py:71 msgid "一般" msgstr "" -#: views\settingsDialog.py:76 +#: views\settingsDialog.py:72 msgid "起動時に最新の情報を取得する" msgstr "" -#: views\settingsDialog.py:78 +#: views\settingsDialog.py:74 msgid "次回起動時にフィルタの状況を維持" msgstr "" -#: views\settingsDialog.py:80 +#: views\settingsDialog.py:76 msgid "次回起動時にカーソルの位置を復元" msgstr "" -#: views\settingsDialog.py:82 +#: views\settingsDialog.py:78 msgid "ログ記録レベル(&L)" msgstr "" -#: views\settingsDialog.py:86 +#: views\settingsDialog.py:82 msgid "ログイン" msgstr "" -#: views\settingsDialog.py:87 -msgid "利用するIDの種類" -msgstr "" - -#: views\settingsDialog.py:90 +#: views\settingsDialog.py:85 msgid "パスワード(&P)" msgstr "" -#: views\settingsDialog.py:92 +#: views\settingsDialog.py:87 msgid "ログインした状態で質問する" msgstr "" -#: views\settingsDialog.py:99 +#: views\settingsDialog.py:91 msgid "表示/言語" msgstr "" -#: views\settingsDialog.py:100 +#: views\settingsDialog.py:92 msgid "言語(&L)" msgstr "" -#: views\settingsDialog.py:101 +#: views\settingsDialog.py:93 msgid "画面表示モード(&D)" msgstr "" -#: views\settingsDialog.py:102 +#: views\settingsDialog.py:94 msgid "テキストの折り返し(&W)" msgstr "" -#: views\settingsDialog.py:105 +#: views\settingsDialog.py:95 +msgid "複数行の質問・回答を入力可能にする" +msgstr "" + +#: views\settingsDialog.py:100 msgid "ネットワーク" msgstr "" -#: views\settingsDialog.py:106 +#: views\settingsDialog.py:101 msgid "起動時に更新を確認(&U)" msgstr "" -#: views\settingsDialog.py:107 +#: views\settingsDialog.py:102 msgid "プロキシサーバーの情報を手動で設定する(&M)" msgstr "" -#: views\settingsDialog.py:108 +#: views\settingsDialog.py:103 msgid "サーバーURL" msgstr "" -#: views\settingsDialog.py:110 +#: views\settingsDialog.py:105 msgid "ポート番号" msgstr "" -#: views\settingsDialog.py:145 +#: views\settingsDialog.py:140 msgid "IDとPWは両方を入力するか、両方を空欄としてください。" msgstr "" -#: views\settingsDialog.py:149 +#: views\settingsDialog.py:144 msgid "" "ログインした状態で質問をする場合には、IDとパスワードを入力してください。" msgstr "" +#: views\SimpleInputDialog.py:87 views\SimpleInputDialog.py:96 +msgid "入力内容に誤りがあります。" +msgstr "" + +#: views\SimpleInputDialog.py:87 +#, python-format +msgid "行: %d" +msgstr "" + +#: views\SimpleInputDialog.py:92 +msgid "有効な値が入力されていません。" +msgstr "" + #: views\updateDialog.py:23 #, python-format msgid "アップデート - %s" diff --git a/menuItemsDic.py b/menuItemsDic.py index 13cbced..4d2df34 100644 --- a/menuItemsDic.py +++ b/menuItemsDic.py @@ -21,7 +21,7 @@ def getValueString(ref_id): "FILE_EXPORT":_("表示中のリスト内容をCSVファイルにエクスポート(&E)"), "FILE_SHOW_USER_WEB":_("ブラウザでユーザのページを開く(&B)"), "FILE_USER_LIST":_("登録済みユーザリスト(&L)")+"...", - "FILE_ADD_USER_FROM_TWITTER_FOLLOW_LIST":_("Twitterのフォローリストから一括登録"), + "FILE_ADD_USER_FROM_TWITTER_FOLLOW_LIST":_("ユーザの一括追加"), "FILE_EXIT":_("終了(&X)"), "FILTER_AUTO_QUESTION":_("運営からの質問を非表示(&M)"), diff --git a/public/history.txt b/public/history.txt index 49c0197..9503a25 100644 --- a/public/history.txt +++ b/public/history.txt @@ -1,5 +1,11 @@ windows Native Peing Connector(NPC) 更新履歴 +2023/04/29 Version 1.4.0 +1. メインウィンドウにステータスバーを追加しました。表示中の質問の数と、現在のカーソル位置が表示されます。 +2. オプション設定に、複数行の質問・回答を入力可能にするかどうかの設定を追加しました。 +3. TwitterIDでのログイン機能を廃止しました。 +4. Twitterでフォローしているユーザーの一覧を基にアカウントを一括追加する機能を廃止し、代わりに複数アカウントをまとめて入力・追加できる機能をつけました。 + 2022/02/02 Version 1.3.2 1. リスト上の項目を選択していない状態でソフトウェアを終了しようとした場合、エラーとなってしまう不具合を修正しました。 diff --git a/public/readme.txt b/public/readme.txt index c16423e..7517d94 100644 --- a/public/readme.txt +++ b/public/readme.txt @@ -1,7 +1,7 @@ windows Native Peing Connector -NPC- - バージョン:  ver.1.3.2 - リリース:   2022-02-02 + バージョン:  ver.1.4.0 + リリース:   2023-04-29 開発・配布元: ACT Laboratory (https://actlab.org/) 主要開発者:  吹雪   ソフト種別:  オープンソースソフトウェア (GitHubリポジトリ:https://github.com/actlaboratory/NPC/) @@ -132,23 +132,9 @@ NPCからの回答の取得や質問の投稿がうまくいかない際には [絞り込み]エディットボックスにアカウント名または表示名の一部、もしくは@に続けてアカウント名の先頭部分を入力すると、表示するアカウントを絞り込むことができます。 リストビューの上でコンテキストメニューを表示すると、各ボタンと同じ操作を行うことができます。また、リスト上の2つのカラムの表示順序を入れ替えることができます。なお、この並び替えを行った際にPC-Talkerでの読み上げがおかしくなった場合は、一旦ダイアログを閉じてから開き直してください。リストの順序は保存されます。 -4.1.10 Twitterのフォローリストから一括登録 -短文投稿SNSのTwitterにおいて指定したユーザがフォローしているユーザのリストを取得し、リスト内のアカウントを回答の閲覧対象として追加登録します。 -この機能は、多くのユーザがTwitterからの連携によりPeingに登録し、PeingIDとTwitterのアカウント名が一致していることに着目して作られたものです。 -そのため、指定したアカウントがフォローしているユーザのPeingアカウントが登録されなかったり、逆に関係のないアカウントが登録されてしまったりする場合があります。 -登録前には最終確認のダイアログを表示しますので、必ず内容を確認してから実行してください。 - -この機能を利用するには、利用者がTwitterのアカウントを所有している必要があります。 -また、Twitterの通信制限の為、この機能を連続して利用する場合、必ず15分間以上時間を空ける必要があります。 - -この項目を選択すると、ブラウザが起動し、Twitterへのログインを求められます。 -ブラウザを操作し、TwitterのIDとパスワードを入力してください。 -もし、入力後に「このブラウザは現在サポートされていません。」という画面が表示された場合には、IDまたはパスワードが間違っていますので、[Alt+左カーソル]等の操作で前の画面に戻り、再度入力してください。 -入力に成功すると、NPCに対してアカウントの利用を許可するか否かを問う画面が表示されます。内容を確認後、許可の操作を行ってください。 -利用しているブラウザによっては、この後にセキュリティの警告などが2度程度表示される場合がありますが、問題のないものですので[はい]を押してください。 - -すべての操作が終了後、NPCに戻ると、[対象ユーザの指定]というダイアログボックスが表示されますので、フォローリストを取得したいユーザのアカウント(@guredora403のような半角英数と_のみで構成された@で始まる文字列)を入力し、[OK]を押してください。 -ここで指定できるアカウントは、先の手順でログインに用いたアカウント、公開アカウント、もしくは先の手順でログインに用いたアカウントからフォローしている非公開アカウントのいずれかであり、フォロー数が3,000未満のものに限られます。フォロー数3,000超のアカウントを指定した場合、リスト内の3,000件のみが取得されます。 +4.1.10 ユーザの一括追加 +複数のユーザを一括で追加することができます。 +画面の指示に従い、追加したいユーザのアカウントを下位行区切りで入力してください。 入力後は、リストの取得などのため、しばらく時間がかかります。 通信が完了すると、[登録候補ユーザの確認]ダイアログボックスが表示されます。ここには、指定したユーザがフォローしており、かつNPCに登録されていないアカウントが一覧表示されています。 @@ -260,13 +246,11 @@ NPCを起動すると、インストール先フォルダに「npc.log」とい ログイン機能の利用には、幾つかの注意事項があります。5.1の内容をお読みになったうえで使用してください。 4.4.1.2.1 利用するIDの種類 -Peingへのログインに用いるアカウントをTwitterIDまたはPeingIDから選択することができます。 -なお、両方のIDで同じアカウントにログインできる方は、動作速度や安定性の観点からPeingログインの設定を推奨します。 - +Peingへのログインに用いるアカウントをTwitterIDまたはPeingIDから選択することができる機能でしたが、TwitterIDでのログイン機能は廃止されました。 4.4.1.2.2 ID ログインが必要な機能を利用する際に用いるPeingアカウントのIDを設定します。 -前の項目で設定した種類のIDまたは登録メールアドレスを入力します。 +PeingIDまたは登録メールアドレスを入力します。 入力したIDを用いてPeingにログインしたことがある必要があります。NPCは初回ログインおよびIDの新規登録には利用できません。 なお、Twitterからの連携でPeingアカウントを作成した場合のPeingIDは、Twitterのアカウント名の先頭の@を消し、全ての英字を小文字にしたものとなります。 設定を解除する場合には、IDと次の項目で詳述するパスワードを両方とも空欄としてください。 @@ -274,7 +258,7 @@ Peingへのログインに用いるアカウントをTwitterIDまたはPeingID 4.4.1.2.3 パスワード IDと併せてPeingのログインに用いるパスワードを設定します。 なお、Twitterを含むSNSからの連携でPeingアカウントを作成した場合には、PeingIDのパスワードが設定されていない状態となります(2021年4月現在)。 -その場合には、ここで設定を行う前に、ウェブや公式アプリからPeingにログインしてパスワードの設定を行うか、Twitter連携で登録された場合にはTwitterIDによるログインをお試しください。 +その場合には、ここで設定を行う前に、ウェブや公式アプリからPeingにログインしてパスワードの設定を行ってください。 設定を解除する場合には、IDとパスワードを両方とも空欄としてください。 4.4.1.2.4 ログインした状態で質問する @@ -302,6 +286,11 @@ NPCの表示に使用する言語を設定します。 [画面幅で折り返し]を選択すると、画面幅に合わせて折り返しが行われます。 規定では[折り返さない]に設定されています。 +4.4.1.3.4 複数行の質問・回答を入力可能にする +質問の投稿、届いた質問への回答時に、複数行の入力を可能にするかどうかを設定します。 +この設定をチェックした場合、入力欄でEnterキーを押すことで、改行を挿入できるようになります。 +規定ではチェックされていません。 + 4.4.1.4 ネットワーク NPCの自動更新や、Peingとの通信にプロキシサーバーを使用する場合に必要な設定を行います。 diff --git a/requirements.txt b/requirements.txt index 14950bb..7aa18e8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,11 +1,11 @@ -wxpython>=4.1 +wxpython==4.1 pywin32 winpaths -pyinstaller>=4 +pyinstaller==5.3 pyperclip requests bs4 lxml https://github.com/actlaboratory/proxyutil/archive/0.2.4.zip https://github.com/actlaboratory/diff_archiver/archive/v1.0.1.zip -https://github.com/actlaboratory/twitter-authorization/archive/1.0.2.zip +https://github.com/actlaboratory/twitter-authorization/archive/2.0.2.zip diff --git a/service.py b/service.py index 4593e2e..84385ad 100644 --- a/service.py +++ b/service.py @@ -8,7 +8,6 @@ import errorCodes import entity.user import entity.answer -import twitterLogin import peing import views.main @@ -288,23 +287,7 @@ def login(self,idType,id,pw,force=False): self.log.error(e) return errorCodes.LOGIN_PEING_ERROR else: - try: - self.log.info("login with twitter") - session = twitterLogin.login(id,pw) - if type(session) == int: - self.log.error("login failed. code="+str(session)) - return session - self.log.debug("try to get userId") - self.selfId = self.getSelfId(session) - if type(self.selfId)!=str: - self.log.error("getSelfId() failed. code="+str(self.selfId)) - return self.selfId - self.log.info("twitter login succeseeded:"+self.selfId) - self.session = session - return errorCodes.OK - except Exception as e: - self.log.error(e) - return errorCodes.LOGIN_UNKNOWN_ERROR + return errorCodes.LOGIN_UNKNOWN_ERROR def getSelfId(self,session): try: diff --git a/twitterLogin.py b/twitterLogin.py deleted file mode 100644 index 04b67af..0000000 --- a/twitterLogin.py +++ /dev/null @@ -1,65 +0,0 @@ -# NPC Twitter login module -# Copyright (C) 2021 yamahubuki - -import errorCodes - -import requests -import urllib.parse - -from bs4 import BeautifulSoup - - -def getToken(session): - page = session.get("https://peing.net/ja/",timeout=5,verify=False) - soup = BeautifulSoup(page.content, "lxml") - form = soup.find("form", {"action":"/auth/twitter"}) - ret = form.find("input", {"name":"authenticity_token","type":"hidden"}) - return ret["value"] - -def login(id, password): - session = requests.Session() - try: - data = { - "authenticity_token": getToken(session) - } - except: - return errorCodes.LOGIN_PEING_ERROR - - headers = { - "Accept-Language": "ja-JP", - "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko", - "Content-Type": "application/x-www-form-urlencoded", - } - ret = session.post("https://peing.net/auth/twitter",headers=headers,data=data,timeout=5,verify=False) - if not ret.url.startswith("https://api.twitter.com/oauth/authenticate?"): - return errorCodes.LOGIN_PEING_ERROR - - soup = BeautifulSoup(ret.content, "lxml") - headers = { - } - data = { - "authenticity_token": soup.find("input", {"name":"authenticity_token","type":"hidden"})["value"], - "redirect_after_login": soup.find("input", {"name":"redirect_after_login","type":"hidden"})["value"], - "oauth_token": soup.find("input", {"name":"oauth_token","type":"hidden"})["value"], - "session[username_or_email]": id, - "session[password]": password - } - - ret = session.post("https://api.twitter.com/oauth/authenticate",headers=headers,data=data,timeout=5,verify=False) - if ret.url.startswith("https://twitter.com/login/error?"): - return errorCodes.LOGIN_WRONG_PASSWORD - elif ret.url.startswith("https://twitter.com/account/access") or ret.url.startswith("https://twitter.com/login"): - return errorCodes.LOGIN_RECAPTCHA_NEEDED - elif not ret.url.startswith("https://api.twitter.com/oauth/authenticate"): - return errorCodes.LOGIN_TWITTER_ERROR - - try: - soup = BeautifulSoup(ret.content, "lxml") - url = soup.find("meta",{"http-equiv":"refresh"})["content"][6:] - except: - return errorCodes.LOGIN_CONFIRM_NEEDED - - if not url.startswith("https://peing.net/auth/twitter/callback"): - return errorCodes.LOGIN_TWITTER_ERROR - session.get(url) - return session diff --git a/twitterService.py b/twitterService.py deleted file mode 100644 index 8d0442d..0000000 --- a/twitterService.py +++ /dev/null @@ -1,95 +0,0 @@ -# npc service -# Copyright (C) 2021 yamahubuki - -import os -import time -import tweepy -import twitterAuthorization -import webbrowser -import wx - -import constants -import errorCodes - -from logging import getLogger - - -log = getLogger("%s.twitterService" % (constants.LOG_PREFIX)) - - -# ブラウザを起動し、ユーザからの認証を受ける -# 途中、Bool値を返すpollingFunctionを呼び続け、Falseが返却された場合は強制的に終了する -# 成功時はトークン(dic)、失敗時はNoneを返す -def authorize(pollingFunction=None): - manager = None - try: - log.debug("start authorization") - manager = twitterAuthorization.TwitterAuthorization(constants.TWITTER_CONSUMER_KEY,constants.TWITTER_CONSUMER_SECRET,constants.LOCAL_SERVER_PORT) - l="ja" - try: - l=globalVars.app.config["general"]["language"].split("_")[0].lower() - except: - pass#end うまく読めなかったら ja を採用 - #end except - manager.setMessage( - lang=l, - success=_("認証に成功しました。このウィンドウを閉じて、アプリケーションに戻ってください。"), - failed=_("認証に失敗しました。もう一度お試しください。"), - transfer=_("しばらくしても画面が切り替わらない場合は、別のブラウザでお試しください。") - ) - url = manager.getUrl() - log.debug("url = %s" % url) - webbrowser.open(url, new=1, autoraise=True) - - # polling - while(True): - wx.YieldIfNeeded() - - # return tupple, "" or None - token=manager.getToken() - if token=="": - log.info("Authorization failed. May be user disagreed.") - token = None - break - elif token: - break - elif pollingFunction()==False: - token = errorCodes.CANCELED - log.info("pollingFunction returned False") - break - # when token==None: continue polling - - manager.shutdown() - return token - except Exception as e: - log.error(e) - if manager: - manager.shutdown() - return None - -def getFollowList(token,target): - auth = tweepy.OAuthHandler(constants.TWITTER_CONSUMER_KEY, constants.TWITTER_CONSUMER_SECRET) - auth.set_access_token(*token) - try: - twitterApi = tweepy.API(auth,proxy=os.environ['HTTPS_PROXY']) - except KeyError: - twitterApi = tweepy.API(auth) - - ret = [] - try: - user = twitterApi.get_user(screen_name=target) - friendsCount = user.friends_count - friends = tweepy.Cursor(twitterApi.friends,screen_name=target,include_user_entities=False,skip_status=True,count=200).items() - for friend in friends: - ret.append(friend.screen_name) - return ret - except tweepy.error.RateLimitError: - log.error("rateLimitError") - return ret - except tweepy.error.TweepError as e: - log.error(e) - log.error("%s" %(e.response)) - return errorCodes.TWITTER_ERROR - except Exception: - log.error(e) - return errorCodes.UNKNOWN diff --git a/version.json b/version.json index a0404dc..2ca1a1c 100644 --- a/version.json +++ b/version.json @@ -1 +1 @@ -{"version": "1.3.2", "release_date": "2022-02-02"} \ No newline at end of file +{"version": "1.4.0", "release_date": "2023-04-29"} \ No newline at end of file diff --git a/views/SimpleInputDialog.py b/views/SimpleInputDialog.py index 2e10954..aca1e62 100644 --- a/views/SimpleInputDialog.py +++ b/views/SimpleInputDialog.py @@ -3,6 +3,7 @@ # Copyright (C) 2019-2020 yamahubuki # Note: All comments except these top lines will be written in Japanese. +import enum import re import wx @@ -10,29 +11,44 @@ from logging import getLogger from views.baseDialog import * +import simpleDialog + +DEFAULT_STYLE=wx.BORDER_RAISED + +# 入力値のバリデーション、値の返却のモード +class Mode(enum.Enum): + # 空行を飛ばしつつ、1行ずつバリデーション + # パターンにマッチしない行が1行でもあればinvalid + # 返却時は、空行を除く各行のデータを改行コードで繋いで返す + EACH_LINE = enum.auto() + # 入力値全体がパターンとマッチするかを調べる + # 返却時は、入力されたデータを加工せずに返す + WHOLE = enum.auto() + class Dialog(BaseDialog): - def __init__(self,title,detail,parent=None,validationPattern=None): + def __init__(self,title,detail,parent=None,validationPattern=None,defaultValue="",style=0,mode=Mode.EACH_LINE): super().__init__("SimpleInputDialog") self.title=title self.detail=detail + self.default=defaultValue if parent!=None: self.parent=parent else: self.parent=self.app.hMainView.hFrame self.validationPattern = validationPattern + self.style=style + self.mode=mode def Initialize(self): - self.log.debug("created") super().Initialize(self.parent,self.title) self.InstallControls() - self.log.debug("Finished creating view - %s" % self.title) return True def InstallControls(self): """いろんなwidgetを設置する。""" self.creator=views.ViewCreator.ViewCreator(self.viewMode,self.panel,self.sizer,wx.VERTICAL,20,style=wx.ALL|wx.EXPAND,margin=20) - self.edit,self.static=self.creator.inputbox(self.detail,x=-1,style=wx.BORDER_RAISED|wx.TE_DONTWRAP,sizerFlag=wx.EXPAND) + self.edit,self.static=self.creator.inputbox(self.detail,defaultValue=self.default,x=-1,style=DEFAULT_STYLE|self.style,sizerFlag=wx.EXPAND) self.edit.hideScrollBar(wx.HORIZONTAL) self.creator=views.ViewCreator.ViewCreator(self.viewMode,self.panel,self.sizer,wx.HORIZONTAL,20,style=wx.ALIGN_RIGHT) @@ -40,10 +56,43 @@ def InstallControls(self): self.bCancel=self.creator.cancelbutton(_("キャンセル"),None) def ok(self,event): - if self.validationPattern: - if len(re.sub(self.validationPattern,"\\1",self.edit.GetLineText(0))) != len(self.edit.GetLineText(0)): - return + if not self.validate(): + return event.Skip() def GetData(self): - return self.edit.GetLineText(0) + if self.mode == Mode.EACH_LINE: + ret = [] + for line in self.edit.GetValue().splitlines(): + line = line.strip() + if len(line) == 0: + continue + ret.append(line) + return "\n".join(ret) + elif self.mode == Mode.WHOLE: + return self.edit.GetValue() + + def validate(self): + if self.validationPattern: + pattern = re.compile(self.validationPattern) + if self.mode == Mode.EACH_LINE: + exists = False + lineNum = 0 + for line in self.edit.GetValue().splitlines(): + lineNum += 1 + line = line.strip() + if len(line) == 0: + continue + if not re.fullmatch(pattern, line): + simpleDialog.errorDialog(_("入力内容に誤りがあります。") + "\n" + _("行: %d") % lineNum, self.wnd) + return False + # バリデーションに成功した + exists = True + if not exists: + simpleDialog.errorDialog(_("有効な値が入力されていません。"), self.wnd) + return False + elif self.mode == Mode.WHOLE: + if not re.fullmatch(pattern, self.edit.GetValue()): + simpleDialog.errorDialog(_("入力内容に誤りがあります。"), self.wnd) + return False + return True diff --git a/views/answerDialog.py b/views/answerDialog.py index a1f818c..642edf3 100644 --- a/views/answerDialog.py +++ b/views/answerDialog.py @@ -84,7 +84,10 @@ def load(self): def answer(self,event): q = self.lst[self.hListCtrl.GetFocusedItem()].question - d = views.SimpleInputDialog.Dialog(_("回答の入力"),q,self.wnd) + style = 0 + if self.app.config.getboolean("view", "enableMultiline", False): + style = wx.TE_MULTILINE + d = views.SimpleInputDialog.Dialog(_("回答の入力"),q,self.wnd, style=style) d.Initialize() if d.Show()==wx.ID_CANCEL: return diff --git a/views/main.py b/views/main.py index f4f4d2e..9b0ed10 100644 --- a/views/main.py +++ b/views/main.py @@ -17,7 +17,7 @@ import globalVars import menuItemsStore import service -import twitterService +import update from .base import * from simpleDialog import * @@ -69,8 +69,11 @@ def __init__(self): self.lst.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.events.listActivated) self.lst.Bind(wx.EVT_LIST_ITEM_SELECTED, self.events.listSelectEvent) self.lst.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.events.listSelectEvent) + self.lst.Bind(wx.EVT_LIST_ITEM_FOCUSED, self.events.updateFocus) self.events.listSelectEvent() #最初に1度実行し、未選択状態をメニューに反映 + self.hFrame.CreateStatusBar() + self.hFrame.Bind(wx.EVT_MENU_OPEN, self.events.OnMenuOpen) self.refresh() @@ -282,46 +285,33 @@ def OnMenuSelect(self,event): if selected==menuItemsStore.getRef("FILE_ADD_USER_FROM_TWITTER_FOLLOW_LIST"): self.log.debug("addListFromTwitterUser:start") + + # ダイアログ表示用パラメータ + title = _("対象ユーザの指定") + msg = _("対象アカウントの@からはじまるアカウント名を、\n改行区切りで入力してください。") + pattern = "^(@?[a-zA-Z0-9_]*)$" + style = wx.TE_MULTILINE + d = views.SimpleInputDialog.Dialog(title, msg, validationPattern=pattern, style=style) + d.Initialize() + d.edit.SetMinSize((-1,200)) + if d.Show() == wx.ID_CANCEL: + return + # 改行区切りの文字列 + users = d.GetValue() + users = users.split("\n") + # 先頭の'@'があれば削除 + for i in range(len(users)): + if users[i][0] == "@": + users[i] = users[i][1:] + d=progress.Dialog() - d.Initialize(_("Twitterアカウントの認証のため、ブラウザの操作を待っています。")+"...",_("Twitterのフォローリストから一括登録")) + d.Initialize(_("登録済みユーザのリストを取得しています。")+"...",_("ユーザの一括追加")) d.gauge.Hide() d.Show(modal=False) self.parent.hFrame.Disable() - token = twitterService.authorize(d.isOk) - if token == None: - errorDialog(_("Twitterの認証に失敗しました。ブラウザ上で認証を拒否した、時間がかかりすぎた、またはインターネット接続に問題がある可能性があります。"),d.wnd) - if token == None or token == errorCodes.CANCELED: - self.parent.hFrame.Enable() - d.Destroy() - return - - d2 = SimpleInputDialog.Dialog(_("対象ユーザの指定"),_("フォロー中のユーザを取得するアカウントの@からはじまるアカウント名を入力してください。\n後悔アカウント、認証に用いたアカウント、\nまたは認証に用いたアカウントがフォローしている非公開アカウントを指定できます。"),d.wnd,"^(@?[a-zA-Z0-9_]*)$") - d2.Initialize() - r = d2.Show() - if r==wx.ID_CANCEL: - self.parent.hFrame.Enable() - d.Destroy() - return - #先頭の@はいらないので対策。入力時はあってもなくても良い - target = re.sub("@?(.*)","\\1", d2.GetValue()) - self.log.debug("target=%s" % target) - - d.update(label=_("フォローリストを取得しています。")+"...") - followList = twitterService.getFollowList(token,target) - if type(followList)==int: - if followList == errorCodes.TWITTER_ERROR: - errorDialog(_("Twitterからフォローリストを取得できませんでした。指定したユーザが存在しないか、フォローしていない非公開アカウントである可能性があります。"),d.wnd) - else: - errorDialog(_("Twitterからフォローリストを取得できませんでした。しばらくたってから再度お試しください。状況が改善しない場合には、開発者までお問い合わせください。"),d.wnd) - self.parent.hFrame.Enable() - d.Destroy() - return - if len(followList)==0: - errorDialog(_("Twitterからフォローリストを取得できませんでした。まだ誰もフォローしていないアカウントであるか、通信回数の上限に達しています。後者の場合には、15分以上待ってから再度お試しください。"),d.wnd) - follows=set(followList) + follows=set(users) - d.update(label=_("登録済みユーザのリストを取得しています。")+"...") userList = self.parent.service.getEnableUserList() users = set() if type(users)==int: @@ -494,7 +484,7 @@ def OnMenuSelect(self,event): d.Show() if selected == menuItemsStore.getRef("HELP_UPDATE"): - globalVars.update.update() + update.checkUpdate() if selected==menuItemsStore.getRef("HELP_VERSIONINFO"): d = versionDialog.versionDialog() @@ -586,7 +576,10 @@ def postQuestion(self,target,parent=None): if not self.loginCheck(): return - d = SimpleInputDialog.Dialog(_("質問を投稿"),_("%sさんへの質問内容") % target.getViewString(), parent) + style = 0 + if self.parent.app.config.getboolean("view", "enableMultiline", False): + style = wx.TE_MULTILINE + d = SimpleInputDialog.Dialog(_("質問を投稿"),_("%sさんへの質問内容") % target.getViewString(), parent, style=style) d.Initialize() r = d.Show() if r==wx.ID_CANCEL: @@ -692,7 +685,7 @@ def loginCheck(self): return False ret = self.parent.service.login( - self.parent.app.config.getint("account","id_type",constants.LOGIN_PEING,0,1), + constants.LOGIN_PEING, self.parent.app.config.getstring("account","id"), self.parent.app.config.getstring("account","password") ) @@ -702,3 +695,9 @@ def loginCheck(self): return False return True + def updateFocus(self, event): + if event.GetIndex(): + self.parent.hFrame.SetStatusText(_("%d個中%d個目を選択中" % (self.parent.lst.GetItemCount(), event.GetIndex()))) + else: + self.parent.hFrame.SetStatusText(_("%d個表示中、選択項目なし" % self.parent.lst.GetItemCount())) + diff --git a/views/settingsDialog.py b/views/settingsDialog.py index 3fcb692..704ee3d 100644 --- a/views/settingsDialog.py +++ b/views/settingsDialog.py @@ -30,10 +30,6 @@ class Dialog(BaseDialog): # "NVDA": "NVDA", # "JAWS": "JAWS for Windows" #} - loginTypeSelection = { - str(constants.LOGIN_PEING):"PeingID", - str(constants.LOGIN_TWITTER):"TwitterID" - } logLevelSelection = { "50":"CRITICAL", "40":"ERROR", @@ -84,7 +80,6 @@ def InstallControls(self): # login creator=views.ViewCreator.ViewCreator(self.viewMode,self.tab,None,views.ViewCreator.GridBagSizer,label=_("ログイン"),style=wx.ALL,margin=20) - self.loginType,dummy = creator.combobox(_("利用するIDの種類"),list(self.loginTypeSelection.values())) self.id,dummy = creator.inputbox("&ID",sizerFlag=wx.EXPAND) self.id.hideScrollBar(wx.HORIZONTAL) self.password,dummy = creator.inputbox(_("パスワード(&P)"),x=400,style=wx.TE_PASSWORD,sizerFlag=wx.EXPAND) @@ -92,14 +87,14 @@ def InstallControls(self): self.loginAlways = creator.checkbox(_("ログインした状態で質問する")) creator.GetSizer().SetItemSpan(self.loginAlways.GetParent(),2) - - - # view creator=views.ViewCreator.ViewCreator(self.viewMode,self.tab,None,views.ViewCreator.GridBagSizer,label=_("表示/言語"),style=wx.ALL,margin=20) self.language, static = creator.combobox(_("言語(&L)"), list(self.languageSelection.values())) self.colormode, static = creator.combobox(_("画面表示モード(&D)"), list(self.colorModeSelection.values())) self.textwrapping, static = creator.combobox(_("テキストの折り返し(&W)"), list(self.textWrappingSelection.values())) + self.enableMultiline = creator.checkbox(_("複数行の質問・回答を入力可能にする")) + creator.GetSizer().SetItemSpan(self.enableMultiline.GetParent(), 2) + # network creator=views.ViewCreator.ViewCreator(self.viewMode,self.tab,None,wx.VERTICAL,space=20,label=_("ネットワーク"),style=wx.ALL,margin=20) @@ -123,7 +118,6 @@ def load(self): self._setValue(self.logLevel,"general","log_level",configType.DIC,self.logLevelSelection) # login - self._setValue(self.loginType,"account","id_type",configType.DIC,self.loginTypeSelection,constants.LOGIN_PEING) self._setValue(self.id,"account","id",configType.STRING,"") self._setValue(self.password,"account","password",configType.STRING,"") self._setValue(self.loginAlways,"account","use_always",configType.BOOL,False) @@ -132,6 +126,7 @@ def load(self): self._setValue(self.language,"general","language",configType.DIC,self.languageSelection) self._setValue(self.colormode,"view","colormode",configType.DIC,self.colorModeSelection) self._setValue(self.textwrapping,"view","textwrapping",configType.DIC,self.textWrappingSelection) + self._setValue(self.enableMultiline,"view","enableMultiline",configType.BOOL,False) # network self._setValue(self.update, "general", "update", configType.BOOL)