• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
Aucun tag

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

ファイル整理用ツールのPrism+WPFサンプル実装


Commit MetaInfo

Révisionc66f5412f39217c46a0ccef4cd7cea23b1848b32 (tree)
l'heure2022-11-29 23:46:18
Auteuryoshy <yoshy.org.bitbucket@gz.j...>
Commiteryoshy

Message de Log

[MOD] ファイル操作時の確認系ダイアログのキャプション・メッセージをリソース化

Change Summary

Modification

--- a/FolderCategorizer2.02UseCase/FileSystemOperation/Interactor/FileSystemCopyOperationInteractor.cs
+++ b/FolderCategorizer2.02UseCase/FileSystemOperation/Interactor/FileSystemCopyOperationInteractor.cs
@@ -54,7 +54,7 @@ namespace FolderCategorizer2.UseCase.FileSystemOperation.Interactor
5454 IEnumerable<FileSystemSourceFilesTargetFolder> sourceTargetEntries =
5555 FileSystemSourceFilesTargetFolder.Join(targetFolders, sourceFilesList);
5656
57- if (!this.dialog.ConfirmCopyFiles(sourceTargetEntries))
57+ if (!this.dialog.ConfirmCopyFile(sourceTargetEntries))
5858 {
5959 // don't show abort dialog.
6060 return new();
--- a/FolderCategorizer2.02UseCase/Internal/FileSystemDialogLogic.cs
+++ b/FolderCategorizer2.02UseCase/Internal/FileSystemDialogLogic.cs
@@ -1,32 +1,41 @@
11 using CleanAuLait.Adaptor.Boundary.Gateway.UI.Dialog;
22 using FolderCategorizer2.Domain.Service.Dto;
3+using FolderCategorizer2.Infra.Boundary.Resource;
34 using FolderCategorizer2.UseCase.Boundary.ViewProxy;
45 using Prism.Services.Dialogs;
5-using System;
66 using System.Collections.Generic;
7-using System.Linq;
8-using System.Text;
9-using System.Threading.Tasks;
107 using System.Windows;
118
129 namespace FolderCategorizer2.UseCase.Internal
1310 {
1411 internal class FileSystemDialogLogic : IFileSystemDialogLogic
1512 {
13+ private const string CONFIRM_DIALOG_KEY_COPY_FILE = "CopyFile";
14+ private const string CONFIRM_DIALOG_KEY_MOVE_FILE = "MoveFile";
15+ private const string CONFIRM_DIALOG_KEY_DELETE_FILE = "DeleteFile";
16+ private const string CONFIRM_DIALOG_KEY_RENAME_FILE = "RenameFile";
17+ private const string CONFIRM_DIALOG_KEY_OVERWRITE_CREATION_TIME = "OverwriteCreationTime";
18+ private const string CONFIRM_DIALOG_KEY_OVERWRITE_LAST_WRITE_TIME = "OverwriteLastWriteTime";
19+ private const string CONFIRM_DIALOG_KEY_EXCHANGE_TIMESTAMP = "ExchangeTimestamp";
20+ private const string CONFIRM_DIALOG_KEY_AUTOFIX_FOLDER_TIMESTAMP = "AutoFixFolderTimestamp";
21+
1622 private readonly INewFilePromptViewProxy newFilePrompt;
1723 private readonly INewFolderPromptViewProxy newFolderPrompt;
1824 private readonly IRenamePromptViewProxy renamePrompt;
25+ private readonly IAppCaptionFormatter caption;
1926 private readonly IUniversalDialogProxy dialog;
2027
2128 public FileSystemDialogLogic(
2229 INewFilePromptViewProxy newFilePrompt,
2330 INewFolderPromptViewProxy newFolderPrompt,
2431 IRenamePromptViewProxy renamePrompt,
32+ IAppCaptionFormatter caption,
2533 IUniversalDialogProxy dialog)
2634 {
2735 this.newFilePrompt = newFilePrompt;
2836 this.newFolderPrompt = newFolderPrompt;
2937 this.renamePrompt = renamePrompt;
38+ this.caption = caption;
3039 this.dialog = dialog;
3140 }
3241
@@ -66,18 +75,19 @@ namespace FolderCategorizer2.UseCase.Internal
6675 return targetName;
6776 }
6877
69- public bool ConfirmCopyFiles(IEnumerable<FileSystemSourceFilesTargetFolder> sourceTargetEntries)
78+ public bool ConfirmCopyFile(IEnumerable<FileSystemSourceFilesTargetFolder> sourceTargetEntries)
7079 {
71- string msg = CreateConfirmMessageCopyFiles(sourceTargetEntries);
80+ string msg = CreateConfirmMessageCopyFile(sourceTargetEntries);
81+ string caption = this.caption.GetAppConfirmCaption(CONFIRM_DIALOG_KEY_COPY_FILE);
7282
73- IDialogResult result = this.dialog.ShowYesNoDialog("ファイルのコピー - 確認", msg, MessageBoxImage.Question);
83+ IDialogResult result = this.dialog.ShowYesNoDialog(caption, msg, MessageBoxImage.Question);
7484
7585 return result.Result == ButtonResult.Yes;
7686 }
7787
78- private static string CreateConfirmMessageCopyFiles(IEnumerable<FileSystemSourceFilesTargetFolder> sourceTargetEntries)
88+ private string CreateConfirmMessageCopyFile(IEnumerable<FileSystemSourceFilesTargetFolder> sourceTargetEntries)
7989 {
80- string msg = "【仮】コピーしてもよろしいですか";
90+ string msg = this.caption.GetAppConfirmMessage(CONFIRM_DIALOG_KEY_COPY_FILE);
8191
8292 foreach (FileSystemSourceFilesTargetFolder sourceTargetEntry in sourceTargetEntries)
8393 {
@@ -95,15 +105,17 @@ namespace FolderCategorizer2.UseCase.Internal
95105 public bool ConfirmMoveFile(IEnumerable<FileSystemSourceFilesTargetFolder> sourceTargetEntries)
96106 {
97107 string msg = CreateConfirmMessageMoveFile(sourceTargetEntries);
108+ string caption = this.caption.GetAppConfirmCaption(CONFIRM_DIALOG_KEY_MOVE_FILE);
98109
99- IDialogResult result = this.dialog.ShowYesNoDialog("ファイルの移動 - 確認", msg, MessageBoxImage.Question);
110+ IDialogResult result = this.dialog.ShowYesNoDialog(caption, msg, MessageBoxImage.Question);
100111
101112 return result.Result == ButtonResult.Yes;
102113 }
103114
104- private static string CreateConfirmMessageMoveFile(IEnumerable<FileSystemSourceFilesTargetFolder> sourceTargetEntries)
115+ private string CreateConfirmMessageMoveFile(IEnumerable<FileSystemSourceFilesTargetFolder> sourceTargetEntries)
105116 {
106- string msg = "【仮】移動してもよろしいですか";
117+ string msg = this.caption.GetAppConfirmMessage(CONFIRM_DIALOG_KEY_MOVE_FILE);
118+
107119 foreach (FileSystemSourceFilesTargetFolder sourceTargetEntry in sourceTargetEntries)
108120 {
109121 msg += "\n\n移動元:" + sourceTargetEntry.SourceFiles.AbsolutePath;
@@ -120,15 +132,17 @@ namespace FolderCategorizer2.UseCase.Internal
120132 public bool ConfirmDeleteFile(IEnumerable<FileSystemSourceFiles> sourceFilesList)
121133 {
122134 string msg = CreateConfirmMessageDeleteFile(sourceFilesList);
135+ string caption = this.caption.GetAppConfirmCaption(CONFIRM_DIALOG_KEY_DELETE_FILE);
123136
124- IDialogResult result = this.dialog.ShowYesNoDialog("ファイルの削除 - 確認", msg, MessageBoxImage.Question);
137+ IDialogResult result = this.dialog.ShowYesNoDialog(caption, msg, MessageBoxImage.Question);
125138
126139 return result.Result == ButtonResult.Yes;
127140 }
128141
129- private static string CreateConfirmMessageDeleteFile(IEnumerable<FileSystemSourceFiles> sourceFilesList)
142+ private string CreateConfirmMessageDeleteFile(IEnumerable<FileSystemSourceFiles> sourceFilesList)
130143 {
131- string msg = "【仮】削除してもよろしいですか";
144+ string msg = this.caption.GetAppConfirmMessage(CONFIRM_DIALOG_KEY_DELETE_FILE);
145+
132146 foreach (FileSystemSourceFiles sourceFiles in sourceFilesList)
133147 {
134148 msg += "\n\n削除元:" + sourceFiles.AbsolutePath;
@@ -144,15 +158,16 @@ namespace FolderCategorizer2.UseCase.Internal
144158 public bool ConfirmRenameFile(IEnumerable<FileSystemSourceFile> sourceFileList, string targetName)
145159 {
146160 string msg = CreateConfirmMessageRenameFile(sourceFileList, targetName);
161+ string caption = this.caption.GetAppConfirmCaption(CONFIRM_DIALOG_KEY_RENAME_FILE);
147162
148- IDialogResult result = this.dialog.ShowYesNoDialog("ファイル名の変更 - 確認", msg, MessageBoxImage.Question);
163+ IDialogResult result = this.dialog.ShowYesNoDialog(caption, msg, MessageBoxImage.Question);
149164
150165 return result.Result == ButtonResult.Yes;
151166 }
152167
153- private static string CreateConfirmMessageRenameFile(IEnumerable<FileSystemSourceFile> sourceFileList, string targetName)
168+ private string CreateConfirmMessageRenameFile(IEnumerable<FileSystemSourceFile> sourceFileList, string targetName)
154169 {
155- string msg = "【仮】名前を変更してもよろしいですか";
170+ string msg = this.caption.GetAppConfirmMessage(CONFIRM_DIALOG_KEY_RENAME_FILE);
156171
157172 foreach (FileSystemSourceFile sourceFile in sourceFileList)
158173 {
@@ -167,15 +182,17 @@ namespace FolderCategorizer2.UseCase.Internal
167182 public bool ConfirmOverwriteCreationTime(IEnumerable<FileSystemSourceFiles> sourceFilesList)
168183 {
169184 string msg = CreateConfirmMessageOverwriteCreationTime(sourceFilesList);
185+ string caption = this.caption.GetAppConfirmCaption(CONFIRM_DIALOG_KEY_OVERWRITE_CREATION_TIME);
170186
171- IDialogResult result = this.dialog.ShowYesNoDialog("作成日時を更新日時で上書き - 確認", msg, MessageBoxImage.Question);
187+ IDialogResult result = this.dialog.ShowYesNoDialog(caption, msg, MessageBoxImage.Question);
172188
173189 return result.Result == ButtonResult.Yes;
174190 }
175191
176- private static string CreateConfirmMessageOverwriteCreationTime(IEnumerable<FileSystemSourceFiles> sourceFilesList)
192+ private string CreateConfirmMessageOverwriteCreationTime(IEnumerable<FileSystemSourceFiles> sourceFilesList)
177193 {
178- string msg = "【仮】作成日時を更新日時で上書きしてもよろしいですか";
194+ string msg = this.caption.GetAppConfirmMessage(CONFIRM_DIALOG_KEY_OVERWRITE_CREATION_TIME);
195+
179196 foreach (FileSystemSourceFiles sourceFiles in sourceFilesList)
180197 {
181198 msg += "\n\n対象:" + sourceFiles.AbsolutePath;
@@ -191,15 +208,17 @@ namespace FolderCategorizer2.UseCase.Internal
191208 public bool ConfirmOverwriteLastWriteTime(IEnumerable<FileSystemSourceFiles> sourceFilesList)
192209 {
193210 string msg = CreateConfirmMessageOverwriteLastWriteTime(sourceFilesList);
211+ string caption = this.caption.GetAppConfirmCaption(CONFIRM_DIALOG_KEY_OVERWRITE_LAST_WRITE_TIME);
194212
195- IDialogResult result = this.dialog.ShowYesNoDialog("更新日時を作成日時で上書き - 確認", msg, MessageBoxImage.Question);
213+ IDialogResult result = this.dialog.ShowYesNoDialog(caption, msg, MessageBoxImage.Question);
196214
197215 return result.Result == ButtonResult.Yes;
198216 }
199217
200- private static string CreateConfirmMessageOverwriteLastWriteTime(IEnumerable<FileSystemSourceFiles> sourceFilesList)
218+ private string CreateConfirmMessageOverwriteLastWriteTime(IEnumerable<FileSystemSourceFiles> sourceFilesList)
201219 {
202- string msg = "【仮】更新日時を作成日時で上書きしてもよろしいですか";
220+ string msg = this.caption.GetAppConfirmMessage(CONFIRM_DIALOG_KEY_OVERWRITE_LAST_WRITE_TIME);
221+
203222 foreach (FileSystemSourceFiles sourceFiles in sourceFilesList)
204223 {
205224 msg += "\n\n対象:" + sourceFiles.AbsolutePath;
@@ -215,15 +234,16 @@ namespace FolderCategorizer2.UseCase.Internal
215234 public bool ConfirmExchangeTimestamp(IEnumerable<FileSystemSourceFiles> sourceFilesList)
216235 {
217236 string msg = CreateConfirmMessageExchangeTimestamp(sourceFilesList);
237+ string caption = this.caption.GetAppConfirmCaption(CONFIRM_DIALOG_KEY_EXCHANGE_TIMESTAMP);
218238
219- IDialogResult result = this.dialog.ShowYesNoDialog("作成日時と更新日時を入れ替え - 確認", msg, MessageBoxImage.Question);
239+ IDialogResult result = this.dialog.ShowYesNoDialog(caption, msg, MessageBoxImage.Question);
220240
221241 return result.Result == ButtonResult.Yes;
222242 }
223243
224- private static string CreateConfirmMessageExchangeTimestamp(IEnumerable<FileSystemSourceFiles> sourceFilesList)
244+ private string CreateConfirmMessageExchangeTimestamp(IEnumerable<FileSystemSourceFiles> sourceFilesList)
225245 {
226- string msg = "【仮】作成日時と更新日時を入れ替えてもよろしいですか";
246+ string msg = this.caption.GetAppConfirmMessage(CONFIRM_DIALOG_KEY_EXCHANGE_TIMESTAMP);
227247
228248 foreach (FileSystemSourceFiles sourceFiles in sourceFilesList)
229249 {
@@ -240,15 +260,16 @@ namespace FolderCategorizer2.UseCase.Internal
240260 public bool ConfirmAutoFixFolderTimestamp(IEnumerable<FileSystemSourceFile> SourceFileList)
241261 {
242262 string msg = CreateConfirmMessageAutoFixFolderTimestamp(SourceFileList);
263+ string caption = this.caption.GetAppConfirmCaption(CONFIRM_DIALOG_KEY_AUTOFIX_FOLDER_TIMESTAMP);
243264
244- IDialogResult result = this.dialog.ShowYesNoDialog("フォルダのタイムスタンプを自動修正 - 確認", msg, MessageBoxImage.Question);
265+ IDialogResult result = this.dialog.ShowYesNoDialog(caption, msg, MessageBoxImage.Question);
245266
246267 return result.Result == ButtonResult.Yes;
247268 }
248269
249- private static string CreateConfirmMessageAutoFixFolderTimestamp(IEnumerable<FileSystemSourceFile> SourceFileList)
270+ private string CreateConfirmMessageAutoFixFolderTimestamp(IEnumerable<FileSystemSourceFile> SourceFileList)
250271 {
251- string msg = "【仮】フォルダのタイムスタンプを自動修正してもよろしいですか";
272+ string msg = this.caption.GetAppConfirmMessage(CONFIRM_DIALOG_KEY_AUTOFIX_FOLDER_TIMESTAMP);
252273
253274 foreach (FileSystemSourceFile sourceFile in SourceFileList)
254275 {
--- a/FolderCategorizer2.02UseCase/Internal/IFileSystemDialogLogic.cs
+++ b/FolderCategorizer2.02UseCase/Internal/IFileSystemDialogLogic.cs
@@ -8,7 +8,7 @@ namespace FolderCategorizer2.UseCase.Internal
88 string AskNewFileName(string targetName);
99 string AskNewFolderName(string targetName);
1010 string AskRenameFileName(string targetName);
11- bool ConfirmCopyFiles(IEnumerable<FileSystemSourceFilesTargetFolder> sourceTargetEntries);
11+ bool ConfirmCopyFile(IEnumerable<FileSystemSourceFilesTargetFolder> sourceTargetEntries);
1212 bool ConfirmMoveFile(IEnumerable<FileSystemSourceFilesTargetFolder> sourceTargetEntries);
1313 bool ConfirmDeleteFile(IEnumerable<FileSystemSourceFiles> sourceFilesList);
1414 bool ConfirmRenameFile(IEnumerable<FileSystemSourceFile> sourceFileList, string targetName);
--- a/FolderCategorizer2.03Adaptor/Gateway/ViewModel/MainWindowViewModel.cs
+++ b/FolderCategorizer2.03Adaptor/Gateway/ViewModel/MainWindowViewModel.cs
@@ -50,7 +50,7 @@ namespace FolderCategorizer2.Adaptor.Gateway.ViewModel
5050 this.rm = rm;
5151 this.wc = wc;
5252
53- this.Title = new ReactivePropertySlim<string>(caption.GetCaption()).AddTo(disposables);
53+ this.Title = new ReactivePropertySlim<string>(caption.GetDefaultCaption()).AddTo(disposables);
5454 this.StatusText = sbVm.StatusText.ToReadOnlyReactivePropertySlim().AddTo(disposables);
5555
5656
--- a/FolderCategorizer2.05Infra/Boundary/Resource/IAppCaptionFormatter.cs
+++ b/FolderCategorizer2.05Infra/Boundary/Resource/IAppCaptionFormatter.cs
@@ -7,11 +7,13 @@ namespace FolderCategorizer2.Infra.Boundary.Resource
77 string GetAppCommonPromptOKButtonCaption();
88 string GetAppCommonPromptCancelButtonCaption();
99
10+ string GetAppConfirmCaption(string key);
11+ string FormatAppDefaultCaption(string key);
1012 string GetAppCaption(string key);
11- string GetAppCaption(string key, string caption);
1213
14+ string GetAppConfirmMessage(string key);
1315 string GetAppMessage(string key);
14- string GetAppMessage(string key, params string[] args);
16+ string FormatAppMessage(string key, params string[] args);
1517
1618 string GetAppLabel(string key);
1719 string GetAppLabel(string key, string subKey);
--- a/FolderCategorizer2.05Infra/Core/Resource/AppCaptionFormatter.cs
+++ b/FolderCategorizer2.05Infra/Core/Resource/AppCaptionFormatter.cs
@@ -11,6 +11,8 @@ namespace FolderCategorizer2.Infra.Core.Resource
1111 private const string MSG_KEY_PREFIX_MESSAGE = "Message.";
1212 private const string MSG_KEY_PREFIX_LABEL = "Label.";
1313
14+ private const string MSG_KEY_PREFIX_CONFIRM_DIALOG = "ConfirmDialog.";
15+
1416 private const string APP_LABEL_KEY_COMMON_PROMPT = "CommonPrompt";
1517
1618 private const string APP_LABEL_SUBKEY_OK_BUTTON = "Ok";
@@ -31,41 +33,52 @@ namespace FolderCategorizer2.Infra.Core.Resource
3133 return GetAppLabel(APP_LABEL_KEY_COMMON_PROMPT, APP_LABEL_SUBKEY_CANCEL_BUTTON);
3234 }
3335
36+ public string GetAppConfirmCaption(string key)
37+ {
38+ return FormatConfirmCaption(
39+ MSG_KEY_PREFIX_CAPTION + MSG_KEY_PREFIX_CONFIRM_DIALOG + key);
40+ }
41+
42+ public string FormatAppDefaultCaption(string key)
43+ {
44+ return FormatDefaultCaption(MSG_KEY_PREFIX_CAPTION_FORMAT + key);
45+ }
46+
3447 public string GetAppCaption(string key)
3548 {
3649 return GetCaption(MSG_KEY_PREFIX_CAPTION + key);
3750 }
3851
39- public string GetAppCaption(string key, string caption)
52+ public string GetAppConfirmMessage(string key)
4053 {
41- return GetCaption(MSG_KEY_PREFIX_CAPTION + key, caption);
54+ return GetMessage(MSG_KEY_PREFIX_MESSAGE + MSG_KEY_PREFIX_CONFIRM_DIALOG + key);
4255 }
4356
4457 public string GetAppMessage(string key)
4558 {
46- return Get(MSG_KEY_PREFIX_MESSAGE + key);
59+ return GetMessage(MSG_KEY_PREFIX_MESSAGE + key);
4760 }
4861
49- public string GetAppMessage(string key, params string[] args)
62+ public string FormatAppMessage(string key, params string[] args)
5063 {
51- return Get(MSG_KEY_PREFIX_MESSAGE + key, args);
64+ return FormatMessage(MSG_KEY_PREFIX_MESSAGE + key, args);
5265 }
5366
5467 public string GetAppLabel(string key)
5568 {
56- return Get(MSG_KEY_PREFIX_LABEL + key);
69+ return GetMessage(MSG_KEY_PREFIX_LABEL + key);
5770 }
5871
5972 public string GetAppLabel(string key, string subKey)
6073 {
61- return Get(MSG_KEY_PREFIX_LABEL + key + MSG_KEY_SEPARATOR + subKey);
74+ return GetMessage(MSG_KEY_PREFIX_LABEL + key + MSG_KEY_SEPARATOR + subKey);
6275 }
6376
64- private string Get(string key)
77+ private string GetMessage(string key)
6578 {
6679 return this.repo.Get(key);
6780 }
68- private string Get(string key, params string[] args)
81+ private string FormatMessage(string key, params string[] args)
6982 {
7083 return this.repo.Get(key, args);
7184 }
--- a/FolderCategorizer2.05Infra/Resources/message.properties
+++ b/FolderCategorizer2.05Infra/Resources/message.properties
@@ -1,9 +1,10 @@
11 Caption = FolderCategorizer2
2-Caption.Info = {0} - 通知
3-Caption.Warn = {0} - 警告
4-Caption.Error = {0} - エラー
5-Caption.Settings = {0} - 設定
6-Caption.Exception = {0} - {1}
2+Caption.Format.Info = {0} - 通知
3+Caption.Format.Warn = {0} - 警告
4+Caption.Format.Error = {0} - エラー
5+Caption.Format.Confirm = {0} - 確認
6+Caption.Format.Settings = {0} - 設定
7+Caption.Format.Exception = {0} - {1}
78 Label.CommonPrompt.Ok = OK (_C)
89 Label.CommonPrompt.Cancel = Cancel (_C)
910 Caption.RenamePromptView = ファイル名の変更
@@ -18,3 +19,19 @@ Label.CategorizePromptView.FolderName = フォルダ名
1819 Label.CategorizePromptView.Timestamp = 日時属性
1920 Label.CategorizePromptView.CreatedAt = 作成日時
2021 Label.CategorizePromptView.LastWriteAt = 更新日時
22+Caption.ConfirmDialog.CopyFile = ファイルのコピー
23+Message.ConfirmDialog.CopyFile = 【仮】コピーしてもよろしいですか
24+Caption.ConfirmDialog.MoveFile = ファイルの移動
25+Message.ConfirmDialog.MoveFile = 【仮】移動してもよろしいですか
26+Caption.ConfirmDialog.DeleteFile = ファイルの削除
27+Message.ConfirmDialog.DeleteFile = 【仮】削除してもよろしいですか
28+Caption.ConfirmDialog.RenameFile = ファイル名の変更
29+Message.ConfirmDialog.RenameFile = 【仮】名前を変更してもよろしいですか"
30+Caption.ConfirmDialog.OverwriteCreationTime = 作成日時を更新日時で上書き
31+Message.ConfirmDialog.OverwriteCreationTime = 【仮】作成日時を更新日時で上書きしてもよろしいですか
32+Caption.ConfirmDialog.OverwriteLastWriteTime = 更新日時を作成日時で上書き
33+Message.ConfirmDialog.OverwriteLastWriteTime = 【仮】更新日時を作成日時で上書きしてもよろしいですか
34+Caption.ConfirmDialog.ExchangeTimestamp = 作成日時と更新日時を入れ替え
35+Message.ConfirmDialog.ExchangeTimestamp = 【仮】作成日時と更新日時を入れ替えてもよろしいですか
36+Caption.ConfirmDialog.AutoFixFolderTimestamp = フォルダのタイムスタンプを自動修正
37+Message.ConfirmDialog.AutoFixFolderTimestamp = 【仮】フォルダのタイムスタンプを自動修正してもよろしいですか