B4A Library ICOSWorldForecast 3.50

View attachment 14755 View attachment 14754 View attachment 16846 Hi guys, ICOSWorldForecast is here.


It's a pleasure to introduce the new library of weather forecast.

The zip include:

The library, and the demo

INSTALLATION:

Copy the Library in your Basic For Android Library.

Copy the folder weathericon is located in files in the demo. In your one.


RENAME:
ICOSWorldForecast2.71.part1.zip and ICOSWorldForecast2.71.part2.zip

TO:
ICOSWorldForecast2.71.part1.rar and ICOSWorldForecast2.71.part1.rar

In this version I add WeatherUrl and 2 more days forecast.

You can use your own icons, instead of my icons.

For this new version 2.71 you need the new key.

You must register to obtain the new key, otherwise you will get error.

Use the address below to register.

World Weather Online - Welcome to the World Weather Online Developer Network!

don't forget to replace the ApiKey="XXXXXXXXXXXXXX" with your private key

This demos, I made with my galaxy tab 7 600x1024

any question or bugs please report to me.

big Thx to warwound for is fantastic auto-generated reference.


ICOSWorldForecast
Author:
Giuseppe Salvi
Version: 2.81
  • ICOSWorldForecast
    Methods:
    • FCDate (index As Int) As String
      Return Date for which the weather is forecasted
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.FCDate(0)
    • FCIcon (index As Int) As Bitmap
      Return Weather symbol image
      example:
      Dim a As ICOSWorldForecast
      Image1.SetBackgroundImage=a.FCWeatherIcon(0)
    • FCIconUrl (index As Int) As String
      Return URLIcon For Forecast Condition
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.FCIconUrl(0)
    • FCPrecipitationMM (index As Int) As String
      Return Precipitation amount in millimeter
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.FCPrecipitationMM(0)
    • FCTempMaxCelsius (index As Int) As String
      Return Day and night max temperature in Celcius
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.FCTempMaxCelsius(0)
    • FCTempMaxFahrenheit (index As Int) As String
      Return Day and night max temperature in Fahrenheit
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.FCTempMaxFahrenheit(0)
    • FCTempMinCelsius (index As Int) As String
      Return Day and night min temperature in Celcius
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.FCTempMinCelsius(0)
    • FCTempMinFahrenheit (index As Int) As String
      Return Day and night max temperature in Fahrenheit
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.FCTempMinFahrenheit(0)
    • FCWeatherCode (index As Int) As String
      Return Weather Code
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.FCWeatherCode(0)
    • FCWeatherDesc (index As Int) As String
      Return Weather description
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.FCWeatherDesc(0)
    • FCWinddir16Point (index As Int) As String
      Return 16-Point compass wind direction
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.FCWinddir16Point(0)
    • FCWinddirDegree (index As Int) As String
      Return Wind direction in degree
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.FCWinddirDegree(0)
    • FCWinddirection (index As Int) As String
      Return Compass Wind direction
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.FCWinddirection(0)
    • FCWindspeedKmph (index As Int) As String
      Return Wind speed in kilometer per hour
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.FCWindspeedKmph(0)
    • FCWindspeedMiles (index As Int) As String
      Return Wind speed in Miles per hour
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.FCWindspeedMiles(0)
    • FindLatAndLong As String
      Retrieve accurate latitude and longitude from GPS or network services
    • FindLocation As String
      Retrieve accurate location from GPS or network services
    • Full7DayName (day As Int) As String
      Return Full name of the day ( Monday )
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.Full7DayName(0) ' 0 = today - 1 = tomorrow etc etc
    • GetList (mCity As String) As ArrayList
      Set the City Name you wish to get the weather
      example:
      Dim a As ICOSWorldForecast
      Dim l As List
      Dim lv1 As ListView
      l = a.GetList("Los Angeles")
      For n = 0 To l.Size-1
      lv1.AddSingleLine(l.Get(n))
      Next
      Sub lv1_ItemClick (Position As Int, Value As Object)ics.CityName = lv1.GetItem(Position)
      lv1.Clear
      End Sub
    • Initialize (EventName As String)
      Initilize the object
    • Short7DayName (day As Int) As String
      Return Short name of the day ( Mon )
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.Short7DayName(0) ' 0 = today - 1 = tomorrow etc etc
    • StringFormat (format As String, object As Object, object1 As Object) As String
      Return Formatted String
      example:
      Label1.Text=StringFormat("Lat: %1$s - Long: %2$s ",Latitude,Longitude)
    • isWiFiConnected As Boolean
      Check if WiFi is Connected
    Permissions:
    • android.permission.ACCESS_ASSISTED_GPS
    • android.permission.ACCESS_COARSE_LOCATION
    • android.permission.ACCESS_FINE_LOCATION
    • android.permission.ACCESS_GPS
    • android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
    • android.permission.ACCESS_NETWORK_STATE
    • android.permission.ACCESS_WIFI_STATE
    • android.permission.CONTROL_LOCATION_UPDATES
    • android.permission.INTERNET
    Properties:
    • ApiKey As String [write only]
      Set your personal ApiKey
      example:
      Dim a As ICOSWorldForecast
      a.ApiKey="XXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    • AreaName As String [read only]
      Return Name of the city
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.AreaName
    • CCCloudCover As String [read only]
      Return Cloud Cover in %
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.CCCloudCover
    • CCHumidity As String [read only]
      Return Humidity in %
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.CCHumidity
    • CCIcon As Bitmap [read only]
      Return Weather symbol image
      example:
      Dim a As ICOSWorldForecast
      Image1.SetBackgroundImage=a.CCWeatherIcon
    • CCIconUrl As String [read only]
      Return URLIcon For Current Condition
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.CCIconUrl
    • CCLocalObsDateTime As String [read only]
      Return Local Observation date and time
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.CCLocalObsDateTime
    • CCObservationTime As String [read only]
      Return Observation time (UTC)
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.CCObservationTime
    • CCPrecipitationMM As String [read only]
      Return Precipitation Amount in Millimeter
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.PrecipitationMM
    • CCPressure As String [read only]
      Return Atmospheric pressure in Milibars
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.CCPressure
    • CCTempCelsius As String [read only]
      Return Temperature in Celsius
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.CCTempCelsius
    • CCTempFahrenheit As String [read only]
      Return Temperature in Fahrenheit
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.CCTempFahrenheit
    • CCVisibility As String [read only]
      Return Visibility kilometers per hour
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.CCVisibility
    • CCWeatherCode As String [read only]
      Return Weather Code
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.CCWeatherCode
    • CCWeatherDescription As String [read only]
      Return Weather Description
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.CCWeatherDescription
    • CCWinddir16Point As String [read only]
      Return 16-Point wind direction compass
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.CCWinddir16Point
    • CCWinddirDegree As String [read only]
      Return Wind direction in degree
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.CCWinddirDegree
    • CCWindspeedKmph As String [read only]
      Return Wind speed in kilometer per hour
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.CCWindspeedKmph
    • CCWindspeedMiles As String [read only]
      Return Wind speed in Miles per hour
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.CCWindspeedMiles
    • CityName As String [write only]
      Set City you wish to get the weather
      example:
      Dim a As ICOSWorldForecast
      a.CityName="New York"
    • Country As String [read only]
      Return Name of the Country
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.Country
    • CurrentDate As String [read only]
      Return Current Day,Month,Year ( Friday, 28 September, 2012 )
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.CurrentDate
    • CurrentTime As String [read only]
      Return Current time ( 02.09 PM )
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.CurrentTime
    • DstOffset As String [read only]
      Return DstOffset = ( GMT +2 )
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.DstOffset
    • GmtOffset As String [read only]
      Return GmtOffset = ( GMT +1 )
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.GmtOffset
    • LatAndLong As String [write only]
      Set Lat and Long you wish to get the weather
      example:
      Dim a As ICOSWorldForecast
      a.LatAndLong="40.714,-74.006"
    • Latitude As Object [read only]
      Return Latitude of the city
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.Latitude
    • Longitude As Object [read only]
      Return Longitude of the city
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.Longitude
    • Population As String [read only]
      Return Population of the city
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.Population
    • Region As String [read only]
      Return Name of the Region
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.Region
    • Sunrise As String [read only]
      Return Sunrise = 06:04
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.Sunrise
    • Sunset As String [read only]
      Return Sunset = 19:36
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.Sunset
    • TimeZoneID As String [read only]
      Return TimeZoneID = Europe/Rome
      example:
      Dim a As ICOSWorldForecast
      Label1.Text=a.TimeZoneID
    • Version As Double [read only]
      Return the version of this library
    • WeatherUrl As String [read only]
      Return url of the city [ http://www.worldweatheronline.com/London-weather/City-of-London-Greater-London/GB.aspx ]
      example:
      Dim Webview1 As Webview
      Webview1.LoadUrl(a.WeatherUrl)
 

Attachments

  • ICOSWorldForecast_DEMO.part1.zip
    293 KB · Views: 983
  • ICOSWorldForecast_DEMO.part2.zip
    167.1 KB · Views: 787
  • Main.png
    Main.png
    86.8 KB · Views: 936
  • Widget.jpg
    Widget.jpg
    81.8 KB · Views: 922
  • ICOSWorldForecast.png
    ICOSWorldForecast.png
    156.3 KB · Views: 983
  • ICOSWorldForecastFree_v3.50_lib_fix.zip
    53.9 KB · Views: 532
Last edited:

Laurent95

Active Member
Licensed User
Longtime User
Hi Laurent and GMan,


Grazie per la vostra collaborazione.

Je vous remercie pour votre collaboration.

Vielen Dank für Ihre Mitarbeit.

Thank you for your collaboration

I think I did some mistake in French.

Hi Giuseppe,

No no your French is good.

Seems there is a problem with the version 3.1, today nothing respond i have crash on all widget installed no longer for version of Android or device.
The log on BA4 send me back that
LogCat connected to: 192.168.56.101:5555
--------- beginning of /dev/log/main
--------- beginning of /dev/log/system
** Service (advancedwidget) Create **
java.util.concurrent.ExecutionException: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:223)
at java.util.concurrent.FutureTask.get(FutureTask.java:82)
at android.os.AsyncTask.get(AsyncTask.java:482)
at it.giuseppe.salvi.icos.library.weather.ICOSForecastGetListWrapper.GetCityList(ICOSForecastGetListWrapper.java:143)
at lizaprod.b4a.widget.easyclockweather.advancedwidget._service_create(advancedwidget.java:578)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:174)
at anywheresoftware.b4a.BA.raiseEvent(BA.java:158)
at lizaprod.b4a.widget.easyclockweather.advancedwidget.onCreate(advancedwidget.java:45)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:2363)
at android.app.ActivityThread.access$1600(ActivityThread.java:130)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1277)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:121)
at android.widget.Toast$TN.<init>(Toast.java:322)
at android.widget.Toast.<init>(Toast.java:91)
at android.widget.Toast.makeText(Toast.java:238)
at it.giuseppe.salvi.icos.library.weather.forecast.provider.ICOSForecastWrapper$ICOSBackgroundWorkGetListAsync.doInBackground(ICOSForecastWrapper.java:354)
at it.giuseppe.salvi.icos.library.weather.forecast.provider.ICOSForecastWrapper$ICOSBackgroundWorkGetListAsync.doInBackground(ICOSForecastWrapper.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
java.lang.RuntimeException: Unable to create service
I don't know enough your new version for understand what happen.
Thank you for your help.

Best regards.
 
Last edited:

Laurent95

Active Member
Licensed User
Longtime User
Hi Laurent, I don't think it has some problem because I use every day and it does not crash to me.

Yes it work in Async now but newer got this problem till now I'll give look

Hi giuseppe,

Today all works good, i don't understand why i have this log yesterday evening.
I will try later to take a look at my code and how i do the things also.

Thank you for your help.

Regards, Laurent.
 

Laurent95

Active Member
Licensed User
Longtime User
Hi, some time is the provider down.

Ok Giuseppe, i will find a way to know it with a result better than a crash :)
Thank you for your concern about it.

