--- /dev/null
+answer.received=Réponse reçue:
+data.collected=Données reçues il y a <SPAN ID="elapsed">0m 0s</SPAN> à {0}.
+destination=Destination
+error.page=Page d'erreur
+eta=Prévue
+frank=Frank
+gps.off=Aucun signal GPS
+gps.read=Position GPS
+hide.details=Détails
+invalid.response=Frank a demandé des informations du serveur OC Transpo, mais a reçu une réponse non-valide.
+m=m
+maybe.server.problem=Cela peut indiquer un problème avec le serveur qui a été contacté, mais il est également possible que vous avez découvert un bogue dans Frank.
+remain=Dans
+request.made=Requête faite:
+return.to.main.page=Cliquez <A HREF="{0}">ici</A> pour revenir à la page principale.
+route=Route
+s=s
+server.timeout=Frank a demandé des informations du serveur d'OC Transpo, mais il n'a pas répondu en temps opportun. Le serveur d'OC Transpo probablement indisponible pour cet instant. Il pourrait revenir bientôt en ligne; veuillez essayer de nouveau dans quelques minutes.
+show.details=Détails
+unexpected.error=Erreure inattendue
+unexpected.exception=Une exception inattendue a été rencontrée. Cela indique probablement un bogue dans Frank.
+url.contacted=URL contacté:
--- /dev/null
+answer.received=\u5FDC\u7B54\uFF1A
+data.collected=\u30C7\u30FC\u30BF\u3092{0}\u306B(<SPAN ID="elapsed">0\u52060\u79D2</SPAN>\u524D)\u96C6\u3081\u305F\u3002
+destination=\u76EE\u7684\u5730
+error.page=\u30A8\u30E9\u30FC\u30DA\u30FC\u30B8
+eta=\u5230\u7740\u4E88\u5B9A
+frank=\u30D5\u30E9\u30F3\u30AF
+gps.off=GPS\u306A\u3057
+gps.read=GPS
+hide.details=\u8A73\u7D30\u3092\u96A0\u3059
+invalid.response=\u30D5\u30E9\u30F3\u30AF\u306F\u3001OC\u30C4\u30E9\u30F3\u30B9\u30DD\u30FC\u306E\u30B5\u30FC\u30D0\u304B\u3089\u4E88\u671F\u305B\u306C\u56DE\u7B54\u3092\u3082\u3089\u3044\u307E\u3057\u305F\u3002
+m=\u5206
+maybe.server.problem=\u3072\u3087\u3063\u3068\u3059\u308B\u3068OC\u30C4\u30E9\u30F3\u30B9\u30DD\u30FC\u306E\u30B5\u30FC\u30D0\u306E\u554F\u984C\u304C\u3042\u308B\u304B\u3082\u3057\u308C\u306A\u3044\u3057\u3001\u30D5\u30E9\u30F3\u30AF\u306E\u554F\u984C\u304C\u3042\u308B\u304B\u3082\u3057\u308C\u306A\u3044\u3002
+remain=\u6B8B\u308A\u6642\u9593
+request.made=\u8981\u6C42\u304C\u884C\u308F\uFF1A
+return.to.main.page=\u30E1\u30A4\u30F3\u30DA\u30FC\u30B8\u306B\u623B\u308B\u306B\u306F\u3001<A HREF="{0}">\u3053\u3053</A>\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u4E0B\u3055\u3044\u3002
+route=\u30EB\u30FC\u30C8
+s=\u79D2
+server.timeout=\u30D5\u30E9\u30F3\u30AF\u306FOC\u30C4\u30E9\u30F3\u30B9\u30DD\u30FC\u306E\u30B5\u30FC\u30D0\u304B\u3089\u5FDC\u7B54\u3092\u3082\u3089\u3044\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u3042\u306E\u30B5\u30FC\u30D0\u306F\u3059\u3050\u306B\u3088\u304F\u306A\u308B\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002\u3042\u3068\uFF15\u5206\u3001\u518D\u8A66\u884C\u3057\u3066\u4E0B\u3055\u3044\u3002
+show.details=\u8A73\u7D30\u3092\u8868\u793A
+unexpected.error=\u4E88\u671F\u3057\u306A\u3044\u30A8\u30E9\u30FC
+unexpected.exception=\u4E88\u671F\u3057\u306A\u3044\u4F8B\u5916\u3002\u3053\u308C\u306F\u304A\u305D\u3089\u304F\u3001\u30D5\u30E9\u30F3\u30AF\u306E\u30D0\u30B0\u3092\u793A\u3057\u3066\u3044\u308B\u3002
+url.contacted=URL\uFF1A
<servlet-name>ViewSchedule</servlet-name>
<url-pattern>/ViewSchedule</url-pattern>
</servlet-mapping>
+
+ <filter-mapping>
+ <filter-name>ForceUtf8Encoding</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+
+ <filter>
+ <filter-name>ForceUtf8Encoding</filter-name>
+ <filter-class>net.jaekl.frank.ForceUtf8EncodingFilter</filter-class>
+ </filter>
<!--
<welcome-file-list>
<HTML>
<HEAD>
+ <META HTTP-EQUIV="Content-Type" content="text/html; charset=UTF-8"/>
<TITLE>Frank Welcome Page</TITLE>
+ <STYLE>
+ body {background-color: #F0F0C0; font-size: 1em; }
+ #heading {border-collapse: collapse; font-size: 1.5em; }
+ #heading td, #heading th {border: 1px solid #600000; padding: 3px 3px 3px 3px; text-align: center;}
+ #heading th {background-color: #800000; color: #FFFFFF; }
+ #heading tr.ghost td {background-color: #C0C0C0;}
+ </STYLE>
</HEAD>
+
<BODY>
- <H1>Welcome to Frank</H1>
- <H2>Choose a preselected stop:</H2>
+ <TABLE ID="heading"><TR><TH>Welcome to Frank</TH></TR></TABLE>
+
<P>
+ <B>Choose a preselected stop:</B><BR/>
<A HREF="/ViewSchedule?stop=2438&route=">Bronson at Sunnyside, NB</A><BR/>
<A HREF="/ViewSchedule?stop=6781&route=">Bronson at Sunnyside, SB</A><BR/>
<A HREF="/ViewSchedule?stop=6683&route=">Sunnyside at Seneca, EB</A><BR/>
<A HREF="/ViewSchedule?stop=6625&route=">Bronson at Somerset NB</A><BR/>
<A HREF="/ViewSchedule?stop=5690&route=">Bronson at Somerset SB</A><BR/>
</P>
- <H2>Or, enter your stop number:</H2>
<P>
+ <B>Or, enter your stop number:</B><BR/>
<FORM NAME="EnterStopNo" ACTION="/ViewSchedule" METHOD="get">
<INPUT TYPE="text" NAME="stop"/>
<INPUT TYPE="submit" VALUE="Submit"/>
</FORM>
</P>
+ <P>
+ English <A HREF="index_fr.html">Français</A> <A HREF="index_jp.html">日本語</A>
+ </P>
</BODY>
</HTML>
--- /dev/null
+<HTML>
+ <HEAD>
+ <META HTTP-EQUIV="Content-Type" content="text/html; charset=UTF-8"/>
+ <TITLE>Frank: Page d'acceuil</TITLE>
+ <STYLE>
+ body {background-color: #F0F0C0; font-size: 1em; }
+ #heading {border-collapse: collapse; font-size: 1.5em; }
+ #heading td, #heading th {border: 1px solid #600000; padding: 3px 3px 3px 3px; text-align: center;}
+ #heading th {background-color: #800000; color: #FFFFFF; }
+ #heading tr.ghost td {background-color: #C0C0C0;}
+ </STYLE>
+ </HEAD>
+
+ <BODY>
+ <TABLE ID="heading"><TR><TH>Bienvenue chez Frank</TH></TR></TABLE>
+
+ <P>
+ <B>Choisissez un des arrêts suivants:</B><BR/>
+ <A HREF="/ViewSchedule?stop=2438&lang=fr&route=">Bronson et Sunnyside, vers le nord</A><BR/>
+ <A HREF="/ViewSchedule?stop=6781&lang=fr&route=">Bronson et Sunnyside, vers le sud</A><BR/>
+ <A HREF="/ViewSchedule?stop=6683&lang=fr&route=">Sunnyside et Seneca, vers l'est</A><BR/>
+ <A HREF="/ViewSchedule?stop=7655&lang=fr&route=">Bank et Sunnyside, vers le nord</A><BR/>
+ <A HREF="/ViewSchedule?stop=6778&lang=fr&route=">Bank et Hopewell, vers le sud</A><BR/>
+ <A HREF="/ViewSchedule?stop=7649&lang=fr&route=">Riverdale et Sunnyside, vers le nord</A><BR/>
+ <A HREF="/ViewSchedule?stop=3034&lang=fr&route=">Station Billings Bridge (Toutes directions)</A><BR/>
+ <A HREF="/ViewSchedule?stop=6612&lang=fr&route=">Université Carleton (Toutes directions)</A><BR/>
+ <A HREF="/ViewSchedule?stop=3009&lang=fr&route=">Centre Rideau (Toutes directions)</A><BR/>
+ </P>
+ <P>
+ <A HREF="/ViewSchedule?stop=6668&lang=fr&route=">Somerset et LeBreton, vers l'est </A><BR/>
+ <A HREF="/ViewSchedule?stop=2363&lang=fr&route=">Somerset et Bronson, vers l'est</A><BR/>
+ <A HREF="/ViewSchedule?stop=6625&lang=fr&route=">Bronson et Somerset, vers le nord</A><BR/>
+ <A HREF="/ViewSchedule?stop=5690&lang=fr&route=">Bronson et Somerset, vers le sud</A><BR/>
+ </P>
+ <P>
+ <B>Ou, entrez le numéro de votre arrêt:</B><BR/>
+ <FORM NAME="EnterStopNo" ACTION="/ViewSchedule" METHOD="get">
+ <INPUT TYPE="text" NAME="stop"/>
+ <INPUT TYPE="hidden" NAME="lang" VALUE="fr"/>
+ <INPUT TYPE="submit" VALUE="soumettre"/>
+ </FORM>
+ </P>
+ <P>
+ <A HREF="index.html">English</A> Français <A HREF="index_jp.html">日本語</A>
+ </P>
+ </BODY>
+</HTML>
--- /dev/null
+<HTML>
+ <HEAD>
+ <META HTTP-EQUIV="Content-Type" content="text/html; charset=UTF-8"/>
+ <TITLE>フランクへようこそ</TITLE>
+ <STYLE>
+ body {background-color: #F0F0C0; font-size: 1em; }
+ #heading {border-collapse: collapse; font-size: 1.5em; }
+ #heading td, #heading th {border: 1px solid #600000; padding: 3px 3px 3px 3px; text-align: center;}
+ #heading th {background-color: #800000; color: #FFFFFF; }
+ #heading tr.ghost td {background-color: #C0C0C0;}
+ </STYLE>
+ </HEAD>
+
+ <BODY>
+ <TABLE ID="heading"><TR><TH>フランクへようこそ</TH></TR></TABLE>
+
+ <P>
+ <B>リストからストップを選択して下さい:</B><BR/>
+ <A HREF="/ViewSchedule?lang=jp&stop=2438&route=">BronsonとSunnyside, 北行き</A><BR/>
+ <A HREF="/ViewSchedule?lang=jp&stop=6781&route=">BronsonとSunnyside, 南行き</A><BR/>
+ <A HREF="/ViewSchedule?lang=jp&stop=6683&route=">SunnysideとSeneca, 東行き</A><BR/>
+ <A HREF="/ViewSchedule?lang=jp&stop=7655&route=">BankとSunnyside, 北行き</A><BR/>
+ <A HREF="/ViewSchedule?lang=jp&stop=6778&route=">BankとHopewell, 南行き</A><BR/>
+ <A HREF="/ViewSchedule?lang=jp&stop=7649&route=">RiverdaleとSunnyside, 北行き</A><BR/>
+ <A HREF="/ViewSchedule?lang=jp&stop=3034&route=">Billings橋駅 (全方向)</A><BR/>
+ <A HREF="/ViewSchedule?lang=jp&stop=6612&route=">Carleton大学 (全方向)</A><BR/>
+ <A HREF="/ViewSchedule?lang=jp&stop=3009&route=">Rideauセンター(全方向)</A><BR/>
+ </P>
+ <P>
+ <A HREF="/ViewSchedule?lang=jp&stop=6668&route=">SomersetとLeBreton, 東行き</A><BR/>
+ <A HREF="/ViewSchedule?lang=jp&stop=2363&route=">SomersetとBronson, 東行き</A><BR/>
+ <A HREF="/ViewSchedule?lang=jp&stop=6625&route=">BronsonとSomerset, 北行き</A><BR/>
+ <A HREF="/ViewSchedule?lang=jp&stop=5690&route=">BronsonとSomerset, 南行き</A><BR/>
+ </P>
+ <P>
+ <B>または、ストップの番号を入力して下さい:</B><BR/>
+ <FORM NAME="EnterStopNo" ACTION="/ViewSchedule" METHOD="get">
+ <INPUT TYPE="text" NAME="stop"/>
+ <INPUT TYPE="hidden" NAME="lang" VALUE="jp"/>
+ <INPUT TYPE="submit" VALUE="出す"/>
+ </FORM>
+ </P>
+ <P>
+ <A HREF="index.html">English</A> <A HREF="index_fr.html">Français</A> 日本語
+ </P>
+ </BODY>
+</HTML>
--- /dev/null
+package net.jaekl.frank;
+
+import java.io.IOException;
+
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+public class ForceUtf8EncodingFilter implements javax.servlet.Filter {
+ public static final String UTF_8 = "UTF-8";
+ @Override
+ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+ response.setCharacterEncoding(UTF_8);
+ chain.doFilter(request, response);
+ }
+
+ @Override
+ public void init(FilterConfig arg0) throws ServletException {
+ // no-op
+ }
+
+ @Override
+ public void destroy() {
+ // no-op
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.jaekl.frank;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+public class FilterChainMock implements FilterChain {
+ ArrayList<ServletRequest> m_filteredRequests;
+ ArrayList<ServletResponse> m_filteredResponses;
+
+ public FilterChainMock() {
+ m_filteredRequests = new ArrayList<ServletRequest>();
+ m_filteredResponses = new ArrayList<ServletResponse>();
+ }
+
+ @Override
+ public void doFilter(ServletRequest arg0, ServletResponse arg1)
+ throws IOException, ServletException
+ {
+ m_filteredRequests.add(arg0);
+ m_filteredResponses.add(arg1);
+ }
+
+ public ServletRequest[] mock_getRequests()
+ {
+ return m_filteredRequests.toArray(new ServletRequest[0]);
+ }
+
+ public ServletResponse[] mock_getResponses()
+ {
+ return m_filteredResponses.toArray(new ServletResponse[0]);
+ }
+}
--- /dev/null
+package net.jaekl.frank;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+
+public class ForceUtf8EncodingFilterTest {
+
+ @Test
+ public void testDoFilter() throws IOException, ServletException {
+ ForceUtf8EncodingFilter filter = new ForceUtf8EncodingFilter();
+
+ ServletRequestMock request = new ServletRequestMock();
+ ServletResponseMock response = new ServletResponseMock();
+ FilterChainMock chain = new FilterChainMock();
+
+ filter.doFilter(request, response, chain);
+
+ Assert.assertEquals(ForceUtf8EncodingFilter.UTF_8, response.getCharacterEncoding());
+
+ ServletRequest[] filteredRequests = chain.mock_getRequests();
+ Assert.assertEquals(1, filteredRequests.length);
+ Assert.assertEquals(request, filteredRequests[0]);
+
+ ServletResponse[] filteredResponses = chain.mock_getResponses();
+ Assert.assertEquals(1, filteredResponses.length);
+ Assert.assertEquals(response, filteredResponses[0]);
+ }
+
+}
--- /dev/null
+package net.jaekl.frank;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.util.Enumeration;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletInputStream;
+import javax.servlet.ServletRequest;
+
+public class ServletRequestMock implements ServletRequest {
+ String m_encodingName;
+
+ public ServletRequestMock() {
+ m_encodingName = null;
+ }
+
+ @Override
+ public Object getAttribute(String arg0) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Enumeration<?> getAttributeNames() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public String getCharacterEncoding() {
+ return m_encodingName;
+ }
+
+ @Override
+ public int getContentLength() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public String getContentType() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public ServletInputStream getInputStream() throws IOException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public String getLocalAddr() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public String getLocalName() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public int getLocalPort() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public Locale getLocale() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Enumeration<?> getLocales() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public String getParameter(String arg0) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Map<?, ?> getParameterMap() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Enumeration<?> getParameterNames() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public String[] getParameterValues(String arg0) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public String getProtocol() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public BufferedReader getReader() throws IOException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Deprecated
+ @Override
+ public String getRealPath(String arg0) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public String getRemoteAddr() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public String getRemoteHost() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public int getRemotePort() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public RequestDispatcher getRequestDispatcher(String arg0) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public String getScheme() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public String getServerName() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public int getServerPort() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public boolean isSecure() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public void removeAttribute(String arg0) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setAttribute(String arg0, Object arg1) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setCharacterEncoding(String arg0)
+ throws UnsupportedEncodingException {
+ m_encodingName = arg0;
+ }
+
+}
--- /dev/null
+package net.jaekl.frank;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Locale;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.ServletResponse;
+
+public class ServletResponseMock implements ServletResponse {
+ String m_encodingName;
+
+ public ServletResponseMock() {
+ m_encodingName = null;
+ }
+
+ @Override
+ public void flushBuffer() throws IOException {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public int getBufferSize() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public String getCharacterEncoding() {
+ return m_encodingName;
+ }
+
+ @Override
+ public String getContentType() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Locale getLocale() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public ServletOutputStream getOutputStream() throws IOException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public PrintWriter getWriter() throws IOException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public boolean isCommitted() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public void reset() {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void resetBuffer() {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setBufferSize(int arg0) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setCharacterEncoding(String arg0) {
+ m_encodingName = arg0;
+ }
+
+ @Override
+ public void setContentLength(int arg0) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setContentType(String arg0) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setLocale(Locale arg0) {
+ // TODO Auto-generated method stub
+
+ }
+
+}