<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Design &amp; Architecture</title><link>https://www.dotnetzone.gr:443/cs/forums/16/ShowForum.aspx</link><description>Θέματα αρχιτεκτονικής και σχεδιασμού εφαρμογών (design patterns, object orientation, κ.α.)</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: Πολυγλωσσικότητα και Υποστήριξη Λογισμικού</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/21260.aspx</link><pubDate>Mon, 27 Nov 2006 21:07:22 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:21260</guid><dc:creator>Νατάσα Μανουσοπούλου</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/21260.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=21260</wfw:commentRss><description>Το μεγάλο πρόβλημα στην υποστήριξη δεν είναι τόσο τα exceptions και το event log, αφού μπορείς να χρησιμοποιήσεις κωδικούς λαθών και event IDs που θα σου δίνουν ένα μπούσουλα με τη βοήθεια του εγχειριδίου σφαλμάτων &lt;img src="/cs/emoticons/emotion-4.gif" alt="Stick out tongue" /&gt; Το μανίκι είναι στην καταγραφή των support calls και των FAQs, τα οποία θα πρέπει να αναφέρονται όλα στην ίδια έκδοση της εφαρμογής, κατά προτίμηση την αγγλική.&lt;br&gt;&lt;br&gt;Αν θεωρήσουμε δεδομένο ότι όσοι παίρνουν τηλεφωνήματα στην υποστήριξη έχουν την εφαρμογή μπροστά τους, θα μπορούσες να έχεις ειδικές εκδόσεις για το support, όπου σε κάθε control, εκτός από το localized κείμενο να δείχνεις π.χ. σε ένα tooltip το αγγλικό κείμενο, το οποίο θα πρέπει ο supporter να καταγράφει στο CRM/bug tracking/whatever. Βέβαια στηρίζεσαι πολύ στον πατριωτισμό τους, γιατί μπορούν άνετα να αγνοήσουν τα αγγλικά και να γράψουν ό,τι θέλουν. Επίσης πρόβλημα υπάρχει και στα e-mails των πελατών, στα οποία είναι βέβαιο ότι δε θα καταγράφεται το αγγλικό κείμενο (αν έχεις το localized και μάλιστα σωστό θα είσαι υπερτυχερός).&lt;br&gt;&lt;br&gt;Μπορείς να κάνεις τη ζωή όλων πολύ πιο εύκολη, αν είναι δυνατή η εύκολη εισαγωγή screenshots μέσα σε κάθε ticket ή e-mail πελάτη. Έτσι τουλάχιστον θα είναι δυνατό το ταίριασμα με βάση τη θέση των controls στην οθόνη.&lt;br&gt;</description></item><item><title>Απ: Πολυγλωσσικότητα και Υποστήριξη Λογισμικού</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/21258.aspx</link><pubDate>Mon, 27 Nov 2006 20:22:06 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:21258</guid><dc:creator>Dimitris Papadimitriou</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/21258.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=21258</wfw:commentRss><description>Τι μου θύμισες!!! Ξέρω, δεν εννοείς αυτό, αλλά δεν μπορώ να μην το παραθέσω...!&lt;br&gt;&lt;BLOCKQUOTE&gt;&lt;table width="85%"&gt;&lt;tr&gt;&lt;td class="txt4"&gt;&lt;img src="/cs/Themes/mistblue/images/icon-quote.gif"&gt;&amp;nbsp;&lt;strong&gt;Οι περιπέτειες του Ζαχαρία Δεντοφτιάχνω wrote:&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="quoteTable"&gt;&lt;table width="100%"&gt;&lt;tr&gt;&lt;td valign="top" class="txt4"&gt;&lt;br&gt;&lt;strong&gt;ΕΜΠ&lt;/strong&gt;:Δηλαδή; Τι θέλετε να πείτε; Ενας κωδικός εξηγεί στο χρήστη τι συνέβη;&lt;br&gt;&lt;strong&gt;ΑΠΞ&lt;/strong&gt;: Φυσικά! Κάθε εφαρμογή που ΕΓΩ προσωπικά επιμελούμαι συνοδεύεται από ένα εγχειρίδιο επεξήγησης κωδικών!&lt;br&gt;&lt;strong&gt;ΨΜΜ&lt;/strong&gt;: Ναι, ναι! Και στη σχολή όταν κάναμε τις ασκήσεις βάζαμε κωδικούς σφαλμ&lt;strong&gt;ΑΟΥΤΣ&lt;/strong&gt;!&lt;br&gt;&lt;em&gt;(Το πόδι του Ζαχαρία βρήκε αυτή τη φορά το σωστό στόχο)&lt;/em&gt;
&lt;strong&gt;ΕΜΠ&lt;/strong&gt;: Εεε, κύριε Ξερόλα, τι μεγέθους είναι αυτό το εγχειρίδιο; &lt;br&gt;&lt;strong&gt;ΑΠΞ&lt;/strong&gt;: &lt;em&gt;(Κορδωμένος,
με υπερηφάνεια υπερκαταναλωτικού κατόχου πιστωτικής κάρτας που πήρε
μηδενικό ποσό χρέους στο statement του για το μήνα)&lt;/em&gt; Πάνω απο 100
σελίδες! Ακόμα και αν δεν έχουμε ΤΟΣΑ μηνύματα σφάλματος, βάζουμε και
κάποια τα οποία δεν εμφανίζονται ποτέ στην εφαρμογή για να πιάσουμε τις
100 σελίδες! Μερικά στην τύχη.&lt;br&gt;&lt;strong&gt;ΕΜΠ&lt;/strong&gt;:Και γιατί το κάνετε αυτό;&lt;br&gt;&lt;strong&gt;ΑΠΞ&lt;/strong&gt;:
Αααα, απλά πράγματα. Ξέρετε τι ευχαρίστηση είναι για τον πελάτη να
παίρνει κάτι τόσο ΒΑΡΥ στα χέρια του; (Με θερμοκόλληση και
σκληρο΄εξώφυλλο, εννοείται). Φαίνεται ωραία στη βιβλιοθήκη του, και
νοιώθει οτι αξίζει τον κόπο που πλήρωσε τόσα χρήματα για την εφαρμογή.
Αφήστε που ΕΓΩ έχω φτιάξει και ένα random error message generator
ακριβώς για αυτό το λόγο.&lt;br&gt;&lt;a href="/cs/blogs/zaxarias/archive/2006/11/22/20895.aspx"&gt;συνέχεια...&lt;/a&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/BLOCKQUOTE&gt;&lt;br&gt;Η ιδέα του dictionary είναι λίγο δύσκολη στην εφαρμογή της, καθώς δεν ταιριάζει πολύ με την λογική των exception. Π.χ. μια μέθοδος σηκώνει ένα exception, το οποίο έστω ότι έχει ένα ID. Αυτό το πιάνει μια άλλη μέθοδος και ξανασηκώνει άλλο exception με άλλο ID, ενώ το πρώτο μπαίνει σαν inner exception. Για να καταλάβει τελικά ο developer τι συνέβει ίσως (τονίζω το ίσως!) τελικά χρειαστεί όλο το exception trace. Μήπως τελικά μια λύση να ήταν στο κάθε exception να έχω μια μεταφρασμένη περιγραφή και μια επιπλέον στα αγγλικά, ίσως ακόμα και το ID που αναφέρεις εσύ Σωτήρη; π.χ.&lt;br&gt;&lt;br&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Class&lt;/span&gt; MyException&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Inherits&lt;/span&gt; ApplicationException&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Private&lt;/span&gt; _ID &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;As&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Integer&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Private&lt;/span&gt; _NativeMessage &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;As&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;String&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;ReadOnly&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Property&lt;/span&gt; NativeMessage() &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;As&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;String&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Get&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Return&lt;/span&gt; _NativeMessage&lt;br /&gt;        &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;End&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Get&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;End&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Property&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Public&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;ReadOnly&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Property&lt;/span&gt; ID() &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;As&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Integer&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Get&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Return&lt;/span&gt; _ID&lt;br /&gt;        &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;End&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Get&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;End&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Property&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;End&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Class&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;Βέβαια μιλάω για exceptions για τα οποία δεν έχουν δημιουργηθεί ειδικά exception types, μια που σε εκείνα μπορείς να καταλάβεις το exception μόνο από το type name.&lt;br&gt;</description></item><item><title>Απ: Πολυγλωσσικότητα και Υποστήριξη Λογισμικού</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/21256.aspx</link><pubDate>Mon, 27 Nov 2006 20:01:11 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:21256</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/21256.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=21256</wfw:commentRss><description>Για τα κουμπιά και τα labels, ο μηχανισμός localization των Winforms μπορεί να κάνει τη δουλειά. Το Event log από την άλλη, υποστηρίζει όποια γλώσσα θέλεις ... μόνο που δεν μπορείς να το χρησιμοποιήσεις έτσι μέσω .NET! Το Event Log αποθηκεύει μόνο EventIDs και παραμέτρους. Τα μηνύματα που διαβάζουμε δημιουργούνται από τον viewer χρησιμοποιώντας resource dlls. Μόνο που το .NET δεν υποστηρίζει τη δημιουργία resource dlls! Τα μηνύματα που γράφει το .NET έχουν απλά ως πρώτη παράμετρο όλο το string που διαβάζουμε μετά. Resource dlls μπορείς να φτιάξεις χρησιμοποιώντας εργαλεία της C++ και του SDK :(&lt;br /&gt;
&lt;br /&gt;
Προφανώς, στην περίπτωση σου δεν αρκεί να φορτώνεις το κατάλληλο event ή exception string από τα Resources για μόνο γλώσσα. Το καλύτερο θα ήταν να αποθηκεύεις το event ID και ο viewer να εμφανίζει το κατάλληλο μήνυμα. Αλλά ...&lt;br /&gt;
&lt;br /&gt;
Ένας τρόπος να διευκολύνεις λίγο την κατάσταση είναι να ορίσεις ιεραρχικά event IDs, έτσι ώστε οι admins να μπορούν τουλάχιστον να καταλάβουν τί λέει το ID. Μία άλλη λύση θα ήταν να φτιάξεις τον δικό σου viewer, ο οποίος θα διαβάζει τα event ID από το Event Log και θα τα φορμάρει ανάλογα με τη γλώσσα του χρήστη. Η ιδέα όμως μου φαίνεται παράξενη, καθώς ουσιαστικά θα ξαναγράψεις τον Event Viewer για .NET.</description></item><item><title>Απ: Πολυγλωσσικότητα και Υποστήριξη Λογισμικού</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/21255.aspx</link><pubDate>Mon, 27 Nov 2006 19:56:51 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:21255</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/21255.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=21255</wfw:commentRss><description>&lt;P&gt;Υποθέτω ότι τα event log events και τα exceptions θα έχουν κάποιο ID μέσω του οποίου θα μπορούσες να έχεις ένα dictionary για κάθε μία&amp;nbsp;γλώσσα. Πάντως, μπορείς να κάνεις ultimate error handling ώστε να μην φτάσει ποτέ το exception στον χρήστη, δες αυτό το άρθρο μου &lt;A href="/cs/blogs/mkelaiditis/articles/9419.aspx"&gt;http://www.dotnetzone.gr/cs/blogs/mkelaiditis/articles/9419.aspx&lt;/A&gt;&lt;/P&gt;</description></item><item><title>Πολυγλωσσικότητα και Υποστήριξη Λογισμικού</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/21254.aspx</link><pubDate>Mon, 27 Nov 2006 19:45:35 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:21254</guid><dc:creator>Dimitris Papadimitriou</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/21254.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=21254</wfw:commentRss><description>Για άλλη μια φορά στο αγαπημένο μου forum στο dotΝΕΤΖone!&lt;br&gt;&lt;br&gt;&lt;img src="http://website.lineone.net/%7Essleightholm/dict/glossary/babel.jpg" align="left"&gt;Έχω την τύχη να ασχολούμαι με ένα project το οποίο θα λειτουργήσει τελικά σε περισσότερες από μια γλώσσες. Τεχνικά θέματα σχετικά με τη διαχείριση των resources και την μετάφρασή τους έχουν λυθεί, σε γενικές γραμμές, χρησιμοποιώντας τα πολύ ωραία typed resources του VS 2005.&lt;br&gt;Η υποστήριξη του προϊόντος θα γίνεται από τα κατά τόπους παραρτήματα της εταιρείας για την οποία αναπτύσω το project και βέβαια η υποστήριξη θα γίνεται στην γλώσσα της κάθε χώρας. Οπότε, κάποια στιγμή το εγχειρίδιο χρήσης θα έχει μεταφραστεί, καθώς και τα exceptions, τα λεκτικά πάνω στα πλήκτρα κλπ. Η ανάπτυξη του project συνοδεύεται από ένα community server, στον οποίο θα έχει πρόσβαση το προσωπικό υποστήριξης και ανάπτυξης της εταιρείας, αλλά όχι και ο τελικός πελάτης. Επίσης υπάρχει και ένα Gemini για bug tracking. Προφανώς τόσο community server όσο στο Gemini τα θέματα θα καταγράφονται στα αγγλικά. &lt;br&gt;&lt;br&gt;Θα ήθελα την γνώμη σας στο εξής: Πως θα μπορούσε να γίνει σωστή συννεόηση, όταν ο κάθε εμπλεκόμενος "τρέχει" το σύστημα στην δική του γλώσσα, οπότε τα πλήκτρα γράφουν "Αποθήκευση", "Save" ή "Save [in Bulgarian]"; Επίσης ο server θα καταγράφει τα event log σε διαφορετικές γλώσσες. Το ίδιο συμβαίνει και με τα exceptions που θα σηκώνονται. Βαβέλ!!!&lt;br&gt;&lt;br&gt;π.χ. μια λύση θα ήταν να γίνει μερική μετάφραση και κάποια πράγματα να είναι μόνο στα αγγλικά, π.χ. server exceptions. Με την λογική όμως ότι ένα exception δεν ξέρεις σε πιο σημείο θα το "πιάσει" η εφαρμογή, μπορεί τελικά να φτάσει και στον τελικό χρήστη.&lt;br&gt;</description></item></channel></rss>