Best regards.
 

Laurent95

Active Member
Licensed User
Longtime User
Hi Giuseppe,

I have something weird who happens with 3.1 version.
If i try to use the function RequestConnectServer2 with a space in the town like 'New York', it return an error.
Unfortunatly i can't save the log, it's so rotten with other debug messages, that disappear too quick, but i have seen that it's returned by the calling of the HTTP Sub in the library. Maybe the space who's not translated with '%20' in the call on internet.
But when i use the function RequestConnectServer in the same conditions it return an empty string. I need to put an underscore instead the space in 'New_York' and it's good, it returns the city of New York with a good spelling.
That's not very easily to use it like that, i bet that many towns have a composed name.
Can you take a look and say me if i did a mistake, and why it return not the same thing in both function, please ?
Thank you.

Best regards, Laurent.

P.S. : Don't bother you too much with the crash who was happened precedently, it seems happened because many big storms on my place at day that the crash came, all operators was in down and didn't work properly, it's not the server I thinks.
 
Last edited:

lonleystar

Well-Known Member
Licensed User
Longtime User
Hi Giuseppe,

I have something weird who happens with 3.1 version.
If i try to use the function RequestConnectServer2 with a space in the town like 'New York', it return an error.
Unfortunatly i can't save the log, it's so rotten with other debug messages, that disappear too quick, but i have seen that it's returned by the calling of the HTTP Sub in the library. Maybe the space who's not translated with '%20' in the call on internet.
But when i use the function RequestConnectServer in the same conditions it return an empty string. I need to put an underscore instead the space in 'New_York' and it's good, it returns the city of New York with a good spelling.
That's not very easily to use it like that, i bet that many towns have a composed name.
Can you take a look and say me if i did a mistake, and why it return not the same thing in both function, please ?
Thank you.

