Video details

JavaScript apps go Int(ernationa)l - Phil Nash

JavaScript
10.19.2022
English

In a connected, global world there are a surprising number of problems with formatting text for our users. Did you know how many different ways there are to format a number? Or pluralise a noun? Or display a date? And let's not get into doing time zone maths for those dates. Internationalising an app by hand, and doing it correctly, could be a never-ending, full-time job.
The Intl namespace is home to the ECMAScript Internationalization API and contains the solutions to many of our formatting problems. In this talk we'll explore the available APIs that can make it easier to build a truly international application.
With Intl we can build apps that cater to all our users, wherever they are, however they write things down.
Check out more of our featured speakers and talks at https://www.ndcconferences.com https://ndcmelbourne.com/

Transcript

Let's get it cracking. We're going to talk about JavaScript apps and internationalization APIs, and it's going to be great. Cool. It's a good start. There we go. The clicker works as well. My name is On Ash. I'm absolutely delighted you decided to come and see the talk. All right, at the end of the day, I am a developer manager at Twilio. And Twilio if you don't know, is a platform for communications. That means it's a whole bunch of APIs that you can use in your apps to do everything from sending receiving text messages and emails, to creating video chats, making phones ring, all sorts of stuff. You can think of it in communications. You can probably do so with Twilio and use that inside your apps. I'm not here to talk about Twilio right now, but for the rest of the conference, I am out at the Twilio stand over there and absolutely there to talk about Twilio. So please come and ask me questions. And my swag just turned up, so I also now have socks and scrunchies and some fun stickers and hats and stuff. So come say hi out there. It'd be great. But if you also have any questions about this or anything about toleo do, find me online. I'm at Phil Nash and Twitter and everything else, or drop me an email on film as atolio.com you can't forget that. Cool. So the reason I started thinking about this talk and the kind of impact that we can have on our users with internationalization APIs actually kind of events, but events over the last couple of years, all those online events that kind of people helped organize in lieu of these in person face to face meetings. As a developer of analyst, I do find myself talking to these events and I enjoy that. And so the last few years, I've done a lot of talking to a camera from my own room. And that's fine, I've enjoyed that too. But my problem was kind of around the fact that these events existed in all different places around the world. Now this is brilliant because you can go to conferences and learn things from people all over the place without having to leave your home, without having to get on a plane. And I have to do all of that. And the events are a lot cheaper because not renting a convention center is a lot easier to do when you're just going online. But they cause some issues as well, because if there's a conference or a thing in Europe or in the US. And somebody asks, what time are you speaking? What time is that thing on? This question becomes a lot more ambiguous than, say, if somebody was to ask me earlier today and have said 20 to six, no problem, just before the beers, sorry about that. But if you said that online, you say 20 to six. What does that mean? 20 to six? Where when and in what day or time. We actually lose an awful lot of context when we put things online, especially around time. And that kind of bothered me. I was like, there must be something, there must be some way that JavaScript can help us out here and I found it, so we'll get to that in a bit. But there's more to just context like that we have context is not just that where and when, but also like who's saying this, right? Who is correct? Are these the same dates? I guess so if we put the flags up with it, but we don't know that. What we do know is that this side of the slide is incorrect. I prove that I found a map online of countries that use different date codes like that. It looks like this. As you can see, the people in green use the day month year version. People in blue use some kind of mix of them at times, I think, and the people in red are wrong and use month, day year, just straight up incorrect. Obviously as developers we absolutely know that the correct one is year month day because we can sort and search on that all as easy as we can. But I know green here is good, red is bad, and we'll work out what the rest are up to you some time later. But it's not just that, because even though we're doing the reverse dates here, when it comes down to it, here in Australia, the day is not the same day as it is in the US either. Twilio runs a conference called Signal every year and we were like, we actually put on them on the conference website last year, like it's on the second and 3 October. But in APAC, where you get to it first, it's on the third and fourth. And that makes sense because the days are not necessarily lined up to the right date as well. So displaying an online time online requires an awful lot more context than we necessarily give ourselves and so what can we do about that? So those contexts include times, dates, places, even the language, right? I'm lucky enough that most places and most of these conferences tend to publish themselves in English, but we could be sharing this in a different language as well and making that just more accessible for people around the world would be better. So how can the platform help? This is what I always ask myself. I try to ask what the platform can do before I ask whether there's a library that we can do this with. And if you take away anything from this talk, I hope it's that. And it's an incredible thing that the JavaScript platform or through the web platform actually gives us a lot of this. In this particular case, it's actually the JavaScript platform rather than web in general because all of this is actually going to work in node as well. You see, there's a task group Echo of 402. They are responsible for the Internationalization APIs in JavaScript because that is under the Ecmpt kind of group. So this is for JavaScript as a whole. Like I said, it's not just the web. All of these things will work in node JS and any other platform that kind of implements ECMAScript as a standard the Equin 402 group work on. What are the intel APIs? Intel is the namespace under which JavaScript helps us to internationalize a website, a web application. And I want to spend the time in this talk telling you a bit about each of the ones that I think are cool and useful and we should probably be using in our application. So the Intel APIs give us a couple of things. Each of them kind of work slightly differently to each other because some of them are formatted and produce a result and some of them kind of just allow you to provide rules and you have to come up with the results yourself. And this will become more clear as we see the different ones in action. To Dates and Times were my original bug there. And that's what I want to start with, talking about now and showing you how they work. So under that namespace we have the intel date time format. This formatter allows us to hand over a date to it and then it will format it in any sort of number of ways that are going to be useful to the end user. Let's go back to that. I'm just going to show a couple of things. First up, one of those problems was time zone. What time zone are you in right now? And these Intel APIs actually know where you are. Like, you can call on a new Intel Date Time Format object, call on resolved options and it's got an objective things and it tells you the time zone, your browser knows where you are, which is great. And so that means if we provide a date to this formatter in ISO 8601 format, so that's the sort of standard, a good all round standard, but also the sort of JavaScript version of it, which is, let's go, let's make a new date. Date equals a new date. And it's today. We'll do today, which is 620, 2nd, 23rd, 23rd, time is getting away from me. And then I'll just say time. So at 740 in the morning in Zed Z being etc. This is how JavaScript likes ISO eight, six, one format. It doesn't care about the time zone, it's just like give me etc. That's all I want and that's what the Z means. And if we create that and already the kind of printing version of this from DevTools here has shown me that it's actually 20 to six at the time. My talk started here in Australia and Eastern Standard Time. Thanks, Date Object. So it knows it's aware of this. And so if you do, if when you are saving or storing dates in an application, as long as you store them in UTC and then use JavaScript to display them, you can, at least on the front end, always get in the time zone of the user that is looking at it. That's all I wanted. That's all I wanted from these events. I wanted to know what time when I looked at it. Maybe I'm selfish, but right, you can then take that and use the actual formatters. So we've got a date time formatter. And so when we create one of these, we can create one by default, which will use the browser's natural language, or you can give it a language, so we can just give it English, and then we can format format that date. When we do so, we get kind of a default format, which is wrong, as you can see, because en in this is just regular English, which of course is American English, because they invented it, I guess, in English anyway. So we get in. But if we were indeed to do this in the right English, we could pick Australian English, for example, and we'll get the right way around. And so the default format comes with day, month, year, in some sort of order, but we can add a lot more to that. I'm just going to copy a big set of options here, because I have time to type all of that out and you don't watch me type it all out. But if we wanted to look at in British format in GB, which actually is just the same as the Australian one, when we come down to it, but put this time in Paris and choose different ways of printing it out, then we'll get a lovely, nice, long date, thursday 23rd June, 2022 Ad at 940 in the morning, central European Standard Time. Brilliant. Currently 2 hours off of UTC, even though they're in Paris. And so those various kind of options here, like we've got day, month, year, weekday, error. Error is our ad. We actually have I like the long error, actually. If you change that up, we actually get 2022 and the dominant I didn't think you were going to get any Latin in this, did you? But we get all these options, and so even yet, we share the time zone. We can change the time zone. Not too long as well. I quite like that one. It really puts it out. Central European summertime, not central. Yeah. And there's options where you have numeric. There can be like two digit as well, which tends to be useful for those times when you need there always to be two digits, so it will add to the first one with a zero. But that's not going to show up on any of this date right now. So that's our intel date time formatter. It allows us to completely control a date and what it looks like on the page and how it appears to that user. And sort of like I said in the front end, the browser can know our time zone. But when you're dealing with the backend, if you're doing this in NodeJS, that is where you want to pass the time zone to it. So you might need to know your user time zone if you are printing this out from the server side. Cool. But date time formats is not the only thing we can do with dates and times on the web. Sorry. In JavaScript, I always think this web stuff JavaScript, in this case we actually get relative time as well. These are those kind of like you posted a comment three minutes ago and that kind of thing, which we've actually had and there's been JavaScript libraries to do that for a long time, but JavaScript can do it. And in this case it works slightly differently to our date time format object. So as I said, we have those formatters which is very much the date time format. It produces that final string that you can put on a page. The relative timer thing is more of a building block where you set a time period and then the offset from it. So you kind of take a time and then you take the offset from it in a number of units. We're going to say it's much easier to see that if we just write it out. So if we actually grab a internal relative time format and we'll do it in English, we'll do n au why not? It says format, we're going to give it three and then hours. It gives us that in 3 hours we've got this, we can use that. This is a formatter as well. But you kind of give it the rules and if you say it was in fact -3 hours, we get 3 hours ago, right? This is actually happening. This is quite cool. This just exists in the platform and there's a bunch of other things we can do with it. So we can actually sort of pass some more options to it. So for example, we can actually say numeric auto which gives it the option to not use a numeric thing. So that works in 3 hours ago. There's not much else you can save for 3 hours ago. But if you change the offset units today and change it to say one ago, that's yesterday and one in the future is tomorrow, if we took off on numeric auto, there that's in one day and one day ago. So it really gives you a lot of those options. And of course because this is doing it, because these are built into the system as well, we can do that in French for example, or whatever language you want to display. I think it's quite useful. Go back to the numeric auto thing. There we go in one tag, or indeed Morgan in general. It gives us that and it has a whole bunch of options. We've got seconds, minutes, hours, days, and even for your business people, quarters, natural quarter. I didn't know that. Just make sure I'm not making no sense until next quarter. There we go. In one quarter, or in Oops, in say, four quarters time, which is of course a year and year work as well. So I think this relative time format is brilliant because for all of those plugins and things we've ever used to make a comment appear to come from a number of days seconds a week ago, we can just use this and it will not only appear, it'll only sort of work it out itself without having to include a whole library. I love using less other people's JavaScript there. It will also do it in the language that your user is looking at it in. Now, it's of course entirely possible that if you are building an entirely English site, you haven't localized it at all. You don't really want to have just the relative time things come out in French when a French person looks at it. So that's why you can still set that language there in the format to start with. Cool. So relative time format, use that. It's great for those kind of things really there for you. Now, plurals, plurals is a slightly different one. It's slightly different because plurals is now dealing with actual translations of content. And so this API is that is less of a formatter and more of a set of rules. And those rules you can then plug your own translations into. So plurals deals with sorry, it's rules, not a formatter. You then kind of create your own formatting functions out of it, but you do need during translations. And so if you are actually localizing a site, plural rules are going to help you with this kind of thing. And plural rules can be cardinals and audios, that is, counting things and kind of places of things. So one cat, two cats, three cats and or the first cat, second cat and third cat. I mention cats because that is my demo for this, because it turns out there are different rules and different languages for how you actually do counting and things like that. English is fairly straightforward. I just got a function over here to pluralize the word cats. So this creates ourself creates a plural rules in English and gives us back a function. Ultimately, that what's happening is this PR select right here, we create the plural rules and therefore, in addition, that's the stuff that's built into the platform. And then we say PR select count, which is the number that we pass into this. And it is going to give us a rule. And the rule is either in this case, one or other, that's going to be the result. That's how English works when we pluralize something, we have one of a thing or other of a thing. So zero cats, one cat, two cats, more cats, and that's fine, right? If we do pooling these cats, we'll get what we expect. No cats, one cat, two cats, 500 cats concerning lifestyle. But when I was looking into this, I found out that Welsh, for example, has six of these. I don't know how to speak Welsh, so I'm not going to try and say any of these out loud, but let me get my Welsh plural cats function. And in this case, there are rules for zero. One, two, few, many and other. And now some of them are the same, right? One and two is actually the same in terms of the word cat, but it doesn't have to be for others. And again, few and others are the same and many is different. Many does not go for long between few and other. It's weird. So we get plural Welsh caps. So if we pass in zero, we get zero cathode. Don't know how it's pronounced, I presume I'm wrong. One is gar, two is also three is then into few. So three is few. So when we learn something about it, four is few, five is few, but six as many, and seven is more than that. So six as many. If you go to Wales and somebody tells you there are many things out there, you know that there are six of them. And we learned that from our intel rules. And so, yeah, so these plural rules give us that object which we can select a rule from, and we can then translate into the thing that you will want, obviously more if you are I always think these kind of things are more useful. They're not useful for user generated content, but they're useful for that stuff around a website that you do control if it's not cats, but maybe comments? You have four new comments. This is the sort of thing that can translate that successfully for you, rather than trying to be like an entire translator. So, yeah, I hope we've learned things about plurals, but also cats, or indeed Welsh. We've got ordinals as well, I can just show you that quickly. It's not quite as fun. English, British, what am I trying to do? English has four times as ordinals, right? 1st, 2nd, third and something 0th or fourth. And so the thing works exactly the same. You just have to set a different type in your plurals there. So by default, it is a cardinal set, different type to ordinal, and you have got yourself format English, ordinals first format English, or nons. Yes, it's a function. 1st, 2nd, 3rd is just giving us the rules. And fourth, and it will do zeros as well, which is cool. It's official. I always thought zeros were sort of made up, but it's official. JavaScript agrees with it. First, the plural rules, like I said, we get rules that we then make our own format or out of, depending on what we're trying to translate, and we have to bring our own translations to that. Next up are numbers. Now, I would never necessarily have thought numbers might be a difficult thing here, but it turns out people around the world have very different ideas on what numbers should look like, and I really didn't know. So for that, we have our intel number format object here. Intel number format takes, as usual, language and allows us to format it in what you'd expect that language to look like. So English is fairly straightforward. We're going to format format because I didn't put new on it. We're going to format see the number 123-45-6789. It's a good example. And you expect that, right? You get commas. Every third number a decimal place is a full stop as a period, and then the 89. Cool, right? That's exactly what you'd expect. But the French wouldn't they would expect to drop the commas and actually use commas instead of periods. Fine. Similarly, the Germans would just oops, really broke that. The Germans would reverse them from what we have. So dots and colors, and then you get even more kind of fun ones. Like we'll go back to English languages, but English in India english in India puts the commas in different places, right? That's, I believe twelve lakh or 34 lakh, I think. I didn't it's hard to kind of exactly understand, but it all makes sense to them, I think. I'm trying to work out if they just keep going after the first three, you then break it up into twos. That's how they expect to see it. So when we're displaying a number like this to somebody, we should be displaying it the way they expect to see it. And then I like it, it's good to find something else as well. And so Arabic Egyptian just those are Arabic Egyptian numbers. That's great. But it's not just numbers. Again, this is something you could be using inside some of those plural things. Again, you're displaying one comment is new since you last went to this website, and you use the plural rule. If you expect to get to a thousand comments, maybe that's not a good idea. I don't read the comments. I think it's the best idea. But that's going to build up and you end up being able to format these correctly. But it's also really important if you're in ecommerce or something like that, where you're trying to sell something, you've got a price and you want people to recognize and understand the price in their language as well. The number four matter helps us with that as well. Let's imagine it's a very expensive thing. We can go back to English, but we'll start throwing some rules in now, like the style should be currency, a useful thing to do. And then when the style is currency, you can set the currency object to let's start with a Ud. Why not? Here we are. And so this has given us 1,034,067 Australian dollars. And you will note, of course, we have an a dollar at the front there. And that is, again, because default English, sadly, is American English. So if we were to do that in Australian, it's just a dollar. Brilliant. But that's kind of useful as well, right? If you are displaying a price in Australian dollars to somebody in the US, you kind of want them to understand that this is an Australian dollar, not a US dollar, or you have to do the conversion for them. And similarly, if you do that, we're in English, Australian language and we do a US dollar, it's going to show us some USD. It's nice, there's some other bits. So it's useful to see what the French think of this in Australian dollars, let's say. Again, well, that's now changed the side in which the thing is because in French it's 1 million, actually, why don't we have the dogs at the end? That's how we say it. That's what it looks like. And I don't think the Germans do it particularly differently. But again, we just see the different number formats and they do. Right. So the French have dollars Australian and the Germans have Australian dollars, usually. So it all makes sense, or at least it makes sense when you're reading it in your own language, in your own time. And you should be able to see that. You can, of course, add some more options to this if we go back to French. But in this particular place, say currency, we set the currency display to narrow symbol and that just gives us dollars. Again, that gives us just the sort of currency symbol which is useful, if that's what you want to say. But it's not just currency that we can do through this. There are a whole bunch of other units that you can add. So let's start again with a new intel number format in English. The style this time won't be currency but unit. And then you can pass not a currency but a unit. And there's a whole bunch of units and weights and measures, that kind of thing. But I like that we have megabytes as an option here. The units should be the megabyte and let's format 256 of them, 250. Brilliant. But then you can actually turn it to be longer. So previously we could say the currency display was narrow symbol. We can actually shut the unit display to the currency display is narrow symbol and this time we can go, you need displays long, so it says megabytes. And then you just get to have fun playing around with the languages and see what people call megabytes in other countries. Mega OGT, for example, or actually just megabyte. In Germany. They didn't bother. That's the thing about French, isn't it? The French government find it very important to make sure that they make up a word for everything that they come up with. And then regular French people call things the internet and the computer and the megabytes and the French government's like I think you'll find it's negotia. Listen to us and we'll be correct. I haven't tried this one before but I kind of want to go and see what it is in Arabic, Egypt. There you go. Egyptian Arabic, that is. I'm not going to try to pronounce it. I don't know how to read it. But the point being here is that we can always use these things to display bits of our UI, bits of our applications to our users in the ways that they would expect and the ways that going to make the most sense to them and it's so useful. So let's get out of the format. I talked about units and then like I said, I'm going to get through this relatively quickly in case they've got the beers already. Lists is kind of my final thing. I want to talk about. The list one is great. It's also very confusing. But basically if you've ever had that time when you've written a reducer on an array so that you print out all the things in the array with a comma benedict except for the last one which has and beneath between the two of them and I have to do that. That is in the system for us. It's in tools list format, which is cool. Let's make a list. I was watching. There we go. Hello. Did this earlier, didn't I come back to that? I was watching Amy's talk earlier where she made a chocolate bot, a WhatsApp number and an email you could send in pictures and it will tell you if the picture contains a quacker or not. And so I was like, okay, when I do the list of things we're going to list fun Australian animals. These are my three favorites. But when we want to print them out we don't want to have to map over this and insert commas and things like that. We want to take intel for a spin and use the list format and I will finish that off. So in this particular case, vehicles, animals in this particular case, in Australian English when we say we'd like a list of these things, there's type as conjunction. So it's and because we can do the other one which is a disjunction, which is Oz and we get koala one battle quacker. What I think is interesting about the and the conjunction is that there's actually no way to handle the Oxford comma. Now I don't know if you are a fan of the Oxford comma or not but obviously as you can see in Australian English it is not in the conjunction. In British English it is not the home of Oxford. However, in US Oxford comma, apparently obviously it doesn't make. Sense in this particular sentence, but it turns out that there's just not a control over it within this API. So it's a little bit sad. It kind of takes things out of your hands. There is a long GitHub comment thread about whether the writers of the API should or shouldn't care about this and whether there should be an option in there alongside style and type. Just Oxford, true or false, which was rejected. And instead they raised bugs with CLDR, which is a sort of international effort to put these kind of translation things together, and with Unicode for some reason, perhaps asking for a new symbol, the Oxford comma, to set aside from actual commas. But yeah, it resulted in bugs going to two other separate systems and we just get random Oxford comments, depending on the language we're looking at. That's all this format, it's quite useful for that for some reason. There's also like a short style, not shirt style, short style, I wish. Use an ambassador. Cool. And then a very narrow style, I think, which just prints them out. Cool. So list formatting, you never have to write a map and a reduce over a list of things again and try and get the right things. Or it's a join, really isn't. You just join them with commas and then you replace the last comm with an end and you're already confused. And I am too. Hold on, there's a type of unit. You also can just print out a list of them. I don't know why that one's useful, don't bother with that. But of course we've seen this in English, but the languages are there as well. Kuala Ka is entirely reasonable if you want to print it in a different language as well. Like I said, that is very much, I think, down to whether you're trying to fully translate an application or in some respects, just providing certain bits of the UI that are going to look better to somebody. So these list formatting things probably want to stick with the majority of the language, but your number formatting, your currencies a nice way is to make people feel a bit more at home, even though they're in the same language sorry, maybe a separate language, they can still see currencies or units in their own thing. I wanted to take a little sidestep on this and talk a little bit about web components. I think web components have never been they're getting more popular, which is great because they've been around for about ten years and it takes that long to get something popular on the internet if you're just part of the platform. Web components I think has been incredibly useful, maybe not for building those entire component based applications. Component based architecture is incredibly popular, obviously, as we've seen, with things like React and View and Angular and everything that does components and web components. I know there are ways to build entire applications with them, but I'm not sure they're the best thing for that. What I do think they are is really good for kind of adding a little progressive enhancement and making these kind of APIs a bit more declarative. And so whilst I was playing with this, I ended up writing a web component to do time formatting as well. That's all it is, is a component, looks like time formatter. You give it a date time attribute like that with that ISO eight, six, one UTC date in it, and you can give it some fallback content in the middle. So if the Intel API or a web component is not supported in the browser, it will just fall back to what's in the middle. But if you do this, it will format that date in the time zone of the person that is looking at it and make that thing really easy. I actually have an example of this. So this, when you load this page, it gets the date now and then plugs it into two elements. Here the bits in gray there. So the time we loaded this page is in US English for some reason, but it does know my time zone. I say it's Australian Melbourne, and let's change the other one too. I want to go to Europe. Paris. Paris was good. I'm not going to find it now if we change it there. So the day is still the same, but we can then start adding attributes that set the format the same as the object that we saw earlier. So if we want to set a weekday to be long, we just know it's Thursday. Thursday and odominate. Not particularly useful, but we can set that Thursday to a numeric date, to a numeric day. Let's do short month Thursday, June 20, 322. And we can start adding in our times as well. And all this is doing is adding attributes to a web component so the entire thing looks like that. It's then replacing its internal content with the result of the intel formatter. And so all this does is make this entire thing declarative. Now we can sidestep having to use the JavaScript APIs and just put a component like this on a page and it would just act the way we expect it to. I think this could work for other things. You can imagine putting a list formatter in, or another thing for those pluralizations. Maybe that gets a bit harder because you have to provide those translations for it, which is less declarative at that point. But certainly for time, this is really useful. And so I built and released this. I don't know if any people, I think a few people have installed it. It's available on NPM. There are others available as well, of course, GitHub themselves have a bunch of time elements. Those ones include, I think, their web component, which does a nonintol based relative time formatter for their like this commit was so many minutes ago, but yeah, relative time format would be another one we could definitely do this for. So if you're interested in seeing how load components can act as a declarative and easy way to use these, check out a couple of these, couple of these repositories too. And then there's the future. So Echo 402 is an ongoing group and so they're continually working on these things as they go on. There are things being raised. Maybe I'll get back to the Oxford comma debate at some point, but Echo 402 itself actually works out in the open. They have an entire GitHub repository where they do this kind of conversation in the open. You can go and investigate and see what so the proposals for new Intel APIs go through the same kind of process that things for JavaScript go through with TC 39, the committee that decides on what gets into JavaScript. You go from stage zero, which is like, I think it's a great idea all the way up to stage four, which is we'll deploy this in the next version and you can see what's in at what stage, at what time. And so that is really interesting to see what they're working on, what we might get in the platform in the future, but also a great way to suggest these things. And if you are deep into internationalizing a website of your own and you realize that there is something that the platform could do that you had to reach out to get a library to do instead, or had to build something yourself to do, then it is a great idea to kind of take this to ECMA 402 and effectively help pay the calf path. If you're having trouble internationalizing something where you had to build something or there's a library for it, then there's other people with that problem too, and we can build this into the platform and get it out there as well. And I kind of recommend that in terms of all JavaScript, it's an open ecosystem and as long as you can get somebody who kind of works on those committees on your side agreeing with you that yes, this is a problem, then it will kind of gain momentum and be worked on to perhaps make it to a version of JavaScript. So I was going to have a quick look at this. Yeah, so under the TC 39 repository, we can go see it from 402, see what the current proposals are, the active proposals. It's kind of interesting. So there's like number format. Version three is coming up kind of soon. It's made up to stage three. It's also a duration format, which kind of makes sense, how long something's taken. We've got the relative time since until something and then durations, then we can look at the experimental one. And actually, I was reading this message format one earlier. I'm not sure I fully understand it, but it sounds like it's going to really help all sorts of standards and things like that. Easier to localize the entire web, which is quite a claim for an international standard, but it's in stage one and we can see this going through. You also see other things like smart unit preferences. I like that. Trying to make things smarter and easier to get the right thing. Localized like lengths, lenses in miles in the US and kilometers in France, pounds in the US and kilograms in France and who knows what in the UK since Brexit. Anyway, let's think of the future of the web is bright the future of internationalization on the web and the future of how we build UIs for our users and make them feel comfortable understanding and reading those things. This is all part of the platform. It's all part of JavaScript or Exoscript and is available on the web and on the server side. And so use that platform. Don't reach for a library if we can do that on the platform because that is amazing and that is all I've got time for. Like I said, I'm thirsty too. So thank you very much again. My name is To Annash, I'm developer of Ancient Toyo and it's an absolute pleasure to speak with you today. Before we get them to open the doors and serve us drinks, does anybody have any questions? There is a microphone in the middle, I believe, that's useful to talk into because we have the live streams and recordings going on. So if you have a question, jump up or I can repeat as well. What time do you trigger BC question? We're onto a new intel date time format. Right? Do we want to be like zero? You thought, right, I need to come up with the date. What was the date? And I need to show the era in long. Let's see. So we got a format and let's format new date. That is zero. Yeah, I'm very excited. We're doing etc. Obviously. Wait, hold on. Hello? In palette. I'm at valley. Okay, I might not get that right. I don't know. That's true. Yeah, absolutely right. Okay, I'll have an answer tomorrow. Come see me at the Julia booth for that. Otherwise, yeah, thanks very much. Enjoy party tonight and I'll see you all there. Cheers.