Best regards, Laurent.

P.S. : Don't bother you too much with the crash who was happened precedently, it seems happened because many big storms on my place at day that the crash came, all operators was in down and didn't work properly, it's not the server I thinks.



Hi Laurent, I really dont know but I'm working on it and thanks to report it so I can check this too. The next update bring about 40 language fixed FindLocation now work fine and some bug. I think in few days it'll come.
 

Laurent95

Active Member
Licensed User
Longtime User
Hi Laurent, I really dont know but I'm working on it and thanks to report it so I can check this too. The next update bring about 40 language fixed FindLocation now work fine and some bug. I think in few days it'll come.

Hi Giuseppe,

Take your time it's ok.
In more i can say you it's for all composed cities names like Sao Paulo, San Diego, San Francisco, Los Angeles.
If you add an underscore the function return you a list but with many informations like San Franscico, California, United States Of America.
Of course if you try to find one city with all of these informations returned by RequestConnectServer it not work for have the forecast weather, the city isn't recognized..
I haven't tried again with the other function.
Good luck in your research, hopefully you can find what happen without too bothering yourself.

Best regards, Laurent.
 
Last edited:

lonleystar

Well-Known Member
Licensed User
Longtime User
Hi Laurent and all, the ICOSWorldForecastFree updated v3.20 what is new.

Added:

the event LocationResult,CancelTimer, FromLatAndLong and FromLocation instead of FindLatAndLong and FindLocation
Fixed FindLatAndLong and FindLocation now work fine and many.

B4X:
Sub a_LocationResult(Result As String, Value As Boolean)
    If (Value) Then
        a.CityName = Result
        StartActivity(Forecast)
    End If
End Sub

This needs to be called onPause() if FromLocation or FromLatAndLong is called from onResume anywhere,to prevent crash, as stated on the same stackoverflow thread. code below.
B4X:
Sub Activity_Pause (UserClosed As Boolean)
    a.CancelTimer
End Sub

I think I've reported all.
 
Last edited:

Thraka

Member
Licensed User
Longtime User
Hello, I'm working with Jakebullet70 on a project and I'm having an issue with this control. Sometimes when reading the sunrise information I get this error:

java.lang.StringIndexOutOfBoundsException: length=0; regionStart=10; regionLength=6

and other times it is OK.

Also, I cannot seem to use the CCIcon with a Bitmap type. I don't know why. I created another post (http://www.b4x.com/android/forum/th...-bitmap-reference-to-a-bitmap-variable.43757/) about it, maybe you can help with that too? Thanks!
 

lonleystar

Well-Known Member
Licensed User
Longtime User
Hello, I'm working with Jakebullet70 on a project and I'm having an issue with this control. Sometimes when reading the sunrise information I get this error:

java.lang.StringIndexOutOfBoundsException: length=0; regionStart=10; regionLength=6

and other times it is OK.

Also, I cannot seem to use the CCIcon with a Bitmap type. I don't know why. I created another post (http://www.b4x.com/android/forum/th...-bitmap-reference-to-a-bitmap-variable.43757/) about it, maybe you can help with that too? Thanks!


Hi, For the first question I think U've to use SetGeoUserName ="Your User Name" because many people use already my username.

For the second question I read the other post , use this Image.Bitmap = forecastObject.CCIcon instead of Image = forecastObject.CCIcon U'll see it working.
 

Thraka

Member
Licensed User
Longtime User
My image variable is already a Bitmap type:

B4X:
Dim Image As Bitmap

I almost have a feeling it's something to do with this being parsed so close to the activity loading maybe. Unsure.. I actually just bypassed it currently by hand loading the images based on the filename of the CCIconUrl...

As regards using SetGeoUserName = "User name" I tried a bunch of random characters, but it still didn't solve the problem. :(
 

Thraka

Member
Licensed User
Longtime User
It seems you have a typo in the only event supplied by the library. It is called LocationResul instead of LocationResult. Also, when does this event get fired?
 

lonleystar

Well-Known Member
Licensed User
Longtime User
My image variable is already a Bitmap type:

B4X:
Dim Image As Bitmap

I almost have a feeling it's something to do with this being parsed so close to the activity loading maybe. Unsure.. I actually just bypassed it currently by hand loading the images based on the filename of the CCIconUrl...

As regards using SetGeoUserName = "User name" I tried a bunch of random characters, but it still didn't solve the problem. :(

Hi, the CCIconUrl return this string ( http://cdn.worldweatheronline.net/images/wsymbols01_png_64/wsymbol_0001_sunny.png )
 

lonleystar

Well-Known Member
Licensed User
Longtime User
It seems you have a typo in the only event supplied by the library. It is called LocationResul instead of LocationResult. Also, when does this event get fired?

HI, in my demo I use this way:

B4X:
Sub a_LocationResult(Result As String, Value As Boolean)
    If (Value) Then
        a.CityName = Result
        StartActivity(Forecast)
    End If
End Sub

P.S.
Can U please post the entire code also via e-mail:salvigiuseppe@libero.it so I can check it.
 

Laurent95

Active Member
Licensed User
Longtime User
Hi Laurent and all, the ICOSWorldForecastFree updated v3.20 what is new.

Added:

the event LocationResult,CancelTimer, FromLatAndLong and FromLocation instead of FindLatAndLong and FindLocation
Fixed FindLatAndLong and FindLocation now work fine and many.

B4X:
Sub a_LocationResult(Result As String, Value As Boolean)
    If (Value) Then
        a.CityName = Result
        StartActivity(Forecast)
    End If
End Sub

This needs to be called onPause() if FromLocation or FromLatAndLong is called from onResume anywhere,to prevent crash, as stated on the same stackoverflow thread code below.
B4X:
Sub Activity_Pause (UserClosed As Boolean)
    a.CancelTimer
End Sub

I think I've reported all.

Hi Giuseppe,

Thank you for update the library again.
I need some explains about the new functions.
1) If i don't use the FromLocation or FromLatAndLong, i don't need to use the callback for cancel the timer in my code, right ?
2) Other question about this two new functions, what they returns exactly ? Only the city or other data ? i bet you use the geoname api for this and in my widget i give the possibility to find a place on a map. Maybe the new function can help me to retrieve the exact place with lat & long for a city. But not sure, i need other data also, it's why i ask you what you get as data in this way.
Another, but related to the next post, how you, or we, can determine which ISO code is used for the website ?
On the Website they say :
But i don't see anywhere in functions how i can put a special ISO code.
I think it's good for the spelling in each language to search a city. It can help, for example Manila in English it's Manille in French.
And who knows maybe we can search a city with Walof spelling, soon when we have learned it :eek:

Thank you in advance for your help, the library works good and grows up time after time.

Best regards.
Laurent
 
Top